[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