vc4: Fix accidental dropping of the low bits of the store tilebuffer packet.
authorEric Anholt <eric@anholt.net>
Fri, 17 Oct 2014 11:14:11 +0000 (12:14 +0100)
committerEric Anholt <eric@anholt.net>
Fri, 17 Oct 2014 12:09:29 +0000 (13:09 +0100)
Notably this included the EOF flag (the other bits are the full buffer
dump selection, but we don't do full dumps), which caused the kernel
checking for frame completion to trigger.

src/gallium/drivers/vc4/kernel/vc4_validate.c

index fe2cd44d8e7fd7a2ccbda28e97279f9c3c07de7f..86b8fa5069af802609aa70f9a03284558dc0653e 100644 (file)
@@ -268,7 +268,7 @@ validate_loadstore_tile_buffer_general(VALIDATE_ARGS)
        uint32_t packet_b1 = *(uint8_t *)(untrusted + 1);
        struct drm_gem_cma_object *fbo;
        uint32_t buffer_type = packet_b0 & 0xf;
-       uint32_t offset, cpp;
+       uint32_t untrusted_address, offset, cpp;
 
        switch (buffer_type) {
        case VC4_LOADSTORE_TILE_BUFFER_NONE:
@@ -295,7 +295,8 @@ validate_loadstore_tile_buffer_general(VALIDATE_ARGS)
        if (!vc4_use_handle(exec, 0, VC4_MODE_RENDER, &fbo))
                return -EINVAL;
 
-       offset = *(uint32_t *)(untrusted + 2) & ~0xf;
+       untrusted_address = *(uint32_t *)(untrusted + 2);
+       offset = untrusted_address & ~0xf;
 
        if (!check_tex_size(exec, fbo, offset,
                            ((packet_b0 &
@@ -305,7 +306,8 @@ validate_loadstore_tile_buffer_general(VALIDATE_ARGS)
                return -EINVAL;
        }
 
-       *(uint32_t *)(validated + 2) = offset + fbo->paddr;
+       *(uint32_t *)(validated + 2) = (offset + fbo->paddr +
+                                       (untrusted_address & 0xf));
 
        return 0;
 }