From nobody Sun Jun 21 14:00:00 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9AA2335E94F for ; Fri, 3 Apr 2026 19:28:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244495; cv=pass; b=P0C58PqoaBQXWwofyh79BucHb/DVpENvi1DKu/ngxyC0HezF0L+3OBhxuBWWtpnUzWaBDPyjgH0ec1KRYbjfpepMD6jP/GkA7DrYKCwV1Yi0OcT/XcXJw2D2BgQew1+fusYtqjCaP6jZ2E1lND+rxgJO97Cegh9/zQ3fUneljgA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244495; c=relaxed/simple; bh=nXFixdTTyXA2+H2TWsxZMh+Ev8knTbhmDT8IS7WJf/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=nUiUBb6iDGzWH4Z28VqNI2KtRsQnwCZ13zvug+BTlkKaN84bu997lNCEIZUKorMZnwvSXVlJUFdsCzmTJXG2U3sCqnE1BBYOLsV+eC0GFFrHoTmqrka2Vy9p5RY2WPK5snmYZhkLbEOM5LlkItEI/CXonvfqlyuPpX5h1c5h+xM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b=NIugsFIA; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="NIugsFIA" ARC-Seal: i=1; a=rsa-sha256; t=1775244478; cv=none; d=zohomail.com; s=zohoarc; b=E9YUmtTUsk9DE6rHCu8HpTTcC+fOqgMaOfDMZEN3MxnY768hneUOWWTtz2H7cX65yhT1OgioDl8qJO3saOfehO4HNSGA5Uac6bLne1plTCVhEQw6Kbf34Fh3SqC4OHdeIsKzQbVUIHbmv+uN68Gu0x0mILIWWO4gp+7pmzcLE3k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775244478; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=DPQJ1kO3XaJTraRgXmq4KjPxJ79Qcr/xdHUBczXdLFg=; b=KW4UpALGFI4MZbV225ajON0RXcI0H7R0Pugw2LRutQLxOSDpwnCn7n5RInLV2N7NpQ8Bz8qMzzGzOSYeh6G6WEYgLc+1SzuXlKylKznMyp95L+QtjZfLysenFiUsIrK6HM/QV/TM8simzAA5VXt4NRtkKsijMnvZGV4ZHchkBRg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1775244478; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=DPQJ1kO3XaJTraRgXmq4KjPxJ79Qcr/xdHUBczXdLFg=; b=NIugsFIA3+jQK4s6msJUNaxX3lRZ3wVLm3tzLROi0AYdB5OfywZL1nzlntpkd8Lf BmY4XnIIpmEFERCGu3I94Ve02Zqtp/Sz0Tiyfg0DFbxVMRsQLa1vO+GAawYpI5kUX8w cjglvMrSvF5RakCuaqmoTyxIKJ2TD74nzQK9GI0s= Received: by mx.zohomail.com with SMTPS id 1775244477373939.8573886410505; Fri, 3 Apr 2026 12:27:57 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Steven Price , Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Daniel Almeida , Alice Ryhl Subject: [PATCH v6 1/4] drm/panthor: Expose GPU page sizes to UM Date: Fri, 3 Apr 2026 20:27:26 +0100 Message-ID: <20260403192743.3572062-2-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403192743.3572062-1-adrian.larumbe@collabora.com> References: <20260403192743.3572062-1-adrian.larumbe@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable In future commits that will implement repeated mappings, only repeat values multiple of GPU page sizes will be tolerated. That means these values must be made known to UM. Do it through a queriable GPU info value. Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panthor/panthor_device.h | 3 +++ drivers/gpu/drm/panthor/panthor_drv.c | 8 ++++++++ drivers/gpu/drm/panthor/panthor_mmu.c | 9 ++++++++- include/uapi/drm/panthor_drm.h | 13 +++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/pan= thor/panthor_device.h index 5cba272f9b4d..d856a4fe1d61 100644 --- a/drivers/gpu/drm/panthor/panthor_device.h +++ b/drivers/gpu/drm/panthor/panthor_device.h @@ -158,6 +158,9 @@ struct panthor_device { /** @csif_info: Command stream interface information. */ struct drm_panthor_csif_info csif_info; =20 + /** @mmu_info: MMU info */ + struct drm_panthor_mmu_info mmu_info; + /** @hw: GPU-specific data. */ struct panthor_hw *hw; =20 diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index 73fc983dc9b4..a8090bc4e33c 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -175,6 +175,7 @@ panthor_get_uobj_array(const struct drm_panthor_obj_arr= ay *in, u32 min_stride, _Generic(_obj_name, \ PANTHOR_UOBJ_DECL(struct drm_panthor_gpu_info, tiler_present), \ PANTHOR_UOBJ_DECL(struct drm_panthor_csif_info, pad), \ + PANTHOR_UOBJ_DECL(struct drm_panthor_mmu_info, page_size_bitmap), \ PANTHOR_UOBJ_DECL(struct drm_panthor_timestamp_info, current_timestamp)= , \ PANTHOR_UOBJ_DECL(struct drm_panthor_group_priorities_info, pad), \ PANTHOR_UOBJ_DECL(struct drm_panthor_sync_op, timeline_value), \ @@ -946,6 +947,10 @@ static int panthor_ioctl_dev_query(struct drm_device *= ddev, void *data, struct d args->size =3D sizeof(ptdev->csif_info); return 0; =20 + case DRM_PANTHOR_DEV_QUERY_MMU_INFO: + args->size =3D sizeof(ptdev->mmu_info); + return 0; + case DRM_PANTHOR_DEV_QUERY_TIMESTAMP_INFO: args->size =3D sizeof(timestamp_info); return 0; @@ -966,6 +971,9 @@ static int panthor_ioctl_dev_query(struct drm_device *d= dev, void *data, struct d case DRM_PANTHOR_DEV_QUERY_CSIF_INFO: return PANTHOR_UOBJ_SET(args->pointer, args->size, ptdev->csif_info); =20 + case DRM_PANTHOR_DEV_QUERY_MMU_INFO: + return PANTHOR_UOBJ_SET(args->pointer, args->size, ptdev->mmu_info); + case DRM_PANTHOR_DEV_QUERY_TIMESTAMP_INFO: ret =3D copy_struct_from_user(×tamp_info, sizeof(timestamp_info), diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 2b96359d3b94..880c8c4cca17 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -2763,7 +2763,7 @@ panthor_vm_create(struct panthor_device *ptdev, bool = for_mcu, refcount_set(&vm->as.active_cnt, 0); =20 pgtbl_cfg =3D (struct io_pgtable_cfg) { - .pgsize_bitmap =3D SZ_4K | SZ_2M, + .pgsize_bitmap =3D ptdev->mmu_info.page_size_bitmap, .ias =3D va_bits, .oas =3D pa_bits, .coherent_walk =3D ptdev->coherent, @@ -3208,6 +3208,11 @@ static void panthor_mmu_release_wq(struct drm_device= *ddev, void *res) destroy_workqueue(res); } =20 +static void panthor_mmu_info_init(struct panthor_device *ptdev) +{ + ptdev->mmu_info.page_size_bitmap =3D SZ_4K | SZ_2M; +} + /** * panthor_mmu_init() - Initialize the MMU logic. * @ptdev: Device. @@ -3220,6 +3225,8 @@ int panthor_mmu_init(struct panthor_device *ptdev) struct panthor_mmu *mmu; int ret, irq; =20 + panthor_mmu_info_init(ptdev); + mmu =3D drmm_kzalloc(&ptdev->base, sizeof(*mmu), GFP_KERNEL); if (!mmu) return -ENOMEM; diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h index 0e455d91e77d..dc2704fc2829 100644 --- a/include/uapi/drm/panthor_drm.h +++ b/include/uapi/drm/panthor_drm.h @@ -246,6 +246,9 @@ enum drm_panthor_dev_query_type { /** @DRM_PANTHOR_DEV_QUERY_CSIF_INFO: Query command-stream interface info= rmation. */ DRM_PANTHOR_DEV_QUERY_CSIF_INFO, =20 + /** @DRM_PANTHOR_DEV_QUERY_MMU_INFO: Query MMU information. */ + DRM_PANTHOR_DEV_QUERY_MMU_INFO, + /** @DRM_PANTHOR_DEV_QUERY_TIMESTAMP_INFO: Query timestamp information. */ DRM_PANTHOR_DEV_QUERY_TIMESTAMP_INFO, =20 @@ -487,6 +490,16 @@ struct drm_panthor_timestamp_info { __u64 cpu_timestamp_nsec; }; =20 +/** + * struct drm_panthor_mmu_info - MMU information + * + * Structure grouping all queryable information relating to the MMU. + */ +struct drm_panthor_mmu_info { + /** @page_size_bitmap: Allowed page sizes */ + __u64 page_size_bitmap; +}; + /** * struct drm_panthor_group_priorities_info - Group priorities information * --=20 2.53.0 From nobody Sun Jun 21 14:00:00 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CEF083D523F for ; Fri, 3 Apr 2026 19:28:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244499; cv=pass; b=Ldv9MISLidS9v7mht14kG0/i92X6hG3utsK7LLf4BfbP+YhRQzY5rc6qfWNZztJKBD0GMeNyRPY3ZkhXO+FxQTbuTjglE2QP+2zHKCZ7SuIiPX5acv2LzbaYZ+UuM7gGSNgWEsbWecFrWUH3YkiWLNZDxN/Bjyis+VlEo/yLz+o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244499; c=relaxed/simple; bh=V0e2Wuyn6l2VgQBgFo8hHJKn2iu2Is+Kb8Qo+dqMK1g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=J490L2dwr4XdVel314cZqmdWL+mgBRs7Tc5pGTbDoUnWjaNsGKiDak1XQYoEjgCKK2o2VW5nKHaHJL6oYH6U5G8OEZuqO1PkhvlPnwFLVg2No4xMn8Gfr9v028hrObViD5AGlGUvPl4D9uFT5A9MXCud8AKeXQBJAdiTqSThIo0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b=k0KUxcIH; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="k0KUxcIH" ARC-Seal: i=1; a=rsa-sha256; t=1775244482; cv=none; d=zohomail.com; s=zohoarc; b=REQ2LUkaGu5CrGw6RvteVD4XrR0FgoHb975hfInSMtssAHj16RutZaIpeWX6Pma9pjMlUFrn5JOvrTrrEuAN19gLRChJQRLcj+57ozXh/cSs5EVOUhOwzOs97SIFw5oN0OxcbLxTsYIeh0jlO4Pt911CgOZAyyfze2v0PZw2kVs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775244482; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=n8yJPWTwbSrHTD8heN6sOvCNS1lzvI+WkfRiFuTAyCA=; b=laqSTuBDScA++G5D+KZ6hWFGMFtWnPfttaPt2tHINOrC/U7ptU6ulLOxDYJH0OplESDsO9ttKhdwl/Jjd59nGVEJ3/wFV0i2AQIQDsQb8KQ49giHBEc1GzYFBYi308B9NvWulHUgMTVO6uSawFEeBuuEJhl4ryNul1s3rdIBzq4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1775244482; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=n8yJPWTwbSrHTD8heN6sOvCNS1lzvI+WkfRiFuTAyCA=; b=k0KUxcIHHJ3HaKs/5LuxfQ4l9uMeHaYvIKJkS7X56TFTE1Np3Li377NdwcMeyQes G0SGQSeIMuus/zkvtPolDCtQWaEahZj33wpqlThOMRDT4CpotlJRFtpfBkBmKKmGM9s KdVwc489lS5dx5NHyt3g54+zgJBA1KiWWzRMsAGk= Received: by mx.zohomail.com with SMTPS id 1775244480378924.0601221764704; Fri, 3 Apr 2026 12:28:00 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Steven Price , Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH v6 2/4] drm/panthor: Pass vm_bind_op to vm_prepare_map_op_ctx Date: Fri, 3 Apr 2026 20:27:27 +0100 Message-ID: <20260403192743.3572062-3-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403192743.3572062-1-adrian.larumbe@collabora.com> References: <20260403192743.3572062-1-adrian.larumbe@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Instead of passing its constituent elements, pass the whole struct to simplify the function prototype. Signed-off-by: Adri=C3=A1n Larumbe Reviewed-by: Liviu Dudau --- drivers/gpu/drm/panthor/panthor_mmu.c | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 880c8c4cca17..10da2f021d9d 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -1275,9 +1275,7 @@ static int panthor_vm_op_ctx_prealloc_pts(struct pant= hor_vm_op_ctx *op_ctx) static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx, struct panthor_vm *vm, struct panthor_gem_object *bo, - u64 offset, - u64 size, u64 va, - u32 flags) + const struct drm_panthor_vm_bind_op *op) { struct drm_gpuvm_bo *preallocated_vm_bo; struct sg_table *sgt =3D NULL; @@ -1286,12 +1284,12 @@ static int panthor_vm_prepare_map_op_ctx(struct pan= thor_vm_op_ctx *op_ctx, if (!bo) return -EINVAL; =20 - if ((flags & ~PANTHOR_VM_BIND_OP_MAP_FLAGS) || - (flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) !=3D DRM_PANTHOR_VM_BIND_O= P_TYPE_MAP) + if ((op->flags & ~PANTHOR_VM_BIND_OP_MAP_FLAGS) || + (op->flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) !=3D DRM_PANTHOR_VM_BI= ND_OP_TYPE_MAP) return -EINVAL; =20 /* Make sure the VA and size are in-bounds. */ - if (size > bo->base.size || offset > bo->base.size - size) + if (op->size > bo->base.size || op->bo_offset > bo->base.size - op->size) return -EINVAL; =20 /* If the BO has an exclusive VM attached, it can't be mapped to other VM= s. */ @@ -1299,7 +1297,7 @@ static int panthor_vm_prepare_map_op_ctx(struct panth= or_vm_op_ctx *op_ctx, bo->exclusive_vm_root_gem !=3D panthor_vm_root_gem(vm)) return -EINVAL; =20 - panthor_vm_init_op_ctx(op_ctx, size, va, flags); + panthor_vm_init_op_ctx(op_ctx, op->size, op->va, op->flags); =20 ret =3D panthor_vm_op_ctx_prealloc_vmas(op_ctx); if (ret) @@ -1328,7 +1326,7 @@ static int panthor_vm_prepare_map_op_ctx(struct panth= or_vm_op_ctx *op_ctx, } =20 op_ctx->map.vm_bo =3D drm_gpuvm_bo_obtain_prealloc(preallocated_vm_bo); - op_ctx->map.bo_offset =3D offset; + op_ctx->map.bo_offset =3D op->bo_offset; =20 ret =3D panthor_vm_op_ctx_prealloc_pts(op_ctx); if (ret) @@ -2843,10 +2841,7 @@ panthor_vm_bind_prepare_op_ctx(struct drm_file *file, gem =3D drm_gem_object_lookup(file, op->bo_handle); ret =3D panthor_vm_prepare_map_op_ctx(op_ctx, vm, gem ? to_panthor_bo(gem) : NULL, - op->bo_offset, - op->size, - op->va, - op->flags); + op); drm_gem_object_put(gem); return ret; =20 @@ -3042,10 +3037,18 @@ int panthor_vm_bind_exec_sync_op(struct drm_file *f= ile, int panthor_vm_map_bo_range(struct panthor_vm *vm, struct panthor_gem_obje= ct *bo, u64 offset, u64 size, u64 va, u32 flags) { + struct drm_panthor_vm_bind_op op =3D {0}; struct panthor_vm_op_ctx op_ctx; int ret; =20 - ret =3D panthor_vm_prepare_map_op_ctx(&op_ctx, vm, bo, offset, size, va, = flags); + op =3D (struct drm_panthor_vm_bind_op){ + .bo_offset =3D offset, + .size =3D size, + .va =3D va, + .flags =3D flags, + }; + + ret =3D panthor_vm_prepare_map_op_ctx(&op_ctx, vm, bo, &op); if (ret) return ret; =20 --=20 2.53.0 From nobody Sun Jun 21 14:00:00 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FE5735E94F for ; Fri, 3 Apr 2026 19:28:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244505; cv=pass; b=emlwBqiv98lJ85NojWsgZCb4fPy5FV2RQicR96AtBsauZhslavewIvaow86jLNkHHfSpSg9x65z6RhPFrnKoo2HWxR+VMIvgsLggWPZq/wqawkNTsPAo48ZuA+q1jtJKyY2kgiKIEdYlQkSWIy8ObqPncOwm7sA7ueTObDgUqfs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244505; c=relaxed/simple; bh=fyGpeKvKTn3Qk+5Pg+XnfJ+4eLj1Wmjxezp+TOP5erk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sA5IIrikJvBpy5DQYsILod1vZhqgb+5idmZLew6/B8kIStOpLEUKxgrEd4NUe04W0X2xs/SIjlRHbYtK+JkaM+O3G8dAI7jD4yYpMyQ7XFOxrsJBZabKmcB5EN9Ig8d5JWLGX4u9n6CEpyzCjfeTbOkBSGU24dNqcyny4at+J/s= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b=boOHWZyr; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="boOHWZyr" ARC-Seal: i=1; a=rsa-sha256; t=1775244486; cv=none; d=zohomail.com; s=zohoarc; b=CWEPTfmTSNz5LCTXMSP+3atHm3SIGsN3/Vjl7eOlMlvjfloYDBCoPcyFi1RZnl+vfSLPz5aeNCuPNHocy1m/e6tm1CZxSyd0xaGjBffauYn5r4eC4gVcQH162cmW4sZUo6jzYK8OxHy2HoJxv59o6WGglOnbVgQA4awGTBc9jZc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775244486; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=lO5/eTiFFEzPpQdaJvQXE2yn657Nel0wx8BqGIBsio0=; b=lTqC08QKD0WwyeMaEK6GGdmZK2FtmzrZq6cjpgUY0bmXLRNsH43u7HqkgZnMaJ7VtbX5grE9ywDv5V6XGH204ZU5mBvL5XReW2YQcVwNttjZvRxQDcTpYTGPLPCqZHZuaQYeEeQxqaKQilcnzm4Za7BTfR2nTa4fFs3oo4TIPBM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1775244486; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=lO5/eTiFFEzPpQdaJvQXE2yn657Nel0wx8BqGIBsio0=; b=boOHWZyrZbqSHSDPFsBhhce5WypOc/7MKYl4jgawExlNPeDa2t6Una/358Zf7Dl4 hyF9Ym9qxquhTcqaJS2xFDXXuXGKuO50LINi2PkmMDRtZ3D2TFqW833SbaujsQg4MZS GYT+MDKNBusOpip2yH0m4kzQgEwS/czrty6ulsh8= Received: by mx.zohomail.com with SMTPS id 1775244484271526.1050989488903; Fri, 3 Apr 2026 12:28:04 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Steven Price , Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Daniel Almeida , Alice Ryhl Subject: [PATCH v6 3/4] drm/panthor: Support sparse mappings Date: Fri, 3 Apr 2026 20:27:28 +0100 Message-ID: <20260403192743.3572062-4-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403192743.3572062-1-adrian.larumbe@collabora.com> References: <20260403192743.3572062-1-adrian.larumbe@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Allow UM to bind sparsely populated memory regions by cyclically mapping virtual ranges over a set of zero-initialised dummy pages. This alternative is preferable to the old method of handling sparseness in the UMD, because it relied on the creation of a buffer object to the same end, despite the fact Vulkan sparse resources don't need to be backed by a driver BO. Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panthor/panthor_mmu.c | 267 +++++++++++++++++++------- include/uapi/drm/panthor_drm.h | 13 +- 2 files changed, 206 insertions(+), 74 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 10da2f021d9d..e73657aebfb0 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -104,6 +104,11 @@ struct panthor_mmu { /** @vm.wq: Workqueue used for the VM_BIND queues. */ struct workqueue_struct *wq; } vm; + + struct { + struct page *pages; + struct sg_table *sgt; + } dummy; }; =20 /** @@ -1028,6 +1033,34 @@ panthor_vm_map_pages(struct panthor_vm *vm, u64 iova= , int prot, return 0; } =20 +static int +panthor_vm_repeated_map_pages(struct panthor_vm *vm, u64 iova, int prot, + struct sg_table *sgt, u64 size) +{ + u64 first_iova =3D iova; + u64 first_size =3D size; + int ret; + + /* FIXME: we really need to optimize this at the io_pgtable level. */ + while (size > 0) { + u64 next_size =3D min(size, sgt->sgl->length); + + ret =3D panthor_vm_map_pages(vm, iova, prot, + sgt, 0, next_size); + if (ret) + goto err_unmap; + + size -=3D next_size; + iova +=3D next_size; + } + + return 0; + +err_unmap: + panthor_vm_unmap_pages(vm, first_iova, first_size - size); + return ret; +} + static int flags_to_prot(u32 flags) { int prot =3D 0; @@ -1270,6 +1303,7 @@ static int panthor_vm_op_ctx_prealloc_pts(struct pant= hor_vm_op_ctx *op_ctx) (DRM_PANTHOR_VM_BIND_OP_MAP_READONLY | \ DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | \ DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED | \ + DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE | \ DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) =20 static int panthor_vm_prepare_map_op_ctx(struct panthor_vm_op_ctx *op_ctx, @@ -1277,74 +1311,87 @@ static int panthor_vm_prepare_map_op_ctx(struct pan= thor_vm_op_ctx *op_ctx, struct panthor_gem_object *bo, const struct drm_panthor_vm_bind_op *op) { + bool is_sparse =3D op->flags & DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE; struct drm_gpuvm_bo *preallocated_vm_bo; struct sg_table *sgt =3D NULL; int ret; =20 - if (!bo) - return -EINVAL; - if ((op->flags & ~PANTHOR_VM_BIND_OP_MAP_FLAGS) || (op->flags & DRM_PANTHOR_VM_BIND_OP_TYPE_MASK) !=3D DRM_PANTHOR_VM_BI= ND_OP_TYPE_MAP) return -EINVAL; =20 - /* Make sure the VA and size are in-bounds. */ - if (op->size > bo->base.size || op->bo_offset > bo->base.size - op->size) - return -EINVAL; + if (!is_sparse) { + /* Make sure the VA and size are in-bounds. */ + if (!bo || op->size > bo->base.size || + op->bo_offset > bo->base.size - op->size) + return -EINVAL; + } else { + if (bo || op->bo_handle || op->bo_offset) + return -EINVAL; + } =20 /* If the BO has an exclusive VM attached, it can't be mapped to other VM= s. */ - if (bo->exclusive_vm_root_gem && + if (!is_sparse && bo->exclusive_vm_root_gem && bo->exclusive_vm_root_gem !=3D panthor_vm_root_gem(vm)) return -EINVAL; =20 - panthor_vm_init_op_ctx(op_ctx, op->size, op->va, op->flags); + panthor_vm_init_op_ctx(op_ctx, op->size, op->va, op->flags + | ((is_sparse) ? DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC : 0)); =20 ret =3D panthor_vm_op_ctx_prealloc_vmas(op_ctx); if (ret) goto err_cleanup; =20 - /* Pre-reserve the BO pages, so the map operation doesn't have to - * allocate. - */ - ret =3D panthor_gem_pin(bo); - if (ret) - goto err_cleanup; + if (!is_sparse) { + /* Pre-reserve the BO pages, so the map operation doesn't have to + * allocate. + */ + ret =3D panthor_gem_pin(bo); + if (ret) + goto err_cleanup; =20 - drm_gem_object_get(&bo->base); - op_ctx->map.bo =3D bo; + drm_gem_object_get(&bo->base); + op_ctx->map.bo =3D bo; =20 - sgt =3D panthor_gem_get_dev_sgt(bo); - if (IS_ERR(sgt)) { - ret =3D PTR_ERR(sgt); - goto err_cleanup; - } + sgt =3D panthor_gem_get_dev_sgt(bo); + if (IS_ERR(sgt)) { + ret =3D PTR_ERR(sgt); + goto err_cleanup; + } + op_ctx->map.sgt =3D sgt; =20 - preallocated_vm_bo =3D drm_gpuvm_bo_create(&vm->base, &bo->base); - if (!preallocated_vm_bo) { - ret =3D -ENOMEM; - goto err_cleanup; - } + preallocated_vm_bo =3D drm_gpuvm_bo_create(&vm->base, &bo->base); + if (!preallocated_vm_bo) { + ret =3D -ENOMEM; + goto err_cleanup; + } =20 - op_ctx->map.vm_bo =3D drm_gpuvm_bo_obtain_prealloc(preallocated_vm_bo); - op_ctx->map.bo_offset =3D op->bo_offset; + op_ctx->map.vm_bo =3D + drm_gpuvm_bo_obtain_prealloc(preallocated_vm_bo); + op_ctx->map.bo_offset =3D op->bo_offset; + } else { + op_ctx->map.sgt =3D vm->ptdev->mmu->dummy.sgt; + } =20 ret =3D panthor_vm_op_ctx_prealloc_pts(op_ctx); if (ret) goto err_cleanup; =20 - /* Insert BO into the extobj list last, when we know nothing can fail. */ - if (bo->base.resv !=3D panthor_vm_resv(vm)) { - dma_resv_lock(panthor_vm_resv(vm), NULL); - drm_gpuvm_bo_extobj_add(op_ctx->map.vm_bo); - dma_resv_unlock(panthor_vm_resv(vm)); - } + if (!is_sparse) { + /* Insert BO into the extobj list last, when we know nothing can fail. */ + if (bo->base.resv !=3D panthor_vm_resv(vm)) { + dma_resv_lock(panthor_vm_resv(vm), NULL); + drm_gpuvm_bo_extobj_add(op_ctx->map.vm_bo); + dma_resv_unlock(panthor_vm_resv(vm)); + } =20 - /* And finally update the BO state. */ - dma_resv_lock(bo->base.resv, NULL); - mutex_lock(&bo->base.gpuva.lock); - panthor_gem_update_reclaim_state_locked(bo, NULL); - mutex_unlock(&bo->base.gpuva.lock); - dma_resv_unlock(bo->base.resv); + /* And finally update the BO state. */ + dma_resv_lock(bo->base.resv, NULL); + mutex_lock(&bo->base.gpuva.lock); + panthor_gem_update_reclaim_state_locked(bo, NULL); + mutex_unlock(&bo->base.gpuva.lock); + dma_resv_unlock(bo->base.resv); + } =20 return 0; =20 @@ -2148,13 +2195,43 @@ static void panthor_vma_init(struct panthor_vma *vm= a, u32 flags) #define PANTHOR_VM_MAP_FLAGS \ (DRM_PANTHOR_VM_BIND_OP_MAP_READONLY | \ DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | \ - DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED) + DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED | \ + DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE) + +static int +panthor_vm_map(struct panthor_vm *vm, bool sparse, struct sg_table *sgt, + u64 addr, u64 offset, u64 size, int prot) +{ + int ret; + + if (!size) + return 0; + + if (!sparse) + return panthor_vm_map_pages(vm, addr, prot, sgt, offset, size); + + drm_WARN_ON(&vm->ptdev->base, sgt->sgl->length !=3D SZ_2M); + + if (addr & (SZ_2M - 1)) { + u64 unaligned_size =3D min(ALIGN(addr, SZ_2M) - addr, size); + + ret =3D panthor_vm_map_pages(vm, addr, prot, sgt, + 0, unaligned_size); + if (ret) + return ret; + + size -=3D unaligned_size; + } + + return panthor_vm_repeated_map_pages(vm, addr, prot, sgt, size); +} =20 static int panthor_gpuva_sm_step_map(struct drm_gpuva_op *op, void *priv) { struct panthor_vm *vm =3D priv; struct panthor_vm_op_ctx *op_ctx =3D vm->op_ctx; struct panthor_vma *vma =3D panthor_vm_op_ctx_get_vma(op_ctx); + bool is_sparse =3D op_ctx->flags & DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE; int ret; =20 if (!vma) @@ -2162,19 +2239,20 @@ static int panthor_gpuva_sm_step_map(struct drm_gpu= va_op *op, void *priv) =20 panthor_vma_init(vma, op_ctx->flags & PANTHOR_VM_MAP_FLAGS); =20 - ret =3D panthor_vm_map_pages(vm, op->map.va.addr, flags_to_prot(vma->flag= s), - op_ctx->map.bo->dmap.sgt, op->map.gem.offset, - op->map.va.range); + ret =3D panthor_vm_map(vm, is_sparse, op_ctx->map.sgt, op->map.va.addr, + op->map.gem.offset, op->map.va.range, flags_to_prot(vma->flags)); if (ret) { panthor_vm_op_ctx_return_vma(op_ctx, vma); return ret; } =20 drm_gpuva_map(&vm->base, &vma->base, &op->map); - panthor_vma_link(vm, vma, op_ctx->map.vm_bo); =20 - drm_gpuvm_bo_put_deferred(op_ctx->map.vm_bo); - op_ctx->map.vm_bo =3D NULL; + if (!is_sparse) { + panthor_vma_link(vm, vma, op_ctx->map.vm_bo); + drm_gpuvm_bo_put_deferred(op_ctx->map.vm_bo); + op_ctx->map.vm_bo =3D NULL; + } =20 return 0; } @@ -2194,7 +2272,7 @@ iova_mapped_as_huge_page(struct drm_gpuva_op_map *op,= u64 addr) =20 static void unmap_hugepage_align(const struct drm_gpuva_op_remap *op, - u64 *unmap_start, u64 *unmap_range) + u64 *unmap_start, u64 *unmap_range, bool sparse) { u64 aligned_unmap_start, aligned_unmap_end, unmap_end; =20 @@ -2207,7 +2285,7 @@ unmap_hugepage_align(const struct drm_gpuva_op_remap = *op, */ if (op->prev && aligned_unmap_start < *unmap_start && op->prev->va.addr <=3D aligned_unmap_start && - iova_mapped_as_huge_page(op->prev, *unmap_start)) { + (sparse || iova_mapped_as_huge_page(op->prev, *unmap_start))) { *unmap_range +=3D *unmap_start - aligned_unmap_start; *unmap_start =3D aligned_unmap_start; } @@ -2217,7 +2295,7 @@ unmap_hugepage_align(const struct drm_gpuva_op_remap = *op, */ if (op->next && aligned_unmap_end > unmap_end && op->next->va.addr + op->next->va.range >=3D aligned_unmap_end && - iova_mapped_as_huge_page(op->next, unmap_end - 1)) { + (sparse || iova_mapped_as_huge_page(op->next, *unmap_start))) { *unmap_range +=3D aligned_unmap_end - unmap_end; } } @@ -2229,6 +2307,8 @@ static int panthor_gpuva_sm_step_remap(struct drm_gpu= va_op *op, struct panthor_vm *vm =3D priv; struct panthor_vm_op_ctx *op_ctx =3D vm->op_ctx; struct panthor_vma *prev_vma =3D NULL, *next_vma =3D NULL; + struct sg_table *sgt =3D vm->ptdev->mmu->dummy.sgt; + bool is_sparse =3D unmap_vma->flags & DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE; u64 unmap_start, unmap_range; int ret; =20 @@ -2241,7 +2321,7 @@ static int panthor_gpuva_sm_step_remap(struct drm_gpu= va_op *op, * unmap region. Calculating the right start address and range for the ex= panded * unmap operation is the responsibility of the following function. */ - unmap_hugepage_align(&op->remap, &unmap_start, &unmap_range); + unmap_hugepage_align(&op->remap, &unmap_start, &unmap_range, is_sparse); =20 /* If the range changed, we might have to lock a wider region to guarantee * atomicity. panthor_vm_lock_region() bails out early if the new region @@ -2253,14 +2333,15 @@ static int panthor_gpuva_sm_step_remap(struct drm_g= puva_op *op, } =20 if (op->remap.prev) { - struct panthor_gem_object *bo =3D to_panthor_bo(op->remap.prev->gem.obj); u64 offset =3D op->remap.prev->gem.offset + unmap_start - op->remap.prev= ->va.addr; u64 size =3D op->remap.prev->va.addr + op->remap.prev->va.range - unmap_= start; =20 + if (!is_sparse) + sgt =3D to_panthor_bo(op->remap.prev->gem.obj)->dmap.sgt; + if (!unmap_vma->evicted) { - ret =3D panthor_vm_map_pages(vm, unmap_start, - flags_to_prot(unmap_vma->flags), - bo->dmap.sgt, offset, size); + ret =3D panthor_vm_map(vm, is_sparse, sgt, unmap_start, offset, + size, flags_to_prot(unmap_vma->flags)); if (ret) return ret; } @@ -2271,14 +2352,16 @@ static int panthor_gpuva_sm_step_remap(struct drm_g= puva_op *op, } =20 if (op->remap.next) { - struct panthor_gem_object *bo =3D to_panthor_bo(op->remap.next->gem.obj); u64 addr =3D op->remap.next->va.addr; u64 size =3D unmap_start + unmap_range - op->remap.next->va.addr; =20 + if (!is_sparse) + sgt =3D to_panthor_bo(op->remap.next->gem.obj)->dmap.sgt; + if (!unmap_vma->evicted) { - ret =3D panthor_vm_map_pages(vm, addr, flags_to_prot(unmap_vma->flags), - bo->dmap.sgt, op->remap.next->gem.offset, - size); + ret =3D panthor_vm_map(vm, is_sparse, sgt, addr, + op->remap.next->gem.offset, size, + flags_to_prot(unmap_vma->flags)); if (ret) return ret; } @@ -2292,20 +2375,22 @@ static int panthor_gpuva_sm_step_remap(struct drm_g= puva_op *op, next_vma ? &next_vma->base : NULL, &op->remap); =20 - if (prev_vma) { - /* panthor_vma_link() transfers the vm_bo ownership to - * the VMA object. Since the vm_bo we're passing is still - * owned by the old mapping which will be released when this - * mapping is destroyed, we need to grab a ref here. - */ - panthor_vma_link(vm, prev_vma, op->remap.unmap->va->vm_bo); - } + if (!is_sparse) { + if (prev_vma) { + /* panthor_vma_link() transfers the vm_bo ownership to + * the VMA object. Since the vm_bo we're passing is still + * owned by the old mapping which will be released when this + * mapping is destroyed, we need to grab a ref here. + */ + panthor_vma_link(vm, prev_vma, op->remap.unmap->va->vm_bo); + } + + if (next_vma) + panthor_vma_link(vm, next_vma, op->remap.unmap->va->vm_bo); =20 - if (next_vma) { - panthor_vma_link(vm, next_vma, op->remap.unmap->va->vm_bo); + panthor_vma_unlink(unmap_vma); } =20 - panthor_vma_unlink(unmap_vma); return 0; } =20 @@ -2579,11 +2664,9 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct pan= thor_vm_op_ctx *op, =20 switch (op_type) { case DRM_PANTHOR_VM_BIND_OP_TYPE_MAP: { - const struct drm_gpuvm_map_req map_req =3D { + struct drm_gpuvm_map_req map_req =3D { .map.va.addr =3D op->va.addr, .map.va.range =3D op->va.range, - .map.gem.obj =3D op->map.vm_bo->obj, - .map.gem.offset =3D op->map.bo_offset, }; =20 if (vm->unusable) { @@ -2591,6 +2674,11 @@ panthor_vm_exec_op(struct panthor_vm *vm, struct pan= thor_vm_op_ctx *op, break; } =20 + if (!(op->flags & DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE)) { + map_req.map.gem.obj =3D op->map.vm_bo->obj; + map_req.map.gem.offset =3D op->map.bo_offset; + } + ret =3D drm_gpuvm_sm_map(&vm->base, vm, &map_req); break; } @@ -3041,6 +3129,9 @@ int panthor_vm_map_bo_range(struct panthor_vm *vm, st= ruct panthor_gem_object *bo struct panthor_vm_op_ctx op_ctx; int ret; =20 + if (drm_WARN_ON(&vm->ptdev->base, flags & DRM_PANTHOR_VM_BIND_OP_MAP_SPAR= SE)) + return -EINVAL; + op =3D (struct drm_panthor_vm_bind_op){ .bo_offset =3D offset, .size =3D size, @@ -3204,6 +3295,10 @@ void panthor_mmu_unplug(struct panthor_device *ptdev) } } mutex_unlock(&ptdev->mmu->as.slots_lock); + + sg_free_table(ptdev->mmu->dummy.sgt); + kfree(ptdev->mmu->dummy.sgt); + __free_pages(ptdev->mmu->dummy.pages, get_order(SZ_2M)); } =20 static void panthor_mmu_release_wq(struct drm_device *ddev, void *res) @@ -3269,7 +3364,33 @@ int panthor_mmu_init(struct panthor_device *ptdev) ptdev->gpu_info.mmu_features |=3D BITS_PER_LONG; } =20 + mmu->dummy.pages =3D alloc_pages(GFP_KERNEL | __GFP_ZERO, get_order(SZ_2M= )); + if (!mmu->dummy.pages) + return -ENOMEM; + + mmu->dummy.sgt =3D kzalloc_obj(*mmu->dummy.sgt); + if (!mmu->dummy.sgt) { + ret =3D -ENOMEM; + goto mmu_init_free_pages; + } + + ret =3D sg_alloc_table(mmu->dummy.sgt, 1, GFP_KERNEL); + if (ret) { + ret =3D -ENOMEM; + goto mmu_init_free_sgtable; + } + + sg_set_page(mmu->dummy.sgt->sgl, mmu->dummy.pages, SZ_2M, 0); + sg_dma_address(mmu->dummy.sgt->sgl) =3D page_to_phys(mmu->dummy.pages); + sg_dma_len(mmu->dummy.sgt->sgl) =3D SZ_2M; + return drmm_add_action_or_reset(&ptdev->base, panthor_mmu_release_wq, mmu= ->vm.wq); + +mmu_init_free_sgtable: + kfree(mmu->dummy.sgt); +mmu_init_free_pages: + __free_pages(mmu->dummy.pages, get_order(SZ_2M)); + return ret; } =20 #ifdef CONFIG_DEBUG_FS diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h index dc2704fc2829..9e7197845ea4 100644 --- a/include/uapi/drm/panthor_drm.h +++ b/include/uapi/drm/panthor_drm.h @@ -614,6 +614,18 @@ enum drm_panthor_vm_bind_op_flags { */ DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED =3D 1 << 2, =20 + /** + * @DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE: Repeat a BO range + * + * Only valid with DRM_PANTHOR_VM_BIND_OP_TYPE_MAP. + * + * When this flag is set, the whole vm_bind range is mapped over a dummy + * object in a cyclic fashion, and all GPU reads from the addresses in the + * range return 0. This flag being set means drm_panthor_vm_bind_op:offset + * and drm_panthor_vm_bind_op::handle must both be set to 0. + */ + DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE =3D 1 << 3, + /** * @DRM_PANTHOR_VM_BIND_OP_TYPE_MASK: Mask used to determine the type of = operation. */ @@ -677,7 +689,6 @@ struct drm_panthor_vm_bind_op { * This array shall not be empty for sync-only operations. */ struct drm_panthor_obj_array syncs; - }; =20 /** --=20 2.53.0 From nobody Sun Jun 21 14:00:00 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 884D0363083 for ; Fri, 3 Apr 2026 19:28:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244503; cv=pass; b=F3F55ksP8ECvkxnaLA9tikGCx40Z2VPnH4V5APUEzzkBS+mzXsu6KWmn80rnn82ukSdoYpCBpKXm6z3WtFTzZ5OQOzUOzT2Oe0SpgCYUF9piUX/sXUm0t39WcTtCYQRowtlk2QWUJ1/j5KWav5aJ1FL96ZCb4NDuXlDfD3Crxy4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775244503; c=relaxed/simple; bh=25yjW99K3WpTDGsWxuiPnry0WqVj3vcfFgbeUZtMTOk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bjJYfGK24MDXofsq5Ad8P583AmJvpBiatOrK7yzx+xKFPhsAMxRql+fzR21Yi2FNuxKmFTn1tOb2aC6RjLdyFUr0a7tciF9qbgePwKqjkd0XkgBLdbDvWnBNIi258NEJM2Na2vWKhpG8jo5LPvfmok999pTgRQPX3olLRIfzfMg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b=UUSYSlfi; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=adrian.larumbe@collabora.com header.b="UUSYSlfi" ARC-Seal: i=1; a=rsa-sha256; t=1775244488; cv=none; d=zohomail.com; s=zohoarc; b=BoOtfGB7L38LT7P/dFeQgKALf965vgx/tyKmZVJ/tYk0TgACdsBRt8h1H1FIZ7hLc1juUGD6mVhFSoECqQIdCaXS80oRB0PEq74s8p7YZhdwgpjMXSrRKhQNMP+nvrYFBvnVYft/pcJBH6psUUTA71vv868yza2X4AfYgbNcSdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775244488; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=wBbhOd9N1ulj8HlqwKZuLm9O6XwurhYVgjsddamL+4o=; b=biuQNYhkbazEz3GXUX5Q9nww826gDBOV2+VuzN3Kut0HmyMyls3SFiOjF/saqqZkwmqzoeHmwRDPkg7d7ufyHWbc0OQk3rMgbQEaFO9JeDvMvLzMreUNHHOHqBq4jglxOW4UOTABk6B1pqxXzqZqzTjzSen0Vf1wImHaGaLtZSs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=adrian.larumbe@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1775244488; s=zohomail; d=collabora.com; i=adrian.larumbe@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=wBbhOd9N1ulj8HlqwKZuLm9O6XwurhYVgjsddamL+4o=; b=UUSYSlfis3A/eRGAPbfWSRUU/JN+JQMgmOoLLrWM1MMo/h4hKQd8LB9kSzkGjmz9 /CB65uFrjPLA5iLNIkqtMy60giV9aOoLAuHCRWHAXkcrM3N7/2BCEuY6qcCeY87syt7 Tii4MPlcXzbzM5eHaLjhKKSNdZa9qmnIqtaHCrpA= Received: by mx.zohomail.com with SMTPS id 17752444875431016.9023260910756; Fri, 3 Apr 2026 12:28:07 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Steven Price , Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Liviu Dudau , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH v6 4/4] drm/panthor: Bump the driver version to 1.9 Date: Fri, 3 Apr 2026 20:27:29 +0100 Message-ID: <20260403192743.3572062-5-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260403192743.3572062-1-adrian.larumbe@collabora.com> References: <20260403192743.3572062-1-adrian.larumbe@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Bump the driver version to reflect the new MMU info query ioctl parameter and the VM_BIND map sparse flag. Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panthor/panthor_drv.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index a8090bc4e33c..c8fb63ede62c 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1787,6 +1787,8 @@ static void panthor_debugfs_init(struct drm_minor *mi= nor) * - adds DRM_IOCTL_PANTHOR_BO_QUERY_INFO ioctl * - adds drm_panthor_gpu_info::selected_coherency * - 1.8 - extends DEV_QUERY_TIMESTAMP_INFO with flags + * - 1.9 - adds DRM_PANTHOR_DEV_QUERY_MMU_INFO query + * - adds DRM_PANTHOR_VM_BIND_OP_MAP_SPARSE flag */ static const struct drm_driver panthor_drm_driver =3D { .driver_features =3D DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ | --=20 2.53.0