From: Boris Brezillon <boris.brezillon@collabora.com>
To: "Boris Brezillon" <boris.brezillon@collabora.com>,
"Steven Price" <steven.price@arm.com>,
"Liviu Dudau" <liviu.dudau@arm.com>,
"Adrián Larumbe" <adrian.larumbe@collabora.com>
Cc: dri-devel@lists.freedesktop.org, kernel@collabora.com
Subject: Re: [PATCH v3] drm/panthor: Fix firmware initialization on systems with a page size > 4k
Date: Wed, 30 Oct 2024 16:38:45 +0100 [thread overview]
Message-ID: <20241030163845.1c8fc1e4@collabora.com> (raw)
In-Reply-To: <20241030150231.768949-1-boris.brezillon@collabora.com>
On Wed, 30 Oct 2024 16:02:31 +0100
Boris Brezillon <boris.brezillon@collabora.com> wrote:
> The system and GPU MMU page size might differ, which becomes a
> problem for FW sections that need to be mapped at explicit addresses
> since our PAGE_SIZE alignment might cover a VA range that's
> expected to be used for another section.
>
> Make sure we never map more than we need.
>
> Changes in v3:
> - Add R-bs
>
> Changes in v2:
> - Plan for per-VM page sizes so the MCU VM and user VM can
> have different pages sizes
>
> Fixes: 2718d91816ee ("drm/panthor: Add the FW logical block")
> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> Reviewed-by: Steven Price <steven.price@arm.com>
> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Queued to drm-misc-fixes.
> ---
> drivers/gpu/drm/panthor/panthor_fw.c | 4 ++--
> drivers/gpu/drm/panthor/panthor_gem.c | 11 ++++++++---
> drivers/gpu/drm/panthor/panthor_mmu.c | 16 +++++++++++++---
> drivers/gpu/drm/panthor/panthor_mmu.h | 1 +
> 4 files changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c
> index 631f639b8b86..ecca5565ce41 100644
> --- a/drivers/gpu/drm/panthor/panthor_fw.c
> +++ b/drivers/gpu/drm/panthor/panthor_fw.c
> @@ -500,6 +500,7 @@ static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
> struct panthor_fw_binary_iter *iter,
> u32 ehdr)
> {
> + ssize_t vm_pgsz = panthor_vm_page_size(ptdev->fw->vm);
> struct panthor_fw_binary_section_entry_hdr hdr;
> struct panthor_fw_section *section;
> u32 section_size;
> @@ -528,8 +529,7 @@ static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
> return -EINVAL;
> }
>
> - if ((hdr.va.start & ~PAGE_MASK) != 0 ||
> - (hdr.va.end & ~PAGE_MASK) != 0) {
> + if (!IS_ALIGNED(hdr.va.start, vm_pgsz) || !IS_ALIGNED(hdr.va.end, vm_pgsz)) {
> drm_err(&ptdev->base, "Firmware corrupted, virtual addresses not page aligned: 0x%x-0x%x\n",
> hdr.va.start, hdr.va.end);
> return -EINVAL;
> diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
> index c60b599665d8..8244a4e6c2a2 100644
> --- a/drivers/gpu/drm/panthor/panthor_gem.c
> +++ b/drivers/gpu/drm/panthor/panthor_gem.c
> @@ -44,8 +44,7 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo)
> to_panthor_bo(bo->obj)->exclusive_vm_root_gem != panthor_vm_root_gem(vm)))
> goto out_free_bo;
>
> - ret = panthor_vm_unmap_range(vm, bo->va_node.start,
> - panthor_kernel_bo_size(bo));
> + ret = panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size);
> if (ret)
> goto out_free_bo;
>
> @@ -95,10 +94,16 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
> }
>
> bo = to_panthor_bo(&obj->base);
> - size = obj->base.size;
> kbo->obj = &obj->base;
> bo->flags = bo_flags;
>
> + /* The system and GPU MMU page size might differ, which becomes a
> + * problem for FW sections that need to be mapped at explicit address
> + * since our PAGE_SIZE alignment might cover a VA range that's
> + * expected to be used for another section.
> + * Make sure we never map more than we need.
> + */
> + size = ALIGN(size, panthor_vm_page_size(vm));
> ret = panthor_vm_alloc_va(vm, gpu_va, size, &kbo->va_node);
> if (ret)
> goto err_put_obj;
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
> index aa12ed2acfcf..8ca85526491e 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -826,6 +826,14 @@ void panthor_vm_idle(struct panthor_vm *vm)
> mutex_unlock(&ptdev->mmu->as.slots_lock);
> }
>
> +u32 panthor_vm_page_size(struct panthor_vm *vm)
> +{
> + const struct io_pgtable *pgt = io_pgtable_ops_to_pgtable(vm->pgtbl_ops);
> + u32 pg_shift = ffs(pgt->cfg.pgsize_bitmap) - 1;
> +
> + return 1u << pg_shift;
> +}
> +
> static void panthor_vm_stop(struct panthor_vm *vm)
> {
> drm_sched_stop(&vm->sched, NULL);
> @@ -1025,12 +1033,13 @@ int
> panthor_vm_alloc_va(struct panthor_vm *vm, u64 va, u64 size,
> struct drm_mm_node *va_node)
> {
> + ssize_t vm_pgsz = panthor_vm_page_size(vm);
> int ret;
>
> - if (!size || (size & ~PAGE_MASK))
> + if (!size || !IS_ALIGNED(size, vm_pgsz))
> return -EINVAL;
>
> - if (va != PANTHOR_VM_KERNEL_AUTO_VA && (va & ~PAGE_MASK))
> + if (va != PANTHOR_VM_KERNEL_AUTO_VA && !IS_ALIGNED(va, vm_pgsz))
> return -EINVAL;
>
> mutex_lock(&vm->mm_lock);
> @@ -2366,11 +2375,12 @@ panthor_vm_bind_prepare_op_ctx(struct drm_file *file,
> const struct drm_panthor_vm_bind_op *op,
> struct panthor_vm_op_ctx *op_ctx)
> {
> + ssize_t vm_pgsz = panthor_vm_page_size(vm);
> struct drm_gem_object *gem;
> int ret;
>
> /* Aligned on page size. */
> - if ((op->va | op->size) & ~PAGE_MASK)
> + if (!IS_ALIGNED(op->va | op->size, vm_pgsz))
> return -EINVAL;
>
> switch (op->flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) {
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.h b/drivers/gpu/drm/panthor/panthor_mmu.h
> index 6788771071e3..8d21e83d8aba 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.h
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.h
> @@ -30,6 +30,7 @@ panthor_vm_get_bo_for_va(struct panthor_vm *vm, u64 va, u64 *bo_offset);
>
> int panthor_vm_active(struct panthor_vm *vm);
> void panthor_vm_idle(struct panthor_vm *vm);
> +u32 panthor_vm_page_size(struct panthor_vm *vm);
> int panthor_vm_as(struct panthor_vm *vm);
> int panthor_vm_flush_all(struct panthor_vm *vm);
>
prev parent reply other threads:[~2024-10-30 15:38 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-30 15:02 [PATCH v3] drm/panthor: Fix firmware initialization on systems with a page size > 4k Boris Brezillon
2024-10-30 15:38 ` Boris Brezillon [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241030163845.1c8fc1e4@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=adrian.larumbe@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=kernel@collabora.com \
--cc=liviu.dudau@arm.com \
--cc=steven.price@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.