pan/decode: Validate AFBC fields are zero when AFBC is disabled

There is no "chunknown" structure; that part of the union is an artefact
from falsely believing vertex/tiler MFBDs could have render targets
attached (they can't). These are just plain old AFBC fields, and if
there is no AFBC, it's error to set these field.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Alyssa Rosenzweig 2019-08-20 11:06:07 -07:00
parent 4aeb694462
commit c9b6233558
2 changed files with 19 additions and 32 deletions

View file

@ -1522,27 +1522,21 @@ struct bifrost_render_target {
u64 zero1;
union {
struct {
/* Stuff related to ARM Framebuffer Compression. When AFBC is enabled,
* there is an extra metadata buffer that contains 16 bytes per tile.
* The framebuffer needs to be the same size as before, since we don't
* know ahead of time how much space it will take up. The
* framebuffer_stride is set to 0, since the data isn't stored linearly
* anymore.
*/
struct {
/* Stuff related to ARM Framebuffer Compression. When AFBC is enabled,
* there is an extra metadata buffer that contains 16 bytes per tile.
* The framebuffer needs to be the same size as before, since we don't
* know ahead of time how much space it will take up. The
* framebuffer_stride is set to 0, since the data isn't stored linearly
* anymore.
*
* When AFBC is disabled, these fields are zero.
*/
mali_ptr metadata;
u32 stride; // stride in units of tiles
u32 unk; // = 0x20000
} afbc;
struct {
/* Heck if I know */
u64 unk;
mali_ptr pointer;
} chunknown;
};
mali_ptr metadata;
u32 stride; // stride in units of tiles
u32 unk; // = 0x20000
} afbc;
mali_ptr framebuffer;

View file

@ -818,18 +818,11 @@ pandecode_render_target(uint64_t gpu_va, unsigned job_no, const struct bifrost_f
pandecode_indent--;
pandecode_log("},\n");
} else {
pandecode_log(".chunknown = {\n");
pandecode_indent++;
pandecode_prop("unk = 0x%" PRIx64, rt->chunknown.unk);
char *a = pointer_as_memory_reference(rt->chunknown.pointer);
pandecode_prop("pointer = %s", a);
free(a);
pandecode_indent--;
pandecode_log("},\n");
} else if (rt->afbc.metadata || rt->afbc.stride || rt->afbc.unk) {
pandecode_msg("XXX: AFBC disabled but AFBC field set (0x%lX, 0x%x, 0x%x)\n",
rt->afbc.metadata,
rt->afbc.stride,
rt->afbc.unk);
}
MEMORY_PROP(rt, framebuffer);