[Mesa-dev] [PATCH v2] intel/decoder: Use 'DWord Length' and 'bias' fields for packet length.

Lionel Landwerlin lionel.g.landwerlin at intel.com
Tue Oct 30 12:43:57 UTC 2018


This patch and the previous one pushed to master.
Thanks!

On 30/10/2018 12:41, Lionel Landwerlin wrote:
> On 29/10/2018 11:56, Toni Lönnberg wrote:
>> Use the 'DWord Length' and 'bias' fields from the instruction 
>> definition to
>> parse the packet length from the command stream when possible. The 
>> hardcoded
>> mechanism is used whenever an instruction doesn't have this field.
>
>
> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>
>
>> ---
>>   src/intel/common/gen_decoder.c | 30 +++++++++++++++++++++++-------
>>   src/intel/common/gen_decoder.h |  2 ++
>>   2 files changed, 25 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/intel/common/gen_decoder.c 
>> b/src/intel/common/gen_decoder.c
>> index 5f6e7a0b808..eaa7642fea9 100644
>> --- a/src/intel/common/gen_decoder.c
>> +++ b/src/intel/common/gen_decoder.c
>> @@ -163,11 +163,16 @@ create_group(struct parser_context *ctx,
>>      group->spec = ctx->spec;
>>      group->variable = false;
>>      group->fixed_length = fixed_length;
>> +   group->dword_length_field = NULL;
>> +   group->dw_length = 0;
>> +   group->bias = 1;
>>        for (int i = 0; atts[i]; i += 2) {
>>         char *p;
>>         if (strcmp(atts[i], "length") == 0) {
>>            group->dw_length = strtoul(atts[i + 1], &p, 0);
>> +      } else if (strcmp(atts[i], "bias") == 0) {
>> +         group->bias = strtoul(atts[i + 1], &p, 0);
>>         }
>>      }
>>   @@ -288,15 +293,18 @@ create_field(struct parser_context *ctx, 
>> const char **atts)
>>      for (int i = 0; atts[i]; i += 2) {
>>         char *p;
>>   -      if (strcmp(atts[i], "name") == 0)
>> +      if (strcmp(atts[i], "name") == 0) {
>>            field->name = ralloc_strdup(field, atts[i + 1]);
>> -      else if (strcmp(atts[i], "start") == 0)
>> +         if (strcmp(field->name, "DWord Length") == 0) {
>> +            field->parent->dword_length_field = field;
>> +         }
>> +      } else if (strcmp(atts[i], "start") == 0) {
>>            field->start = strtoul(atts[i + 1], &p, 0);
>> -      else if (strcmp(atts[i], "end") == 0) {
>> +      } else if (strcmp(atts[i], "end") == 0) {
>>            field->end = strtoul(atts[i + 1], &p, 0);
>> -      } else if (strcmp(atts[i], "type") == 0)
>> +      } else if (strcmp(atts[i], "type") == 0) {
>>            field->type = string_to_type(ctx, atts[i + 1]);
>> -      else if (strcmp(atts[i], "default") == 0 &&
>> +      } else if (strcmp(atts[i], "default") == 0 &&
>>                  field->start >= 16 && field->end <= 31) {
>>            field->has_default = true;
>>            field->default_value = strtoul(atts[i + 1], &p, 0);
>> @@ -743,8 +751,16 @@ gen_group_find_field(struct gen_group *group, 
>> const char *name)
>>   int
>>   gen_group_get_length(struct gen_group *group, const uint32_t *p)
>>   {
>> -   if (group && group->fixed_length)
>> -      return group->dw_length;
>> +   if (group) {
>> +      if (group->fixed_length)
>> +         return group->dw_length;
>> +      else {
>> +         struct gen_field *field = group->dword_length_field;
>> +         if (field) {
>> +            return field_value(p[0], field->start, field->end) + 
>> group->bias;
>> +         }
>> +      }
>> +   }
>>        uint32_t h = p[0];
>>      uint32_t type = field_value(h, 29, 31);
>> diff --git a/src/intel/common/gen_decoder.h 
>> b/src/intel/common/gen_decoder.h
>> index a80c50b6647..4beed22d729 100644
>> --- a/src/intel/common/gen_decoder.h
>> +++ b/src/intel/common/gen_decoder.h
>> @@ -99,8 +99,10 @@ struct gen_group {
>>      char *name;
>>        struct gen_field *fields; /* linked list of fields */
>> +   struct gen_field *dword_length_field; /* <instruction> specific */
>>        uint32_t dw_length;
>> +   uint32_t bias; /* <instruction> specific */
>>      uint32_t group_offset, group_count;
>>      uint32_t group_size;
>>      bool variable; /* <group> specific */
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev




More information about the mesa-dev mailing list