From nobody Sat Feb 7 17:41:47 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 D504F1A7072 for ; Tue, 13 Aug 2024 21:06:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583197; cv=pass; b=jhdd5DJVC2gSvJp4BQ5tWM4z41eK+CUFdBp3fAf1GDsFOuK/fxG1eexBtmCQhsAe/YtmQlY1asH9Uq57ItIaCCkvL091y4O9qHsRNfh8CYCnoeH8LRyVYtHQqYySi4CUjpHFwooqqmRcqzJXaikRpUy/dAzqfhXCPX2jSjayIKY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583197; c=relaxed/simple; bh=zdjBsAr4gMxdC5HW/ZwOouh4ea8rth+C468BcIC9+b8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lZYIpsAaG9/LNndkmJVEqYxc+W/u1sh6wEN+gysp15FHyjVlPzvcMYX2WJSuTwJ2hmUCmBB1PUn+QQkzS+R4fC68MB1o+s6MayZawB19GYj6lb9KqmGfyVvDJhqlrbs85CdO0U/tZFgv+rr+40rFVmLKdXdfov0mVQmLUH/CV8s= 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=daniel.almeida@collabora.com header.b=aVxi57OV; arc=pass smtp.client-ip=136.143.188.12 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=daniel.almeida@collabora.com header.b="aVxi57OV" ARC-Seal: i=1; a=rsa-sha256; t=1723583191; cv=none; d=zohomail.com; s=zohoarc; b=DcX1Pyuhfk9dXPS4rK9VeKblu6L3/jmS9rNcwVo+ufKL24LfwD382rDrFugP/ZwYsgTrvQFxZp3CnKd89Ig87WGY0WFx5/4YRNNsm5YSSgpbaQsR5vQUKsm12QxNh/jO03FsMoVxdm6mYJiXifkH2BJHje5A20V5ntiqx3jKwAc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723583191; h=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=rD+SnsdX/sylSEfyI7jJsNyloIr864MAV90HZjGumtc=; b=Dz9xgmjUrD2lQhf2+vMNu2WssTa7wR/nWtqsTnGpDS8Cm4YRhvtyH1nKUEvQc/keBPsHSLmx1AvpijisHDvYneMFYmD0OMdOrzOMbCkp8M0CsNbC+HqrU81YfcZwTyQFxkrBMQdQaKBxUDd4vDR4cAMB0rscLzgWpSKu0700lcs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1723583191; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=rD+SnsdX/sylSEfyI7jJsNyloIr864MAV90HZjGumtc=; b=aVxi57OVrGFIAL17GDPLiHlFn7hyEjVyEY26IvzQP4FakMVnpuN2/m4GKB38EmPe WMIaqxLvLXVyZXp45YgplpHkkJtFnG6KgzdMa8E5SqtgDin3bCGX1+rtUPaS3TFa8K+ 9HnRggWVYqkRhMkLAUCvbFncTOlusnFD6Bunpc2Y= Received: by mx.zohomail.com with SMTPS id 1723583190644813.7539044857064; Tue, 13 Aug 2024 14:06:30 -0700 (PDT) From: Daniel Almeida To: liviu.dudau@arm.com, steven.price@arm.com, carsten.haitzler@arm.com, boris.brezillon@collabora.com, robh@kernel.org, faith.ekstrand@collabora.com Cc: Daniel Almeida , linux-kernel@vger.kernel.org Subject: [PATCH v2 1/5] drm: panthor: expose some fw information through the query ioctl Date: Tue, 13 Aug 2024 18:05:44 -0300 Message-ID: <20240813210555.607641-3-daniel.almeida@collabora.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240813210555.607641-1-daniel.almeida@collabora.com> References: <20240710225011.275153-1-daniel.almeida@collabora.com> <20240813210555.607641-1-daniel.almeida@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" This is of interest to userspace, and similar in nature to the GPU and CSIF information we already return in the query ioctl. Signed-off-by: Daniel Almeida --- drivers/gpu/drm/panthor/panthor_device.h | 3 +++ drivers/gpu/drm/panthor/panthor_drv.c | 8 ++++++++ drivers/gpu/drm/panthor/panthor_sched.c | 5 +++++ include/uapi/drm/panthor_drm.h | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/pan= thor/panthor_device.h index e388c0472ba7..224c53dcfe6d 100644 --- a/drivers/gpu/drm/panthor/panthor_device.h +++ b/drivers/gpu/drm/panthor/panthor_device.h @@ -100,6 +100,9 @@ struct panthor_device { /** @csif_info: Command stream interface information. */ struct drm_panthor_csif_info csif_info; =20 + /** @fw_info: Firmware info for the global interface */ + struct drm_panthor_fw_info fw_info; + /** @gpu: GPU management data. */ struct panthor_gpu *gpu; =20 diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index b8a84f26b3ef..fb30e119d9bf 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -164,6 +164,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_fw_info, instr_features), \ PANTHOR_UOBJ_DECL(struct drm_panthor_sync_op, timeline_value), \ PANTHOR_UOBJ_DECL(struct drm_panthor_queue_submit, syncs), \ PANTHOR_UOBJ_DECL(struct drm_panthor_queue_create, ringbuf_size), \ @@ -765,6 +766,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_FW_INFO: + args->size =3D sizeof(ptdev->fw_info); + return 0; + default: return -EINVAL; } @@ -777,6 +782,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_FW_INFO: + return PANTHOR_UOBJ_SET(args->pointer, args->size, ptdev->fw_info); + default: return -EINVAL; } diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/pant= hor/panthor_sched.c index 79ffcbc41d78..e0ecc8bcfaae 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -3495,6 +3495,11 @@ int panthor_sched_init(struct panthor_device *ptdev) ptdev->csif_info.cs_slot_count =3D sched->cs_slot_count; ptdev->csif_info.scoreboard_slot_count =3D sched->sb_slot_count; =20 + ptdev->fw_info.version =3D glb_iface->control->version; + ptdev->fw_info.features =3D glb_iface->control->features; + ptdev->fw_info.group_num =3D glb_iface->control->group_num; + ptdev->fw_info.instr_features =3D glb_iface->control->instr_features; + sched->last_tick =3D 0; sched->resched_target =3D U64_MAX; sched->tick_period =3D msecs_to_jiffies(10); diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h index aaed8e12ad0b..e235cf452460 100644 --- a/include/uapi/drm/panthor_drm.h +++ b/include/uapi/drm/panthor_drm.h @@ -260,6 +260,9 @@ enum drm_panthor_dev_query_type { =20 /** @DRM_PANTHOR_DEV_QUERY_CSIF_INFO: Query command-stream interface info= rmation. */ DRM_PANTHOR_DEV_QUERY_CSIF_INFO, + + /** @DRM_PANTHOR_DEV_QUERY_FW_INFO: Query firmware information */ + DRM_PANTHOR_DEV_QUERY_FW_INFO, }; =20 /** @@ -377,6 +380,22 @@ struct drm_panthor_csif_info { __u32 pad; }; =20 +/** struct drm_panthor_fw_info - FW information + * + * Structure grouping all queryable information relating to the global FW = interface. + */ + +struct drm_panthor_fw_info { + /** @version: Global interface version */ + __u32 version; + /** @features: Global interface features */ + __u32 features; + /** @group_num: Number of CSG interfaces */ + __u32 group_num; + /** @instr_features: Instrumentation features */ + __u32 instr_features; +}; + /** * struct drm_panthor_dev_query - Arguments passed to DRM_PANTHOR_IOCTL_DE= V_QUERY */ --=20 2.45.2 From nobody Sat Feb 7 17:41:47 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 C03131A7067 for ; Tue, 13 Aug 2024 21:06:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583202; cv=pass; b=SV5g5dVXIuTCLMrOfR9VV47770rip9jiPHmLY06ZbPYDQQIisvwy9d3O44IwO/UlvNBE4ezua8lrx79AjFRIynlj23oFdCQy9SDOiiIxc/CfqXsxbyJEK+0tg8CfoucdLiopdipLRn0mhKS8bxJ5MsRxdYPeflhvUD/MCxTdB8w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583202; c=relaxed/simple; bh=DY55RFZqJXWmOOjke7ZNey8T35aIJyQCDUKVgyEywV0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AvAG4gen2DQ13U8tQi8BvlJzgGIjFh8j58nMcNP1OIaW1wR4Bz0jBY1yV6R/RUwoQ6m7ECcAhCM0xTT7JWDdivYxvfEE7qBjeHAbLbz7tLv3800pKGKMxXMwtET97xW6Jt7BRJO6HQ1s0mJV6PLELzDAPYmnfZRVDCElkfix/OY= 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=daniel.almeida@collabora.com header.b=ih9gvZS0; arc=pass smtp.client-ip=136.143.188.12 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=daniel.almeida@collabora.com header.b="ih9gvZS0" ARC-Seal: i=1; a=rsa-sha256; t=1723583195; cv=none; d=zohomail.com; s=zohoarc; b=Xc1MhJLswEzgKsrc62zKJplUxUdD6OKd1TyFL5XSAspuuIM/BorStZPz6KCfdwkds0ilk5WBR+kv8bxOXb+MgkQBU1ofe+dhlPcPv7t6s5hbrbG/0wVC+7xCvYS2udGl1H0m080782C5MsBFuz+FGNUgS/PDdaHcNLoJ4lA4z9A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723583195; h=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=Hxzm49gmsbSKbs0TbF5K6vGCIKx5EAMcbDENEu5LKHU=; b=bbushN8WSMdXKFmLUvi8j276Whus7CspOLb3xOde21XBrPSRDcqhlcxOEVdYtTnns4vmn9xN3ylrniSDSuAep9qi6nW/HA0lgHAa3sorI3tI4xjb+AowKwgSr//GZamTteimS8pJYGNC7LimdArr5z7fPW2URWBar4pCVL2Kiw0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1723583195; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=Hxzm49gmsbSKbs0TbF5K6vGCIKx5EAMcbDENEu5LKHU=; b=ih9gvZS0YccgfJKTr9yzi4CawuUul4SkyFyAJhQAbxZmASuL0fOQrrEbJJDkSSIc GtnqD2mf+QqKR7bNX4SMgGKzY9i+a3oTGSdjWExmAUOQIS5wU1V9mzJjGxskJS8Z68T NcbuIzJam3DxdHqUCqzgwRPSg2P5wJ5UApGkB6CU= Received: by mx.zohomail.com with SMTPS id 172358319360042.98901637150698; Tue, 13 Aug 2024 14:06:33 -0700 (PDT) From: Daniel Almeida To: liviu.dudau@arm.com, steven.price@arm.com, carsten.haitzler@arm.com, boris.brezillon@collabora.com, robh@kernel.org, faith.ekstrand@collabora.com Cc: Daniel Almeida , linux-kernel@vger.kernel.org Subject: [PATCH v2 2/5] drm: panthor: add devcoredump support Date: Tue, 13 Aug 2024 18:05:45 -0300 Message-ID: <20240813210555.607641-4-daniel.almeida@collabora.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240813210555.607641-1-daniel.almeida@collabora.com> References: <20240710225011.275153-1-daniel.almeida@collabora.com> <20240813210555.607641-1-daniel.almeida@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" Dump the GPU state using devcoredump. This is useful for debugging purposes. Signed-off-by: Daniel Almeida --- drivers/gpu/drm/panthor/Kconfig | 1 + drivers/gpu/drm/panthor/Makefile | 1 + drivers/gpu/drm/panthor/panthor_dump.c | 376 ++++++++++++++++++++++++ drivers/gpu/drm/panthor/panthor_dump.h | 21 ++ drivers/gpu/drm/panthor/panthor_mmu.c | 22 ++ drivers/gpu/drm/panthor/panthor_mmu.h | 6 + drivers/gpu/drm/panthor/panthor_sched.c | 51 +++- drivers/gpu/drm/panthor/panthor_sched.h | 10 + include/uapi/drm/panthor_drm.h | 124 ++++++++ 9 files changed, 611 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/panthor/panthor_dump.c create mode 100644 drivers/gpu/drm/panthor/panthor_dump.h diff --git a/drivers/gpu/drm/panthor/Kconfig b/drivers/gpu/drm/panthor/Kcon= fig index 55b40ad07f3b..eeb80d8e8064 100644 --- a/drivers/gpu/drm/panthor/Kconfig +++ b/drivers/gpu/drm/panthor/Kconfig @@ -14,6 +14,7 @@ config DRM_PANTHOR select IOMMU_IO_PGTABLE_LPAE select IOMMU_SUPPORT select PM_DEVFREQ + select WANT_DEVCOREDUMP help DRM driver for ARM Mali CSF-based GPUs. =20 diff --git a/drivers/gpu/drm/panthor/Makefile b/drivers/gpu/drm/panthor/Mak= efile index 15294719b09c..19be24ddf577 100644 --- a/drivers/gpu/drm/panthor/Makefile +++ b/drivers/gpu/drm/panthor/Makefile @@ -4,6 +4,7 @@ panthor-y :=3D \ panthor_devfreq.o \ panthor_device.o \ panthor_drv.o \ + panthor_dump.o \ panthor_fw.o \ panthor_gem.o \ panthor_gpu.o \ diff --git a/drivers/gpu/drm/panthor/panthor_dump.c b/drivers/gpu/drm/panth= or/panthor_dump.c new file mode 100644 index 000000000000..7ec0e21dc7e9 --- /dev/null +++ b/drivers/gpu/drm/panthor/panthor_dump.c @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: GPL-2.0 or MIT +/* SPDX-FileCopyrightText: Copyright Collabora 2024 */ + +#include +#include +#include +#include +#include +#include +#include + +#include "panthor_device.h" +#include "panthor_dump.h" +#include "panthor_mmu.h" +#include "panthor_sched.h" + +/* A magic value used when starting a new section in the dump */ +#define PANT_DUMP_MAGIC 0x544e4150 /* PANT */ +#define PANT_DUMP_MAJOR 1 +#define PANT_DUMP_MINOR 0 + +/* keep track of where we are in the underlying buffer */ +struct dump_allocator { + u8 *start; + u8 *curr; + size_t pos; + size_t capacity; +}; + +struct vm_dump_count { + u64 size; + u32 vas; +}; + +struct queue_count { + u32 queues; +}; + +struct dump_group_args { + struct panthor_device *ptdev; + struct dump_allocator *alloc; + struct panthor_group *group; +}; + +struct dump_va_args { + struct panthor_device *ptdev; + struct dump_allocator *alloc; +}; + +static void *alloc_bytes(struct dump_allocator *alloc, size_t size) +{ + void *ret; + + if (alloc->pos + size > alloc->capacity) + return ERR_PTR(-ENOMEM); + + ret =3D alloc->curr; + alloc->curr +=3D size; + alloc->pos +=3D size; + return ret; +} + +static struct drm_panthor_dump_header * +alloc_header(struct dump_allocator *alloc, u32 type, size_t size) +{ + struct drm_panthor_dump_header *hdr; + int header_size =3D sizeof(*hdr); + + hdr =3D alloc_bytes(alloc, header_size); + if (IS_ERR(hdr)) + return hdr; + + hdr->magic =3D PANT_DUMP_MAGIC; + hdr->header_type =3D type; + hdr->header_size =3D header_size; + hdr->data_size =3D size; + return hdr; +} + +static int dump_bo(struct panthor_device *ptdev, u8 *dst, + struct drm_gem_object *obj, int offset, int size) +{ + struct iosys_map map =3D {}; + int ret; + + ret =3D drm_gem_vmap_unlocked(obj, &map); + if (ret) + return ret; + + drm_dbg(&ptdev->base, "dumping bo %p, offset %d, size %d\n", obj, + offset, size); + + memcpy(dst, map.vaddr + offset, size); + drm_gem_vunmap_unlocked(obj, &map); + return ret; +} + +static int dump_va(struct dump_va_args *dump_va_args, + const struct drm_gpuva *va, int type) +{ + struct drm_gem_object *obj =3D va->gem.obj; + const int hdr_size =3D + sizeof(struct drm_panthor_dump_gpuva) + va->va.range; + struct drm_panthor_dump_gpuva *dump_va; + struct drm_panthor_dump_header *dump_hdr; + u8 *bo_data; + + dump_hdr =3D alloc_header(dump_va_args->alloc, type, hdr_size); + if (IS_ERR(dump_hdr)) + return PTR_ERR(dump_hdr); + + dump_va =3D alloc_bytes(dump_va_args->alloc, sizeof(*dump_va)); + if (IS_ERR(dump_va)) + return PTR_ERR(dump_va); + + bo_data =3D alloc_bytes(dump_va_args->alloc, va->va.range); + if (IS_ERR(bo_data)) + return PTR_ERR(bo_data); + + dump_va->addr =3D va->va.addr; + dump_va->range =3D va->va.range; + + return dump_bo(dump_va_args->ptdev, bo_data, obj, va->gem.offset, + va->va.range); +} + +static int dump_va_cb(void *priv, const struct drm_gpuva *va) +{ + struct dump_va_args *dump_va_args =3D priv; + int ret; + + ret =3D dump_va(dump_va_args, va, DRM_PANTHOR_DUMP_HEADER_TYPE_VM); + if (ret) + return ret; + + return 0; +} + +static int count_va_cb(void *priv, const struct drm_gpuva *va) +{ + struct vm_dump_count *count =3D priv; + + count->vas++; + count->size +=3D va->va.range; + return 0; +} + +static void count_queues(struct queue_count *count, + struct drm_panthor_dump_group_info *info) +{ + count->queues +=3D info->queue_count; +} + +static int compute_dump_size(struct vm_dump_count *va_count, + struct queue_count *group_and_q_cnt) +{ + int size =3D 0; + int i; + + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_dump_version); + + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_gpu_info); + + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_csif_info); + + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_fw_info); + + for (i =3D 0; i < va_count->vas; i++) { + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_dump_gpuva); + } + + size +=3D va_count->size; + + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_dump_group_info); + + for (i =3D 0; i < group_and_q_cnt->queues; i++) { + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_dump_queue_info); + } + + return size; +} + +static int dump_queue_info(struct dump_group_args *dump_group_args, + struct drm_panthor_dump_queue_info *info) +{ + struct drm_panthor_dump_header *hdr; + struct drm_panthor_dump_queue_info *queue_info; + + drm_dbg(&dump_group_args->ptdev->base, + "dumping queue info for cs_id %d, gpuva: %llx, insert: %llx, extract: %l= lx\n", + info->cs_id, info->ringbuf_gpuva, info->ringbuf_insert, + info->ringbuf_extract); + + hdr =3D alloc_header(dump_group_args->alloc, + DRM_PANTHOR_DUMP_HEADER_TYPE_QUEUE_INFO, + sizeof(*info)); + if (IS_ERR(hdr)) + return PTR_ERR(hdr); + + queue_info =3D alloc_bytes(dump_group_args->alloc, sizeof(*queue_info)); + if (IS_ERR(queue_info)) + return PTR_ERR(queue_info); + + *queue_info =3D *info; + return 0; +} + +static int dump_group_info(struct dump_group_args *dump_group_args, + struct drm_panthor_dump_group_info *info) +{ + struct drm_panthor_dump_header *hdr; + struct drm_panthor_dump_group_info *group_info; + int ret =3D 0; + + drm_dbg(&dump_group_args->ptdev->base, + "dumping group info for num_queues: %d, faulty bitmask: %d\n", + info->queue_count, info->faulty_bitmask); + + hdr =3D alloc_header(dump_group_args->alloc, + DRM_PANTHOR_DUMP_HEADER_TYPE_GROUP_INFO, + sizeof(*info)); + if (IS_ERR(hdr)) + return PTR_ERR(hdr); + + group_info =3D alloc_bytes(dump_group_args->alloc, sizeof(*group_info)); + if (IS_ERR(group_info)) + return PTR_ERR(group_info); + + *group_info =3D *info; + + for (int i =3D 0; i < info->queue_count; i++) { + struct drm_panthor_dump_queue_info qinfo; + + ret =3D panthor_sched_get_queueinfo(dump_group_args->group, i, + &qinfo); + if (ret) + break; + ret =3D dump_queue_info(dump_group_args, &qinfo); + if (ret) + break; + } + + return ret; +} + +int panthor_core_dump(struct panthor_core_dump_args *args) +{ + u8 *mem; + int dump_size; + int ret =3D 0; + struct dump_allocator alloc =3D {}; + struct vm_dump_count va_count =3D {}; + struct drm_panthor_dump_header *hdr; + struct drm_panthor_dump_version *version; + struct drm_panthor_gpu_info *gpu_info; + struct drm_panthor_csif_info *csif_info; + struct drm_panthor_fw_info *fw_info; + struct queue_count group_and_q_cnt =3D {}; + struct dump_va_args dump_va_args =3D {}; + struct drm_panthor_dump_group_info group_info; + struct dump_group_args dump_group_args; + + panthor_vm_foreach_va(args->group_vm, count_va_cb, &va_count); + + panthor_sched_get_groupinfo(args->group, &group_info); + + count_queues(&group_and_q_cnt, &group_info); + + dump_size =3D compute_dump_size(&va_count, &group_and_q_cnt); + + mem =3D vzalloc(dump_size); + if (!mem) + return ret; + + alloc =3D (struct dump_allocator){ + .start =3D mem, + .curr =3D mem, + .pos =3D 0, + .capacity =3D dump_size, + }; + + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_VERSION, + sizeof(struct drm_panthor_dump_version)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + version =3D alloc_bytes(&alloc, sizeof(*version)); + if (IS_ERR(version)) { + ret =3D PTR_ERR(version); + goto free_valloc; + } + + *version =3D (struct drm_panthor_dump_version){ + .major =3D PANT_DUMP_MAJOR, + .minor =3D PANT_DUMP_MINOR, + }; + + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_GPU_INFO, + sizeof(args->ptdev->gpu_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + gpu_info =3D alloc_bytes(&alloc, sizeof(*gpu_info)); + if (IS_ERR(gpu_info)) { + ret =3D PTR_ERR(gpu_info); + goto free_valloc; + } + + *gpu_info =3D args->ptdev->gpu_info; + + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_CSIF_INFO, + sizeof(args->ptdev->csif_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + csif_info =3D alloc_bytes(&alloc, sizeof(*csif_info)); + if (IS_ERR(csif_info)) { + ret =3D PTR_ERR(csif_info); + goto free_valloc; + } + + *csif_info =3D args->ptdev->csif_info; + + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_FW_INFO, + sizeof(args->ptdev->fw_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + fw_info =3D alloc_bytes(&alloc, sizeof(*fw_info)); + if (IS_ERR(fw_info)) { + ret =3D PTR_ERR(fw_info); + goto free_valloc; + } + + *fw_info =3D args->ptdev->fw_info; + + dump_va_args.ptdev =3D args->ptdev; + dump_va_args.alloc =3D &alloc; + ret =3D panthor_vm_foreach_va(args->group_vm, dump_va_cb, &dump_va_args); + if (ret) + goto free_valloc; + + dump_group_args =3D + (struct dump_group_args){ args->ptdev, &alloc, args->group }; + panthor_sched_get_groupinfo(args->group, &group_info); + dump_group_info(&dump_group_args, &group_info); + + if (alloc.pos < dump_size) + drm_warn(&args->ptdev->base, + "dump size mismatch: expected %d, got %zu\n", + dump_size, alloc.pos); + + dev_coredumpv(args->ptdev->base.dev, alloc.start, alloc.pos, + GFP_KERNEL); + + return ret; + +free_valloc: + vfree(mem); + return ret; +} diff --git a/drivers/gpu/drm/panthor/panthor_dump.h b/drivers/gpu/drm/panth= or/panthor_dump.h new file mode 100644 index 000000000000..2a02943a2dbd --- /dev/null +++ b/drivers/gpu/drm/panthor/panthor_dump.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0 or MIT */ +/* SPDX-FileCopyrightText: Copyright Collabora 2024 */ + +#ifndef __PANTHOR_DUMP_H__ +#define __PANTHOR_DUMP_H__ + +#include +#include + +#include "panthor_device.h" +#include "panthor_gem.h" + +struct panthor_core_dump_args { + struct panthor_device *ptdev; + struct panthor_vm *group_vm; + struct panthor_group *group; +}; + +int panthor_core_dump(struct panthor_core_dump_args *args); + +#endif /* __PANTHOR_DUMP_H__ */ diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/pantho= r/panthor_mmu.c index 412e95fcfb92..61d61157ace0 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.c +++ b/drivers/gpu/drm/panthor/panthor_mmu.c @@ -2632,6 +2632,28 @@ int panthor_vm_prepare_mapped_bos_resvs(struct drm_e= xec *exec, struct panthor_vm return drm_gpuvm_prepare_objects(&vm->base, exec, slot_count); } =20 +/** + * panthor_vm_foreachva() - Execute a callback for each VA in a VM + * + */ +int panthor_vm_foreach_va(struct panthor_vm *vm, + int (*cb)(void *priv, const struct drm_gpuva *va), + void *priv) +{ + struct drm_gpuva *va; + int ret =3D 0; + + mutex_lock(&vm->op_lock); + drm_gpuvm_for_each_va(va, &vm->base) { + ret =3D cb(priv, va); + if (ret) + break; + } + mutex_unlock(&vm->op_lock); + + return ret; +} + /** * panthor_mmu_unplug() - Unplug the MMU logic * @ptdev: Device. diff --git a/drivers/gpu/drm/panthor/panthor_mmu.h b/drivers/gpu/drm/pantho= r/panthor_mmu.h index 6788771071e3..05a5d68b23ae 100644 --- a/drivers/gpu/drm/panthor/panthor_mmu.h +++ b/drivers/gpu/drm/panthor/panthor_mmu.h @@ -8,6 +8,7 @@ #include =20 struct drm_exec; +struct drm_gpuva; struct drm_sched_job; struct panthor_gem_object; struct panthor_heap_pool; @@ -52,6 +53,11 @@ void panthor_vm_add_job_fence_to_bos_resvs(struct pantho= r_vm *vm, struct drm_sched_job *job); =20 struct dma_resv *panthor_vm_resv(struct panthor_vm *vm); + +int panthor_vm_foreach_va(struct panthor_vm *vm, + int (*cb)(void *priv, const struct drm_gpuva *va), + void *priv); + struct drm_gem_object *panthor_vm_root_gem(struct panthor_vm *vm); =20 void panthor_vm_pool_destroy(struct panthor_file *pfile); diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/pant= hor/panthor_sched.c index e0ecc8bcfaae..59c30b311ee9 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -24,6 +24,7 @@ =20 #include "panthor_devfreq.h" #include "panthor_device.h" +#include "panthor_dump.h" #include "panthor_fw.h" #include "panthor_gem.h" #include "panthor_gpu.h" @@ -2805,6 +2806,45 @@ static void group_sync_upd_work(struct work_struct *= work) group_put(group); } =20 +/** + * panthor_sched_get_groupinfo() - Build a group info structure for the gr= oup + * + * @group: the group to build a group info structure for + * @info: the group info structure to fill + */ +void panthor_sched_get_groupinfo(struct panthor_group *group, + struct drm_panthor_dump_group_info *info) +{ + info->queue_count =3D group->queue_count; + info->faulty_bitmask =3D group->fatal_queues; +} + +/** panthor_sched_get_queueinfo() - Build a queue info structure for a que= ue + * given its group and its cs_id + * + * @group: the group the queue belongs to + * @cs_id: the command stream ID of the queue + * @info: the queue info structure to fill + */ +int panthor_sched_get_queueinfo(struct panthor_group *group, u32 cs_id, + struct drm_panthor_dump_queue_info *info) +{ + struct panthor_queue *queue; + + if (cs_id >=3D group->queue_count) + return -EINVAL; + + queue =3D group->queues[cs_id]; + + info->cs_id =3D cs_id; + info->ringbuf_insert =3D queue->iface.input->insert; + info->ringbuf_extract =3D queue->iface.output->extract; + info->ringbuf_gpuva =3D panthor_kernel_bo_gpuva(queue->ringbuf); + info->ringbuf_size =3D panthor_kernel_bo_size(queue->ringbuf); + + return 0; +} + static struct dma_fence * queue_run_job(struct drm_sched_job *sched_job) { @@ -2946,7 +2986,7 @@ queue_timedout_job(struct drm_sched_job *sched_job) struct panthor_device *ptdev =3D group->ptdev; struct panthor_scheduler *sched =3D ptdev->scheduler; struct panthor_queue *queue =3D group->queues[job->queue_idx]; - + struct panthor_core_dump_args core_dump_args; drm_warn(&ptdev->base, "job timeout\n"); =20 drm_WARN_ON(&ptdev->base, atomic_read(&sched->reset.in_progress)); @@ -2955,6 +2995,15 @@ queue_timedout_job(struct drm_sched_job *sched_job) =20 mutex_lock(&sched->lock); group->timedout =3D true; + + core_dump_args =3D (struct panthor_core_dump_args) { + .ptdev =3D ptdev, + .group_vm =3D job->group->vm, + .group =3D job->group, + }; + + panthor_core_dump(&core_dump_args); + if (group->csg_id >=3D 0) { sched_queue_delayed_work(ptdev->scheduler, tick, 0); } else { diff --git a/drivers/gpu/drm/panthor/panthor_sched.h b/drivers/gpu/drm/pant= hor/panthor_sched.h index 3a30d2328b30..9a5b53498dcc 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.h +++ b/drivers/gpu/drm/panthor/panthor_sched.h @@ -17,6 +17,9 @@ struct panthor_device; struct panthor_file; struct panthor_group_pool; struct panthor_job; +struct panthor_group; +struct drm_panthor_dump_group_info; +struct drm_panthor_dump_queue_info; =20 int panthor_group_create(struct panthor_file *pfile, const struct drm_panthor_group_create *group_args, @@ -41,6 +44,13 @@ int panthor_sched_init(struct panthor_device *ptdev); void panthor_sched_unplug(struct panthor_device *ptdev); void panthor_sched_pre_reset(struct panthor_device *ptdev); void panthor_sched_post_reset(struct panthor_device *ptdev, bool reset_fai= led); + +void panthor_sched_get_groupinfo(struct panthor_group *group, + struct drm_panthor_dump_group_info *info); + +int panthor_sched_get_queueinfo(struct panthor_group *group, u32 cs_id, + struct drm_panthor_dump_queue_info *info); + void panthor_sched_suspend(struct panthor_device *ptdev); void panthor_sched_resume(struct panthor_device *ptdev); =20 diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h index e235cf452460..82ec0f20c49e 100644 --- a/include/uapi/drm/panthor_drm.h +++ b/include/uapi/drm/panthor_drm.h @@ -969,6 +969,130 @@ struct drm_panthor_tiler_heap_destroy { __u32 pad; }; =20 +/** + * enum drm_panthor_dump_header_type - Identifies the type of data that fo= llows + * in a panthor core dump. + */ +enum drm_panthor_dump_header_type { + DRM_PANTHOR_DUMP_HEADER_TYPE_VERSION =3D 0, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_GPU_INFO: Gpu information. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_GPU_INFO =3D 1, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_CSIF_INFO: Command stream interface info= rmation. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_CSIF_INFO =3D 2, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_FW_INFO: Information about the firmware. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_FW_INFO =3D 3, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_VM: A dump of the VM for the context. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_VM =3D 4, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_GROUP_INFO: Describes a group. A dump can + * contain either the faulty group, or all groups for the DRM FD. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_GROUP_INFO =3D 5, + /** + * @DRM_PANTHOR_DUMP_HEADER_TYPE_QUEUE_INFO: Describes a faulty queue. Th= is + * will immediately follow a group info. + */ + DRM_PANTHOR_DUMP_HEADER_TYPE_QUEUE_INFO =3D 6, +}; + +/** + * struct drm_panthor_dump_header - A header that describes a section of a= panthor core dump. + */ +struct drm_panthor_dump_header { + /** @magic: Always set to PANT (0x544e4150). */ + __u32 magic; + + /** @header_type: Identifies the type of data in the following section of= the + * core dump file + */ + enum drm_panthor_dump_header_type header_type; + + /** @header_size: The size of the header. + * + * This is for backward-compatibility purposes in case this structure is + * augmented in the future. It allows userspace to skip over the header a= nd + * access the actual data it describes. + */ + __u32 header_size; + + /** @data_size: The size of the following section */ + __u32 data_size; +}; + +/** + * struct drm_panthor_dump_version - Version information for a Panthor GPU= dump. + * + * This structure is used to hold version information when performing a du= mp of + * the state of a Panthor GPU. + */ +struct drm_panthor_dump_version { + /** @major: Versioning information for backwards compatibility */ + __u32 major; + /** @minor: Versioning information for backwards compatibility */ + __u32 minor; +}; + +/** + * struct drm_panthor_dump_group_info - Group information for a Panthor GPU + * dump. + * + * This structure is used to hold information about a group when performin= g a + * dump of the state of a Panthor GPU. + */ +struct drm_panthor_dump_group_info { + /** @queue_count: The number of queues in the group. */ + __u32 queue_count; + /** @faulty_queues: A bitmask denoting the faulty queues */ + __u32 faulty_bitmask; +}; + +#define DRM_PANTHOR_DUMP_QUEUE_INFO_FLAGS_FAULTY (1 << 0) + +/** + * struct drm_panthor_dump_queue_info - Queue information for a Panthor GPU + * dump. + * + * This structure is used to hold information about a queue when performin= g a + * dump of the state of a Panthor GPU. + */ +struct drm_panthor_dump_queue_info { + /** See DRM_PANTHOR_DUMP_QUEUE_INFO_FLAGS_XXX */ + u32 flags; + /** @cs_id: The ID of the command stream. */ + __s32 cs_id; + /** @faulty: Whether this queue has faulted */ + /** @ringbuf_gpuva: The GPU virtual address of the ring buffer. */ + __u64 ringbuf_gpuva; + /** @ringbuf_insert: The insert point (i.e.: offset) in the ring buffer. = This + * is where a instruction would be inserted next by the CPU. + */ + __u64 ringbuf_insert; + /** @ringbuf_extract: The extract point (i.e.: offset) in the ring buffer. + * This is where the GPU would read the next instruction. + */ + __u64 ringbuf_extract; + /** @ringbuf_size: The size of the ring buffer */ + __u64 ringbuf_size; +}; + +/** + * struct drm_panthor_dump_gpuva - Describes a GPU VA range in the dump. + */ +struct drm_panthor_dump_gpuva { + /** @addr: The start address for the mapping */ + __u64 addr; + /** @range: The range covered by the VA mapping */ + __u64 range; +}; + #if defined(__cplusplus) } #endif --=20 2.45.2 From nobody Sat Feb 7 17:41:47 2026 Received: from sender3-op-o18.zoho.com (sender3-op-o18.zoho.com [136.143.184.18]) (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 3316E1A706A for ; Tue, 13 Aug 2024 21:06:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.184.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583204; cv=pass; b=saeaAYw1KRzRV/Feq2upXnMbfjC8WXkLD1Gps4yVf1DJkY/7Os0jjYv8W1pUEhxweUWDdPcV8yAflFwyMA39OEdzOZs3O7aMNn6Gc6WfIf25H+7laxZi8nKv9fhbYJ9G9oZVS3kMOeZQ7l5cAvlAO+u329BdrhCoO5FJP1dCEGU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583204; c=relaxed/simple; bh=qWm9n3PWuVmoE8n2Sr5A4kKFFF3A9ezgPCzJ9GxbUkY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qKu5iyvRfHaNcMOsxi/WJB+1HZHvYu6y/kAPSeC/RsAQSLb7US65iJwrzimMq8/wC8gS5S0DWvBeuqdQCA/CJeruEBkgyWgkm9oIjkeyp8EeMVCYOKLqfvHOeHPBkWw1xywSe1+ha6webCVw7aBSXwivTDsNAb8s3GjgPJ5huxo= 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=daniel.almeida@collabora.com header.b=XsZZGtBk; arc=pass smtp.client-ip=136.143.184.18 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=daniel.almeida@collabora.com header.b="XsZZGtBk" ARC-Seal: i=1; a=rsa-sha256; t=1723583197; cv=none; d=zohomail.com; s=zohoarc; b=Uyv7JoKnVTonV0l0r6qUk1rA/ISqtejv45gbXePpgjG2fM3ds232gQ7ghq3nGs6bThk8icp7EkA4Id+DJyhCjItrztSLrcii/pHd+1NYhxf/+Gy+MXtTZ9Ju2UyPNvpjO39vW/SV1RD6gylc11WAHsGWVow195cZT/C4RsEAiRg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723583197; h=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=X7hMMm58w0Lxs4euGai67p0IMEstJ81Np3QDMu1KXrY=; b=KtS1a0RqVWHdrmkrNMSNopO7chSBxJPNuNKJ9/Po5/H3fb0EbMftqhLBRYRhrNENmmx4OmV/06COzoOMjszYMWe/Lb8k/OiA3jclChJwnj9JyvhnMNh2vFT3EAfP9kWodaDVB57/UzSVuJb5I2A46Z+cBD6KNpRbYH/fyUB9a9A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1723583197; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=X7hMMm58w0Lxs4euGai67p0IMEstJ81Np3QDMu1KXrY=; b=XsZZGtBkaSY1+nwNu4JEU+SDIrOZDK0nJMW6l0Uu35orrncQr9Qab8FrItQRxlZJ BMTXd0c91nq1CNVsP203S86myYqOCR2w2q+2LbYeE81tHaDqj8bEEkfZm0dW0WLi+cr yNHdHcpkAQMs8s4ie6flS0mhX1RacUpmYGZOFAfU= Received: by mx.zohomail.com with SMTPS id 1723583196586939.8017438652769; Tue, 13 Aug 2024 14:06:36 -0700 (PDT) From: Daniel Almeida To: liviu.dudau@arm.com, steven.price@arm.com, carsten.haitzler@arm.com, boris.brezillon@collabora.com, robh@kernel.org, faith.ekstrand@collabora.com Cc: Daniel Almeida , linux-kernel@vger.kernel.org Subject: [PATCH v2 3/5] drm: panthor: add debugfs support in panthor_sched Date: Tue, 13 Aug 2024 18:05:46 -0300 Message-ID: <20240813210555.607641-5-daniel.almeida@collabora.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240813210555.607641-1-daniel.almeida@collabora.com> References: <20240710225011.275153-1-daniel.almeida@collabora.com> <20240813210555.607641-1-daniel.almeida@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" In preparation for future patches, add support for debugfs in panthor_sched.c. Follow-up patches will make use of debugfs files to control aspects of the dumping process. Signed-off-by: Daniel Almeida --- drivers/gpu/drm/panthor/panthor_drv.c | 1 + drivers/gpu/drm/panthor/panthor_sched.c | 9 +++++++++ drivers/gpu/drm/panthor/panthor_sched.h | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/pantho= r/panthor_drv.c index fb30e119d9bf..bb759baa98bd 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1374,6 +1374,7 @@ static const struct file_operations panthor_drm_drive= r_fops =3D { static void panthor_debugfs_init(struct drm_minor *minor) { panthor_mmu_debugfs_init(minor); + panthor_sched_debugfs_init(minor); } #endif =20 diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/pant= hor/panthor_sched.c index 59c30b311ee9..afd644c7d9f1 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -3602,3 +3602,12 @@ int panthor_sched_init(struct panthor_device *ptdev) ptdev->scheduler =3D sched; return 0; } + +#ifdef CONFIG_DEBUG_FS +void panthor_sched_debugfs_init(struct drm_minor *minor) +{ + struct panthor_device *ptdev =3D + container_of(minor->dev, struct panthor_device, base); + struct panthor_scheduler *sched =3D ptdev->scheduler; +} +#endif /* CONFIG_DEBUG_FS */ diff --git a/drivers/gpu/drm/panthor/panthor_sched.h b/drivers/gpu/drm/pant= hor/panthor_sched.h index 9a5b53498dcc..88871f38c1ab 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.h +++ b/drivers/gpu/drm/panthor/panthor_sched.h @@ -8,6 +8,7 @@ struct drm_exec; struct dma_fence; struct drm_file; struct drm_gem_object; +struct drm_minor; struct drm_sched_job; struct drm_panthor_group_create; struct drm_panthor_queue_create; @@ -57,4 +58,10 @@ void panthor_sched_resume(struct panthor_device *ptdev); void panthor_sched_report_mmu_fault(struct panthor_device *ptdev); void panthor_sched_report_fw_events(struct panthor_device *ptdev, u32 even= ts); =20 +#ifdef CONFIG_DEBUG_FS +void panthor_sched_debugfs_init(struct drm_minor *minor); +#else +static inline void panthor_sched_debugfs_init(struct drm_minor *minor) {} +#endif /* CONFIG_DEBUG_FS */ + #endif --=20 2.45.2 From nobody Sat Feb 7 17:41:47 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 829821A76C2 for ; Tue, 13 Aug 2024 21:06:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583205; cv=pass; b=ZTAbHv8GHnIOnbzRQYBi4WATM+8womXOeD/YArX9sl/zlMcUJaNOgLqSQsB+i4ZiiwpmZ5c5XjlOKSASD8NvvnuP3af6NDeq294YpqITojZtJjFdfLNklbueG2UdQg9RGnzlIAxi6duoNczB9ZROFdMF+zfOhcrJWA/P/W0EOVI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583205; c=relaxed/simple; bh=5WY3+gNhVO7XvYfdKyFpik6KpYa2KreAwq1robbCMKs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l7iurh+t55JCRGeuxO2S/4mUY4z951lQSZhvKOhA5L7j2z/0s7WJTD5Ue6G9WZC6SVKJHL8IBpDgs9XYgZg+dY1BWZ1ZxkxThtDy5o+HTFxVaDw9qTDHegj1Qen84JUR5Z/Z4+9kzJpUq/tiKB0M/rROKfMFuLepilEI3ihiZ9s= 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=daniel.almeida@collabora.com header.b=Z3yWk6yq; arc=pass smtp.client-ip=136.143.188.12 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=daniel.almeida@collabora.com header.b="Z3yWk6yq" ARC-Seal: i=1; a=rsa-sha256; t=1723583201; cv=none; d=zohomail.com; s=zohoarc; b=VnhcDQrue3RoMgzcjWqERjSwPlGQqRmnyjLwdvp0Nm1YU40GLmHLnLMQqVhmSRrbFnPs3QhsjYrWrftwzbcpDsGg2+i8dbd2jV7kISJfuP0Lzzmxu2Gxlr5WH+l74nKl0ekYZgkwyJVZSL3OTJ2fsGe5ylgGUSd0vylmAmykJ4A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723583201; h=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=PCQWaHskTaBykjAdT2PUbBbFw9GDVrxCBS6/qxN19Uc=; b=PKTePiWQoW/0GjqNlIVWN7ylmfFmrVFT9Iq9nMTqhUKm+wPUc0civIizI7mQcfmYuYPvYjH/ynWC+SSQTl77k2bOpRHJp1oSXIX2Ywok9Jqwf5UCpS8JmdLgVw7UooK/7WbCqmZkH3QIaxuxN3mVxVytBJZQ4n3P1gat98MCHzg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1723583201; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=PCQWaHskTaBykjAdT2PUbBbFw9GDVrxCBS6/qxN19Uc=; b=Z3yWk6yqcR3csH5BCEpmG9AzWOsuLrLvGJEnChWKt01J/z42F/oN5lmMtcVRLSxs /RZ050rShb8+MtlZnMIsn+CkeDkjYT8GAFzYhMbzG83TzyL2jpys+a2a3Y0qhLiBp9v yRkKxt8JyA7xr4MWlZzL0/dG5cLkkgVtfSmgz4g4= Received: by mx.zohomail.com with SMTPS id 1723583199756876.345562240049; Tue, 13 Aug 2024 14:06:39 -0700 (PDT) From: Daniel Almeida To: liviu.dudau@arm.com, steven.price@arm.com, carsten.haitzler@arm.com, boris.brezillon@collabora.com, robh@kernel.org, faith.ekstrand@collabora.com Cc: Daniel Almeida , linux-kernel@vger.kernel.org Subject: [PATCH v2 4/5] drm: panthor: add debugfs knob to dump successful jobs Date: Tue, 13 Aug 2024 18:05:47 -0300 Message-ID: <20240813210555.607641-6-daniel.almeida@collabora.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240813210555.607641-1-daniel.almeida@collabora.com> References: <20240710225011.275153-1-daniel.almeida@collabora.com> <20240813210555.607641-1-daniel.almeida@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" It can be advantageous for userspace to have access to successful jobs. Allow this as an opt-in through a debugfs file. Note that the devcoredump infrastructure will discard new dumps if a previous dump hasn't been read. A future patch will add support for multi-job dumps which will work around this limitation. Signed-off-by: Daniel Almeida --- drivers/gpu/drm/panthor/panthor_sched.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/pant= hor/panthor_sched.c index afd644c7d9f1..ea2696c1075a 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -10,6 +10,7 @@ =20 #include #include +#include #include #include #include @@ -317,6 +318,9 @@ struct panthor_scheduler { */ struct list_head stopped_groups; } reset; + + /** @dump_successful_jobs: whether to dump successful jobs through coredu= mpv */ + bool dump_successful_jobs; }; =20 /** @@ -2946,6 +2950,16 @@ queue_run_job(struct drm_sched_job *sched_job) queue->iface.input->extract =3D queue->iface.output->extract; queue->iface.input->insert =3D job->ringbuf.end; =20 + if (sched->dump_successful_jobs) { + struct panthor_core_dump_args core_dump_args =3D { + .ptdev =3D ptdev, + .group_vm =3D job->group->vm, + .group =3D job->group, + }; + + panthor_core_dump(&core_dump_args); + } + if (group->csg_id < 0) { /* If the queue is blocked, we want to keep the timeout running, so we * can detect unbounded waits and kill the group when that happens. @@ -3609,5 +3623,8 @@ void panthor_sched_debugfs_init(struct drm_minor *min= or) struct panthor_device *ptdev =3D container_of(minor->dev, struct panthor_device, base); struct panthor_scheduler *sched =3D ptdev->scheduler; + + debugfs_create_bool("dump_successful_jobs", 0644, minor->debugfs_root, + &sched->dump_successful_jobs); } #endif /* CONFIG_DEBUG_FS */ --=20 2.45.2 From nobody Sat Feb 7 17:41:47 2026 Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (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 653961AAE21 for ; Tue, 13 Aug 2024 21:06:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583212; cv=pass; b=Lxmw1vUlCx2mTpJ7fPH1JpNzuZIFLBxKpk+TjcWyAKuaEnwiiixHJjlsA34sS1chFOSN+8gSYV29OTv8own3UjjVuxZnkXA0JFf/IoSk6l/XS28IA8h1NIS2Cu5MHXLjmtkIfy12N521j9eIs2dp4YFWXCdR9a0MmP6VQ7GEUr4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723583212; c=relaxed/simple; bh=q0ZyM+pBQV63wqsfPlbOU9SZtLE5DGhEfks5O++htuY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ksai9lpebAzajRRV+e7xZ64W36jzQ+eXtzftyRwsV/qp9hzm+nwEjD4DjWNfiRdqVnYuA267LkPgkFd31fqgF4FMLA9W4N2A6cbIM7oyIZJb2LlPbY5dd2a638hwk4VWlKDk3PGDEUhN3nDB8vSJshOvFpLaKxam6/FhwmmWcw0= 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=daniel.almeida@collabora.com header.b=BXksm/I6; arc=pass smtp.client-ip=136.143.188.12 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=daniel.almeida@collabora.com header.b="BXksm/I6" ARC-Seal: i=1; a=rsa-sha256; t=1723583205; cv=none; d=zohomail.com; s=zohoarc; b=fKUwfpOhvdJtFWG6VHaA1ab+f2vFp0ZWp/zQQIRjvJfIY1cLSLtQBWtuBE701Uql6jLyoBrv0a+daXKWFVjI0BocfiphjYdYMlkxb9Qtr+CVmkU1SfKI7r7JBT+vC7MTHo2GyXD435j++v9V0Iu8MbNTtVK0Zg4jSfevmixeQH0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1723583205; h=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=4TyB7ycVJcJFce9wDMid/a6SVoBq2Z6PsVzRbtIMMJU=; b=b1AAbMH1twg3hzWcJMrS14YbfJMP9b8roTcLjw/Qhx0Ezanib8YOdEUL5oaHAv3Cp9gH/OWdfQb+lzZ3V34TwvZ30qLnf9hLoFG7EqfYIbXkB5viVWTyPDdiCGeDBZ/DKz+z+2070Th9Inc4MP+VEmFtmgPqWkfyn9Ebsk8X6IE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=daniel.almeida@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1723583205; s=zohomail; d=collabora.com; i=daniel.almeida@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=4TyB7ycVJcJFce9wDMid/a6SVoBq2Z6PsVzRbtIMMJU=; b=BXksm/I6lCew9NYUpb+MESfiik/BemGzso6hVxHnQFMAvPGkLQm1IEQVG28H7utx yGW1/5r4tEmqsr+OlleIc9887BAjwosQ+3+4dWog+D3rFoIMaopryn8vmZ9B23pb7Iq 7rmHZxnuHSI+SGip2RczP56E6Oxf0+lT8LR8i26M= Received: by mx.zohomail.com with SMTPS id 1723583203030109.96859534897851; Tue, 13 Aug 2024 14:06:43 -0700 (PDT) From: Daniel Almeida To: liviu.dudau@arm.com, steven.price@arm.com, carsten.haitzler@arm.com, boris.brezillon@collabora.com, robh@kernel.org, faith.ekstrand@collabora.com Cc: Daniel Almeida , linux-kernel@vger.kernel.org Subject: [PATCH v2 5/5] drm: panthor: allow dumping multiple jobs Date: Tue, 13 Aug 2024 18:05:48 -0300 Message-ID: <20240813210555.607641-7-daniel.almeida@collabora.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240813210555.607641-1-daniel.almeida@collabora.com> References: <20240710225011.275153-1-daniel.almeida@collabora.com> <20240813210555.607641-1-daniel.almeida@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" When dumping successful jobs, it's useful to dump a given number of them if needed. This is blocked by the fact that the devcoredump mechanism will not create a new dump if an old one has not been read. In particular, if we're dumping multiple jobs in sequence, there are sections of the dump that we do not want to include again, since they would be redundant. Allow dumping multiple jobs by keeping a counter and a list. The list gets appended until the counter is zero, at which point, the whole list is dumped at once, thereby calling into devcoredump also only once. This counter is controlled through a debugfs file. Signed-off-by: Daniel Almeida --- drivers/gpu/drm/panthor/panthor_dump.c | 229 ++++++++++++++++-------- drivers/gpu/drm/panthor/panthor_dump.h | 15 ++ drivers/gpu/drm/panthor/panthor_sched.c | 20 ++- 3 files changed, 186 insertions(+), 78 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_dump.c b/drivers/gpu/drm/panth= or/panthor_dump.c index 7ec0e21dc7e9..d3b29359e13a 100644 --- a/drivers/gpu/drm/panthor/panthor_dump.c +++ b/drivers/gpu/drm/panthor/panthor_dump.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -152,22 +153,25 @@ static void count_queues(struct queue_count *count, } =20 static int compute_dump_size(struct vm_dump_count *va_count, - struct queue_count *group_and_q_cnt) + struct queue_count *group_and_q_cnt, + bool job_list_is_empty) { int size =3D 0; int i; =20 - size +=3D sizeof(struct drm_panthor_dump_header); - size +=3D sizeof(struct drm_panthor_dump_version); + if (job_list_is_empty) { + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_dump_version); =20 - size +=3D sizeof(struct drm_panthor_dump_header); - size +=3D sizeof(struct drm_panthor_gpu_info); + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_gpu_info); =20 - size +=3D sizeof(struct drm_panthor_dump_header); - size +=3D sizeof(struct drm_panthor_csif_info); + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_csif_info); =20 - size +=3D sizeof(struct drm_panthor_dump_header); - size +=3D sizeof(struct drm_panthor_fw_info); + size +=3D sizeof(struct drm_panthor_dump_header); + size +=3D sizeof(struct drm_panthor_fw_info); + } =20 for (i =3D 0; i < va_count->vas; i++) { size +=3D sizeof(struct drm_panthor_dump_header); @@ -250,6 +254,58 @@ static int dump_group_info(struct dump_group_args *dum= p_group_args, return ret; } =20 +static void clean_job_list(struct list_head *joblist) +{ + struct panthor_dump_job_entry *job, *tmp; + + list_for_each_entry_safe(job, tmp, joblist, node) { + list_del(&job->node); + vfree(job->mem); + kfree(job); + } +} + +static int append_job(struct panthor_core_dump_args *args, void *mem, + size_t size) +{ + struct panthor_dump_job_entry *job; + + job =3D kzalloc(sizeof(*job), GFP_KERNEL); + if (!job) + return -ENOMEM; + + job->mem =3D mem; + job->size =3D size; + list_add_tail(&job->node, args->job_list); + return 0; +} + +static int copy_from_job_list(struct list_head *job_list, void **out_mem, + u32 *out_size) +{ + u32 total_size =3D 0; + u32 offset =3D 0; + struct panthor_dump_job_entry *entry; + void *mem; + + list_for_each_entry(entry, job_list, node) { + total_size +=3D entry->size; + } + + mem =3D vzalloc(total_size); + if (!mem) + return -ENOMEM; + + list_for_each_entry(entry, job_list, node) { + memcpy(mem + offset, entry->mem, entry->size); + offset +=3D entry->size; + } + + *out_mem =3D mem; + *out_size =3D total_size; + return 0; +} + int panthor_core_dump(struct panthor_core_dump_args *args) { u8 *mem; @@ -273,7 +329,8 @@ int panthor_core_dump(struct panthor_core_dump_args *ar= gs) =20 count_queues(&group_and_q_cnt, &group_info); =20 - dump_size =3D compute_dump_size(&va_count, &group_and_q_cnt); + dump_size =3D compute_dump_size(&va_count, &group_and_q_cnt, + list_empty(args->job_list)); =20 mem =3D vzalloc(dump_size); if (!mem) @@ -286,69 +343,73 @@ int panthor_core_dump(struct panthor_core_dump_args *= args) .capacity =3D dump_size, }; =20 - hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_VERSION, - sizeof(struct drm_panthor_dump_version)); - if (IS_ERR(hdr)) { - ret =3D PTR_ERR(hdr); - goto free_valloc; + if (list_empty(args->job_list)) { + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_VERSION, + sizeof(struct drm_panthor_dump_version)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + version =3D alloc_bytes(&alloc, sizeof(*version)); + if (IS_ERR(version)) { + ret =3D PTR_ERR(version); + goto free_valloc; + } + + *version =3D (struct drm_panthor_dump_version){ + .major =3D PANT_DUMP_MAJOR, + .minor =3D PANT_DUMP_MINOR, + }; + + hdr =3D alloc_header(&alloc, + DRM_PANTHOR_DUMP_HEADER_TYPE_GPU_INFO, + sizeof(args->ptdev->gpu_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + gpu_info =3D alloc_bytes(&alloc, sizeof(*gpu_info)); + if (IS_ERR(gpu_info)) { + ret =3D PTR_ERR(gpu_info); + goto free_valloc; + } + + *gpu_info =3D args->ptdev->gpu_info; + + hdr =3D alloc_header(&alloc, + DRM_PANTHOR_DUMP_HEADER_TYPE_CSIF_INFO, + sizeof(args->ptdev->csif_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + csif_info =3D alloc_bytes(&alloc, sizeof(*csif_info)); + if (IS_ERR(csif_info)) { + ret =3D PTR_ERR(csif_info); + goto free_valloc; + } + + *csif_info =3D args->ptdev->csif_info; + + hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_FW_INFO, + sizeof(args->ptdev->fw_info)); + if (IS_ERR(hdr)) { + ret =3D PTR_ERR(hdr); + goto free_valloc; + } + + fw_info =3D alloc_bytes(&alloc, sizeof(*fw_info)); + if (IS_ERR(fw_info)) { + ret =3D PTR_ERR(fw_info); + goto free_valloc; + } + + *fw_info =3D args->ptdev->fw_info; } =20 - version =3D alloc_bytes(&alloc, sizeof(*version)); - if (IS_ERR(version)) { - ret =3D PTR_ERR(version); - goto free_valloc; - } - - *version =3D (struct drm_panthor_dump_version){ - .major =3D PANT_DUMP_MAJOR, - .minor =3D PANT_DUMP_MINOR, - }; - - hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_GPU_INFO, - sizeof(args->ptdev->gpu_info)); - if (IS_ERR(hdr)) { - ret =3D PTR_ERR(hdr); - goto free_valloc; - } - - gpu_info =3D alloc_bytes(&alloc, sizeof(*gpu_info)); - if (IS_ERR(gpu_info)) { - ret =3D PTR_ERR(gpu_info); - goto free_valloc; - } - - *gpu_info =3D args->ptdev->gpu_info; - - hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_CSIF_INFO, - sizeof(args->ptdev->csif_info)); - if (IS_ERR(hdr)) { - ret =3D PTR_ERR(hdr); - goto free_valloc; - } - - csif_info =3D alloc_bytes(&alloc, sizeof(*csif_info)); - if (IS_ERR(csif_info)) { - ret =3D PTR_ERR(csif_info); - goto free_valloc; - } - - *csif_info =3D args->ptdev->csif_info; - - hdr =3D alloc_header(&alloc, DRM_PANTHOR_DUMP_HEADER_TYPE_FW_INFO, - sizeof(args->ptdev->fw_info)); - if (IS_ERR(hdr)) { - ret =3D PTR_ERR(hdr); - goto free_valloc; - } - - fw_info =3D alloc_bytes(&alloc, sizeof(*fw_info)); - if (IS_ERR(fw_info)) { - ret =3D PTR_ERR(fw_info); - goto free_valloc; - } - - *fw_info =3D args->ptdev->fw_info; - dump_va_args.ptdev =3D args->ptdev; dump_va_args.alloc =3D &alloc; ret =3D panthor_vm_foreach_va(args->group_vm, dump_va_cb, &dump_va_args); @@ -365,12 +426,34 @@ int panthor_core_dump(struct panthor_core_dump_args *= args) "dump size mismatch: expected %d, got %zu\n", dump_size, alloc.pos); =20 - dev_coredumpv(args->ptdev->base.dev, alloc.start, alloc.pos, - GFP_KERNEL); + if (args->append) { + ret =3D append_job(args, alloc.start, alloc.pos); + if (ret) + goto free_valloc; + } else if (!list_empty(args->job_list)) { + void *mem; + u32 size; + + /* append ourselves */ + append_job(args, alloc.start, alloc.pos); + if (ret) + goto free_valloc; + + ret =3D copy_from_job_list(args->job_list, &mem, &size); + if (ret) + goto free_valloc; + + dev_coredumpv(args->ptdev->base.dev, mem, size, GFP_KERNEL); + clean_job_list(args->job_list); + } else { + dev_coredumpv(args->ptdev->base.dev, alloc.start, alloc.pos, + GFP_KERNEL); + } =20 return ret; =20 free_valloc: + clean_job_list(args->job_list); vfree(mem); return ret; } diff --git a/drivers/gpu/drm/panthor/panthor_dump.h b/drivers/gpu/drm/panth= or/panthor_dump.h index 2a02943a2dbd..f16051d7da21 100644 --- a/drivers/gpu/drm/panthor/panthor_dump.h +++ b/drivers/gpu/drm/panthor/panthor_dump.h @@ -10,10 +10,25 @@ #include "panthor_device.h" #include "panthor_gem.h" =20 +struct panthor_dump_job_entry { + void *mem; + size_t size; + struct list_head node; +}; + struct panthor_core_dump_args { struct panthor_device *ptdev; struct panthor_vm *group_vm; struct panthor_group *group; + /** @job_list: used if the dump contains more than one job. + * + * Note that the default devcoredump behavior is to discard dumps when a + * previous dump has not been read yet. There is also a limit on the numb= er + * of dumps that can be stored. + */ + struct list_head *job_list; + /** @append: whether to append the current job dump to job_list */ + bool append; }; =20 int panthor_core_dump(struct panthor_core_dump_args *args); diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/pant= hor/panthor_sched.c index ea2696c1075a..5f31a476866b 100644 --- a/drivers/gpu/drm/panthor/panthor_sched.c +++ b/drivers/gpu/drm/panthor/panthor_sched.c @@ -319,8 +319,10 @@ struct panthor_scheduler { struct list_head stopped_groups; } reset; =20 - /** @dump_successful_jobs: whether to dump successful jobs through coredu= mpv */ - bool dump_successful_jobs; + /** @dump_successful_jobs: Whether to dump successful jobs through coredu= mpv */ + u32 dump_next_n_successful_jobs; + /** @dump_job_list: List containing dump entries if multiple jobs are bei= ng dumped */ + struct list_head dump_job_list; }; =20 /** @@ -2950,11 +2952,15 @@ queue_run_job(struct drm_sched_job *sched_job) queue->iface.input->extract =3D queue->iface.output->extract; queue->iface.input->insert =3D job->ringbuf.end; =20 - if (sched->dump_successful_jobs) { + if (sched->dump_next_n_successful_jobs > 0) { + sched->dump_next_n_successful_jobs--; + struct panthor_core_dump_args core_dump_args =3D { .ptdev =3D ptdev, .group_vm =3D job->group->vm, .group =3D job->group, + .job_list =3D &sched->dump_job_list, + .append =3D !!sched->dump_next_n_successful_jobs, }; =20 panthor_core_dump(&core_dump_args); @@ -3014,6 +3020,7 @@ queue_timedout_job(struct drm_sched_job *sched_job) .ptdev =3D ptdev, .group_vm =3D job->group->vm, .group =3D job->group, + .job_list =3D &sched->dump_job_list, }; =20 panthor_core_dump(&core_dump_args); @@ -3509,6 +3516,7 @@ static void panthor_sched_fini(struct drm_device *dde= v, void *res) } =20 drm_WARN_ON(ddev, !list_empty(&sched->groups.waiting)); + drm_WARN_ON(ddev, !list_empty(&sched->dump_job_list)); } =20 int panthor_sched_init(struct panthor_device *ptdev) @@ -3585,6 +3593,7 @@ int panthor_sched_init(struct panthor_device *ptdev) return ret; =20 INIT_LIST_HEAD(&sched->reset.stopped_groups); + INIT_LIST_HEAD(&sched->dump_job_list); =20 /* sched->heap_alloc_wq will be used for heap chunk allocation on * tiler OOM events, which means we can't use the same workqueue for @@ -3624,7 +3633,8 @@ void panthor_sched_debugfs_init(struct drm_minor *min= or) container_of(minor->dev, struct panthor_device, base); struct panthor_scheduler *sched =3D ptdev->scheduler; =20 - debugfs_create_bool("dump_successful_jobs", 0644, minor->debugfs_root, - &sched->dump_successful_jobs); + debugfs_create_u32("dump_next_n_successful_jobs", 0644, + minor->debugfs_root, + &sched->dump_next_n_successful_jobs); } #endif /* CONFIG_DEBUG_FS */ --=20 2.45.2