From nobody Fri Oct 3 16:44:17 2025 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 3D9681A9FB8 for ; Thu, 28 Aug 2025 02:35:29 +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=1756348531; cv=pass; b=qPAzsTXTRRi9PuZyfw9CEMlqaZZn2aG+CMBgyBKW0JwCdmP6sgIePHqc+PjD70IRlPucFmpVXfU++P6RaXvpM/EvUpIS+c5cfdf6FHUPoN8WVG2UdRZyNz6+ameRnUFE+0j8kmOkrwIGmrl7xTmAf++P09VlqPth8YTgi38vPjk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756348531; c=relaxed/simple; bh=UvqG/wxG+NEmQwSW6r12yp/QSCvRu3NXYTi/7nGBl4Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MeCeSNh15et/YDCLpBtr8TcTEMsLegNk/s+DlsTPfhBhUGsruJTdQPIbpoj69nOytrwFQtj2FFs35lmKIrR9Xcxhdb1Vgf3kzrbKhSY5rLEIfCKrk5wc0zdgvYIPOw8g8+dN7eInkViIDozc7Ij7VWnRpt1Y2dzEumBaGVQxp7o= 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=bTcnjlE8; 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="bTcnjlE8" ARC-Seal: i=1; a=rsa-sha256; t=1756348507; cv=none; d=zohomail.com; s=zohoarc; b=e0Lu09OCUP0WgVr3n31YDq1NfZNRaecwMWSEzhgLPihmfsWTeX685rU46DfyPnyxQxTz7TkS6PivZFzgStS319pfvceSmq/c/ezhJ0+p2F8JGduZGuQZa+F9OvlqFOnAXI7Q9gmjHMvDlw2RcdI1ZD3nx8PYSFLdJ3dP+kUFrkM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756348507; 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=/XgZbXaaDAt51tRo1gxaJmYurANtM3wU1qrejFSnDxA=; b=k4sjsNxwOHAjmkkum/3wBlb/jQX2KlI9B0KHOrI0Hk7pSbANUal/XLJXH3/EvJfFG4q03XyYUxNuMxY6BUHvYxDCvLqaqfht3YPYgwQEN+HTsKWO/7vV84BqYh3JwgToUJqqREEtpUCDYVPkVSRtamVftZG5v34WPAx79+pnv2Y= 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=1756348507; 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=/XgZbXaaDAt51tRo1gxaJmYurANtM3wU1qrejFSnDxA=; b=bTcnjlE8tUy6GWMO/O66nMnoLl+f2QPNUx9hZTlOiGlzUUMZ50i1pSalo2YgpfBl lKOFjuIT3TzEg9zkfTgcwWuymGQAWkmjVhuSVsfal/iPaVcU3ZqzWW4whqAvuUgEXFX fgKDNgqz2tmKmt7WUik8TChswjKkK3ccQvo3FEFg= Received: by mx.zohomail.com with SMTPS id 1756348505762628.2176497594086; Wed, 27 Aug 2025 19:35:05 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Rob Herring , Steven Price , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH 1/5] drm/panfrost: Add job slot register defs for affinity Date: Thu, 28 Aug 2025 03:34:04 +0100 Message-ID: <20250828023422.2404784-2-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250828023422.2404784-1-adrian.larumbe@collabora.com> References: <20250828023422.2404784-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 From: Boris Brezillon This will let us set the affinity (L2 caches and tiler units that can process a job) in future commits. Signed-off-by: Boris Brezillon Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panfrost/panfrost_regs.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/panfrost/panfrost_regs.h b/drivers/gpu/drm/pan= frost/panfrost_regs.h index 2b8f1617b836..a63cd65b344a 100644 --- a/drivers/gpu/drm/panfrost/panfrost_regs.h +++ b/drivers/gpu/drm/panfrost/panfrost_regs.h @@ -253,6 +253,7 @@ #define JS_AFFINITY_NEXT_LO(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x50) #define JS_AFFINITY_NEXT_HI(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x54) #define JS_CONFIG_NEXT(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x58) +#define JS_XAFFINITY_NEXT(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x5c) #define JS_COMMAND_NEXT(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x60) #define JS_FLUSH_ID_NEXT(n) (JS_BASE + ((n) * JS_SLOT_STRIDE) + 0x70) =20 @@ -267,6 +268,11 @@ #define JS_CONFIG_DISABLE_DESCRIPTOR_WR_BK BIT(15) #define JS_CONFIG_THREAD_PRI(n) ((n) << 16) =20 +/* Possible values of JS_XAFFINITY and JS_XAFFINITY_NEXT registers */ +#define JS_XAFFINITY_ENABLE BIT(0) +#define JS_XAFFINITY_TILER_MASK(x) (((u32)(x) & GENMASK(7, 0)) << 8) +#define JS_XAFFINITY_L2_MASK(x) (((u32)(x) & GENMASK(15, 0)) << 16) + #define JS_COMMAND_NOP 0x00 #define JS_COMMAND_START 0x01 #define JS_COMMAND_SOFT_STOP 0x02 /* Gently stop processing a job chain */ --=20 2.50.0 From nobody Fri Oct 3 16:44:17 2025 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 E26E325EF87 for ; Thu, 28 Aug 2025 02:35:33 +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=1756348535; cv=pass; b=tAl8X07UIpF2zbDcxz+sJNEEggcU3Ru4WNFBcsU2pS/Ut4Zqj8LdwmRq4X+k4pPWF6EnMVEz9LO+HXpCpe8fm7qXdNNa84++ZfgZZ2SraxeCMqRNh6HPHUyp3O4pW/uVPGBvmJQqpP8Q950HI5YKhNclpx/46XfAhACehdJcwyU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756348535; c=relaxed/simple; bh=vpA/e9lW6KbW/rfuADTMc1pz4n5U0uW8lJ41HDzh+hI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qKBnQmK2BRcECl73Az3yvbFVUeUU3geTezR3A5aroOfD2FbvAPGCITEQBP0Sj4o+QM2WIvW4UbvT+M/kz71IPE/zXgsjBgLJM62Tnti3pxddtOKEvv8a0GUCxdyijGDAqhrrMlde9yzKYzUnHsb2EwEIiGBP/yKJWiPg+s14jLw= 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=OiP/IveF; 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="OiP/IveF" ARC-Seal: i=1; a=rsa-sha256; t=1756348511; cv=none; d=zohomail.com; s=zohoarc; b=guORNmwwjDjNHrywXAGqBMD1KpboHPrMY2vlIr4bnj/JOujlbbALWgrf2t2LHUnnq49RyeaGwXdIHJ6bS6imkjrN+hCTG54BXxjcnE33aAmGBv3dVRWBYVrCK91RlVd8cP9rOQjtaf/g0L/ZivIocKpmGWtKIEYkhzHl/sG6xnA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756348511; 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=PHsI4CYV0V3r9lD5ytBPM7HtZI5OLJ3XqOdRLkAvVSA=; b=cZWQLo75gPv8cdXCY+l2dRKj7TFxi3ZreJC2EImctj9Ah265RzFoSfwJZ0TwjOQHi3P9ioXJZp3MZP78Qf84/hlWZNmWr1iic3+OZR/9/EGPnRArLFMo/J2w3ZV1nSMKDcRf6iZRx7NhcnyXz6B895WiyDiLvEmlvql2Ww5CQkY= 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=1756348511; 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=PHsI4CYV0V3r9lD5ytBPM7HtZI5OLJ3XqOdRLkAvVSA=; b=OiP/IveFFD0n/80TxzwrNR/xbVgptcQhpfDxxNAiWtTCmR1qRgfhv62vQNwP/HJ0 8qWlLHO3B/66XkKA/KLR5T3F6o1tjtgmJUJ1LEGvgN6i5XIu8nmT8JL3SOswX8YIGBh jHtfzxfgayiN2HGgBiRlWCkKbRpYJESRpzWy6baE= Received: by mx.zohomail.com with SMTPS id 1756348509179663.5810528333795; Wed, 27 Aug 2025 19:35:09 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Rob Herring , Steven Price , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Subject: [PATCH 2/5] drm/panfrost: Introduce uAPI for JM context creation Date: Thu, 28 Aug 2025 03:34:05 +0100 Message-ID: <20250828023422.2404784-3-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250828023422.2404784-1-adrian.larumbe@collabora.com> References: <20250828023422.2404784-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 From: Boris Brezillon The new uAPI lets user space query the KM driver for the available priorities a job can be given at submit time. These are managed through the notion of a context, which besides a priority, codifies the list of L2 caches, shading cores and tiler units a job is allowed to use, for all three of the available device job slots. Signed-off-by: Boris Brezillon Signed-off-by: Adri=C3=A1n Larumbe --- include/uapi/drm/panfrost_drm.h | 93 +++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/include/uapi/drm/panfrost_drm.h b/include/uapi/drm/panfrost_dr= m.h index ed67510395bd..2d8b32448e68 100644 --- a/include/uapi/drm/panfrost_drm.h +++ b/include/uapi/drm/panfrost_drm.h @@ -22,6 +22,8 @@ extern "C" { #define DRM_PANFROST_PERFCNT_DUMP 0x07 #define DRM_PANFROST_MADVISE 0x08 #define DRM_PANFROST_SET_LABEL_BO 0x09 +#define DRM_PANFROST_JM_CTX_CREATE 0x0a +#define DRM_PANFROST_JM_CTX_DESTROY 0x0b =20 #define DRM_IOCTL_PANFROST_SUBMIT DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROST= _SUBMIT, struct drm_panfrost_submit) #define DRM_IOCTL_PANFROST_WAIT_BO DRM_IOW(DRM_COMMAND_BASE + DRM_PANFROS= T_WAIT_BO, struct drm_panfrost_wait_bo) @@ -31,6 +33,8 @@ extern "C" { #define DRM_IOCTL_PANFROST_GET_BO_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_P= ANFROST_GET_BO_OFFSET, struct drm_panfrost_get_bo_offset) #define DRM_IOCTL_PANFROST_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_PANFRO= ST_MADVISE, struct drm_panfrost_madvise) #define DRM_IOCTL_PANFROST_SET_LABEL_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_P= ANFROST_SET_LABEL_BO, struct drm_panfrost_set_label_bo) +#define DRM_IOCTL_PANFROST_JM_CTX_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_P= ANFROST_JM_CTX_CREATE, struct drm_panfrost_jm_ctx_create) +#define DRM_IOCTL_PANFROST_JM_CTX_DESTROY DRM_IOWR(DRM_COMMAND_BASE + DRM_= PANFROST_JM_CTX_DESTROY, struct drm_panfrost_jm_ctx_destroy) =20 /* * Unstable ioctl(s): only exposed when the unsafe unstable_ioctls module @@ -71,6 +75,12 @@ struct drm_panfrost_submit { =20 /** A combination of PANFROST_JD_REQ_* */ __u32 requirements; + + /** JM context handle. Zero if you want to use the default context. */ + __u32 jm_ctx_handle; + + /** Padding field. MBZ. */ + __u32 pad; }; =20 /** @@ -177,6 +187,7 @@ enum drm_panfrost_param { DRM_PANFROST_PARAM_AFBC_FEATURES, DRM_PANFROST_PARAM_SYSTEM_TIMESTAMP, DRM_PANFROST_PARAM_SYSTEM_TIMESTAMP_FREQUENCY, + DRM_PANFROST_PARAM_ALLOWED_JM_CTX_PRIORITIES, }; =20 struct drm_panfrost_get_param { @@ -299,6 +310,88 @@ struct panfrost_dump_registers { __u32 value; }; =20 +enum drm_panfrost_jm_ctx_priority { + /** + * @PANFROST_JM_CTX_PRIORITY_LOW: Low priority context. + */ + PANFROST_JM_CTX_PRIORITY_LOW =3D 0, + + /** + * @PANFROST_JM_CTX_PRIORITY_MEDIUM: Medium priority context. + */ + PANFROST_JM_CTX_PRIORITY_MEDIUM, + + /** + * @PANFROST_JM_CTX_PRIORITY_HIGH: High priority context. + * + * Requires CAP_SYS_NICE or DRM_MASTER. + */ + PANFROST_JM_CTX_PRIORITY_HIGH, +}; + +#define PANFROST_JS_FLAG_ENABLED (1 << 0) + +struct drm_panfrost_js_ctx_info { + /** @flags: Combination of PANFROST_JS_FLAG_xxx values */ + __u32 flags; + + /** @priority: Context priority (see enum drm_panfrost_jm_ctx_priority). = */ + __u8 priority; + + /** + * @tiler_mask: Mask encoding tiler units that can be used by the job slot + * + * When this field is zero, it means the tiler won't be used. + * + * The bits set here should also be set in drm_panthor_gpu_info::tiler_pr= esent. + */ + __u8 tiler_mask; + + /** + * @l2_mask: Mask encoding L2 caches that can be used by the job slot + * + * The bits set here should also be set in drm_panthor_gpu_info::l2_prese= nt.: + */ + __u16 l2_mask; + + /** + * @core_mask: Mask encoding cores that can be used by the job slot + * + * When this field is zero, it means the queue won't be used. + * + * The bits set here should also be set in drm_panthor_gpu_info::shader_p= resent. + */ + __u64 core_mask; +}; + +struct drm_panfrost_jm_ctx_create { + /** @handle: Handle of the created JM context */ + __u32 handle; + + /** @pad: Padding field, MBZ. */ + __u32 pad; + + /** + * @slots: Job slots + * + * This field must be greater than zero and less than 8 (only three slots + * available). + */ + struct drm_panfrost_js_ctx_info slots[3]; +}; + +struct drm_panfrost_jm_ctx_destroy { + /** + * @handle: Handle of the JM context to destroy. + * + * Must be a valid context handle returned by DRM_IOCTL_PANTHOR_JM_CTX_CR= EATE. + */ + __u32 handle; + + /** @pad: Padding field, MBZ. */ + __u32 pad; +}; + #if defined(__cplusplus) } #endif --=20 2.50.0 From nobody Fri Oct 3 16:44:17 2025 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 D70A826158B for ; Thu, 28 Aug 2025 02:35:36 +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=1756348538; cv=pass; b=IwpnPVOIOiY9/9IFtrrmnfvv+XPUeQ3totzHQ/9Hi1pe5qnEWNAjmgs9qH6FeHAW6bd2ITrwZOL1CadUWudt7vSKgEtPvI3PmGiCIpOKdRXwfLv2Y0FhZ+arx/BPW7lVWuzyQBRYTEwXpMCkP5Naa2TIEEY8h13CnK5VIw9iJV8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756348538; c=relaxed/simple; bh=SY5O60UE15YKH+q6WCFiAo2SfQJJ5OnesR2QWvXsLkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QVt3Ywlqp1AEV0roiKA+2ofqskU1PidbEdKCxm6OaPsq4dQ0BPsjoU5ibpwwST7L9oaRTpaDtcdnXdYk+l/qzWRX6N7ijxmR+hm4g9mGtqBn7O8GBkO21YmGbgq9vaJSSsyhIkEk9GrFqM+9z1ubJcQkZ47yC/Kj6PB3I5nref8= 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=gRjjmCkr; 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="gRjjmCkr" ARC-Seal: i=1; a=rsa-sha256; t=1756348515; cv=none; d=zohomail.com; s=zohoarc; b=frfonRDKjHxF2d5+puFPDHQIHhd9SHsxv9/HNMszjlMgvASKHnIa4fK4DWxQ6Vrg9abYXxN2mDnGnB5lgY1QWJ27rmRv8610mlM9p0na+25Jk5dpLkSJwmk/cy7Cp77BX9FGju+qRu5TazqXFHRDYZS6vfL26+/nFM7D5DhdrAI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756348515; 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=+9kWUKIpvaTwL3YgLr5LNgQOSIHL67kPC1I5p1eDb84=; b=oICcBHtRGylpKJzSrg1twT1iYm0dYPsjE0mceq7jDiv00xF1E/cc01vaVDExdhGHmpC9EDmb3WNzO8BbDxF/g9FFHnjWf1PKucr6rWkoVFDbW4xI12dE+tZqxGg8LZ+XUseESM9bVqq5PzkUuy30phc+XUQc1M4jGt5uKCDbloU= 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=1756348515; 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=+9kWUKIpvaTwL3YgLr5LNgQOSIHL67kPC1I5p1eDb84=; b=gRjjmCkruFP6GlCF/v96+dmCiBDtUPbkYm8FxURRYQnHqmfAtDNDWnmNjcthPLnv p40xv7e4eJnP+rac4xQ6/n6YRCIzAFdZSRzPjGudYYWu3kG7lpvvzLioXJYr0LH1oyl BuiQaDEfXkv2TcBtWbEXO9/Mxe2zuprNEd9sHN7s= Received: by mx.zohomail.com with SMTPS id 1756348512626816.9721835035102; Wed, 27 Aug 2025 19:35:12 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Rob Herring , Steven Price , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH 3/5] drm/panfrost: Introduce JM context for manging job resources Date: Thu, 28 Aug 2025 03:34:06 +0100 Message-ID: <20250828023422.2404784-4-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250828023422.2404784-1-adrian.larumbe@collabora.com> References: <20250828023422.2404784-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 From: Boris Brezillon A context described the affinity properties of a job, like the mask of L2 caches, shader cores and tiler units a job can use, and its priority within its job slot. Every context must define these properties for the job slots in the hardware. Until context creation and destruction and attaching a context ID to a job submission are exposed to UM, all jobs shall be bound to the default Panfrost file context, which has medium priorities and lets a job use any of the above resources. Signed-off-by: Boris Brezillon Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panfrost/panfrost_device.h | 4 +- drivers/gpu/drm/panfrost/panfrost_drv.c | 19 +- drivers/gpu/drm/panfrost/panfrost_job.c | 270 +++++++++++++++++---- drivers/gpu/drm/panfrost/panfrost_job.h | 27 ++- 4 files changed, 262 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/p= anfrost/panfrost_device.h index 077525a3ad68..5b164871eb95 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.h +++ b/drivers/gpu/drm/panfrost/panfrost_device.h @@ -15,6 +15,7 @@ #include =20 #include "panfrost_devfreq.h" +#include "panfrost_job.h" =20 struct panfrost_device; struct panfrost_mmu; @@ -22,7 +23,6 @@ struct panfrost_job_slot; struct panfrost_job; struct panfrost_perfcnt; =20 -#define NUM_JOB_SLOTS 3 #define MAX_PM_DOMAINS 5 =20 enum panfrost_drv_comp_bits { @@ -206,7 +206,7 @@ struct panfrost_engine_usage { struct panfrost_file_priv { struct panfrost_device *pfdev; =20 - struct drm_sched_entity sched_entity[NUM_JOB_SLOTS]; + struct xarray jm_ctxs; =20 struct panfrost_mmu *mmu; =20 diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index 1ea6c509a5d5..398c067457d9 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -279,6 +279,7 @@ static int panfrost_ioctl_submit(struct drm_device *dev= , void *data, struct panfrost_file_priv *file_priv =3D file->driver_priv; struct drm_panfrost_submit *args =3D data; struct drm_syncobj *sync_out =3D NULL; + struct panfrost_jm_ctx *jm_ctx; struct panfrost_job *job; int ret =3D 0, slot; =20 @@ -294,10 +295,17 @@ static int panfrost_ioctl_submit(struct drm_device *d= ev, void *data, return -ENODEV; } =20 + /* TODO: Use the default JM context until ctx management IOCTLs are expos= ed */ + jm_ctx =3D panfrost_jm_ctx_from_handle(file, 0); + if (!jm_ctx) { + ret =3D -EINVAL; + goto out_put_syncout; + } + job =3D kzalloc(sizeof(*job), GFP_KERNEL); if (!job) { ret =3D -ENOMEM; - goto out_put_syncout; + goto out_put_jm_ctx; } =20 kref_init(&job->refcount); @@ -307,12 +315,13 @@ static int panfrost_ioctl_submit(struct drm_device *d= ev, void *data, job->requirements =3D args->requirements; job->flush_id =3D panfrost_gpu_get_latest_flush_id(pfdev); job->mmu =3D file_priv->mmu; + job->ctx =3D panfrost_jm_ctx_get(jm_ctx); job->engine_usage =3D &file_priv->engine_usage; =20 slot =3D panfrost_job_get_slot(job); =20 ret =3D drm_sched_job_init(&job->base, - &file_priv->sched_entity[slot], + &jm_ctx->slots[slot].sched_entity, 1, NULL, file->client_id); if (ret) goto out_put_job; @@ -338,6 +347,8 @@ static int panfrost_ioctl_submit(struct drm_device *dev= , void *data, drm_sched_job_cleanup(&job->base); out_put_job: panfrost_job_put(job); +out_put_jm_ctx: + panfrost_jm_ctx_put(jm_ctx); out_put_syncout: if (sync_out) drm_syncobj_put(sync_out); @@ -564,7 +575,7 @@ panfrost_open(struct drm_device *dev, struct drm_file *= file) goto err_free; } =20 - ret =3D panfrost_job_open(panfrost_priv); + ret =3D panfrost_job_open(file); if (ret) goto err_job; =20 @@ -583,7 +594,7 @@ panfrost_postclose(struct drm_device *dev, struct drm_f= ile *file) struct panfrost_file_priv *panfrost_priv =3D file->driver_priv; =20 panfrost_perfcnt_close(file); - panfrost_job_close(panfrost_priv); + panfrost_job_close(file); =20 panfrost_mmu_ctx_put(panfrost_priv->mmu); kfree(panfrost_priv); diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panf= rost/panfrost_job.c index 82acabb21b27..571bd75d5b40 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.c +++ b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include =20 @@ -22,6 +23,7 @@ #include "panfrost_mmu.h" #include "panfrost_dump.h" =20 +#define MAX_JM_CTX_PER_FILE 128 #define JOB_TIMEOUT_MS 500 =20 #define job_write(dev, reg, data) writel(data, dev->iomem + (reg)) @@ -125,23 +127,6 @@ int panfrost_job_get_slot(struct panfrost_job *job) return 1; } =20 -static void panfrost_job_write_affinity(struct panfrost_device *pfdev, - u32 requirements, - int js) -{ - u64 affinity; - - /* - * Use all cores for now. - * Eventually we may need to support tiler only jobs and h/w with - * multiple (2) coherent core groups - */ - affinity =3D pfdev->features.shader_present; - - job_write(pfdev, JS_AFFINITY_NEXT_LO(js), lower_32_bits(affinity)); - job_write(pfdev, JS_AFFINITY_NEXT_HI(js), upper_32_bits(affinity)); -} - static u32 panfrost_get_job_chain_flag(const struct panfrost_job *job) { @@ -198,6 +183,7 @@ panfrost_enqueue_job(struct panfrost_device *pfdev, int= slot, static void panfrost_job_hw_submit(struct panfrost_job *job, int js) { struct panfrost_device *pfdev =3D job->pfdev; + struct panfrost_js_ctx *js_ctx =3D &job->ctx->slots[js]; unsigned int subslot; u32 cfg; u64 jc_head =3D job->jc; @@ -218,11 +204,15 @@ static void panfrost_job_hw_submit(struct panfrost_jo= b *job, int js) job_write(pfdev, JS_HEAD_NEXT_LO(js), lower_32_bits(jc_head)); job_write(pfdev, JS_HEAD_NEXT_HI(js), upper_32_bits(jc_head)); =20 - panfrost_job_write_affinity(pfdev, job->requirements, js); + job_write(pfdev, JS_AFFINITY_NEXT_LO(js), lower_32_bits(js_ctx->affinity)= ); + job_write(pfdev, JS_AFFINITY_NEXT_HI(js), upper_32_bits(js_ctx->affinity)= ); + + if (panfrost_has_hw_feature(pfdev, HW_FEATURE_XAFFINITY)) + job_write(pfdev, JS_XAFFINITY_NEXT(js), js_ctx->xaffinity); =20 /* start MMU, medium priority, cache clean/flush on end, clean/flush on * start */ - cfg |=3D JS_CONFIG_THREAD_PRI(8) | + cfg |=3D js_ctx->config | JS_CONFIG_START_FLUSH_CLEAN_INVALIDATE | JS_CONFIG_END_FLUSH_CLEAN_INVALIDATE | panfrost_get_job_chain_flag(job); @@ -359,6 +349,7 @@ static void panfrost_job_cleanup(struct kref *ref) kvfree(job->bos); } =20 + panfrost_jm_ctx_put(job->ctx); kfree(job); } =20 @@ -917,39 +908,229 @@ void panfrost_job_fini(struct panfrost_device *pfdev) destroy_workqueue(pfdev->reset.wq); } =20 -int panfrost_job_open(struct panfrost_file_priv *panfrost_priv) +int panfrost_job_open(struct drm_file *file) { + struct panfrost_file_priv *panfrost_priv =3D file->driver_priv; struct panfrost_device *pfdev =3D panfrost_priv->pfdev; + int ret; + + struct drm_panfrost_jm_ctx_create default_jm_ctx =3D { + /* Fragment queue */ + .slots[0] =3D { + .flags =3D PANFROST_JS_FLAG_ENABLED, + .priority =3D PANFROST_JM_CTX_PRIORITY_MEDIUM, + .tiler_mask =3D 0, + .l2_mask =3D pfdev->features.l2_present, + .core_mask =3D pfdev->features.shader_present, + }, + /* Vertex/tiler/compute queue */ + .slots[1] =3D { + .flags =3D PANFROST_JS_FLAG_ENABLED, + .priority =3D PANFROST_JM_CTX_PRIORITY_MEDIUM, + .tiler_mask =3D pfdev->features.tiler_present, + .l2_mask =3D pfdev->features.l2_present, + .core_mask =3D pfdev->features.shader_present, + }, + }; + + xa_init_flags(&panfrost_priv->jm_ctxs, XA_FLAGS_ALLOC); + + ret =3D panfrost_jm_ctx_create(file, &default_jm_ctx); + if (ret) + return ret; + + /* We expect the default context to be assigned handle 0. */ + if (WARN_ON(default_jm_ctx.handle)) + return -EINVAL; + + return 0; +} + +void panfrost_job_close(struct drm_file *file) +{ + struct panfrost_file_priv *panfrost_priv =3D file->driver_priv; + struct panfrost_jm_ctx *jm_ctx; + unsigned long i; + + xa_for_each(&panfrost_priv->jm_ctxs, i, jm_ctx) + panfrost_jm_ctx_destroy(file, i); + + xa_destroy(&panfrost_priv->jm_ctxs); +} + +int panfrost_job_is_idle(struct panfrost_device *pfdev) +{ struct panfrost_job_slot *js =3D pfdev->js; - struct drm_gpu_scheduler *sched; - int ret, i; + int i; =20 for (i =3D 0; i < NUM_JOB_SLOTS; i++) { - sched =3D &js->queue[i].sched; - ret =3D drm_sched_entity_init(&panfrost_priv->sched_entity[i], - DRM_SCHED_PRIORITY_NORMAL, &sched, - 1, NULL); - if (WARN_ON(ret)) - return ret; + /* If there are any jobs in the HW queue, we're not idle */ + if (atomic_read(&js->queue[i].sched.credit_count)) + return false; + } + + return true; +} + +static void panfrost_jm_ctx_release(struct kref *kref) +{ + struct panfrost_jm_ctx *jm_ctx =3D container_of(kref, struct panfrost_jm_= ctx, refcnt); + + for (u32 i =3D 0; i < ARRAY_SIZE(jm_ctx->slots); i++) + drm_sched_entity_destroy(&jm_ctx->slots[i].sched_entity); + + kfree(jm_ctx); +} + +void +panfrost_jm_ctx_put(struct panfrost_jm_ctx *jm_ctx) +{ + if (jm_ctx) + kref_put(&jm_ctx->refcnt, panfrost_jm_ctx_release); +} + +struct panfrost_jm_ctx * +panfrost_jm_ctx_get(struct panfrost_jm_ctx *jm_ctx) +{ + if (jm_ctx) + kref_get(&jm_ctx->refcnt); + + return jm_ctx; +} + +struct panfrost_jm_ctx * +panfrost_jm_ctx_from_handle(struct drm_file *file, u32 handle) +{ + struct panfrost_file_priv *priv =3D file->driver_priv; + struct panfrost_jm_ctx *jm_ctx; + + xa_lock(&priv->jm_ctxs); + jm_ctx =3D panfrost_jm_ctx_get(xa_load(&priv->jm_ctxs, handle)); + xa_unlock(&priv->jm_ctxs); + + return jm_ctx; +} + +static int jm_ctx_prio_to_drm_sched_prio(struct drm_file *file, + enum drm_panfrost_jm_ctx_priority in, + enum drm_sched_priority *out) +{ + switch (in) { + case PANFROST_JM_CTX_PRIORITY_LOW: + *out =3D DRM_SCHED_PRIORITY_LOW; + return 0; + case PANFROST_JM_CTX_PRIORITY_MEDIUM: + *out =3D DRM_SCHED_PRIORITY_NORMAL; + return 0; + case PANFROST_JM_CTX_PRIORITY_HIGH: + /* Higher priorities require CAP_SYS_NICE or DRM_MASTER */ + if (!capable(CAP_SYS_NICE) && !drm_is_current_master(file)) + return -EACCES; + + *out =3D DRM_SCHED_PRIORITY_HIGH; + return 0; + default: + return -EINVAL; + } +} + +#define PANFROST_JS_VALID_FLAGS PANFROST_JS_FLAG_ENABLED + +int panfrost_jm_ctx_create(struct drm_file *file, + struct drm_panfrost_jm_ctx_create *args) +{ + struct panfrost_file_priv *priv =3D file->driver_priv; + struct panfrost_device *pfdev =3D priv->pfdev; + struct panfrost_jm_ctx *jm_ctx; + int ret; + + if (args->pad !=3D 0) + return -EINVAL; + + jm_ctx =3D kzalloc(sizeof(*jm_ctx), GFP_KERNEL); + if (!jm_ctx) + return -ENOMEM; + + kref_init(&jm_ctx->refcnt); + + for (u32 i =3D 0; i < ARRAY_SIZE(args->slots); i++) { + struct drm_gpu_scheduler *sched =3D &pfdev->js->queue[i].sched; + const struct drm_panfrost_js_ctx_info *js_info =3D &args->slots[i]; + struct panfrost_js_ctx *js_ctx =3D &jm_ctx->slots[i]; + enum drm_sched_priority sched_prio; + + if (js_info->flags & ~PANFROST_JS_VALID_FLAGS) + goto err_put_jm_ctx; + + if (!(js_info->flags & PANFROST_JS_FLAG_ENABLED)) + continue; + + ret =3D jm_ctx_prio_to_drm_sched_prio(file, js_info->priority, &sched_pr= io); + if (ret) + goto err_put_jm_ctx; + + if (js_info->core_mask & ~pfdev->features.shader_present) + goto err_put_jm_ctx; + + if (js_info->tiler_mask & ~pfdev->features.tiler_present) + goto err_put_jm_ctx; + + if (js_info->l2_mask & ~pfdev->features.l2_present) + goto err_put_jm_ctx; + + js_ctx->affinity =3D js_info->core_mask; + js_ctx->config =3D JS_CONFIG_THREAD_PRI(js_info->priority); + + if (panfrost_has_hw_feature(pfdev, HW_FEATURE_XAFFINITY)) { + js_ctx->xaffinity =3D JS_XAFFINITY_ENABLE | + JS_XAFFINITY_TILER_MASK(js_info->tiler_mask) | + JS_XAFFINITY_L2_MASK(js_info->l2_mask); + } + + ret =3D drm_sched_entity_init(&js_ctx->sched_entity, sched_prio, + &sched, 1, NULL); + if (ret) + goto err_put_jm_ctx; + + js_ctx->enabled =3D true; } + + ret =3D xa_alloc(&priv->jm_ctxs, &args->handle, jm_ctx, + XA_LIMIT(0, MAX_JM_CTX_PER_FILE), GFP_KERNEL); + if (ret) + goto err_put_jm_ctx; + return 0; + +err_put_jm_ctx: + panfrost_jm_ctx_put(jm_ctx); + return ret; } =20 -void panfrost_job_close(struct panfrost_file_priv *panfrost_priv) +int panfrost_jm_ctx_destroy(struct drm_file *file, u32 handle) { - struct panfrost_device *pfdev =3D panfrost_priv->pfdev; - int i; + struct panfrost_file_priv *priv =3D file->driver_priv; + struct panfrost_device *pfdev =3D priv->pfdev; + struct panfrost_jm_ctx *jm_ctx; =20 - for (i =3D 0; i < NUM_JOB_SLOTS; i++) - drm_sched_entity_destroy(&panfrost_priv->sched_entity[i]); + jm_ctx =3D xa_erase(&priv->jm_ctxs, handle); + if (!jm_ctx) + return -EINVAL; + + for (u32 i =3D 0; i < ARRAY_SIZE(jm_ctx->slots); i++) { + if (jm_ctx->slots[i].enabled) + drm_sched_entity_destroy(&jm_ctx->slots[i].sched_entity); + } =20 /* Kill in-flight jobs */ spin_lock(&pfdev->js->job_lock); - for (i =3D 0; i < NUM_JOB_SLOTS; i++) { - struct drm_sched_entity *entity =3D &panfrost_priv->sched_entity[i]; - int j; + for (u32 i =3D 0; i < ARRAY_SIZE(jm_ctx->slots); i++) { + struct drm_sched_entity *entity =3D &jm_ctx->slots[i].sched_entity; + + if (!jm_ctx->slots[i].enabled) + continue; =20 - for (j =3D ARRAY_SIZE(pfdev->jobs[0]) - 1; j >=3D 0; j--) { + for (int j =3D ARRAY_SIZE(pfdev->jobs[0]) - 1; j >=3D 0; j--) { struct panfrost_job *job =3D pfdev->jobs[i][j]; u32 cmd; =20 @@ -980,18 +1161,7 @@ void panfrost_job_close(struct panfrost_file_priv *pa= nfrost_priv) } } spin_unlock(&pfdev->js->job_lock); -} - -int panfrost_job_is_idle(struct panfrost_device *pfdev) -{ - struct panfrost_job_slot *js =3D pfdev->js; - int i; - - for (i =3D 0; i < NUM_JOB_SLOTS; i++) { - /* If there are any jobs in the HW queue, we're not idle */ - if (atomic_read(&js->queue[i].sched.credit_count)) - return false; - } =20 - return true; + panfrost_jm_ctx_put(jm_ctx); + return 0; } diff --git a/drivers/gpu/drm/panfrost/panfrost_job.h b/drivers/gpu/drm/panf= rost/panfrost_job.h index ec581b97852b..caf394e070f4 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.h +++ b/drivers/gpu/drm/panfrost/panfrost_job.h @@ -18,6 +18,7 @@ struct panfrost_job { =20 struct panfrost_device *pfdev; struct panfrost_mmu *mmu; + struct panfrost_jm_ctx *ctx; =20 /* Fence to be signaled by IRQ handler when the job is complete. */ struct dma_fence *done_fence; @@ -39,10 +40,32 @@ struct panfrost_job { u64 start_cycles; }; =20 +struct panfrost_js_ctx { + struct drm_sched_entity sched_entity; + u32 config; + u32 xaffinity; + u64 affinity; + bool enabled; +}; + +#define NUM_JOB_SLOTS 3 + +struct panfrost_jm_ctx { + struct kref refcnt; + struct panfrost_js_ctx slots[NUM_JOB_SLOTS]; +}; + +int panfrost_jm_ctx_create(struct drm_file *file, + struct drm_panfrost_jm_ctx_create *args); +int panfrost_jm_ctx_destroy(struct drm_file *file, u32 handle); +void panfrost_jm_ctx_put(struct panfrost_jm_ctx *jm_ctx); +struct panfrost_jm_ctx *panfrost_jm_ctx_get(struct panfrost_jm_ctx *jm_ctx= ); +struct panfrost_jm_ctx *panfrost_jm_ctx_from_handle(struct drm_file *file,= u32 handle); + int panfrost_job_init(struct panfrost_device *pfdev); void panfrost_job_fini(struct panfrost_device *pfdev); -int panfrost_job_open(struct panfrost_file_priv *panfrost_priv); -void panfrost_job_close(struct panfrost_file_priv *panfrost_priv); +int panfrost_job_open(struct drm_file *file); +void panfrost_job_close(struct drm_file *file); int panfrost_job_get_slot(struct panfrost_job *job); int panfrost_job_push(struct panfrost_job *job); void panfrost_job_put(struct panfrost_job *job); --=20 2.50.0 From nobody Fri Oct 3 16:44:17 2025 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 B64E325BEF8 for ; Thu, 28 Aug 2025 02:35:37 +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=1756348539; cv=pass; b=joeXj82dl7sQU9Jw5hCqmr+rjd7VSOdW0B2KCaDsl0ueq1XxZaN2/4r1LO46MyEFN5W+sFVO1zr2BZLFIc2rJrgdi0dbGwO5tt3IwDhEm0fXPori1oMXEFnpDRPf1Cj0YIiYfTaV0Unnhtu+PSKRvT3R6FrNjX/vZ4Nm9unnIyo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756348539; c=relaxed/simple; bh=j1Gitwkm4En+JoTojCmV16fbmEt2ycquiz14lw46/jE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=V52mSMjTxzVpmClanpIvg6kGgVFAHd+Ntc+Kg7lOXKYyspDYdy2+JTL507vp0Wfo8RR3Djd/XcNE5N1+18u+Mmcr4iKoyJODWr8Dv5bPGZwodwBx3nWXk0c9kzmtUqDDumD+FAORRxSHvw0JkwdBhct7TP+iuvrLsVu9VOvnSYY= 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=Ic46tJvh; 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="Ic46tJvh" ARC-Seal: i=1; a=rsa-sha256; t=1756348517; cv=none; d=zohomail.com; s=zohoarc; b=FZHPNHJuaJ/ya76DB++rRFwIXmXyFCHu7xddqfci852BHbOEvvcA9xMqOtmK2EflDjHU3/tqg3GSW9cr8VwPWhuWKXe/d9zRlE0ki2XWpju407e5KE2h+LTp+oKMx0H5aWBaILVEq6TrqlpbF48KkSbSblBCnCt46g7m9iiKztg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756348517; 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=Ahg0uZ2g/6UpbHdYm0+DfmTgyMu38iJj+ckHrZ7WQDs=; b=eOc0o6HSm5bPfU/RTbDlENwOaw84pKj2Xm/rSE+jY1uT9J35AODNzfdl3jCbdGQp5l7Jqs8GovdJ844Q2bxwM4XPnHJ4MN3rWqdEw+zw6BSEOMPhXGsxciiDJCQhWZEKvvuvj5Mvhpt39cwJs0sduNjyuw1+hPvhLenhiUmLryQ= 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=1756348517; 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=Ahg0uZ2g/6UpbHdYm0+DfmTgyMu38iJj+ckHrZ7WQDs=; b=Ic46tJvh8E/kUfX3M/bWifavhfM1zyWUJmE0zcn7o5ZgjhOghd4ZKJbdgbgJQbKg TPqCAV/b67/VgBuzidoyLTIGljJcduulWS0zgOf8KrV4EH5JgOvi+L84jKr+oNJsBKH fU09x7e1mIM3Hrjy0GSrNUtlN0h9FGPfXcdR96FE= Received: by mx.zohomail.com with SMTPS id 1756348515901842.2094297680466; Wed, 27 Aug 2025 19:35:15 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Rob Herring , Steven Price , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH 4/5] drm/panfrost: Expose JM context IOCTLs to UM Date: Thu, 28 Aug 2025 03:34:07 +0100 Message-ID: <20250828023422.2404784-5-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250828023422.2404784-1-adrian.larumbe@collabora.com> References: <20250828023422.2404784-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 From: Boris Brezillon Minor revision of the driver must be bumped because this expands the uAPI. On top of that, let user know the available priorities so that they can create contexts with legal priority values. Signed-off-by: Boris Brezillon Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panfrost/panfrost_drv.c | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index 398c067457d9..b54cdd589ec4 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -109,6 +110,15 @@ static int panfrost_ioctl_get_param(struct drm_device = *ddev, void *data, struct #endif break; =20 + case DRM_PANFROST_PARAM_ALLOWED_JM_CTX_PRIORITIES: + param->value =3D BIT(PANFROST_JM_CTX_PRIORITY_LOW) | + BIT(PANFROST_JM_CTX_PRIORITY_MEDIUM); + + /* High prio require CAP_SYS_NICE or DRM_MASTER */ + if (capable(CAP_SYS_NICE) || drm_is_current_master(file)) + param->value |=3D BIT(PANFROST_JM_CTX_PRIORITY_HIGH); + break; + default: return -EINVAL; } @@ -547,6 +557,24 @@ static int panfrost_ioctl_set_label_bo(struct drm_devi= ce *ddev, void *data, return ret; } =20 +static int panfrost_ioctl_jm_ctx_create(struct drm_device *dev, void *data, + struct drm_file *file) +{ + return panfrost_jm_ctx_create(file, data); +} + +static int panfrost_ioctl_jm_ctx_destroy(struct drm_device *dev, void *dat= a, + struct drm_file *file) +{ + const struct drm_panfrost_jm_ctx_destroy *args =3D data; + + /* We can't destroy the default context created when the file is opened. = */ + if (!args->handle) + return -EINVAL; + + return panfrost_jm_ctx_destroy(file, args->handle); +} + int panfrost_unstable_ioctl_check(void) { if (!unstable_ioctls) @@ -614,6 +642,8 @@ static const struct drm_ioctl_desc panfrost_drm_driver_= ioctls[] =3D { PANFROST_IOCTL(PERFCNT_DUMP, perfcnt_dump, DRM_RENDER_ALLOW), PANFROST_IOCTL(MADVISE, madvise, DRM_RENDER_ALLOW), PANFROST_IOCTL(SET_LABEL_BO, set_label_bo, DRM_RENDER_ALLOW), + PANFROST_IOCTL(JM_CTX_CREATE, jm_ctx_create, DRM_RENDER_ALLOW), + PANFROST_IOCTL(JM_CTX_DESTROY, jm_ctx_destroy, DRM_RENDER_ALLOW), }; =20 static void panfrost_gpu_show_fdinfo(struct panfrost_device *pfdev, @@ -710,6 +740,8 @@ static void panfrost_debugfs_init(struct drm_minor *min= or) * - 1.3 - adds JD_REQ_CYCLE_COUNT job requirement for SUBMIT * - adds SYSTEM_TIMESTAMP and SYSTEM_TIMESTAMP_FREQUENCY queries * - 1.4 - adds SET_LABEL_BO + * - 1.5 - adds JM_CTX_{CREATE,DESTROY} ioctls and extend SUBMIT to allow + * context creation with configurable priorities/affinity */ static const struct drm_driver panfrost_drm_driver =3D { .driver_features =3D DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ, --=20 2.50.0 From nobody Fri Oct 3 16:44:17 2025 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 ACEFF25D1EE for ; Thu, 28 Aug 2025 02:35:40 +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=1756348542; cv=pass; b=djPW5D/WGv9Q7PJplIyJm8DXxt3Dy43J+3IWaKA4BKtLfYP95Ao2dzOf0F4iFcTPbpbY1ugmW3Kg08ay0dfMpxamYzMy7NlmxXMdWuxhsu+ihapQz4mgznMvhtjHPe68flE0+qywH1IbnEZEdSGBro9m37XHUAXAUg2un4JQOFE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756348542; c=relaxed/simple; bh=tYltz7helLksfswpqxgC4xZJWWPlD8KezNZ8jFQaIPY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qCQLBCHVbNdJnwKfefDpXAXPPxvJKvevSxRTviZwaFzDKAXe94laRf/VaP+bzCYeppswdSlFQ1NxCnXmCBlL4eTd1QRwqJ+AuDxWJD36r3rzWF1pAT8J/us1RnAZqwLEC/EegJVPMxfx2PbSwasS1AcCvvn0k0pS9Uu6ZryhTUA= 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=e5wKqVPi; 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="e5wKqVPi" ARC-Seal: i=1; a=rsa-sha256; t=1756348521; cv=none; d=zohomail.com; s=zohoarc; b=DA4N4aH5+wWrP1LP3Sif2/kVsTYDQSSvvojqVC86fVK9a04jv+5tfToFYB+ffWoRMDRYiQ49vCWeHX0JjNUCh+V4smqEmb2or0BAAh3+ADTaNPTxAUbXLQFa5uh80lcmELhLXJCbWrdX9fEH6v8Uakb5ZKJ/aEJH9NFY8taHxFI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756348521; 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=V1Uvfctiz0Q3YCABen6cOD/xIWF8r6drJ7x0TI0+0eA=; b=S3FZxUVoZDTFqDYWBPw2CJGd4N+MbxYYRRsHmdOwjWKhjnqOsB13SCmn229+IDz9xr1f39JBmjlUEkKvbUX7GdIIGeo2wt8OTIVbDc+Xf9UbOiC3vOyR3pO0gHMBiFTuX8TF9qc0jKB6U3uTjeXE5R7up6wQqogLxFQagl6qg7Q= 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=1756348521; 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=V1Uvfctiz0Q3YCABen6cOD/xIWF8r6drJ7x0TI0+0eA=; b=e5wKqVPiGOL9qx/mvTMxmh/x1KqDz9tkR9F5adZB9Kmu4VnMtBflfIK47DsTGJRC KeryRSEJHSaUbCcnxdH6fikEElOpLUR69tmmDglxVdfgYZuSPxoWMMOolEyoXhgSnKd TU3pdGiqg1ELi5lbcjVU2AK8YHEeernREV1uoQSo= Received: by mx.zohomail.com with SMTPS id 1756348518972966.8106728089455; Wed, 27 Aug 2025 19:35:18 -0700 (PDT) From: =?UTF-8?q?Adri=C3=A1n=20Larumbe?= To: linux-kernel@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, Boris Brezillon , kernel@collabora.com, =?UTF-8?q?Adri=C3=A1n=20Larumbe?= , Rob Herring , Steven Price , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Subject: [PATCH 5/5] drm/panfrost: Display list of device JM contexts over debugfs Date: Thu, 28 Aug 2025 03:34:08 +0100 Message-ID: <20250828023422.2404784-6-adrian.larumbe@collabora.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250828023422.2404784-1-adrian.larumbe@collabora.com> References: <20250828023422.2404784-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 From: Boris Brezillon For DebugFS builds, create a filesystem knob that, for every single open file of the Panfrost DRM device, shows its command name information and PID (when applicable), and all of its existing JM contexts. For every context, show also register values that a UM tool could decode back into a mask of L2 caches, tiling units and shader cores which jobs submitted under that context can use. Signed-off-by: Boris Brezillon Signed-off-by: Adri=C3=A1n Larumbe --- drivers/gpu/drm/panfrost/panfrost_drv.c | 101 ++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panf= rost/panfrost_drv.c index b54cdd589ec4..3ba43180ca8d 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -713,6 +713,52 @@ static int panthor_gems_show(struct seq_file *m, void = *data) return 0; } =20 +static void show_panfrost_jm_ctx(struct panfrost_jm_ctx *jm_ctx, u32 handl= e, + struct seq_file *m) +{ + static const char * const prios[] =3D { + [DRM_SCHED_PRIORITY_HIGH] =3D "HIGH", + [DRM_SCHED_PRIORITY_NORMAL] =3D "NORMAL", + [DRM_SCHED_PRIORITY_LOW] =3D "LOW", + }; + + seq_printf(m, " JM context %u:\n", handle); + + for (u32 i =3D 0; i < ARRAY_SIZE(jm_ctx->slots); i++) { + const struct panfrost_js_ctx *slot =3D &jm_ctx->slots[i]; + const char *prio =3D NULL; + + if (!slot->enabled) + continue; + + if (slot->sched_entity.priority < ARRAY_SIZE(prios)) + prio =3D prios[slot->sched_entity.priority]; + + seq_printf(m, " slot %u: priority %s config %x affinity %llx xaffinity = %x\n", + i, prio ? prio : "UNKNOWN", slot->config, + slot->affinity, slot->xaffinity); + } +} + +static int show_file_jm_ctxs(struct panfrost_file_priv *pfile, + struct seq_file *m) +{ + struct panfrost_jm_ctx *jm_ctx; + unsigned long i; + + xa_lock(&pfile->jm_ctxs); + xa_for_each(&pfile->jm_ctxs, i, jm_ctx) { + jm_ctx =3D panfrost_jm_ctx_get(jm_ctx); + xa_unlock(&pfile->jm_ctxs); + show_panfrost_jm_ctx(jm_ctx, i, m); + panfrost_jm_ctx_put(jm_ctx); + xa_lock(&pfile->jm_ctxs); + } + xa_unlock(&pfile->jm_ctxs); + + return 0; +} + static struct drm_info_list panthor_debugfs_list[] =3D { {"gems", panthor_gems_show, 0, NULL}, }; @@ -726,9 +772,64 @@ static int panthor_gems_debugfs_init(struct drm_minor = *minor) return 0; } =20 +static int show_each_file(struct seq_file *m, void *arg) +{ + struct drm_info_node *node =3D (struct drm_info_node *)m->private; + struct drm_device *ddev =3D node->minor->dev; + int (*show)(struct panfrost_file_priv *, struct seq_file *) =3D + node->info_ent->data; + struct drm_file *file; + int ret; + + ret =3D mutex_lock_interruptible(&ddev->filelist_mutex); + if (ret) + return ret; + + list_for_each_entry(file, &ddev->filelist, lhead) { + struct task_struct *task; + struct panfrost_file_priv *pfile =3D file->driver_priv; + struct pid *pid; + + /* + * Although we have a valid reference on file->pid, that does + * not guarantee that the task_struct who called get_pid() is + * still alive (e.g. get_pid(current) =3D> fork() =3D> exit()). + * Therefore, we need to protect this ->comm access using RCU. + */ + rcu_read_lock(); + pid =3D rcu_dereference(file->pid); + task =3D pid_task(pid, PIDTYPE_TGID); + seq_printf(m, "client_id %8llu pid %8d command %s:\n", + file->client_id, pid_nr(pid), + task ? task->comm : ""); + rcu_read_unlock(); + + ret =3D show(pfile, m); + if (ret < 0) + break; + + seq_puts(m, "\n"); + } + + mutex_unlock(&ddev->filelist_mutex); + return ret; +} + +static struct drm_info_list panfrost_sched_debugfs_list[] =3D { + { "sched_ctxs", show_each_file, 0, show_file_jm_ctxs }, +}; + +static void panfrost_sched_debugfs_init(struct drm_minor *minor) +{ + drm_debugfs_create_files(panfrost_sched_debugfs_list, + ARRAY_SIZE(panfrost_sched_debugfs_list), + minor->debugfs_root, minor); +} + static void panfrost_debugfs_init(struct drm_minor *minor) { panthor_gems_debugfs_init(minor); + panfrost_sched_debugfs_init(minor); } #endif =20 --=20 2.50.0