summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-08-24 15:23:04 -0500
committerAndres Gomez <[email protected]>2018-08-28 15:50:59 +0300
commitd449afaa55dbeff89119a5093d15950267581758 (patch)
tree16a374ed49ac23f4332668fe9600f6a52177ea98
parent96504a886fdcc2729d47b692aeb95c70d6cd5b89 (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.c32
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)