mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 16:28:08 +02:00
broadcom/genxml: Check the sub-id field when decoding instructions.
VC5 introduces packet variants where the same opcode has behavior that is decided by a sub-id field in the early bits of the packet. Keep iterating over packets until we find the one with the matching sub-id.
This commit is contained in:
parent
14fe9fd3f7
commit
7c576d6091
1 changed files with 26 additions and 5 deletions
|
|
@ -356,8 +356,7 @@ create_field(struct parser_context *ctx, const char **atts)
|
|||
size *= 8;
|
||||
} else if (strcmp(atts[i], "type") == 0)
|
||||
field->type = string_to_type(ctx, atts[i + 1]);
|
||||
else if (strcmp(atts[i], "default") == 0 &&
|
||||
field->start >= 16 && field->end <= 31) {
|
||||
else if (strcmp(atts[i], "default") == 0) {
|
||||
field->has_default = true;
|
||||
field->default_value = strtoul(atts[i + 1], &p, 0);
|
||||
}
|
||||
|
|
@ -641,10 +640,32 @@ v3d_spec_load(const struct v3d_device_info *devinfo)
|
|||
struct v3d_group *
|
||||
v3d_spec_find_instruction(struct v3d_spec *spec, const uint8_t *p)
|
||||
{
|
||||
uint8_t opcode = *p;
|
||||
|
||||
for (int i = 0; i < spec->ncommands; i++) {
|
||||
uint8_t opcode = *p;
|
||||
if (opcode == spec->commands[i]->opcode)
|
||||
return spec->commands[i];
|
||||
struct v3d_group *group = spec->commands[i];
|
||||
|
||||
if (opcode != group->opcode)
|
||||
continue;
|
||||
|
||||
/* If there's a "sub-id" field, make sure that it matches the
|
||||
* instruction being decoded.
|
||||
*/
|
||||
struct v3d_field *subid = NULL;
|
||||
for (int j = 0; j < group->nfields; j++) {
|
||||
struct v3d_field *field = group->fields[j];
|
||||
if (strcmp(field->name, "sub-id") == 0) {
|
||||
subid = field;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (subid && (__gen_unpack_uint(p, subid->start, subid->end) !=
|
||||
subid->default_value)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue