panvk: introduce panvk_get_gpu_page_size

This function returns the page size of the VM that we're using. The
GPU page size might be different from what the host process uses.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37288>
This commit is contained in:
Caterina Shablia 2025-09-09 22:49:31 +00:00 committed by Marge Bot
parent 19daf0c4b1
commit 2c5f88a074
3 changed files with 11 additions and 3 deletions

View file

@ -190,7 +190,7 @@ finish_subqueue_tracing(struct panvk_gpu_queue *queue,
struct panvk_subqueue *subq = &queue->subqueues[subqueue];
if (subq->tracebuf.addr.dev) {
size_t pgsize = getpagesize();
uint64_t pgsize = panvk_get_gpu_page_size(dev);
pandecode_inject_free(dev->debug.decode_ctx, subq->tracebuf.addr.dev,
subq->tracebuf.size);
@ -265,7 +265,7 @@ init_subqueue_tracing(struct panvk_gpu_queue *queue,
}
/* Add a guard page. */
size_t pgsize = getpagesize();
uint64_t pgsize = panvk_get_gpu_page_size(dev);
dev_addr = panvk_as_alloc(dev, subq->tracebuf.size + pgsize, pgsize);
if (!dev_addr)

View file

@ -151,6 +151,12 @@ panvk_device_adjust_bo_flags(const struct panvk_device *device,
return bo_flags;
}
static inline uint64_t
panvk_get_gpu_page_size(const struct panvk_device *device)
{
return (uint64_t)1 << (ffsll(device->kmod.vm->pgsize_bitmap) - 1);
}
static inline uint64_t
panvk_as_alloc(struct panvk_device *device, uint64_t size, uint64_t alignment)
{

View file

@ -23,6 +23,7 @@
*
*/
#include "panvk_device.h"
#include "panvk_mempool.h"
#include "panvk_priv_bo.h"
@ -55,7 +56,8 @@ panvk_bo_pool_cleanup(struct panvk_bo_pool *bo_pool)
static struct panvk_priv_bo *
panvk_pool_alloc_backing(struct panvk_pool *pool, size_t sz)
{
size_t bo_sz = ALIGN_POT(MAX2(pool->base.slab_size, sz), 4096);
size_t bo_sz = ALIGN_POT(MAX2(pool->base.slab_size, sz),
panvk_get_gpu_page_size(pool->dev));
struct panvk_priv_bo *bo = NULL;
/* If there's a free BO in our BO pool, let's pick it. */