xref: /aosp_15_r20/external/libdrm/nouveau/nvif/unpack.h (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker #ifndef __NVIF_UNPACK_H__
2*7688df22SAndroid Build Coastguard Worker #define __NVIF_UNPACK_H__
3*7688df22SAndroid Build Coastguard Worker 
4*7688df22SAndroid Build Coastguard Worker #define nvif_unvers(r,d,s,m) ({                                                \
5*7688df22SAndroid Build Coastguard Worker 	void **_data = (d); __u32 *_size = (s); int _ret = (r);                \
6*7688df22SAndroid Build Coastguard Worker 	if (_ret == -ENOSYS && *_size == sizeof(m)) {                          \
7*7688df22SAndroid Build Coastguard Worker 		*_data = NULL;                                                 \
8*7688df22SAndroid Build Coastguard Worker 		*_size = _ret = 0;                                             \
9*7688df22SAndroid Build Coastguard Worker 	}                                                                      \
10*7688df22SAndroid Build Coastguard Worker 	_ret;                                                                  \
11*7688df22SAndroid Build Coastguard Worker })
12*7688df22SAndroid Build Coastguard Worker 
13*7688df22SAndroid Build Coastguard Worker #define nvif_unpack(r,d,s,m,vl,vh,x) ({                                        \
14*7688df22SAndroid Build Coastguard Worker 	void **_data = (d); __u32 *_size = (s);                                \
15*7688df22SAndroid Build Coastguard Worker 	int _ret = (r), _vl = (vl), _vh = (vh);                                \
16*7688df22SAndroid Build Coastguard Worker 	if (_ret == -ENOSYS && *_size >= sizeof(m) &&                          \
17*7688df22SAndroid Build Coastguard Worker 	    (m).version >= _vl && (m).version <= _vh) {                        \
18*7688df22SAndroid Build Coastguard Worker 		*_data = (__u8 *)*_data + sizeof(m);                           \
19*7688df22SAndroid Build Coastguard Worker 		*_size = *_size - sizeof(m);                                   \
20*7688df22SAndroid Build Coastguard Worker 		if (_ret = 0, !(x)) {                                          \
21*7688df22SAndroid Build Coastguard Worker 			_ret = *_size ? -E2BIG : 0;                            \
22*7688df22SAndroid Build Coastguard Worker 			*_data = NULL;                                         \
23*7688df22SAndroid Build Coastguard Worker 			*_size = 0;                                            \
24*7688df22SAndroid Build Coastguard Worker 		}                                                              \
25*7688df22SAndroid Build Coastguard Worker 	}                                                                      \
26*7688df22SAndroid Build Coastguard Worker 	_ret;                                                                  \
27*7688df22SAndroid Build Coastguard Worker })
28*7688df22SAndroid Build Coastguard Worker #endif
29