xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/nouveau/include/nvif/unpack.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */
2*4882a593Smuzhiyun #ifndef __NVIF_UNPACK_H__
3*4882a593Smuzhiyun #define __NVIF_UNPACK_H__
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #define nvif_unvers(r,d,s,m) ({                                                \
6*4882a593Smuzhiyun 	void **_data = (d); __u32 *_size = (s); int _ret = (r);                \
7*4882a593Smuzhiyun 	if (_ret == -ENOSYS && *_size == sizeof(m)) {                          \
8*4882a593Smuzhiyun 		*_data = NULL;                                                 \
9*4882a593Smuzhiyun 		*_size = _ret = 0;                                             \
10*4882a593Smuzhiyun 	}                                                                      \
11*4882a593Smuzhiyun 	_ret;                                                                  \
12*4882a593Smuzhiyun })
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define nvif_unpack(r,d,s,m,vl,vh,x) ({                                        \
15*4882a593Smuzhiyun 	void **_data = (d); __u32 *_size = (s);                                \
16*4882a593Smuzhiyun 	int _ret = (r), _vl = (vl), _vh = (vh);                                \
17*4882a593Smuzhiyun 	if (_ret == -ENOSYS && *_size >= sizeof(m) &&                          \
18*4882a593Smuzhiyun 	    (m).version >= _vl && (m).version <= _vh) {                        \
19*4882a593Smuzhiyun 		*_data = (__u8 *)*_data + sizeof(m);                           \
20*4882a593Smuzhiyun 		*_size = *_size - sizeof(m);                                   \
21*4882a593Smuzhiyun 		if (_ret = 0, !(x)) {                                          \
22*4882a593Smuzhiyun 			_ret = *_size ? -E2BIG : 0;                            \
23*4882a593Smuzhiyun 			*_data = NULL;                                         \
24*4882a593Smuzhiyun 			*_size = 0;                                            \
25*4882a593Smuzhiyun 		}                                                              \
26*4882a593Smuzhiyun 	}                                                                      \
27*4882a593Smuzhiyun 	_ret;                                                                  \
28*4882a593Smuzhiyun })
29*4882a593Smuzhiyun #endif
30