diff options
author | Jason Ekstrand <[email protected]> | 2018-08-24 15:23:04 -0500 |
---|---|---|
committer | Andres Gomez <[email protected]> | 2018-08-28 15:50:59 +0300 |
commit | d449afaa55dbeff89119a5093d15950267581758 (patch) | |
tree | 16a374ed49ac23f4332668fe9600f6a52177ea98 | |
parent | 96504a886fdcc2729d47b692aeb95c70d6cd5b89 (diff) |
intel/decoder: Clean up field iteration and fix sub-dword fields
First of all, setting iter->name in advance_field is unnecessary because
it gets set by gen_decode_field which gets called immediately after
gen_decode_field in the one call-site. Second, we weren't properly
initializing start_bit and end_bit in the initial condition of
gen_field_iterator_next so the first field of a struct would get printed
wrong if it doesn't start on the first bit. This is fixed by adding a
iter_start_field helper which sets the field and also sets up the other
bits we need. This fixes decoding of 3DSTATE_SBE_SWIZ.
Reviewed-by: Lionel Landwerlin <[email protected]>
(cherry picked from commit 2abd7ae189135eb5a1f530a3a1c9412d3a7e238d)
-rw-r--r-- | src/intel/common/gen_decoder.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index ec0a486b101..4316b7a82e8 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -812,6 +812,18 @@ iter_more_groups(const struct gen_field_iterator *iter) } static void +iter_start_field(struct gen_field_iterator *iter, struct gen_field *field) +{ + iter->field = field; + + int group_member_offset = iter_group_offset_bits(iter, iter->group_iter); + + iter->start_bit = group_member_offset + iter->field->start; + iter->end_bit = group_member_offset + iter->field->end; + iter->struct_desc = NULL; +} + +static void iter_advance_group(struct gen_field_iterator *iter) { if (iter->group->variable) @@ -825,32 +837,20 @@ iter_advance_group(struct gen_field_iterator *iter) } } - iter->field = iter->group->fields; + iter_start_field(iter, iter->group->fields); } static bool iter_advance_field(struct gen_field_iterator *iter) { if (iter_more_fields(iter)) { - iter->field = iter->field->next; + iter_start_field(iter, iter->field->next); } else { if (!iter_more_groups(iter)) return false; iter_advance_group(iter); } - - if (iter->field->name) - snprintf(iter->name, sizeof(iter->name), "%s", iter->field->name); - else - memset(iter->name, 0, sizeof(iter->name)); - - int group_member_offset = iter_group_offset_bits(iter, iter->group_iter); - - iter->start_bit = group_member_offset + iter->field->start; - iter->end_bit = group_member_offset + iter->field->end; - iter->struct_desc = NULL; - return true; } @@ -1001,9 +1001,9 @@ gen_field_iterator_next(struct gen_field_iterator *iter) /* Initial condition */ if (!iter->field) { if (iter->group->fields) - iter->field = iter->group->fields; + iter_start_field(iter, iter->group->fields); else - iter->field = iter->group->next->fields; + iter_start_field(iter, iter->group->next->fields); bool result = iter_decode_field(iter); if (iter->p_end) |