diff --git a/.pick_status.json b/.pick_status.json index 3161dc3f216..0ec95afbd18 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -904,7 +904,7 @@ "description": "v3dv: avoid TFU reading unmapped pages beyond the end of the buffers", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "ca330f7f0464820a72d5a525a71276e9636dc611", "notes": null diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 09448f20f77..60aec07e2aa 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2202,9 +2202,13 @@ v3dv_AllocateMemory(VkDevice _device, assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); /* We always allocate device memory in multiples of a page, so round up - * requested size to that. + * requested size to that. We need to add a V3D_TFU_READHAEAD padding to + * avoid invalid reads done by the TFU unit after the end of the last page + * allocated. */ - const VkDeviceSize alloc_size = align64(pAllocateInfo->allocationSize, 4096); + + const VkDeviceSize alloc_size = align64(pAllocateInfo->allocationSize + + V3D_TFU_READAHEAD_SIZE, 4096); if (unlikely(alloc_size > MAX_MEMORY_ALLOCATION_SIZE)) return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index f95792aedc9..1ab0973da68 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -591,6 +591,11 @@ struct v3dv_device { struct util_dynarray device_address_bo_list; /* Array of struct v3dv_bo * */ }; +/* TFU has readhead of 64 bytes. So to avoid the unit reading unmaped memory + * it is needed to overallocate buffers that could be read by the TFU + */ +#define V3D_TFU_READAHEAD_SIZE 64 + struct v3dv_device_memory { struct vk_device_memory vk;