179ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs#ifndef __NVIF_UNPACK_H__
279ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs#define __NVIF_UNPACK_H__
379ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs
479ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs#define nvif_unvers(d) ({                                                      \
579ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	ret = (size == sizeof(d)) ? 0 : -ENOSYS;                               \
679ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	(ret == 0);                                                            \
779ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs})
879ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs
979ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs#define nvif_unpack(d,vl,vh,m) ({                                              \
1079ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	if ((vl) == 0 || ret == -ENOSYS) {                                     \
1179ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs		int _size = sizeof(d);                                         \
1279ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs		if (_size <= size && (d).version >= (vl) &&                    \
1379ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs				     (d).version <= (vh)) {                    \
1479ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs			data = (u8 *)data + _size;                             \
1579ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs			size = size - _size;                                   \
1679ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs			ret = ((m) || !size) ? 0 : -E2BIG;                     \
1779ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs		} else {                                                       \
1879ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs			ret = -ENOSYS;                                         \
1979ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs		}                                                              \
2079ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	}                                                                      \
2179ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs	(ret == 0);                                                            \
2279ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs})
2379ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs
2479ca27706a034b683196c85f5c6901b78e5ab8f0Ben Skeggs#endif
25