xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/include/nvif/unpack.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: unpack.h,v 1.4 2021/12/18 23:45:33 riastradh Exp $	*/
2 
3 /* SPDX-License-Identifier: MIT */
4 #ifndef __NVIF_UNPACK_H__
5 #define __NVIF_UNPACK_H__
6 
7 #define nvif_unvers(r,d,s,m) ({                                                \
8 	void **_data = (d); __u32 *_size = (s); int _ret = (r);                \
9 	if (_ret == -ENOSYS && *_size == sizeof(m)) {                          \
10 		*_data = NULL;                                                 \
11 		*_size = _ret = 0;                                             \
12 	}                                                                      \
13 	_ret;                                                                  \
14 })
15 
16 #define nvif_unpack(r,d,s,m,vl,vh,x) ({                                        \
17 	void **_data = (d); __u32 *_size = (s);                                \
18 	int _ret = (r), _vl = (vl), _vh = (vh);                                \
19 	if (_ret == -ENOSYS && *_size >= sizeof(m) &&                          \
20 	    (m).version >= _vl && (m).version <= _vh) {                        \
21 		*_data = (__u8 *)*_data + sizeof(m);                           \
22 		*_size = *_size - sizeof(m);                                   \
23 		if (_ret = 0, !(x)) {                                          \
24 			_ret = *_size ? -E2BIG : 0;                            \
25 			*_data = NULL;                                         \
26 			*_size = 0;                                            \
27 		}                                                              \
28 	}                                                                      \
29 	_ret;                                                                  \
30 })
31 #endif
32