From 1a0e7d18a20da670a656ba4fc19352ca2b90fca5 Mon Sep 17 00:00:00 2001 From: Caterina Shablia Date: Tue, 9 Sep 2025 23:03:13 +0000 Subject: [PATCH] pan/kmod,panvk: use uint64_t and not size_t for device sizes When the host process is 32-bit, size_t can not express all of the device address space. Note that there's still a lot of code that uses size_t for device sizes remaining. Cleaning that up is left for future MRs. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/lib/kmod/pan_kmod.c | 2 +- src/panfrost/lib/kmod/pan_kmod.h | 14 +++++++------- src/panfrost/lib/kmod/pan_kmod_backend.h | 2 +- src/panfrost/lib/kmod/panfrost_kmod.c | 8 ++++++-- src/panfrost/lib/kmod/panthor_kmod.c | 10 +++++----- src/panfrost/vulkan/csf/panvk_queue.h | 4 ++-- src/panfrost/vulkan/panvk_priv_bo.c | 2 +- src/panfrost/vulkan/panvk_priv_bo.h | 2 +- src/panfrost/vulkan/panvk_utrace.c | 2 +- 9 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/panfrost/lib/kmod/pan_kmod.c b/src/panfrost/lib/kmod/pan_kmod.c index b69e2efa380..a4370bb86d5 100644 --- a/src/panfrost/lib/kmod/pan_kmod.c +++ b/src/panfrost/lib/kmod/pan_kmod.c @@ -80,7 +80,7 @@ pan_kmod_dev_destroy(struct pan_kmod_dev *dev) struct pan_kmod_bo * pan_kmod_bo_alloc(struct pan_kmod_dev *dev, struct pan_kmod_vm *exclusive_vm, - size_t size, uint32_t flags) + uint64_t size, uint32_t flags) { struct pan_kmod_bo *bo; diff --git a/src/panfrost/lib/kmod/pan_kmod.h b/src/panfrost/lib/kmod/pan_kmod.h index bd887cf4d18..cd43c7765e3 100644 --- a/src/panfrost/lib/kmod/pan_kmod.h +++ b/src/panfrost/lib/kmod/pan_kmod.h @@ -125,7 +125,7 @@ struct pan_kmod_bo { int32_t refcnt; /* Size of the buffer object. */ - size_t size; + uint64_t size; /* Handle attached to the buffer object. */ uint32_t handle; @@ -295,7 +295,7 @@ struct pan_kmod_vm_op { uint64_t start; /* Size of the VA range */ - size_t size; + uint64_t size; } va; union { @@ -377,7 +377,7 @@ struct pan_kmod_ops { */ struct pan_kmod_bo *(*bo_alloc)(struct pan_kmod_dev *dev, struct pan_kmod_vm *exclusive_vm, - size_t size, uint32_t flags); + uint64_t size, uint32_t flags); /* Free buffer object. */ void (*bo_free)(struct pan_kmod_bo *bo); @@ -386,7 +386,7 @@ struct pan_kmod_ops { * Return NULL if the import fails for any reason. */ struct pan_kmod_bo *(*bo_import)(struct pan_kmod_dev *dev, uint32_t handle, - size_t size, uint32_t flags); + uint64_t size, uint32_t flags); /* Post export operations. * Return 0 on success, -1 otherwise. @@ -526,7 +526,7 @@ pan_kmod_dev_get_user_priv(struct pan_kmod_dev *dev) struct pan_kmod_bo *pan_kmod_bo_alloc(struct pan_kmod_dev *dev, struct pan_kmod_vm *exclusive_vm, - size_t size, uint32_t flags); + uint64_t size, uint32_t flags); static inline struct pan_kmod_bo * pan_kmod_bo_get(struct pan_kmod_bo *bo) @@ -616,7 +616,7 @@ pan_kmod_bo_mmap(struct pan_kmod_bo *bo, off_t bo_offset, size_t size, int prot, { off_t mmap_offset; - if (bo_offset + size > bo->size) + if ((uint64_t)bo_offset + (uint64_t)size > bo->size) return MAP_FAILED; mmap_offset = bo->dev->ops->bo_get_mmap_offset(bo); @@ -639,7 +639,7 @@ pan_kmod_set_bo_label(struct pan_kmod_dev *dev, struct pan_kmod_bo *bo, const ch dev->ops->bo_set_label(dev, bo, label); } -static inline size_t +static inline uint64_t pan_kmod_bo_size(struct pan_kmod_bo *bo) { return bo->size; diff --git a/src/panfrost/lib/kmod/pan_kmod_backend.h b/src/panfrost/lib/kmod/pan_kmod_backend.h index 64f7214f868..f05f7fe62e8 100644 --- a/src/panfrost/lib/kmod/pan_kmod_backend.h +++ b/src/panfrost/lib/kmod/pan_kmod_backend.h @@ -75,7 +75,7 @@ pan_kmod_dev_free(const struct pan_kmod_dev *dev, void *data) static inline void pan_kmod_bo_init(struct pan_kmod_bo *bo, struct pan_kmod_dev *dev, - struct pan_kmod_vm *exclusive_vm, size_t size, uint32_t flags, + struct pan_kmod_vm *exclusive_vm, uint64_t size, uint32_t flags, uint32_t handle) { bo->dev = dev; diff --git a/src/panfrost/lib/kmod/panfrost_kmod.c b/src/panfrost/lib/kmod/panfrost_kmod.c index 2df3050984a..ddad31568b8 100644 --- a/src/panfrost/lib/kmod/panfrost_kmod.c +++ b/src/panfrost/lib/kmod/panfrost_kmod.c @@ -237,9 +237,13 @@ to_panfrost_bo_flags(struct pan_kmod_dev *dev, uint32_t flags) static struct pan_kmod_bo * panfrost_kmod_bo_alloc(struct pan_kmod_dev *dev, - struct pan_kmod_vm *exclusive_vm, size_t size, + struct pan_kmod_vm *exclusive_vm, uint64_t size, uint32_t flags) { + /* The ioctl uses u32 for size. */ + if ((uint64_t)(uint32_t)size != size) + return NULL; + /* We can't map GPU uncached. */ if (flags & PAN_KMOD_BO_FLAG_GPU_UNCACHED) return NULL; @@ -276,7 +280,7 @@ panfrost_kmod_bo_free(struct pan_kmod_bo *bo) } static struct pan_kmod_bo * -panfrost_kmod_bo_import(struct pan_kmod_dev *dev, uint32_t handle, size_t size, +panfrost_kmod_bo_import(struct pan_kmod_dev *dev, uint32_t handle, uint64_t size, uint32_t flags) { struct panfrost_kmod_bo *panfrost_bo = diff --git a/src/panfrost/lib/kmod/panthor_kmod.c b/src/panfrost/lib/kmod/panthor_kmod.c index 3dae874a8b5..86cfc73a216 100644 --- a/src/panfrost/lib/kmod/panthor_kmod.c +++ b/src/panfrost/lib/kmod/panthor_kmod.c @@ -38,7 +38,7 @@ struct panthor_kmod_va_collect { uint64_t va; /* Size of the VA range to release. */ - size_t size; + uint64_t size; }; struct panthor_kmod_vm { @@ -331,7 +331,7 @@ to_panthor_bo_flags(uint32_t flags) static struct pan_kmod_bo * panthor_kmod_bo_alloc(struct pan_kmod_dev *dev, - struct pan_kmod_vm *exclusive_vm, size_t size, + struct pan_kmod_vm *exclusive_vm, uint64_t size, uint32_t flags) { /* We don't support allocating on-fault. */ @@ -400,7 +400,7 @@ panthor_kmod_bo_free(struct pan_kmod_bo *bo) } static struct pan_kmod_bo * -panthor_kmod_bo_import(struct pan_kmod_dev *dev, uint32_t handle, size_t size, +panthor_kmod_bo_import(struct pan_kmod_dev *dev, uint32_t handle, uint64_t size, uint32_t flags) { struct panthor_kmod_bo *panthor_bo = @@ -820,7 +820,7 @@ panthor_kmod_vm_destroy(struct pan_kmod_vm *vm) } static uint64_t -panthor_kmod_vm_alloc_va(struct panthor_kmod_vm *panthor_vm, size_t size) +panthor_kmod_vm_alloc_va(struct panthor_kmod_vm *panthor_vm, uint64_t size) { uint64_t va; @@ -837,7 +837,7 @@ panthor_kmod_vm_alloc_va(struct panthor_kmod_vm *panthor_vm, size_t size) static void panthor_kmod_vm_free_va(struct panthor_kmod_vm *panthor_vm, uint64_t va, - size_t size) + uint64_t size) { assert(panthor_vm->base.flags & PAN_KMOD_VM_FLAG_AUTO_VA); diff --git a/src/panfrost/vulkan/csf/panvk_queue.h b/src/panfrost/vulkan/csf/panvk_queue.h index cf05e22487d..d336550baf3 100644 --- a/src/panfrost/vulkan/csf/panvk_queue.h +++ b/src/panfrost/vulkan/csf/panvk_queue.h @@ -46,7 +46,7 @@ struct panvk_subqueue { struct { struct pan_kmod_bo *bo; - size_t size; + uint64_t size; struct { uint64_t dev; void *host; @@ -57,7 +57,7 @@ struct panvk_subqueue { struct panvk_desc_ringbuf { struct panvk_priv_mem syncobj; struct pan_kmod_bo *bo; - size_t size; + uint64_t size; struct { uint64_t dev; void *host; diff --git a/src/panfrost/vulkan/panvk_priv_bo.c b/src/panfrost/vulkan/panvk_priv_bo.c index 27935d4f39c..86f5ba9e81b 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.c +++ b/src/panfrost/vulkan/panvk_priv_bo.c @@ -16,7 +16,7 @@ #include "genxml/decode.h" VkResult -panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, +panvk_priv_bo_create(struct panvk_device *dev, uint64_t size, uint32_t flags, VkSystemAllocationScope scope, struct panvk_priv_bo **out) { VkResult result; diff --git a/src/panfrost/vulkan/panvk_priv_bo.h b/src/panfrost/vulkan/panvk_priv_bo.h index 576bb99a84b..805c791e188 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.h +++ b/src/panfrost/vulkan/panvk_priv_bo.h @@ -25,7 +25,7 @@ struct panvk_priv_bo { } addr; }; -VkResult panvk_priv_bo_create(struct panvk_device *dev, size_t size, +VkResult panvk_priv_bo_create(struct panvk_device *dev, uint64_t size, uint32_t flags, VkSystemAllocationScope scope, struct panvk_priv_bo **out); diff --git a/src/panfrost/vulkan/panvk_utrace.c b/src/panfrost/vulkan/panvk_utrace.c index 87e323526d3..943b79e5a7e 100644 --- a/src/panfrost/vulkan/panvk_utrace.c +++ b/src/panfrost/vulkan/panvk_utrace.c @@ -36,7 +36,7 @@ panvk_utrace_create_buffer(struct u_trace_context *utctx, uint64_t size_B) if (!addr_dev) { mesa_loge("Couldn't allocate utrace buffer (size = 0x%" PRIx64 ")." - "Provide larger PANVK_UTRACE_CLONE_MEM_SIZE (current = 0x%zx)", + "Provide larger PANVK_UTRACE_CLONE_MEM_SIZE (current = 0x%" PRIx64 ")", size_B, dev->utrace.copy_buf_heap_bo->bo->size); return NULL; }