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