From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=148.251.105.195 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1792572289; b=tpDpB75E0Zpnm3dQyaX4Tf/VPaVCAXSSDvD9nw4N0HD55yKdWbdVDOnjXAoWJxqVzGLM Gg0rAwFyiVfLU5JGML2emR/gl2hQLzXwJ5nenGdenv4ZqGurQjfN+A6TvBe60eKopnpAq lC8fkTpZV1z3xaidklU91VCcxBInGHr3yqol1SFnM86pmIybmhMSa5o/5Z1WtaVyEZtW2 lpmZfXntMUZ8KSRI7QEf0VOkVvrSj/hhXd/JEWx16fL2IU6p6p+dvXAauhmU1OqguKqKS Rv3zxgwtYIeF9qYatFPhlEFt0ybf5SCe3Xvuzo6A+BpD4yjLw9D1akwJ0kr5dqwG6rQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1792572289; h=DMARC-Filter:DKIM-Signature:Received:Date:From:To:Cc:Subject: Message-ID:In-Reply-To:References:Organization:X-Mailer:MIME-Version: Content-Type:Content-Transfer-Encoding; bh=A8X1BgCOWdy5KOEut5tFWy73nN4PDRXXVMpSL+fBvc8=; b=bhn7YKaPDGfDI0GeI6Wk+VYlPNUwy5d25vGG1oY1Qw65JGEvKfuhCx2lQrwGoOcfLw9j Gfdv1W8RAwjRZgjp0Ndgn4sq3L4YnqRS+p0I+c0Nrj9Q1RyKY3F9YzQ760O9fh0DMJGTQ mo33qMLVWcxnew+Yc1IehEDSq0jydopYQXn/gUoNqP6fasR1xj5rDKWH7OAcIf28rpr2R ES/Ww0eX5j/YpqQWwwn9rN5e2DN8/y15D/DT7DwkM10xhcUiCdviMwWkqdovfAqqyWiOY Lj+XP4S5p6xuSz1pBT0nVu1lugGLVFKnE9blEcDj+BqL3cBUi69WF7XlRJWyXUOfYmQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass header.d=collabora.com header.i=@collabora.com header.a=rsa-sha256 header.s=mail header.b=fq6kfxwp; arc=none smtp.remote-ip=148.251.105.195 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F13B606A325 for ; Wed, 21 Oct 2026 08:44:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 4F13B606A325 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=collabora.com header.i=@collabora.com header.a=rsa-sha256 header.s=mail header.b=fq6kfxwp DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1792572286; bh=fYxOwjQv5dtVvmyu01w7Ou5Z1hdzbvQOEdZ2sXgi+ow=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=fq6kfxwpSaRJzytwbRPqgmuwsvKUt+bY0HHHBNExk9ZeouSbQKwnR4aPKeUrcPlOG LtZ+SSNIqWcUFmox8STCbLPsFtiCXGnIkZ3nnqZwrcMthD+bXfGMc0egZC2qw1HumE AiTDZHDnTRXL60KUAx2jOKyVVGmELc1bDWqUt417lnb3zMbhVUj8Qy9wt6fC2TgRP+ AtNaEyj1xBR48APlaIS8PPZV4Yu4KJY7jfcz0IltT1jFgfAIsU4jDjFKsCuXqLI7oA 25pSDapnkofhvxzOei2MGQgpRZf0jeqSseAI9bPZsHLiXPwNaqk1Lmj8UwGzsivG8L OznEEa+XP1dug== Received: from fedora-21.home (unknown [100.64.0.11]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange secp256r1 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by bali.collaboradmins.com (Postfix) with ESMTPSA id F262217E0411; Wed, 21 Oct 2026 10:44:45 +0200 (CEST) Date: Wed, 21 Oct 2026 10:44:37 +0200 From: Boris Brezillon To: Ketil Johnsen Cc: Steven Price , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Daniel Almeida , Alice Ryhl , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 09/12] drm/panthor: Create kernel BO from existing GEM Message-ID: <20261021104437.31382be7@fedora-21.home> In-Reply-To: <20261012125940.3291951-10-ketil.johnsen@arm.com> References: <20261012125940.3291951-1-ketil.johnsen@arm.com> <20261012125940.3291951-10-ketil.johnsen@arm.com> Organization: Collabora X-Mailer: Claws Mail 4.4.0 (GTK 3.24.52; x86_64-redhat-linux-gnu) X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Mon, 12 Oct 2026 14:59:37 +0200 Ketil Johnsen wrote: > From: Boris Brezillon > > Refactors/splits existing panthor_kernel_bo_create(). > Adds panthor_kernel_bo_create_from_gem() so we can create kernel BOs > from imported protected memory in future change. > > Signed-off-by: Boris Brezillon > Co-developed-by: Ketil Johnsen > Signed-off-by: Ketil Johnsen > > --- > > v4: > - First version of this change as a separate commit > --- > drivers/gpu/drm/panthor/panthor_gem.c | 94 ++++++++++++++++++--------- > drivers/gpu/drm/panthor/panthor_gem.h | 7 ++ > 2 files changed, 71 insertions(+), 30 deletions(-) > > diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c > index 2e39a32fcd673..f1939b4aafed1 100644 > --- a/drivers/gpu/drm/panthor/panthor_gem.c > +++ b/drivers/gpu/drm/panthor/panthor_gem.c > @@ -1033,7 +1033,6 @@ panthor_gem_create(struct drm_device *dev, size_t size, uint32_t flags, > bo->base.resv = bo->exclusive_vm_root_gem->resv; > } > > - panthor_gem_debugfs_add_usage_flags(bo, usage_flags); > panthor_gem_debugfs_bo_add(bo); > return bo; > > @@ -1260,7 +1259,9 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo) > panthor_kernel_bo_vunmap(bo); > > drm_WARN_ON(bo->obj->dev, > - to_panthor_bo(bo->obj)->exclusive_vm_root_gem != panthor_vm_root_gem(vm)); > + to_panthor_bo(bo->obj)->exclusive_vm_root_gem && > + (to_panthor_bo(bo->obj)->exclusive_vm_root_gem != > + panthor_vm_root_gem(vm))); Let's create local vars so this can all fit on a single line. > panthor_vm_unmap_range(vm, bo->va_node.start, bo->va_node.size); > panthor_vm_free_va(vm, &bo->va_node); > if (vm == panthor_fw_vm(ptdev)) > @@ -1271,46 +1272,33 @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo) > } > > /** > - * panthor_kernel_bo_create() - Create and map a GEM object to a VM > + * panthor_kernel_bo_create_from_gem() - Create kernel BO from existing GEM object > * @ptdev: Device. > * @vm: VM to map the GEM to. > - * @size: Size of the buffer object. > - * @bo_flags: Combination of drm_panthor_bo_flags flags. > + * @bo: BO to use for our kernel BO. > * @vm_map_flags: Combination of drm_panthor_vm_bind_op_flags (only those > * that are related to map operations). > * @gpu_va: GPU address assigned when mapping to the VM. > * If gpu_va == PANTHOR_VM_KERNEL_AUTO_VA, the virtual address will be > * automatically allocated. > - * @name: Descriptive label of the BO's contents > + * @vm_map_size: Size of the BO to map to the VM. > * > * Return: A valid pointer in case of success, an ERR_PTR() otherwise. > */ > struct panthor_kernel_bo * > -panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, > - size_t size, u32 bo_flags, u32 vm_map_flags, > - u64 gpu_va, const char *name) > +panthor_kernel_bo_create_from_gem(struct panthor_device *ptdev, > + struct panthor_vm *vm, > + struct panthor_gem_object *bo, > + u32 vm_map_flags, u64 gpu_va, u32 vm_map_size) > { > struct panthor_kernel_bo *kbo; > - struct panthor_gem_object *bo; > - u32 debug_flags = PANTHOR_DEBUGFS_GEM_USAGE_FLAG_KERNEL; > int ret; > > - if (drm_WARN_ON(&ptdev->base, !vm)) > - return ERR_PTR(-EINVAL); > - > kbo = kzalloc_obj(*kbo); > if (!kbo) > return ERR_PTR(-ENOMEM); > > - if (vm == panthor_fw_vm(ptdev)) > - debug_flags |= PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED; > - > - bo = panthor_gem_create(&ptdev->base, size, bo_flags, vm, debug_flags); > - if (IS_ERR(bo)) { > - ret = PTR_ERR(bo); > - goto err_free_kbo; > - } > - > + drm_gem_object_get(&bo->base); > kbo->obj = &bo->base; > > if (vm == panthor_fw_vm(ptdev)) { > @@ -1319,24 +1307,27 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, > goto err_put_obj; > } > > - panthor_gem_kernel_bo_set_label(kbo, name); > - > /* 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); > + vm_map_size = ALIGN(vm_map_size, panthor_vm_page_size(vm)); > + ret = panthor_vm_alloc_va(vm, gpu_va, vm_map_size, &kbo->va_node); > if (ret) > goto err_unpin; > > - ret = panthor_vm_map_bo_range(vm, bo, 0, size, kbo->va_node.start, vm_map_flags); > + ret = panthor_vm_map_bo_range(vm, bo, 0, vm_map_size, > + kbo->va_node.start, vm_map_flags); > if (ret) > goto err_free_va; > > kbo->vm = panthor_vm_get(vm); > + if (vm == panthor_fw_vm(ptdev)) > + panthor_gem_debugfs_add_usage_flags( > + bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED); if (vm == panthor_fw_vm(ptdev)) { panthor_gem_debugfs_add_usage_flags(bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_FW_MAPPED); } > + > return kbo; > > err_free_va: > @@ -1348,12 +1339,55 @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, > > err_put_obj: > drm_gem_object_put(&bo->base); > - > -err_free_kbo: > kfree(kbo); > return ERR_PTR(ret); > } > > +/** > + * panthor_kernel_bo_create() - Create and map a GEM object to a VM > + * @ptdev: Device. > + * @vm: VM to map the GEM to. > + * @size: Size of the buffer object. > + * @bo_flags: Combination of drm_panthor_bo_flags flags. > + * @vm_map_flags: Combination of drm_panthor_vm_bind_op_flags (only those > + * that are related to map operations). > + * @gpu_va: GPU address assigned when mapping to the VM. > + * If gpu_va == PANTHOR_VM_KERNEL_AUTO_VA, the virtual address will be > + * automatically allocated. > + * @name: Descriptive label of the BO's contents > + * > + * Return: A valid pointer in case of success, an ERR_PTR() otherwise. > + */ > +struct panthor_kernel_bo * > +panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, > + size_t size, u32 bo_flags, u32 vm_map_flags, > + u64 gpu_va, const char *name) > +{ > + struct panthor_kernel_bo *kbo; > + struct panthor_gem_object *bo; > + > + if (drm_WARN_ON(&ptdev->base, !vm)) > + return ERR_PTR(-EINVAL); > + > + bo = panthor_gem_create(&ptdev->base, size, bo_flags, vm, 0); > + if (IS_ERR(bo)) > + return ERR_CAST(bo); > + > + kbo = panthor_kernel_bo_create_from_gem(ptdev, vm, bo, vm_map_flags, > + gpu_va, size); > + if (!IS_ERR(kbo)) { > + panthor_gem_debugfs_add_usage_flags( > + bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_KERNEL); panthor_gem_debugfs_add_usage_flags(bo, PANTHOR_DEBUGFS_GEM_USAGE_FLAG_KERNEL); > + panthor_gem_kernel_bo_set_label(kbo, name); > + } > + > + /* panthor_kernel_bo_create_from_gem() acquires a GEM ref if the import > + * succeeds, so we can release it unconditionally here. > + */ > + drm_gem_object_put(&bo->base); > + return kbo; > +} > + > /** > * panthor_dummy_bo_create() - Create a Panthor BO meant to back sparse bindings. > * @ptdev: Device. > diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h > index 4da3f59693ce4..03dd3927b5d16 100644 > --- a/drivers/gpu/drm/panthor/panthor_gem.h > +++ b/drivers/gpu/drm/panthor/panthor_gem.h > @@ -318,6 +318,13 @@ panthor_kernel_bo_vunmap(struct panthor_kernel_bo *bo) > } > } > > +struct panthor_kernel_bo * > +panthor_kernel_bo_create_from_gem(struct panthor_device *ptdev, > + struct panthor_vm *vm, > + struct panthor_gem_object *bo, > + u32 vm_map_flags, u64 gpu_va, > + u32 vm_map_size); > + > struct panthor_kernel_bo * > panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, > size_t size, u32 bo_flags, u32 vm_map_flags,