From bd80037441a8a57bd4d01e2e66b03bdfafff36a3 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Wed, 8 Jan 2025 13:00:36 +0100 Subject: [PATCH] pan/genxml: Move [un]pack internals to use packed structs We are now strongly typing everything, pan_[un]pack wil enforce this at the API level next. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/lib/genxml/gen_pack.py | 29 +++++++++++----------- src/panfrost/lib/genxml/pan_pack_helpers.h | 6 ++--- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/panfrost/lib/genxml/gen_pack.py b/src/panfrost/lib/genxml/gen_pack.py index d27419b1efa..19bb88b4aeb 100644 --- a/src/panfrost/lib/genxml/gen_pack.py +++ b/src/panfrost/lib/genxml/gen_pack.py @@ -316,16 +316,16 @@ class Group(object): if field.modifier[0] == "shr": shift = field.modifier[1] mask = hex((1 << shift) - 1) - print(" assert((values->{} & {}) == 0);".format(field.name, mask)) + print(" assert((__unpacked->{} & {}) == 0);".format(field.name, mask)) elif field.modifier[0] == "minus": - print(" assert(values->{} >= {});".format(field.name, field.modifier[1])) + print(" assert(__unpacked->{} >= {});".format(field.name, field.modifier[1])) elif field.modifier[0] == "log2": - print(" assert(IS_POT_NONZERO(values->{}));".format(field.name)) + print(" assert(IS_POT_NONZERO(__unpacked->{}));".format(field.name)) for index in range(self.length // 4): # Handle MBZ words if not index in words: - print(" cl[%2d] = 0;" % index) + print(" __packed->opaque[%2d] = 0;" % index) continue word = words[index] @@ -333,7 +333,7 @@ class Group(object): word_start = index * 32 v = None - prefix = " cl[%2d] =" % index + prefix = " __packed->opaque[%2d] =" % index for contributor in word.contributors: field = contributor.field @@ -344,7 +344,7 @@ class Group(object): start -= contrib_word_start end -= contrib_word_start - value = "values->{}".format(contributor.path) + value = "__unpacked->{}".format(contributor.path) if field.modifier is not None: if field.modifier[0] == "shr": value = "{} >> {}".format(value, field.modifier[1]) @@ -423,7 +423,7 @@ class Group(object): ALL_ONES = 0xffffffff if mask != ALL_ONES: - TMPL = ' if (((const uint32_t *) cl)[{}] & {}) fprintf(stderr, "XXX: Invalid field of {} unpacked at word {}\\n");' + TMPL = ' if (__packed->opaque[{}] & {}) fprintf(stderr, "XXX: Invalid field of {} unpacked at word {}\\n");' print(TMPL.format(index, hex(mask ^ ALL_ONES), self.label, index)) fieldrefs = [] @@ -433,7 +433,7 @@ class Group(object): convert = None args = [] - args.append('cl') + args.append('&__packed->opaque[0]') args.append(str(fieldref.start)) args.append(str(fieldref.end)) @@ -468,10 +468,10 @@ class Group(object): decoded = '{}{}({}){}'.format(prefix, convert, ', '.join(args), suffix) - print(' values->{} = {};'.format(fieldref.path, decoded)) + print(' __unpacked->{} = {};'.format(fieldref.path, decoded)) if field.modifier and field.modifier[0] == "align": mask = hex(field.modifier[1] - 1) - print(' assert(!(values->{} & {}));'.format(fieldref.path, mask)) + print(' assert(!(__unpacked->{} & {}));'.format(fieldref.path, mask)) def emit_print_function(self): for field in self.fields: @@ -647,10 +647,11 @@ class Parser(object): if self.group.align != None: print('#define {} {}'.format (name + "_ALIGN", self.group.align)) print('struct {}_packed {{ uint32_t opaque[{}]; }};'.format(name.lower(), self.group.length // 4)) + print('#define {}_PACKED_T struct {}_packed'.format(name.upper(), name.lower())) def emit_pack_function(self, name, group): - print("static ALWAYS_INLINE void\n%s_pack(uint32_t * restrict cl,\n%sconst struct %s * restrict values)\n{" % - (name, ' ' * (len(name) + 6), name)) + print("static ALWAYS_INLINE void\n%s_pack(%s_PACKED_T * restrict __packed,\n%sconst struct %s * restrict __unpacked)\n{" % + (name, name.upper(), ' ' * (len(name) + 6), name)) group.emit_pack_function() @@ -658,8 +659,8 @@ class Parser(object): def emit_unpack_function(self, name, group): print("static inline void") - print("%s_unpack(const uint32_t * restrict cl,\n%sstruct %s * restrict values)\n{" % - (name.upper(), ' ' * (len(name) + 8), name)) + print("%s_unpack(const %s_PACKED_T * restrict __packed,\n%sstruct %s * restrict __unpacked)\n{" % + (name.upper(), name.upper(), ' ' * (len(name) + 8), name)) group.emit_unpack_function() diff --git a/src/panfrost/lib/genxml/pan_pack_helpers.h b/src/panfrost/lib/genxml/pan_pack_helpers.h index e6ef238eee9..5a573ad229c 100644 --- a/src/panfrost/lib/genxml/pan_pack_helpers.h +++ b/src/panfrost/lib/genxml/pan_pack_helpers.h @@ -87,20 +87,20 @@ __gen_unpack_padded(const uint32_t *restrict cl, uint32_t start, uint32_t end) for (struct PREFIX1(T) name = {PREFIX2(T, header)}, \ *_loop_terminate = &name; \ __builtin_expect(_loop_terminate != NULL, 1); ({ \ - PREFIX2(T, pack)((uint32_t *)(dst), &name); \ + PREFIX2(T, pack)((PREFIX2(T, PACKED_T) *)(dst), &name); \ _loop_terminate = NULL; \ })) #define pan_pack_nodefaults(dst, T, name) \ for (struct PREFIX1(T) name = {0}, *_loop_terminate = &name; \ __builtin_expect(_loop_terminate != NULL, 1); ({ \ - PREFIX2(T, pack)((uint32_t *)(dst), &name); \ + PREFIX2(T, pack)((PREFIX2(T, PACKED_T) *)(dst), &name); \ _loop_terminate = NULL; \ })) #define pan_unpack(src, T, name) \ struct PREFIX1(T) name; \ - PREFIX2(T, unpack)((uint32_t *)(src), &name) + PREFIX2(T, unpack)((const PREFIX2(T, PACKED_T) *)(src), &name) #define pan_print(fp, T, var, indent) PREFIX2(T, print)(fp, &(var), indent)