From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 B70253F20FE for ; Thu, 14 May 2026 13:54:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766853; cv=none; b=ny6oIxiXiTVcm+pXwiaKFmN4XAzbCKxqwK7OU9Eooj+ZySaRiYCO1HZ1STbjJoCvwj2SHiLjXkRvw+j61ejfATrTyAyR87jghZWq8Rb4Q4YSwk+DA/WuSN4GK3vFsftgf+m1etNHsZ4SmwiIXAuFMJ9eWu0twq982S0og5QQe6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766853; c=relaxed/simple; bh=O6zOpZyjhfsAqmSyayYNCXM4WBLy9ykRhdInrt31o8I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L2p+5NAVa49bkwPNTHxAQ0v1HeHIfLs0dQtmAx8AwGiRCedQKwdMHk9LT94kawTyCgK9JI6jzqL2g9dyqOSDS0E4OCkdlytHWLl0U7orHNvThA99NvmRLdo8avpqDYW96wFUYaKXzphGIeJkKnxmeXW0VpW7n96+5Wv48lKo3Qo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=mtq/yOVH; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=cjIHncEZ; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="mtq/yOVH"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="cjIHncEZ" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeQ592841032 for ; Thu, 14 May 2026 13:54:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=FAfZuWh7PNN KUkJyt99koRvzLKYyDj5d3gVvsVzAWZM=; b=mtq/yOVHiu1Ju1x6rtVr+AQ42p5 63e04TTTmy2udzLcLKR096cDYo4HwBkZPL4RHFz5/vAayAk3A5zeAp6KMk8KtAp7 6AUQR6Ix0dtvWgr4XWgqAu07w7wtVfCGex5aZJZn+t/jZrIy2k+LKuGDhvP4YREM 3Yk+uQkvc+y2kLnvFd4q3a8nIFMXPV4rtUn2aFvkxyjEJsa4y9qiKRQIQkRtV14R 2r3VelusIC1jx3ZuzsRHdHV9PZZBmQcJuUC7kM7WbhN/82qZ7XQsR0fF/g4QLrP4 PyTUxWBURDmTxUmG11CG6dmK8comTemLLZ2RElAtJmPASUfNhbvOB87o5DQ== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5899sn47-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:09 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-367cb6de61aso10206154a91.1 for ; Thu, 14 May 2026 06:54:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766849; x=1779371649; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FAfZuWh7PNNKUkJyt99koRvzLKYyDj5d3gVvsVzAWZM=; b=cjIHncEZZm6eL1Y7Nlx+GGohS7LrN047UB4FvtfGy5QEKz7bP246V7rg3H7nIDIarM VvZpVznkzSqOQ9UZqKz7xguwYXIWc5Px8RNDIWlNAL6eCoaqlYlLbw1lOboAVNHZ3MrK IWCdTW5dXvay4Xwb9n06Oof/TRqU7u6TxNWNLaO5ywaigVuWcxmByW2vHwSNOyhh3xg7 N8Qbtzty1qZDCiZv13iuu/oG5A4qIEUvr2YC3+FCBr1ac1LDwFZrSoHxacri4L0FvV2p aM+d4PwMEwmf9ZsOYEPa7408puTv07c0yZ7bC60XKg21FLnGsSVeSpknAvKAdEczK9Mx hK8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766849; x=1779371649; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FAfZuWh7PNNKUkJyt99koRvzLKYyDj5d3gVvsVzAWZM=; b=JpPLfI9D4C3rw1snP1TDb6c6DODed/lwGBVnej4FzEopAkjAn8vNM2B3MpBuz3FS72 vw5TQ3r3QnsTT1pphQ6Qm2WWrudQ9gXhsoJroZ5QAr/nuYv/al7cRIrD43bIOo/K5Oko 8pRorRD4FaqF01FkH+33+5jmnfLQCUPmMsC8G+NaTdrDVggXTqFIHFFbNnmsAsQcDi4N /dyTQ9c22cec6cNYdhI+q280fFkIFxo1wLLyABXZQWvZhPZJax2bD9eCT8IW4voyfoHW oo6NTmp1DdzLWugNbSFfhmWuYT4/HFJSeoHdkfdBHwSVQjYTwmUHCrNofIcVFxfr2tvG p4iw== X-Forwarded-Encrypted: i=1; AFNElJ+cN4DK+ST5QJttBx1o7qFGvSxbHxDkswEnLuPQPqUSOy2SaVun2KpWCOyQJ1Os3GoYSEdhnv75kzPV/K4=@vger.kernel.org X-Gm-Message-State: AOJu0YzzNcLe/txmKWoyjl9imkUcBHABeVhkWvFf7f9dG0Aac+UHaM7l o6IarEVO1ir5F9RwjX96VLgvpnUOz9R1f9R+EU7qDu3eBaGWGdX/kU/SQnrWv/m1yOzM4xfkh0w hHm5vMYSlYhMg59wNXyqSDINwXU/ezOrSjdyTw4qkbs2k4mgmL+79LuAM2UMyP5Dly68= X-Gm-Gg: Acq92OEKACQm8tP0EYBI+TF8oKS2jeKh5MmCnKGsGkBc+Yv6pGDWwzixtQweLN3huht Evlfpj9BOz7XmGE1ANKhu2ie3aXV2E/9meZ51peyVPj6GGJ/w6D9GjrwLg/9nfBmDx2k0mOzrBX yNPeF2XQXUr4e4cf2aPr4Z2P0l6KmaEHiWShNGdaGnUSjbfLSSIaEVwZFjfQyskpl2ljhv7QJhK OSfs9zmBd8ej3O9E1TGSX1x/6mADL6cszmVlCjg7B10ZW44Xj/Fql/6IMN5FXCw/8+oy5H4BcZL WjLIfZhedDCT7+1qeNvZ+bDqCPU59tNeQpwduIEBvh57rkPqOUycBcxFDnIy8CUDOy7iNsavktJ 6YjsGo+cOKIqdY+OkAY5CMzqjzxpCCFqm X-Received: by 2002:a17:90a:2ca1:b0:369:1dcf:4a56 with SMTP id 98e67ed59e1d1-3691dcf4d6cmr3518882a91.21.1778766848484; Thu, 14 May 2026 06:54:08 -0700 (PDT) X-Received: by 2002:a17:90a:2ca1:b0:369:1dcf:4a56 with SMTP id 98e67ed59e1d1-3691dcf4d6cmr3518836a91.21.1778766847778; Thu, 14 May 2026 06:54:07 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36922ee1d85sm1173451a91.1.2026.05.14.06.54.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:07 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Konrad Dybcio , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 01/16] drm/msm: Remove obsolete perf infrastructure Date: Thu, 14 May 2026 06:39:49 -0700 Message-ID: <20260514134052.361771-2-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX55k4OMkV1pTJ 6uZfdPWyZSxnSWc8tNTLenjBz/fqg1yJSVlJ2TYSe3iLNDdHOg5N3NmANfvGaOpvmxcedG/TcfC Ai/XLBbrX8nzTvo1HBgucz9HiWjeZUqRfQS67fixlgc2JQhLQlGIMU3bVcVDMDkpcLNNlvOKuzf gDUXS7p38CccIA8eUjQGOVh9EDvOpbJHD38UxiNUi7QK5f6O8o1JEX6/xdQxQcPtBeUc2y79iJV iS14vtYWgrNqjR9kaDnFoovuKHqaSw5iX4StRIEfE+NsjBs2qYboppFW8Tsu6aZJ58I7jyw+qUq LMOdSDLMcMO9wVMA9xiK+2HRxJAExqPiZnLifBHrbJZq+LaFaS94lmH8mSvbTRN4cFnEtuIGKK0 qb1jBmzHOWiI2csHMF9QNFvGlGRa+8rFc/DO/RQv119pUzjaB/txrroClmhttHa5MiqQuBNA/bN jWvInRwxdElEoen8qHg== X-Proofpoint-ORIG-GUID: 3nrCAqlkB8OOK3NYE9mOPKyrJvJPiIZA X-Authority-Analysis: v=2.4 cv=N6AZ0W9B c=1 sm=1 tr=0 ts=6a05d402 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=istQItjhLDCz62CzcYoA:9 a=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-GUID: 3nrCAqlkB8OOK3NYE9mOPKyrJvJPiIZA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Outside of a3xx, this was never really used. And it low-key gets in the way of the new perfcntr support (or at least it is confusing to have two things called "perf"). So lets remove it. This drops the "perf" debugfs file. But these days, nvtop is a better option. (Plus perfetto for newer gens.) Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/Makefile | 1 - drivers/gpu/drm/msm/adreno/a2xx_gpu.c | 7 - drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 16 -- drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 3 - drivers/gpu/drm/msm/msm_debugfs.c | 6 - drivers/gpu/drm/msm/msm_drv.c | 1 - drivers/gpu/drm/msm/msm_drv.h | 5 - drivers/gpu/drm/msm/msm_gpu.c | 107 ------------ drivers/gpu/drm/msm/msm_gpu.h | 31 ---- drivers/gpu/drm/msm/msm_perf.c | 235 -------------------------- 10 files changed, 412 deletions(-) delete mode 100644 drivers/gpu/drm/msm/msm_perf.c diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile index ba45e99be05b..ce00cfb0a875 100644 --- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile @@ -122,7 +122,6 @@ msm-y +=3D \ msm_gpu_devfreq.o \ msm_io_utils.o \ msm_iommu.o \ - msm_perf.o \ msm_rd.o \ msm_ringbuffer.o \ msm_submitqueue.o \ diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a2xx_gpu.c index d5a5fa9e2cf8..df4cded9143f 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c @@ -489,10 +489,6 @@ static u32 a2xx_get_rptr(struct msm_gpu *gpu, struct m= sm_ringbuffer *ring) return ring->memptrs->rptr; } =20 -static const struct msm_gpu_perfcntr perfcntrs[] =3D { -/* TODO */ -}; - static struct msm_gpu *a2xx_gpu_init(struct drm_device *dev) { struct a2xx_gpu *a2xx_gpu =3D NULL; @@ -518,9 +514,6 @@ static struct msm_gpu *a2xx_gpu_init(struct drm_device = *dev) adreno_gpu =3D &a2xx_gpu->base; gpu =3D &adreno_gpu->base; =20 - gpu->perfcntrs =3D perfcntrs; - gpu->num_perfcntrs =3D ARRAY_SIZE(perfcntrs); - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); if (ret) goto fail; diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a3xx_gpu.c index 018183e0ac3f..c17e9777beae 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c @@ -266,12 +266,6 @@ static int a3xx_hw_init(struct msm_gpu *gpu) /* Turn on performance counters: */ gpu_write(gpu, REG_A3XX_RBBM_PERFCTR_CTL, 0x01); =20 - /* Enable the perfcntrs that we use.. */ - for (i =3D 0; i < gpu->num_perfcntrs; i++) { - const struct msm_gpu_perfcntr *perfcntr =3D &gpu->perfcntrs[i]; - gpu_write(gpu, perfcntr->select_reg, perfcntr->select_val); - } - gpu_write(gpu, REG_A3XX_RBBM_INT_0_MASK, A3XX_INT0_MASK); =20 ret =3D adreno_hw_init(gpu); @@ -508,13 +502,6 @@ static u32 a3xx_get_rptr(struct msm_gpu *gpu, struct m= sm_ringbuffer *ring) return ring->memptrs->rptr; } =20 -static const struct msm_gpu_perfcntr perfcntrs[] =3D { - { REG_A3XX_SP_PERFCOUNTER6_SELECT, REG_A3XX_RBBM_PERFCTR_SP_6_LO, - SP_ALU_ACTIVE_CYCLES, "ALUACTIVE" }, - { REG_A3XX_SP_PERFCOUNTER7_SELECT, REG_A3XX_RBBM_PERFCTR_SP_7_LO, - SP_FS_FULL_ALU_INSTRUCTIONS, "ALUFULL" }, -}; - static struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) { struct a3xx_gpu *a3xx_gpu =3D NULL; @@ -542,9 +529,6 @@ static struct msm_gpu *a3xx_gpu_init(struct drm_device = *dev) adreno_gpu =3D &a3xx_gpu->base; gpu =3D &adreno_gpu->base; =20 - gpu->perfcntrs =3D perfcntrs; - gpu->num_perfcntrs =3D ARRAY_SIZE(perfcntrs); - adreno_gpu->registers =3D a3xx_registers; =20 ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a4xx_gpu.c index e6ab731f8e9a..6392126f48f2 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c @@ -652,9 +652,6 @@ static struct msm_gpu *a4xx_gpu_init(struct drm_device = *dev) adreno_gpu =3D &a4xx_gpu->base; gpu =3D &adreno_gpu->base; =20 - gpu->perfcntrs =3D NULL; - gpu->num_perfcntrs =3D 0; - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); if (ret) goto fail; diff --git a/drivers/gpu/drm/msm/msm_debugfs.c b/drivers/gpu/drm/msm/msm_de= bugfs.c index 1059a9b29d6a..f12701e286ec 100644 --- a/drivers/gpu/drm/msm/msm_debugfs.c +++ b/drivers/gpu/drm/msm/msm_debugfs.c @@ -344,12 +344,6 @@ static int late_init_minor(struct drm_minor *minor) return ret; } =20 - ret =3D msm_perf_debugfs_init(minor); - if (ret) { - DRM_DEV_ERROR(dev->dev, "could not install perf debugfs\n"); - return ret; - } - return 0; } =20 diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index edc3b4af14f4..3066547f319b 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -87,7 +87,6 @@ static int msm_drm_uninit(struct device *dev, const struc= t component_ops *gpu_op =20 msm_gem_shrinker_cleanup(ddev); =20 - msm_perf_debugfs_cleanup(priv); msm_rd_debugfs_cleanup(priv); =20 if (priv->kms) diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 6d847d593f1a..e53e4f220bed 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -45,7 +45,6 @@ struct msm_gpu; struct msm_mmu; struct msm_mdss; struct msm_rd_state; -struct msm_perf_state; struct msm_gem_submit; struct msm_fence_context; struct msm_disp_state; @@ -89,7 +88,6 @@ struct msm_drm_private { =20 struct msm_rd_state *rd; /* debugfs to dump all submits */ struct msm_rd_state *hangrd; /* debugfs to dump hanging submits */ - struct msm_perf_state *perf; =20 /** * total_mem: Total/global amount of memory backing GEM objects. @@ -442,8 +440,6 @@ void msm_rd_debugfs_cleanup(struct msm_drm_private *pri= v); __printf(3, 4) void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *su= bmit, const char *fmt, ...); -int msm_perf_debugfs_init(struct drm_minor *minor); -void msm_perf_debugfs_cleanup(struct msm_drm_private *priv); #else static inline int msm_debugfs_late_init(struct drm_device *dev) { return 0= ; } __printf(3, 4) @@ -451,7 +447,6 @@ static inline void msm_rd_dump_submit(struct msm_rd_sta= te *rd, struct msm_gem_submit *submit, const char *fmt, ...) {} static inline void msm_rd_debugfs_cleanup(struct msm_drm_private *priv) {} -static inline void msm_perf_debugfs_cleanup(struct msm_drm_private *priv) = {} #endif =20 struct clk *msm_clk_get(struct platform_device *pdev, const char *name); diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index cf244fd529aa..1bac70473f80 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -699,104 +699,6 @@ void msm_gpu_sysrq_kill(struct msm_gpu *gpu) } } =20 -/* - * Performance Counters: - */ - -/* called under perf_lock */ -static int update_hw_cntrs(struct msm_gpu *gpu, uint32_t ncntrs, uint32_t = *cntrs) -{ - uint32_t current_cntrs[ARRAY_SIZE(gpu->last_cntrs)]; - int i, n =3D min(ncntrs, gpu->num_perfcntrs); - - /* read current values: */ - for (i =3D 0; i < gpu->num_perfcntrs; i++) - current_cntrs[i] =3D gpu_read(gpu, gpu->perfcntrs[i].sample_reg); - - /* update cntrs: */ - for (i =3D 0; i < n; i++) - cntrs[i] =3D current_cntrs[i] - gpu->last_cntrs[i]; - - /* save current values: */ - for (i =3D 0; i < gpu->num_perfcntrs; i++) - gpu->last_cntrs[i] =3D current_cntrs[i]; - - return n; -} - -static void update_sw_cntrs(struct msm_gpu *gpu) -{ - ktime_t time; - uint32_t elapsed; - unsigned long flags; - - spin_lock_irqsave(&gpu->perf_lock, flags); - if (!gpu->perfcntr_active) - goto out; - - time =3D ktime_get(); - elapsed =3D ktime_to_us(ktime_sub(time, gpu->last_sample.time)); - - gpu->totaltime +=3D elapsed; - if (gpu->last_sample.active) - gpu->activetime +=3D elapsed; - - gpu->last_sample.active =3D msm_gpu_active(gpu); - gpu->last_sample.time =3D time; - -out: - spin_unlock_irqrestore(&gpu->perf_lock, flags); -} - -void msm_gpu_perfcntr_start(struct msm_gpu *gpu) -{ - unsigned long flags; - - pm_runtime_get_sync(&gpu->pdev->dev); - - spin_lock_irqsave(&gpu->perf_lock, flags); - /* we could dynamically enable/disable perfcntr registers too.. */ - gpu->last_sample.active =3D msm_gpu_active(gpu); - gpu->last_sample.time =3D ktime_get(); - gpu->activetime =3D gpu->totaltime =3D 0; - gpu->perfcntr_active =3D true; - update_hw_cntrs(gpu, 0, NULL); - spin_unlock_irqrestore(&gpu->perf_lock, flags); -} - -void msm_gpu_perfcntr_stop(struct msm_gpu *gpu) -{ - gpu->perfcntr_active =3D false; - pm_runtime_put_sync(&gpu->pdev->dev); -} - -/* returns -errno or # of cntrs sampled */ -int msm_gpu_perfcntr_sample(struct msm_gpu *gpu, uint32_t *activetime, - uint32_t *totaltime, uint32_t ncntrs, uint32_t *cntrs) -{ - unsigned long flags; - int ret; - - spin_lock_irqsave(&gpu->perf_lock, flags); - - if (!gpu->perfcntr_active) { - ret =3D -EINVAL; - goto out; - } - - *activetime =3D gpu->activetime; - *totaltime =3D gpu->totaltime; - - gpu->activetime =3D gpu->totaltime =3D 0; - - ret =3D update_hw_cntrs(gpu, ncntrs, cntrs); - -out: - spin_unlock_irqrestore(&gpu->perf_lock, flags); - - return ret; -} - /* * Cmdstream submission/retirement: */ @@ -899,7 +801,6 @@ void msm_gpu_retire(struct msm_gpu *gpu) msm_update_fence(gpu->rb[i]->fctx, gpu->rb[i]->memptrs->fence); =20 kthread_queue_work(gpu->worker, &gpu->retire_work); - update_sw_cntrs(gpu); } =20 /* add bo's to gpu's ring, and kick gpu: */ @@ -916,8 +817,6 @@ void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem= _submit *submit) =20 submit->seqno =3D submit->hw_fence->seqno; =20 - update_sw_cntrs(gpu); - /* * ring->submits holds a ref to the submit, to deal with the case * that a submit completes before msm_ioctl_gem_submit() returns. @@ -1009,9 +908,6 @@ int msm_gpu_init(struct drm_device *drm, struct platfo= rm_device *pdev, void *memptrs; uint64_t memptrs_iova; =20 - if (WARN_ON(gpu->num_perfcntrs > ARRAY_SIZE(gpu->last_cntrs))) - gpu->num_perfcntrs =3D ARRAY_SIZE(gpu->last_cntrs); - gpu->dev =3D drm; gpu->funcs =3D funcs; gpu->name =3D name; @@ -1043,9 +939,6 @@ int msm_gpu_init(struct drm_device *drm, struct platfo= rm_device *pdev, =20 timer_setup(&gpu->hangcheck_timer, hangcheck_handler, 0); =20 - spin_lock_init(&gpu->perf_lock); - - /* Map registers: */ gpu->mmio =3D msm_ioremap(pdev, config->ioname); if (IS_ERR(gpu->mmio)) { diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 07abbe33d992..78e1478669be 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -22,7 +22,6 @@ =20 struct msm_gem_submit; struct msm_gem_vm_log_entry; -struct msm_gpu_perfcntr; struct msm_gpu_state; struct msm_context; =20 @@ -168,18 +167,6 @@ struct msm_gpu { =20 struct adreno_smmu_priv adreno_smmu; =20 - /* performance counters (hw & sw): */ - spinlock_t perf_lock; - bool perfcntr_active; - struct { - bool active; - ktime_t time; - } last_sample; - uint32_t totaltime, activetime; /* sw counters */ - uint32_t last_cntrs[5]; /* hw counters */ - const struct msm_gpu_perfcntr *perfcntrs; - uint32_t num_perfcntrs; - struct msm_ringbuffer *rb[MSM_GPU_MAX_RINGS]; int nr_rings; =20 @@ -320,19 +307,6 @@ static inline bool msm_gpu_active(struct msm_gpu *gpu) return false; } =20 -/* Perf-Counters: - * The select_reg and select_val are just there for the benefit of the chi= ld - * class that actually enables the perf counter.. but msm_gpu base class - * will handle sampling/displaying the counters. - */ - -struct msm_gpu_perfcntr { - uint32_t select_reg; - uint32_t sample_reg; - uint32_t select_val; - const char *name; -}; - /* * The number of priority levels provided by drm gpu scheduler. The * DRM_SCHED_PRIORITY_KERNEL priority level is treated specially in some @@ -689,11 +663,6 @@ void msm_devfreq_idle(struct msm_gpu *gpu); =20 int msm_gpu_hw_init(struct msm_gpu *gpu); =20 -void msm_gpu_perfcntr_start(struct msm_gpu *gpu); -void msm_gpu_perfcntr_stop(struct msm_gpu *gpu); -int msm_gpu_perfcntr_sample(struct msm_gpu *gpu, uint32_t *activetime, - uint32_t *totaltime, uint32_t ncntrs, uint32_t *cntrs); - void msm_gpu_retire(struct msm_gpu *gpu); void msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit); void msm_gpu_sysrq_kill(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/msm_perf.c b/drivers/gpu/drm/msm/msm_perf.c deleted file mode 100644 index 7768bde6745f..000000000000 --- a/drivers/gpu/drm/msm/msm_perf.c +++ /dev/null @@ -1,235 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright (C) 2013 Red Hat - * Author: Rob Clark - */ - -/* For profiling, userspace can: - * - * tail -f /sys/kernel/debug/dri//gpu - * - * This will enable performance counters/profiling to track the busy time - * and any gpu specific performance counters that are supported. - */ - -#ifdef CONFIG_DEBUG_FS - -#include -#include - -#include - -#include "msm_drv.h" -#include "msm_gpu.h" - -struct msm_perf_state { - struct drm_device *dev; - - bool open; - int cnt; - struct mutex read_lock; - - char buf[256]; - int buftot, bufpos; - - unsigned long next_jiffies; -}; - -#define SAMPLE_TIME (HZ/4) - -/* wait for next sample time: */ -static int wait_sample(struct msm_perf_state *perf) -{ - unsigned long start_jiffies =3D jiffies; - - if (time_after(perf->next_jiffies, start_jiffies)) { - unsigned long remaining_jiffies =3D - perf->next_jiffies - start_jiffies; - int ret =3D schedule_timeout_interruptible(remaining_jiffies); - if (ret > 0) { - /* interrupted */ - return -ERESTARTSYS; - } - } - perf->next_jiffies +=3D SAMPLE_TIME; - return 0; -} - -static int refill_buf(struct msm_perf_state *perf) -{ - struct msm_drm_private *priv =3D perf->dev->dev_private; - struct msm_gpu *gpu =3D priv->gpu; - char *ptr =3D perf->buf; - int rem =3D sizeof(perf->buf); - int i, n; - - if ((perf->cnt++ % 32) =3D=3D 0) { - /* Header line: */ - n =3D scnprintf(ptr, rem, "%%BUSY"); - ptr +=3D n; - rem -=3D n; - - for (i =3D 0; i < gpu->num_perfcntrs; i++) { - const struct msm_gpu_perfcntr *perfcntr =3D &gpu->perfcntrs[i]; - n =3D scnprintf(ptr, rem, "\t%s", perfcntr->name); - ptr +=3D n; - rem -=3D n; - } - } else { - /* Sample line: */ - uint32_t activetime =3D 0, totaltime =3D 0; - uint32_t cntrs[5]; - uint32_t val; - int ret; - - /* sleep until next sample time: */ - ret =3D wait_sample(perf); - if (ret) - return ret; - - ret =3D msm_gpu_perfcntr_sample(gpu, &activetime, &totaltime, - ARRAY_SIZE(cntrs), cntrs); - if (ret < 0) - return ret; - - val =3D totaltime ? 1000 * activetime / totaltime : 0; - n =3D scnprintf(ptr, rem, "%3d.%d%%", val / 10, val % 10); - ptr +=3D n; - rem -=3D n; - - for (i =3D 0; i < ret; i++) { - /* cycle counters (I think).. convert to MHz.. */ - val =3D cntrs[i] / 10000; - n =3D scnprintf(ptr, rem, "\t%5d.%02d", - val / 100, val % 100); - ptr +=3D n; - rem -=3D n; - } - } - - n =3D scnprintf(ptr, rem, "\n"); - ptr +=3D n; - rem -=3D n; - - perf->bufpos =3D 0; - perf->buftot =3D ptr - perf->buf; - - return 0; -} - -static ssize_t perf_read(struct file *file, char __user *buf, - size_t sz, loff_t *ppos) -{ - struct msm_perf_state *perf =3D file->private_data; - int n =3D 0, ret =3D 0; - - mutex_lock(&perf->read_lock); - - if (perf->bufpos >=3D perf->buftot) { - ret =3D refill_buf(perf); - if (ret) - goto out; - } - - n =3D min((int)sz, perf->buftot - perf->bufpos); - if (copy_to_user(buf, &perf->buf[perf->bufpos], n)) { - ret =3D -EFAULT; - goto out; - } - - perf->bufpos +=3D n; - *ppos +=3D n; - -out: - mutex_unlock(&perf->read_lock); - if (ret) - return ret; - return n; -} - -static int perf_open(struct inode *inode, struct file *file) -{ - struct msm_perf_state *perf =3D inode->i_private; - struct drm_device *dev =3D perf->dev; - struct msm_drm_private *priv =3D dev->dev_private; - struct msm_gpu *gpu =3D priv->gpu; - int ret =3D 0; - - if (!gpu) - return -ENODEV; - - mutex_lock(&gpu->lock); - - if (perf->open) { - ret =3D -EBUSY; - goto out; - } - - file->private_data =3D perf; - perf->open =3D true; - perf->cnt =3D 0; - perf->buftot =3D 0; - perf->bufpos =3D 0; - msm_gpu_perfcntr_start(gpu); - perf->next_jiffies =3D jiffies + SAMPLE_TIME; - -out: - mutex_unlock(&gpu->lock); - return ret; -} - -static int perf_release(struct inode *inode, struct file *file) -{ - struct msm_perf_state *perf =3D inode->i_private; - struct msm_drm_private *priv =3D perf->dev->dev_private; - msm_gpu_perfcntr_stop(priv->gpu); - perf->open =3D false; - return 0; -} - - -static const struct file_operations perf_debugfs_fops =3D { - .owner =3D THIS_MODULE, - .open =3D perf_open, - .read =3D perf_read, - .release =3D perf_release, -}; - -int msm_perf_debugfs_init(struct drm_minor *minor) -{ - struct msm_drm_private *priv =3D minor->dev->dev_private; - struct msm_perf_state *perf; - - /* only create on first minor: */ - if (priv->perf) - return 0; - - perf =3D kzalloc_obj(*perf); - if (!perf) - return -ENOMEM; - - perf->dev =3D minor->dev; - - mutex_init(&perf->read_lock); - priv->perf =3D perf; - - debugfs_create_file("perf", S_IFREG | S_IRUGO, minor->debugfs_root, - perf, &perf_debugfs_fops); - return 0; -} - -void msm_perf_debugfs_cleanup(struct msm_drm_private *priv) -{ - struct msm_perf_state *perf =3D priv->perf; - - if (!perf) - return; - - priv->perf =3D NULL; - - mutex_destroy(&perf->read_lock); - - kfree(perf); -} - -#endif --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 0B6AD3C1403 for ; Thu, 14 May 2026 13:54:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766853; cv=none; b=Be79QiFlFSUeYhKJclcUs1sm4FTqDUXxHQBH9ahu3Pki7vhAzDtCqpW7xI7gK6mGPBv4D7jeDfNDZbVHwcWQugr9VPUPYdbsDuhM0upWB3UWDgoggcxLNQdob0BJpk/cDzcp4dHQ/jLQG3Cn3Oj/0lFUCYCspJ4OjxEI2O2l6Tw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766853; c=relaxed/simple; bh=hNYajq5FoO8Ohwqtcny4uUuWTPmnir7ozBVWoOEnOkI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nGdWtpN4XQVy6532InaYIpzwvFL0xA9nWSRa8TJD6vwSz4E51U+hkOr330Ubo2Zp8oUmq0xqYCGUNR7NSL25VboTaFr7UFNcplLX7/Tp27c6BysOlI6HddYjDV3pklkA8DlUCQXYLO6LgBugKxRUbY3sirP59sHR/rWsIqVDK7g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=cCqwSZDZ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=UFMvO6Q4; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="cCqwSZDZ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="UFMvO6Q4" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBel1Q3952422 for ; Thu, 14 May 2026 13:54:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=r626fk8GTYQ 7mVDurnFWdbX+Kfuz+zSekrPETuLYfy4=; b=cCqwSZDZA/ZNXKBJmVr7z7Bktxx UVxsaLFxNfkUHMEgmLfDrTkhlkQAn1d8jSnNYEkqL+DnIdkZhebLnz/56GLpNrAD JQDkci1gMWs3NvdVMsAiAEDjbmA9sSsu0eUA+Ha1jDTMFlwyFDEp4N7CEK/GeXBd e1FzjkuHX2n06UoQqE9xx1Fw0LfN+R5uT2P8KUPQIqDs+OP1mnTrr665pUDQI4ZF +HQ4NXS9nPEn3VcF59xxp+kxzOLeDBvQQGOxsizT4SbiMWyaYyE96W8XgahQIWWl nsJWKBWKlNkUUcJ5r62dmrQSWruq5LPCqn3dxViJY/qrm3w/OrTdG+HMLDw== Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e57kssscf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:11 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c828659ecd4so2783437a12.0 for ; Thu, 14 May 2026 06:54:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766850; x=1779371650; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r626fk8GTYQ7mVDurnFWdbX+Kfuz+zSekrPETuLYfy4=; b=UFMvO6Q4nRRdfKnx7GevLiOqNbuRKBiBEEnvscHfXFnn8JoEjQEbd86FEyH4vqZAkc wHm8PIrKgLJLDmdTMMUItT13baf2iUaFL9E2utijSaW4r9VTFuafCBazUqulHOLjige3 /ih5SjKa9vV0opzhz2rtYp8kysBCPF7PjKS1FGiSUBHvvRXGe8Dw9qUOodXh5euqvxbq 1gAmqqYrzpp9CFTG20fLJK2GAaHcaeSZwn77oCM4FF/U00wNgaIAGWamQ+WY1PeIEPtc PmDyUxWXUYSyOqGrE2rIPEXSkbRzL2i4hN4P+Rytfdbnaj36VfZjSLiNXuJN4T5DleYd 2Q7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766850; x=1779371650; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=r626fk8GTYQ7mVDurnFWdbX+Kfuz+zSekrPETuLYfy4=; b=QXzJchl076E+wyY0VHARhCJDk45/U5N4wiVBxLBzxbsAQH6reY6yP+qT5Vi4HhY53Y pWgFzy+m1kB5IlTIJwERjOU97mNer0axJvB+NaHsF+xcWQ+WaMZijSIRAg0rEOF2uA3F m+5xhzdWa+Y5IheRHYQiQP8HSI335+Ufw14UHh+RMnck0aKm2dsCQCeeSIHd8K/ynTmm tlLym/gi5s89U9z2MXAgag4L5Dsfq1eNQbH0X74+XACOPw9+yomyvtX4/7LLzenKw/w2 PUusK0Oo10+4XX70F9SGvDJLjlN+rJw0Xt0u8/PtdgXdHR5Xtax9oTZdGK6WgWsVUb69 hJpw== X-Forwarded-Encrypted: i=1; AFNElJ8Ot6gEDE/16AtzOhb79CIhwk+VefTKn6X/OGQmp2ENZEYMkNv8Eku3pPPE7jSvcMxAGTGWlfVC2yIkhkA=@vger.kernel.org X-Gm-Message-State: AOJu0Yzolg9OOsXHkuzuFZGu5fgHNQNu87e5xXuKSyqJS1QL40dzZtNN +hqXTGt4rnfNSpQFhSHzpm7UGDdq5ObJXrluCCFDw9re7Z1u1TqJz5O9mv/+VodaN/x5p5Wzl3Q 187PlQpZv3L7OsFlySbqbTOKtAeFnBy6+sUvo5HSfUF2dwjfU/U3qJkSyHaGg9BhFDSk= X-Gm-Gg: Acq92OEx0s8tIUI42DmzNcIKdKD5/kWQtltfEzWzglviRSAo1L8ps7brvdPpllgk+1i c9ZBNc7q9bmjV1H4azaaKT0pRgTd7Y+TW5YzEoycz2pL01IBKS6kvCPQXR5zSKvxrVYghXos780 GObM2+pB4sFfbbqQVfcGKWlyapNHKtQDWZnOLlz/1Ev/0pTzKkbvCRSyjUA6MDeo4qqWJZRXi6L kKUMDGNYYZ0WZoC2ehxTF/1D2yao3wFt57hMnUM6lzhyQBkSCUJPAbF0VXtWiU+YBCtT2EEteBG v9kXgR6AjOjKUoGwk+tsnLI2bwUO4J9fjiQ4yjsNT9RvG1SwFp/SdeprctoIG8J+FKJmCqpEiV1 grP/1HLukXYqOojqIA/hsTgI6DEUvoISB X-Received: by 2002:a05:6a20:7354:b0:3a2:f402:50e0 with SMTP id adf61e73a8af0-3afb0b13093mr8611811637.52.1778766850489; Thu, 14 May 2026 06:54:10 -0700 (PDT) X-Received: by 2002:a05:6a20:7354:b0:3a2:f402:50e0 with SMTP id adf61e73a8af0-3afb0b13093mr8611753637.52.1778766849955; Thu, 14 May 2026 06:54:09 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c82bb07d2f2sm2417535a12.10.2026.05.14.06.54.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:09 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 02/16] drm/msm: Allow CAP_PERFMON for setting SYSPROF Date: Thu, 14 May 2026 06:39:50 -0700 Message-ID: <20260514134052.361771-3-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: zh7E_mcQaMwQPq_JOilkiUb5epzaVDf3 X-Authority-Analysis: v=2.4 cv=KZbidwYD c=1 sm=1 tr=0 ts=6a05d403 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=ZRXlmS4ShPoOlOK7p90A:9 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX4MPnvqJXweMs j3nWTvrIc0t4AHOdGs/D0Er5JSJwZpqzDTrMquGbRfoEzb84JjUQUx2sI/gABXZNzFo9LLcS4p0 9VDMxKEnB/nqdPCEXYvJpj6PpEyJCE2vo7OM9Fx5odF1n0YzW/FK018JPfQdQvRx1jOselb2XTg FsI7KAgUzvATubpu4IyFsUNuKsEE8vaEPekB6c2nIdfvU9njmzIFq5FTr7b+ZKSGGP0vNNF28Ku k/XQlza2UdGx7n/yTX7IixkRRnGAaCrR7Ipa2DbrTzya4dbpQMpq+ebV6WH/hdtdmcc72vfkqzw 5J//nPIsxfMsUi7lBnHQbCgAYk/6ZEaCutJj5Y8z74QDZYMsXM/GDV3Qa/E5DnZ7dIpcpNBbvJA V3+94OT/DHPN/dDsnsA5LedLK0XfEbAZQmDqAx4akt8YNH3Ji0pPV3tDgwat0Ilz/1Jo0jBynio /+R0KFJsgp157XRrqeg== X-Proofpoint-ORIG-GUID: zh7E_mcQaMwQPq_JOilkiUb5epzaVDf3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 bulkscore=0 impostorscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Use perfmon_capable() which checks both CAP_SYS_ADMIN and CAP_PERFMON. This matches what i915 and xe do, and seems more appropriate. Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/= adreno/adreno_gpu.c index 66f80f2d12f9..72b71e9e44f0 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -494,7 +494,7 @@ int adreno_set_param(struct msm_gpu *gpu, struct msm_co= ntext *ctx, return 0; } case MSM_PARAM_SYSPROF: - if (!capable(CAP_SYS_ADMIN)) + if (!perfmon_capable()) return UERR(EPERM, drm, "invalid permissions"); return msm_context_set_sysprof(ctx, gpu, value); case MSM_PARAM_EN_VM_BIND: --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 A24FB3FA5DB for ; Thu, 14 May 2026 13:54:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766880; cv=none; b=Xjl+z35QeIbiBW0FXV9XAX+RPEFmoXfoct2ShCsFKegDgvKyd+MZZcd49VGgtMs4kUc/AB50wT8nUmAiy0nUcFHY0MP3V8hpd2/9IqI7wH/MvQ7TRPlbgOCqKokhgvMd7UcVWQNd9jx8/9XcVEAHnrgObv27wdykg2cHJ4kCwls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766880; c=relaxed/simple; bh=vdBwfecxUpui3gUUDoxG8uHGoEKt+PTCqvnLbVjRgvc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qw5oJvsNr8vMcpZ0AG3y4OLOUW1vcaUIMWMpR71TKZOqk5AeT0Oussat0Ex9PI5zaBlMALn2185KIkKYRV5CCgt4rJU/pfRV12uqpbyUzCbK9Ktz0bRJnxPgjNQToBymnJ0/Eqp1BBVAVabAgMWPxXoqFYEsk0V3pPlI+1VnCrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Jai3j1bX; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=aVGj1Z1I; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Jai3j1bX"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="aVGj1Z1I" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeUSu3048537 for ; Thu, 14 May 2026 13:54:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=0UXFPdGQ8Zx 2XiO+ZE7/XEA/6IdFMOGn/yTQ2tXFl8Q=; b=Jai3j1bXVNRpnZT6Dp+eEe1NoNK QVrn5AddFfel0PETc9ZoM+yDj/meAEltaZabYvsBkuc3NmL098WHmUbLBCjmtV6B 03tU9n1p84sBCf237zaDq9lTCipeLbFBOPm7jBkCS6Ui4tkXLezgk87Qo5JtRs0F zAp5R/x3a+FHgf8l59ypnhQE8pcFJh5Q2Aajoz0Y3ce4EZLtcVZO8THHUB1j/IeU Mc5AcyatkBP1S+uVDOkpT+pAaunYeYivElCgw/u5rEhFGsF4OeT9EfkjhD/A3wZc wHvF/dQfzMudqJYAVv/xt2xwwX/hIGoAnYVrDnuMhjE+8+wbInH+yJJAbZA== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5492tc57-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:19 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-3662e7756f0so6711353a91.1 for ; Thu, 14 May 2026 06:54:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766858; x=1779371658; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0UXFPdGQ8Zx2XiO+ZE7/XEA/6IdFMOGn/yTQ2tXFl8Q=; b=aVGj1Z1ID/vVY3Z7/4enh60Ik9lSNtcTUnVHrvlFqUOXzSbCKzQLTsYNIykLU6BdIL M4bDLX4u9BB63CKHR0gcH5HGJ3eEu8AEBeAd5nYMuEaCThRPju+0wmlbMO5tlJjLRVHI ey5JEYwU35rAwIxcz5GydJteoKRFBX6hwykRqMpJJlFdiG4/C3cTj0+V1hA6p/rIvpIg TUW4mOh45t7MnA9WMlcb39rOcECyCgvx32bensrlPAeV+xDeVO33J4nlGl4K4GjPPur1 GFM4qFkArGP6omE3Mwb7eKRdm/axieMnFIs4FIY7dNnbXmll4niml0eiAfvJmMZ4soEb lT9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766858; x=1779371658; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0UXFPdGQ8Zx2XiO+ZE7/XEA/6IdFMOGn/yTQ2tXFl8Q=; b=XRiCsiW9SvNSA2wuyNZQG3DYNs6HIOu30MfZN9U0CCp5SRAY8mdbHOzTlfpuQb7esW RCZAVl6MLQydYzkAQiXDeukaAHSF8xgqg5gFwPXrHFhlpN73aXwb7YnafUFZEbDR8bye DGf739lp+Vp7/L1mmGpsHVbsQqurr/KeP+1S+aDgjmfxMfvFpuSaauB1hJNOrm1s+Dzd Ze26f25YhAUwdp3QOpu2gpo3NTMMC9KweHqqzduYXArKqdIc00SVF3nfKSZ3ITN/luqx oBzQOxCPKp35hg6nTVQAbVkGtuLXD8jC/eeDkcdSBg4qKRPTDzQ5IAuYQq2QKabdlE26 gjpw== X-Forwarded-Encrypted: i=1; AFNElJ9mVEwrgP/wJXh55jwbldbz6l0l4r6em1MNISUpC2CP3/HcFMueqmLiBcxwWOX81+s1MrJPZjR0o2qOjI0=@vger.kernel.org X-Gm-Message-State: AOJu0YxgLMvF62dxDpD3pAPETcRucTfo+/dvhLMMyuU7L2ZETN+AMLZG u8h4BG6j4lZe+IdV7Rv3lNBI56Y+b3J7J76Xe8dfDPyYUZ5G+E99BTXJ9rxde3VRspdYb7QdRxR ebFWBmS4MMjeldpwCGU8G1wS1hnbu2t1tI3Kx9Qin0Rp8uwf4OW6buLi02mEw5RZAwlc= X-Gm-Gg: Acq92OFshK/SspIj+HaQUqjC8qawzFwQxV5GaZ3YPGe7VY2Uxs1DEPBiH6L984/OwxG WeAxzvWEJ5dX9O4FeiMyPv9N+LnvOIEKz0qmMs/8/GiMuQERjJMP8QMf1iKVD1BZk+5PJYgnIOb AD1qZR5Esa3Brs+Q36Jh6q1Wv3c0elkXD1YC7qKGfqvGuug475b7o3xwuMOw1E5GlszaiaLlUmg FLkXlSPWSPeDRQR7yqjurO/8mxXSGZV0Rs7dvXi4ERjIQaFIUocdhN4Xfs1q5BetRhCXeDvNfH8 PGNsrAy2v25ICot/c4nS7Y9HyYa0yAk1PnVfIztis5TzC/zNRGV7ALrZa90WFrNi12kyvWF+rqq f6T4QLmnMkmu23PFSJ8WVoT8n3IkGEowM068OXWC6lWc= X-Received: by 2002:a17:90b:1a89:b0:35f:9ab2:a5bb with SMTP id 98e67ed59e1d1-368f3aaa384mr8922455a91.10.1778766857126; Thu, 14 May 2026 06:54:17 -0700 (PDT) X-Received: by 2002:a17:90b:1a89:b0:35f:9ab2:a5bb with SMTP id 98e67ed59e1d1-368f3aaa384mr8922369a91.10.1778766856060; Thu, 14 May 2026 06:54:16 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5d11d6easm28499125ad.72.2026.05.14.06.54.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:15 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 03/16] drm/msm/adreno: Sync registers from mesa Date: Thu, 14 May 2026 06:39:51 -0700 Message-ID: <20260514134052.361771-4-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: LodDAVNMj1H2NGPp3Yw4ZvbSXgUctdcf X-Authority-Analysis: v=2.4 cv=R74z39RX c=1 sm=1 tr=0 ts=6a05d40b cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=e5mUnYsNAAAA:8 a=SSmOFEACAAAA:8 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=vMjXctBndKc6M4jOp94A:9 a=-YkrfQbNLgtqXKMw:21 a=mQ_c8vxmzFEMiUWkPHU9:22 a=Vxmtnl_E_bksehYqCbjh:22 X-Proofpoint-ORIG-GUID: LodDAVNMj1H2NGPp3Yw4ZvbSXgUctdcf X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX/ILs3eN6SU/4 uL1MrA/arYfGel/MLAVuL3cWyc0IqpXSL/7TYMNL944hixTLqx88VFTLlkuyPx8zac7xwbL/Ro4 z3cDznlm/xnfCNpB1+UGvI8ztodvSGsZl324PJT9hpjk/OLIdF6ZvhIW+XG+5ICc2mhGguZQ4Pd zqoBQl6hpkk06zEoFU7fWq0J9dVkwDQNtIEVXyFPaMKj5MOmKIfOfVgVcEIR6g/Hr6xMIkuOv1S 3RABtNiuRz503GtLlbA2nstYrwCR6J4rWIY2bgF7NbRI3zuxgqtcjV+KZYCut4iIF/K8ZA+Suo7 oc6GclBgLsHWWuSCOhxCtoriRGeY+yCGW2A0o4uBlNjWuEd+HQJmsefCKgGlDw18xldKkOiAuAD Im53BEynQ+bB6b/+azTf6tiZ+qGFaK98RsOycEmW32Mptf/XEyGM2a1yMvGX73MAzgtdxSzdv8s JIoR4DLEMSFzbjsxDfA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Most of the churn is just reworking the usage attribute on the mesa side. Sync from mesa commit 4d4a951ac622 ("fd: add a8xx perfcntr countables"). Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 16 +- drivers/gpu/drm/msm/registers/adreno/a3xx.xml | 8 +- drivers/gpu/drm/msm/registers/adreno/a5xx.xml | 141 +- drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 1300 +++++------ .../msm/registers/adreno/a6xx_descriptors.xml | 71 +- .../drm/msm/registers/adreno/a6xx_enums.xml | 3 + .../msm/registers/adreno/a8xx_descriptors.xml | 96 +- .../msm/registers/adreno/a8xx_perfcntrs.xml | 1929 +++++++++++++++++ .../msm/registers/adreno/adreno_common.xml | 42 + .../drm/msm/registers/adreno/adreno_pm4.xml | 50 +- 10 files changed, 2846 insertions(+), 810 deletions(-) create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a5xx_gpu.c index 79acae11154a..9a03684288d3 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c @@ -752,17 +752,13 @@ static int a5xx_hw_init(struct msm_gpu *gpu) gpu_write(gpu, REG_A5XX_UCHE_CACHE_WAYS, 0x02); =20 /* Disable L2 bypass in the UCHE */ - gpu_write(gpu, REG_A5XX_UCHE_TRAP_BASE_LO, lower_32_bits(adreno_gpu->uche= _trap_base)); - gpu_write(gpu, REG_A5XX_UCHE_TRAP_BASE_HI, upper_32_bits(adreno_gpu->uche= _trap_base)); - gpu_write(gpu, REG_A5XX_UCHE_WRITE_THRU_BASE_LO, lower_32_bits(adreno_gpu= ->uche_trap_base)); - gpu_write(gpu, REG_A5XX_UCHE_WRITE_THRU_BASE_HI, upper_32_bits(adreno_gpu= ->uche_trap_base)); + gpu_write64(gpu, REG_A5XX_UCHE_TRAP_BASE, adreno_gpu->uche_trap_base); + gpu_write64(gpu, REG_A5XX_UCHE_WRITE_THRU_BASE, adreno_gpu->uche_trap_bas= e); =20 /* Set the GMEM VA range (0 to gpu->gmem) */ - gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MIN_LO, 0x00100000); - gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MIN_HI, 0x00000000); - gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MAX_LO, + gpu_write64(gpu, REG_A5XX_UCHE_GMEM_RANGE_MIN, 0x00100000); + gpu_write64(gpu, REG_A5XX_UCHE_GMEM_RANGE_MAX, 0x00100000 + adreno_gpu->info->gmem - 1); - gpu_write(gpu, REG_A5XX_UCHE_GMEM_RANGE_MAX_HI, 0x00000000); =20 if (adreno_is_a505(adreno_gpu) || adreno_is_a506(adreno_gpu) || adreno_is_a508(adreno_gpu) || adreno_is_a510(adreno_gpu)) { @@ -1217,9 +1213,7 @@ static void a5xx_rbbm_err_irq(struct msm_gpu *gpu, u3= 2 status) =20 static void a5xx_uche_err_irq(struct msm_gpu *gpu) { - uint64_t addr =3D (uint64_t) gpu_read(gpu, REG_A5XX_UCHE_TRAP_LOG_HI); - - addr |=3D gpu_read(gpu, REG_A5XX_UCHE_TRAP_LOG_LO); + uint64_t addr =3D gpu_read64(gpu, REG_A5XX_UCHE_TRAP_LOG); =20 dev_err_ratelimited(gpu->dev->dev, "UCHE | Out of bounds access | addr=3D= 0x%llX\n", addr); diff --git a/drivers/gpu/drm/msm/registers/adreno/a3xx.xml b/drivers/gpu/dr= m/msm/registers/adreno/a3xx.xml index 6717abc0a897..09c9606fc3e1 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a3xx.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a3xx.xml @@ -1330,11 +1330,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org= /freedreno/ rules-fd.xsd"> - - + @@ -1420,7 +1416,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - + diff --git a/drivers/gpu/drm/msm/registers/adreno/a5xx.xml b/drivers/gpu/dr= m/msm/registers/adreno/a5xx.xml index bd8df5945166..4af76b3750f7 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a5xx.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a5xx.xml @@ -1418,8 +1418,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - - + @@ -1498,12 +1497,10 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.or= g/freedreno/ rules-fd.xsd"> - - + - - + @@ -1555,20 +1552,14 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.or= g/freedreno/ rules-fd.xsd"> - - - - - - - - + + + + - - - - + + @@ -1583,8 +1574,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - - + =20 @@ -1923,8 +1913,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> invalidates the LRZ buffer? (Or just the covered positions? --> - - + @@ -1933,8 +1922,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> is also divided by 8 (ie. covers 8x8 pixels) - - + =20 @@ -2035,8 +2023,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set --> - - + @@ -2089,8 +2076,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + stride of depth/stencil buffer @@ -2119,8 +2105,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + @@ -2163,8 +2148,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set also for gmem->mem preserving tiling --> - - + @@ -2235,25 +2219,22 @@ bit 7 for RECTLIST (clear) when z32s8 (used for cle= ar of depth32? not set =20 =20 - - + - + - - + =20 - - + =20 @@ -2357,13 +2338,11 @@ bit 7 for RECTLIST (clear) when z32s8 (used for cle= ar of depth32? not set - - + - - + =20 @@ -2423,8 +2402,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + @@ -2475,7 +2453,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - + @@ -2516,8 +2494,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + =20 @@ -2538,8 +2515,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + @@ -2577,8 +2553,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + @@ -2587,22 +2562,19 @@ bit 7 for RECTLIST (clear) when z32s8 (used for cle= ar of depth32? not set =20 - - + - - + - - + @@ -2615,8 +2587,7 @@ bit 7 for RECTLIST (clear) when z32s8 (used for clear= of depth32? not set - - + =20 diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx.xml b/drivers/gpu/dr= m/msm/registers/adreno/a6xx.xml index 2309870f5031..3349c01646e1 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a6xx.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx.xml @@ -10,19 +10,24 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> + =20 @@ -1321,7 +1326,7 @@ by a particular renderpass/blit. =20 - + @@ -1331,13 +1336,13 @@ by a particular renderpass/blit. =20 - + - + - + Configures the mapping between VSC_PIPE buffer and @@ -1370,7 +1375,7 @@ by a particular renderpass/blit. =20 - + Seems to be a bitmap of which tiles mapped to the VSC pipe contain geometry. @@ -1381,7 +1386,7 @@ by a particular renderpass/blit. =20 - + Has the size of data written to corresponding VSC_PRIM_STRM buffer. @@ -1389,7 +1394,7 @@ by a particular renderpass/blit. =20 - + Has the size of data written to corresponding VSC pipe, ie. same thing that is written out to VSC_SIZE_BASE @@ -1397,7 +1402,7 @@ by a particular renderpass/blit. =20 - + =20 @@ -1428,29 +1433,22 @@ by a particular renderpass/blit. =20 - - + + =20 - - - - - - - - - - - - - - - - + + + + + + + + + =20 @@ -1465,16 +1463,16 @@ by a particular renderpass/blit. =20 - - + + =20 =20 - - + + =20 @@ -1499,33 +1497,48 @@ by a particular renderpass/blit. =20 - + + + =20 - + - + - + - + =20 + + + + + + + + + + + + + =20 - + @@ -1534,7 +1547,7 @@ by a particular renderpass/blit. =20 - + @@ -1543,16 +1556,16 @@ by a particular renderpass/blit. =20 - + - + =20 - + @@ -1572,17 +1585,18 @@ by a particular renderpass/blit. TODO: what about gen2 (a640)? --> - - - - - - - - + + + + + + + + + =20 @@ -1590,49 +1604,49 @@ by a particular renderpass/blit. =20 - - + + =20 - - + + =20 =20 - - + + =20 =20 - - + + =20 =20 - - + + =20 =20 - - + + =20 - - + + =20 - - + + =20 - - + + =20 @@ -1640,8 +1654,8 @@ by a particular renderpass/blit. =20 - - + + =20 @@ -1667,19 +1681,19 @@ by a particular renderpass/blit. - - - + + + =20 - - - + + + =20 =20 - + =20 @@ -1738,10 +1752,10 @@ by a particular renderpass/blit. =20 - + - + =20 @@ -1778,7 +1792,7 @@ by a particular renderpass/blit. =20 - + =20 @@ -1795,7 +1809,7 @@ by a particular renderpass/blit. =20 - + @@ -1808,16 +1822,16 @@ by a particular renderpass/blit. =20 - - + + =20 =20 - - + + =20 @@ -1835,15 +1849,15 @@ by a particular renderpass/blit. =20 - - - + + + =20 - - - - - + + + + + =20 @@ -1860,30 +1874,53 @@ by a particular renderpass/blit. =20 - + =20 - + =20 - + - + =20 - - + + + + + + + + + + + + + + + + + + + + + + =20 - - + + + + + =20 @@ -1893,45 +1930,59 @@ by a particular renderpass/blit. =20 - + + + + + + + + + =20 - - + + + + + =20 =20 - - + + + + + =20 =20 - - + + =20 - - + + =20 =20 - - + + =20 @@ -1966,24 +2017,23 @@ by a particular renderpass/blit. =20 - + - - + + =20 - + The total size of the LRZ image array (not including fast clear buffer), used as a stride for double buffering used with concurrent binning. - - - - + + + =20 @@ -1995,28 +2045,28 @@ by a particular renderpass/blit. =20 - - + + =20 =20 - - + + =20 - - + + =20 - + =20 - - + + =20 - + =20 - - + + =20 - + =20 @@ -2082,8 +2132,8 @@ by a particular renderpass/blit. =20 - - + + =20 LUT used to convert quality buffer values to HW shading rate values.= An array of 4-bit values. @@ -2128,32 +2178,32 @@ by a particular renderpass/blit. =20 - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + =20 @@ -2180,10 +2230,10 @@ by a particular renderpass/blit. --> =20 - - + + =20 - + @@ -2197,7 +2247,7 @@ by a particular renderpass/blit. - + @@ -2206,26 +2256,26 @@ by a particular renderpass/blit. =20 - + - + =20 - - - - - + + + + + - + @@ -2236,7 +2286,7 @@ by a particular renderpass/blit. - + @@ -2248,16 +2298,16 @@ by a particular renderpass/blit. =20 - + - + - + @@ -2277,7 +2327,7 @@ by a particular renderpass/blit. - + @@ -2289,11 +2339,11 @@ by a particular renderpass/blit. =20 - + - + @@ -2316,7 +2366,7 @@ by a particular renderpass/blit. =20 - + =20 @@ -2330,12 +2380,12 @@ by a particular renderpass/blit. =20 - + =20 - + @@ -2383,16 +2433,16 @@ by a particular renderpass/blit. =20 - - - - + + + + - + @@ -2401,12 +2451,12 @@ by a particular renderpass/blit. - + - + =20 - + @@ -2422,23 +2472,23 @@ by a particular renderpass/blit. =20 - + - + =20 - - - - + + + + =20 - - + + - + - + - + @@ -2498,41 +2548,41 @@ by a particular renderpass/blit. - - + + =20 - + - + =20 - + - - + + - + =20 - - - + + + =20 - - + + - + - + @@ -2541,23 +2591,23 @@ by a particular renderpass/blit. - - + + - - + + =20 =20 - + =20 - - - - + + + + =20 @@ -2567,7 +2617,7 @@ by a particular renderpass/blit. =20 - + @@ -2595,7 +2645,7 @@ by a particular renderpass/blit. - + =20 @@ -2637,17 +2687,17 @@ by a particular renderpass/blit. =20 - + =20 - + =20 - + @@ -2656,16 +2706,25 @@ by a particular renderpass/blit. + + + + + + + + + - - + + =20 - + @@ -2683,7 +2742,8 @@ by a particular renderpass/blit. =20 - + + =20 @@ -2693,13 +2753,13 @@ by a particular renderpass/blit. These show up in a6xx gen3+ but so far haven't found an example of blob writing non-zero: --> - - - - + + + + =20 - - + + =20 @@ -2731,28 +2791,28 @@ by a particular renderpass/blit. =20 - - - + + + - - - + + + =20 - - + + - - + + =20 - - - - + + + + =20 - + =20 =20 @@ -2821,7 +2881,7 @@ by a particular renderpass/blit. =20 - + =20 @@ -2847,7 +2907,7 @@ by a particular renderpass/blit. =20 =20 - + =20 @@ -2860,17 +2920,17 @@ by a particular renderpass/blit. - - - + + + =20 - - - + + + =20 - - - + + + =20 @@ -2878,17 +2938,17 @@ by a particular renderpass/blit. =20 - - - + + + =20 - - - + + + =20 - - - + + + =20 @@ -2897,19 +2957,19 @@ by a particular renderpass/blit. =20 - - - - + + + + =20 - + =20 - - + + @@ -2949,14 +3009,14 @@ by a particular renderpass/blit. =20 - - - - - - - - + + + + + + + + =20 @@ -2973,20 +3033,20 @@ by a particular renderpass/blit. =20 - + Packed array of a6xx_varying_interp_mode - + Packed array of a6xx_varying_ps_repl_mode =20 - + Packed array of a6xx_varying_interp_mode - + Packed array of a6xx_varying_ps_repl_mode @@ -2995,12 +3055,12 @@ by a particular renderpass/blit. =20 - + =20 - + @@ -3034,8 +3094,8 @@ by a particular renderpass/blit. =20 - - + + =20 @@ -3047,8 +3107,8 @@ by a particular renderpass/blit. =20 - - + + =20 @@ -3097,13 +3157,13 @@ by a particular renderpass/blit. =20 - - - + + + =20 - - - + + + =20 @@ -3124,8 +3184,8 @@ by a particular renderpass/blit. =20 - - + + =20 - - + + =20 @@ -3253,7 +3313,7 @@ by a particular renderpass/blit. =20 - + @@ -3287,9 +3347,12 @@ by a particular renderpass/blit. =20 =20 - - - + + + + + + =20 =20 - - + + =20 @@ -3324,31 +3387,31 @@ by a particular renderpass/blit. =20 - - - - + + + + =20 - - - - + + + + =20 - - + + =20 - + size in vec4s of per-primitive storage for gs. TODO: not actually in V= PC =20 - - + + - - + + @@ -3426,18 +3489,18 @@ by a particular renderpass/blit. =20 - + - + - + This is the ID of the current patch within the @@ -3450,20 +3513,20 @@ by a particular renderpass/blit. - + - - + + - + - + - + @@ -3474,7 +3537,7 @@ by a particular renderpass/blit. =20 - + @@ -3482,14 +3545,14 @@ by a particular renderpass/blit. =20 - - - + + + - + @@ -3502,14 +3565,14 @@ by a particular renderpass/blit. - + =20 - + =20 =20 @@ -3549,10 +3612,12 @@ by a particular renderpass/blit. --> - - - + + + + + =20 @@ -3580,7 +3645,7 @@ by a particular renderpass/blit. =20 - + - - + + @@ -3623,7 +3688,7 @@ by a particular renderpass/blit. an extra varying after, but with a lower OUTLOC position. If present, psize is last, preceded by position. --> - + @@ -3712,20 +3777,20 @@ by a particular renderpass/blit. =20 - - - - - - - - - + + + + + + + + + =20 - + @@ -3735,32 +3800,32 @@ by a particular renderpass/blit. the maximum size of local storage should be: 64 (wavesize) * 64 (SP_HS_CNTL_1) * 4 =3D 16k --> - - + + =20 - - - - - - - - - + + + + + + + + + =20 - + =20 - - + + @@ -3768,7 +3833,7 @@ by a particular renderpass/blit. - + @@ -3778,24 +3843,24 @@ by a particular renderpass/blit. =20 - - - - - - - - - + + + + + + + + + =20 - + - + Normally the size of the output of the last stage in dwords. It should be programmed as follows: @@ -3809,14 +3874,14 @@ by a particular renderpass/blit. doesn't matter in practice. - + =20 - + - + @@ -3825,7 +3890,7 @@ by a particular renderpass/blit. =20 - + @@ -3835,15 +3900,15 @@ by a particular renderpass/blit. =20 - - - - - - - - - + + + + + + + + + @@ -3859,7 +3924,7 @@ by a particular renderpass/blit. =20 =20 - + @@ -3878,16 +3943,15 @@ by a particular renderpass/blit. and so one pixel's value is always unused. - - - - - - + + + + + =20 @@ -3897,12 +3961,12 @@ by a particular renderpass/blit. =20 - - + + =20 - + @@ -3913,7 +3977,7 @@ by a particular renderpass/blit. - + @@ -3923,17 +3987,17 @@ by a particular renderpass/blit. - + - + =20 - + per MRT @@ -3941,7 +4005,7 @@ by a particular renderpass/blit. =20 - + @@ -3950,7 +4014,7 @@ by a particular renderpass/blit. =20 - + @@ -3967,7 +4031,7 @@ by a particular renderpass/blit. - + @@ -3981,7 +4045,7 @@ by a particular renderpass/blit. - + @@ -3993,21 +4057,21 @@ by a particular renderpass/blit. - + - + - + =20 =20 - + @@ -4025,7 +4089,7 @@ by a particular renderpass/blit. =20 - + If 0 - all 32k of shared storage is enabled, otherwise @@ -4045,29 +4109,29 @@ by a particular renderpass/blit. - - - - - - - - - - - - + + + + + + + + + + + + =20 - + - + @@ -4104,10 +4168,10 @@ by a particular renderpass/blit. =20 =20 - - - - + + + + =20 @@ -4118,13 +4182,13 @@ by a particular renderpass/blit. =20 - + - + @@ -4134,9 +4198,9 @@ by a particular renderpass/blit. - - - + + + =20 @@ -4192,7 +4256,7 @@ by a particular renderpass/blit. =20 - + - + =20 - + =20 - - + + =20 - + =20 - + - + @@ -4259,8 +4323,8 @@ by a particular renderpass/blit. =20 - - + + =20 @@ -4268,7 +4332,14 @@ by a particular renderpass/blit. - + + + When this bit is enabled, new waves may be unlocked once + all invocations have signaled they don't need local + memory anymore using (eolm)nop. + + + @@ -4333,7 +4404,7 @@ by a particular renderpass/blit. =20 - + =20 - - - - + + + + =20 - + =20 + =20 - =20 - + @@ -4387,6 +4458,11 @@ by a particular renderpass/blit. + + + + + =20 @@ -4395,24 +4471,26 @@ by a particular renderpass/blit. badly named or the functionality moved in a6xx. But downstream kernel calls this "a6xx_sp_ps_tp_2d_cluster" --> - - + + - - + + =20 - - + + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - - + + + =20 - - + + + - + + + - + - - - - - - + + + + + + - + - + - - - - + + + + =20 - + - + - + - + - + - + - + - + - - - + + + =20 - + - + - + - + - + - + - + - - - + + + =20 @@ -4690,7 +4774,7 @@ by a particular renderpass/blit. =20 - + @@ -4711,7 +4795,7 @@ by a particular renderpass/blit. =20 - + @@ -4723,7 +4807,7 @@ by a particular renderpass/blit. =20 - + @@ -4731,7 +4815,7 @@ by a particular renderpass/blit. =20 - + @@ -4750,7 +4834,7 @@ by a particular renderpass/blit. =20 - + This register clears pending loads queued up by CP_LOAD_STATE6. Each bit resets a particular kind(s) of @@ -4790,7 +4874,7 @@ by a particular renderpass/blit. =20 - + This register clears pending loads queued up by CP_LOAD_STATE6. Each bit resets a particular kind(s) of @@ -4813,7 +4897,7 @@ by a particular renderpass/blit. =20 - + This register clears pending loads queued up by CP_LOAD_STATE6. Each bit resets a particular kind(s) of @@ -4829,16 +4913,16 @@ by a particular renderpass/blit. =20 - - + + =20 - - + + =20 - - + + =20 - + Shared constants are intended to be used for Vulkan push constants. When enabled, 8 vec4's are reserved in the FS diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx_descriptors.xml b/dr= ivers/gpu/drm/msm/registers/adreno/a6xx_descriptors.xml index 56cfaff614a4..08bc37f29a6f 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a6xx_descriptors.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx_descriptors.xml @@ -45,19 +45,21 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> =20 - + Texture constant dwords - - - - - + + + + + + - - + + + probably for D3D structured UAVs, normally set to 1 - - + + =20 - + Pitch in bytes (so actually stride) - + @@ -94,15 +97,15 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> layer size at the point that it stops being reduced moving to higher (smaller) mipmap levels --> - - + + - - + + - + - + + + + + - + + - + + + + - + + - + - - + + + + + diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx_enums.xml b/drivers/= gpu/drm/msm/registers/adreno/a6xx_enums.xml index 81538831dc19..b44946f36fae 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a6xx_enums.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx_enums.xml @@ -328,6 +328,9 @@ to upconvert to 32b float internally? + + + =20 diff --git a/drivers/gpu/drm/msm/registers/adreno/a8xx_descriptors.xml b/dr= ivers/gpu/drm/msm/registers/adreno/a8xx_descriptors.xml index edcbdb3b6921..d119d021446c 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a8xx_descriptors.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a8xx_descriptors.xml @@ -39,76 +39,92 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> =20 - + Texture memobj dwords - + + for type TEX_BUFFER + - + + - + + for type TEX_BUFFER, probably for D3D structured UAVs, normally se= t to 1 + - - - + + + + - - - - + + + + - - - - + + + + - + - + - + - - - - + + + + + + + + + + - = - - + + + - - - - - - + + + + + + - - + + + + + + - + - - + + - + - + - - + + diff --git a/drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml b/driv= ers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml new file mode 100644 index 000000000000..a5bb44f76956 --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.xml @@ -0,0 +1,1929 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/drivers/gpu/drm/msm/registers/adreno/adreno_common.xml b/drive= rs/gpu/drm/msm/registers/adreno/adreno_common.xml index 79d204f1e400..195cee078357 100644 --- a/drivers/gpu/drm/msm/registers/adreno/adreno_common.xml +++ b/drivers/gpu/drm/msm/registers/adreno/adreno_common.xml @@ -14,6 +14,27 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fre= edreno/ rules-fd.xsd"> =20 + + + + TEX_MEMOBJ descriptor types. These are used + to mark fields that only apply to certain + descriptor types, and potentially overlap + with fields in other types. + + + + + + + Additional descriptor types not part of + TEX_MEMOBJ. These are described by their + own toplevel domain. + + + + + @@ -409,4 +430,25 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/f= reedreno/ rules-fd.xsd"> =20 + + + + + + + + + + + + + + + + diff --git a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml b/drivers/= gpu/drm/msm/registers/adreno/adreno_pm4.xml index 51e9c94f5e37..f185b541aa70 100644 --- a/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml +++ b/drivers/gpu/drm/msm/registers/adreno/adreno_pm4.xml @@ -152,6 +152,8 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> + + @@ -1095,7 +1097,7 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) - + @@ -1275,8 +1277,15 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) - + + @@ -1469,6 +1478,7 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) + =20 @@ -1476,7 +1486,7 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) - + @@ -2055,28 +2065,20 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) =20 - Executes the following DWORDs of commands if the dword at = ADDR0 - is not equal to 0 and the dword at ADDR1 is less than REF - (signed comparison). + Executes the following DWORDs of commands if the dword + at BOOL_ADDR is not equal to 0 and the the timestamp + value ACTIVE_TIMESTAMP is ahead of the value fetched + from TIMESTAMP_ADDR. + + The timestamp comparision is an unsigned compare with + wraparound, ie: + + (ACTIVE_TIMESTAMP - *TIMESTAMP_ADDR) < 0x80000000 - - - - - - - - - - - - - - - - - - + + + + =20 --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 5EE983F7A9B for ; Thu, 14 May 2026 13:54:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766867; cv=none; b=qxqWFuAn5RP44Wu/4e1Z0vwu5TPFqdyPB6cR01/5kpr+O2bQlVg4pQVL13mO1AaTiPA65XRuyVHjYKf32eECnKOxm44jsz3ty8CaOZfFzZ1dWxCu8sNcdH+I0WVjK0FylpS7g2JaIEqiJzym0CzW0RRHB/WeF6Yp7HOAXiXRo6c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766867; c=relaxed/simple; bh=zGLAEgA+s6pVroDUNSbh72nrrj2Aw6HUXDAPXJa/Nbs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g+X5LGQWqzq5pcvUoU65WRrZOFyeGAMdhY4LBNGePqAMHwUEelcQN6DTVmp8zxTqYpvg6J3Q9XS/4GTaTQY7rOPKhg4S3dLmtla9yYLoRPlfpgrpeXU/PJsSA00aeszibWClWvD5UDsf6cSJGzL8X3wFj0XFhSMPSj+yxG7vZrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=dyj2+UD+; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DIMZD9/C; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="dyj2+UD+"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DIMZD9/C" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeRZ02713164 for ; Thu, 14 May 2026 13:54:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=+Xsc2uLt9be nkWe+2U5trxxCzbTFXavPO23WjOtGu5Q=; b=dyj2+UD+uYo328mo1Ok3qVoNdz4 9R14sDLgIGSMODWI8YTZzSUdw4ZkJGm5unH8sa2QFIs2uz3bJgRJX2IM+0/Sb9wU ttgCcSNCpViVQTnjfdmqgxsMCncaWrGZufS5XobvgS3V7jhIRq08m6P5Zxrdoy/m 64JlesgoYB9lN2BYkBK58b2epNC79F6a3VjUnXOXBeH/vAXY5thkhdw7NJsWmvB9 8UyG7aSfLfFQTo71JeYvg5dSHjx157L+OAqQica3bWyAlOui1rBmKhht2TLzf5Yi qR0QFBSf+MXlvNd8pHmg2ANfomY9nuXckr1S1MfykRTYQb+pDn5w4aE3y7w== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e58v89h86-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:22 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2bd6cc53fd6so4866015ad.3 for ; Thu, 14 May 2026 06:54:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766862; x=1779371662; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+Xsc2uLt9benkWe+2U5trxxCzbTFXavPO23WjOtGu5Q=; b=DIMZD9/C7H4TwYJ6hf/lyk1s0FpYoJocKs3mVtzBD6mSJ7QOUDX+SbFCqaS1tqAXxW hHVllgmgm+dvt/K4KtMQ8VxYQE69kNm2R0pO2DMmR3z5QnUMygAzn/92GfN1KUEFnS7R VuHL+PQoAnVGNQ/pGM3NXDkGJoKdd3EF7ZtRoJe0DaJNzs9Kd1KxAjbNTHrRJhOsd3XF CTXyJTAHsFXBPV/KdK+g0clqgmcVqXOdrXNbThayR7vWoGH0QTcim8/nDcH1GjGuGuTI lF1XK3udnvKszWFfEv28xE6rj1QLEzJRASXixpEgWdjMgfPDTIEirE9kK7DUL55/17sm /6og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766862; x=1779371662; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+Xsc2uLt9benkWe+2U5trxxCzbTFXavPO23WjOtGu5Q=; b=qegV5apKE2hPNOpWh+C6IPwuIJfVtj+DbULs1ZbwKBW8/nQHhxV7ssBfzVsUOd5gmY y7AgBL271A5Tu34ZYJZcyFqYQhqNdsNVEpW7yb7IzXiHouedkn1BjIZfBHVEF/62JZc5 giATJrJ25ZCW0v7ja6QXJ+5I7duCbVfgJ6D24fCT7ndsYBZ5AgzgxD2ugPlpZ6mpFIFf RdJCxHn+WqMtuQi4iJouj9DjkO5+wW8SCfn1JWF3NiHBMbZ173CFqmRZPvIyBaT86znY xEjCbsJ9YOHhMoHGt+yiXus37I5PRZhWhckcDZ0jSV4FgyMsjUGJBIef+xzdBxdiylzq cveg== X-Forwarded-Encrypted: i=1; AFNElJ97Gi3nEzNIZe32NAUcnNLs056TR4KkIBABRFs4SoqWMlD4Wj+HCWo5AA9ZiPFitKsHQgYG2FSCgVb5NNY=@vger.kernel.org X-Gm-Message-State: AOJu0YyzhJmbMlGKkzJvl+Idn7thgNmmB4GvUKqM/YbzfGumcfWtMW+g WOX6yGWVvP6bUxFcI6hgx5DvxJI5bLrmFaJ29MXr2+U0f8JGIdcePqOk0TroF9LLRYko/pQoW+0 a+d8+rMlJVj2Y3CSy5QPaLF5budSLWRKpqoJNrpFlkDb0JLrWMMGVMVlWcvgbk0rlINQ= X-Gm-Gg: Acq92OGxFcD2bZjYfEGif5HEDH+3sUumWhfr/w6hPhyhJEqZ3Xei7nAKyjb+bBKcrYy lqZC0z//piZnivgT0Xvn+p4YVeULdhznva26FENlf5/ndnv3n1RC+y9THpGiTL5ovc3//q0/bT0 4YeK7HfRwpFy8y6HILsaGgumiB3sai21aV8KaZax6vy2oanuAxR2HXuLevK+Jgg7rjGH8OxyUgf 0VC3wU5XZP+aAwvomwg0Y1HMqoDJ9UYA0XEs7O1M217H0OaRW+OZNOMWXTS8dK0j1EdpCoXmb2U 9VQOQM6SqGFcDM8dka0d++8NePAkc+vXW0u7wAc46LzcjHAmdz+Crd89eRN9Q8TSY/l5xT9DXf7 ApoZ85XWNsu3D7DVCE3IlEgR5lZLZLcf8 X-Received: by 2002:a17:903:228f:b0:2b2:4b4e:e4d2 with SMTP id d9443c01a7336-2bd27184609mr89656185ad.15.1778766860654; Thu, 14 May 2026 06:54:20 -0700 (PDT) X-Received: by 2002:a17:903:228f:b0:2b2:4b4e:e4d2 with SMTP id d9443c01a7336-2bd27184609mr89655675ad.15.1778766859754; Thu, 14 May 2026 06:54:19 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5bd5fe51sm26127345ad.2.2026.05.14.06.54.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:19 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , linux-kernel@vger.kernel.org (open list), llvm@lists.linux.dev (open list:CLANG/LLVM BUILD SUPPORT:Keyword:\b(?i:clang|llvm)\b) Subject: [PATCH v6 04/16] drm/msm/registers: Sync gen_header.py from mesa Date: Thu, 14 May 2026 06:39:52 -0700 Message-ID: <20260514134052.361771-5-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX92JVn6PCOF53 7nvpO3+B/leyHmb+4SQRhqgPUyiISfOpoBWZV86CsAjwAb3KNQlN0eBGajYgbBdhICvt7bL0LnF Awvt50M61Z7uBw+oBzR5IDEwxfRVXla+kojTRq/lhw3T/rPSTzT4J/KHX38gnB9Es7st+Yt903g 8mM6lZIzHRB7lekZ8MAWlOGne4k6J+01FoqYR2nSU0YpgI06JhVCiNIF9KWlWKENoZ+hoK3tLTH rnAW70y/9i1OP0qQcXgqs/vywYV+WVP7XM0Q/F32qZIKWFfhKtTPjU539UYtZGHdwKUpWGChi4B UP8W1KVaEpS/Rwb/HOo/lqQPQYHxtSsPdTFtMd1ZMgJbuBBFTDEGKQhGaIr+yufvMPrmqfmGbnr iC/eHpSVETcWT5uoZaNUVIlhQC0kgO3VjavU1PlBBeYBhQ/piQwxAC1W+SSRn8dGY0qrQWGeIy5 nClgDKicO+/eujgz4WQ== X-Proofpoint-GUID: Xl5tjMIJVzHfRCi1LdO_Tqlpcx56keEr X-Authority-Analysis: v=2.4 cv=YZSNIQRf c=1 sm=1 tr=0 ts=6a05d40e cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=upIMGkliACeFOg2EZ_0A:9 a=3o6Nrjf1o8nA2Q1M:21 a=1OuFwYUASf3TG4hYMiVC:22 X-Proofpoint-ORIG-GUID: Xl5tjMIJVzHfRCi1LdO_Tqlpcx56keEr X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 impostorscore=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Update gen_header.py to bring in support for generating perfcntr tables. Sync from mesa commit 1fd18a9734ad ("freedreno/registers: Add gen8 perfcntr support") Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/registers/gen_header.py | 2079 ++++++++++--------- 1 file changed, 1146 insertions(+), 933 deletions(-) diff --git a/drivers/gpu/drm/msm/registers/gen_header.py b/drivers/gpu/drm/= msm/registers/gen_header.py index 2acad951f1e2..07e6f0cb4e66 100644 --- a/drivers/gpu/drm/msm/registers/gen_header.py +++ b/drivers/gpu/drm/msm/registers/gen_header.py @@ -11,997 +11,1210 @@ import collections import argparse import time import datetime +import json + =20 class Error(Exception): - def __init__(self, message): - self.message =3D message + def __init__(self, message): + self.message =3D message + =20 class Enum(object): - def __init__(self, name): - self.name =3D name - self.values =3D [] - - def has_name(self, name): - for (n, value) in self.values: - if n =3D=3D name: - return True - return False - - def names(self): - return [n for (n, value) in self.values] - - def dump(self, is_deprecated): - use_hex =3D False - for (name, value) in self.values: - if value > 0x1000: - use_hex =3D True - - print("enum %s {" % self.name) - for (name, value) in self.values: - if use_hex: - print("\t%s =3D 0x%08x," % (name, value)) - else: - print("\t%s =3D %d," % (name, value)) - print("};\n") - - def dump_pack_struct(self, is_deprecated): - pass + def __init__(self, name): + self.name =3D name + self.values =3D [] + + def has_name(self, name): + for (n, value) in self.values: + if n =3D=3D name: + return True + return False + + def names(self): + return [n for (n, value) in self.values] + + def value(self, name): + for (n, v) in self.values: + if n =3D=3D name: + return v + + def dump(self, has_variants): + use_hex =3D False + for (name, value) in self.values: + if value > 0x1000: + use_hex =3D True + + print("enum %s {" % self.name) + for (name, value) in self.values: + if use_hex: + print("\t%s =3D 0x%08x," % (name, value)) + else: + print("\t%s =3D %d," % (name, value)) + print("};\n") + + def dump_pack_struct(self, has_variants): + pass + =20 class Field(object): - def __init__(self, name, low, high, shr, type, parser): - self.name =3D name - self.low =3D low - self.high =3D high - self.shr =3D shr - self.type =3D type - - builtin_types =3D [ None, "a3xx_regid", "boolean", "uint", "hex", "int",= "fixed", "ufixed", "float", "address", "waddress" ] - - maxpos =3D parser.current_bitsize - 1 - - if low < 0 or low > maxpos: - raise parser.error("low attribute out of range: %d" % low) - if high < 0 or high > maxpos: - raise parser.error("high attribute out of range: %d" % high) - if high < low: - raise parser.error("low is greater than high: low=3D%d, high=3D%d" % (l= ow, high)) - if self.type =3D=3D "boolean" and not low =3D=3D high: - raise parser.error("booleans should be 1 bit fields") - elif self.type =3D=3D "float" and not (high - low =3D=3D 31 or high - lo= w =3D=3D 15): - raise parser.error("floats should be 16 or 32 bit fields") - elif self.type not in builtin_types and self.type not in parser.enums: - raise parser.error("unknown type '%s'" % self.type) - - def ctype(self, var_name): - if self.type is None: - type =3D "uint32_t" - val =3D var_name - elif self.type =3D=3D "boolean": - type =3D "bool" - val =3D var_name - elif self.type =3D=3D "uint" or self.type =3D=3D "hex" or self.type =3D= =3D "a3xx_regid": - type =3D "uint32_t" - val =3D var_name - elif self.type =3D=3D "int": - type =3D "int32_t" - val =3D var_name - elif self.type =3D=3D "fixed": - type =3D "float" - val =3D "((int32_t)(%s * %d.0))" % (var_name, 1 << self.radix) - elif self.type =3D=3D "ufixed": - type =3D "float" - val =3D "((uint32_t)(%s * %d.0))" % (var_name, 1 << self.radix) - elif self.type =3D=3D "float" and self.high - self.low =3D=3D 31: - type =3D "float" - val =3D "fui(%s)" % var_name - elif self.type =3D=3D "float" and self.high - self.low =3D=3D 15: - type =3D "float" - val =3D "_mesa_float_to_half(%s)" % var_name - elif self.type in [ "address", "waddress" ]: - type =3D "uint64_t" - val =3D var_name - else: - type =3D "enum %s" % self.type - val =3D var_name - - if self.shr > 0: - val =3D "(%s >> %d)" % (val, self.shr) - - return (type, val) + def __init__(self, name, low, high, shr, type, parser): + self.name =3D name + self.low =3D low + self.high =3D high + self.shr =3D shr + self.type =3D type + + builtin_types =3D [None, "a3xx_regid", "boolean", "uint", "hex", + "int", "fixed", "ufixed", "float", "address", "wa= ddress"] + + maxpos =3D parser.current_bitsize - 1 + + if low < 0 or low > maxpos: + raise parser.error("low attribute out of range: %d" % low) + if high < 0 or high > maxpos: + raise parser.error("high attribute out of range: %d" % high) + if high < low: + raise parser.error( + "low is greater than high: low=3D%d, high=3D%d" % (low, hi= gh)) + if self.type =3D=3D "boolean" and not low =3D=3D high: + raise parser.error("booleans should be 1 bit fields") + elif self.type =3D=3D "float" and not (high - low =3D=3D 31 or hig= h - low =3D=3D 15): + raise parser.error("floats should be 16 or 32 bit fields") + elif self.type not in builtin_types and self.type not in parser.en= ums: + raise parser.error("unknown type '%s'" % self.type) + + def ctype(self, var_name): + if self.type is None: + type =3D "uint32_t" + val =3D var_name + elif self.type =3D=3D "boolean": + type =3D "bool" + val =3D var_name + elif self.type =3D=3D "uint" or self.type =3D=3D "hex" or self.typ= e =3D=3D "a3xx_regid": + type =3D "uint32_t" + val =3D var_name + elif self.type =3D=3D "int": + type =3D "int32_t" + val =3D var_name + elif self.type =3D=3D "fixed": + type =3D "float" + val =3D "(uint32_t)((int32_t)(%s * %d.0))" % (var_name, 1 << s= elf.radix) + elif self.type =3D=3D "ufixed": + type =3D "float" + val =3D "((uint32_t)(%s * %d.0))" % (var_name, 1 << self.radix) + elif self.type =3D=3D "float" and self.high - self.low =3D=3D 31: + type =3D "float" + val =3D "fui(%s)" % var_name + elif self.type =3D=3D "float" and self.high - self.low =3D=3D 15: + type =3D "float" + val =3D "_mesa_float_to_half(%s)" % var_name + elif self.type in ["address", "waddress"]: + type =3D "uint64_t" + val =3D var_name + else: + type =3D "enum %s" % self.type + val =3D var_name + + if self.shr > 0: + val =3D "(%s >> %d)" % (val, self.shr) + + return (type, val) + =20 def tab_to(name, value): - tab_count =3D (68 - (len(name) & ~7)) // 8 - if tab_count <=3D 0: - tab_count =3D 1 - print(name + ('\t' * tab_count) + value) + tab_count =3D (68 - (len(name) & ~7)) // 8 + if tab_count <=3D 0: + tab_count =3D 1 + print(name + ('\t' * tab_count) + value) + +def define_macro(name, value, has_variants): + if has_variants: + value =3D "__FD_DEPRECATED " + value + tab_to(name, value) =20 def mask(low, high): - return ((0xffffffffffffffff >> (64 - (high + 1 - low))) << low) + return ((0xffffffffffffffff >> (64 - (high + 1 - low))) << low) + =20 def field_name(reg, f): - if f.name: - name =3D f.name.lower() - else: - # We hit this path when a reg is defined with no bitset fields, ie. - # - name =3D reg.name.lower() + if f.name: + name =3D f.name.lower() + else: + # We hit this path when a reg is defined with no bitset fields, ie. + # + name =3D reg.name.lower() =20 - if (name in [ "double", "float", "int" ]) or not (name[0].isalpha()): - name =3D "_" + name + if (name in ["double", "float", "int"]) or not (name[0].isalpha()): + name =3D "_" + name =20 - return name + return name =20 # indices - array of (ctype, stride, __offsets_NAME) + + def indices_varlist(indices): - return ", ".join(["i%d" % i for i in range(len(indices))]) + return ", ".join(["i%d" % i for i in range(len(indices))]) + =20 def indices_prototype(indices): - return ", ".join(["%s i%d" % (ctype, idx) - for (idx, (ctype, stride, offset)) in enumerate(indices)]) + return ", ".join(["%s i%d" % (ctype, idx) + for (idx, (ctype, stride, offset)) in enumerate(indi= ces)]) + =20 def indices_strides(indices): - return " + ".join(["0x%x*i%d" % (stride, idx) - if stride else - "%s(i%d)" % (offset, idx) - for (idx, (ctype, stride, offset)) in enumerate(indices)]) + return " + ".join(["0x%x*i%d" % (stride, idx) + if stride else + "%s(i%d)" % (offset, idx) + for (idx, (ctype, stride, offset)) in enumerate(ind= ices)]) + =20 def is_number(str): - try: - int(str) - return True - except ValueError: - return False + try: + int(str) + return True + except ValueError: + return False + =20 def sanitize_variant(variant): - if variant and "-" in variant: - return variant[:variant.index("-")] - return variant + if variant and "-" in variant: + return variant[:variant.index("-")] + return variant + =20 class Bitset(object): - def __init__(self, name, template): - self.name =3D name - self.inline =3D False - self.reg =3D None - if template: - self.fields =3D template.fields[:] - else: - self.fields =3D [] - - # Get address field if there is one in the bitset, else return None: - def get_address_field(self): - for f in self.fields: - if f.type in [ "address", "waddress" ]: - return f - return None - - def dump_regpair_builder(self, reg): - print("#ifndef NDEBUG") - known_mask =3D 0 - for f in self.fields: - known_mask |=3D mask(f.low, f.high) - if f.type in [ "boolean", "address", "waddress" ]: - continue - type, val =3D f.ctype("fields.%s" % field_name(reg, f)) - print(" assert((%-40s & 0x%08x) =3D=3D 0);" % (val, 0xffffffff ^ mas= k(0 , f.high - f.low))) - print(" assert((%-40s & 0x%08x) =3D=3D 0);" % ("fields.unknown", know= n_mask)) - print("#endif\n") - - print(" return (struct fd_reg_pair) {") - print(" .reg =3D (uint32_t)%s," % reg.reg_offset()) - print(" .value =3D") - cast =3D "(uint64_t)" if reg.bit_size =3D=3D 64 else "" - for f in self.fields: - if f.type in [ "address", "waddress" ]: - continue - else: - type, val =3D f.ctype("fields.%s" % field_name(reg, f)) - print(" (%s%-40s << %2d) |" % (cast, val, f.low)) - value_name =3D "dword" - if reg.bit_size =3D=3D 64: - value_name =3D "qword" - print(" fields.unknown | fields.%s," % (value_name,)) - - address =3D self.get_address_field() - if address: - print(" .bo =3D fields.bo,") - print(" .is_address =3D true,") - if f.type =3D=3D "waddress": - print(" .bo_write =3D true,") - print(" .bo_offset =3D fields.bo_offset,") - print(" .bo_shift =3D %d," % address.shr) - print(" .bo_low =3D %d," % address.low) - - print(" };") - - def dump_pack_struct(self, is_deprecated, reg=3DNone): - if not reg: - return - - prefix =3D reg.full_name - - print("struct %s {" % prefix) - for f in self.fields: - if f.type in [ "address", "waddress" ]: - tab_to(" __bo_type", "bo;") - tab_to(" uint32_t", "bo_offset;") - continue - name =3D field_name(reg, f) - - type, val =3D f.ctype("var") - - tab_to(" %s" % type, "%s;" % name) - if reg.bit_size =3D=3D 64: - tab_to(" uint64_t", "unknown;") - tab_to(" uint64_t", "qword;") - else: - tab_to(" uint32_t", "unknown;") - tab_to(" uint32_t", "dword;") - print("};\n") - - depcrstr =3D "" - if is_deprecated: - depcrstr =3D " FD_DEPRECATED" - if reg.array: - print("static inline%s struct fd_reg_pair\npack_%s(uint32_t __i, struct= %s fields)\n{" % - (depcrstr, prefix, prefix)) - else: - print("static inline%s struct fd_reg_pair\npack_%s(struct %s fields)\n{= " % - (depcrstr, prefix, prefix)) - - self.dump_regpair_builder(reg) - - print("\n}\n") - - if self.get_address_field(): - skip =3D ", { .reg =3D 0 }" - else: - skip =3D "" - - if reg.array: - print("#define %s(__i, ...) pack_%s(__i, __struct_cast(%s) { __VA_ARGS_= _ })%s\n" % - (prefix, prefix, prefix, skip)) - else: - print("#define %s(...) pack_%s(__struct_cast(%s) { __VA_ARGS__ })%s\n" % - (prefix, prefix, prefix, skip)) - - - def dump(self, is_deprecated, prefix=3DNone, reg=3DNone): - if prefix is None: - prefix =3D self.name - reg64 =3D reg and self.reg and self.reg.bit_size =3D=3D 64 - if reg64: - print("static inline uint32_t %s_LO(uint32_t val)\n{" % prefix) - print("\treturn val;\n}") - print("static inline uint32_t %s_HI(uint32_t val)\n{" % prefix) - print("\treturn val;\n}") - for f in self.fields: - if f.name: - name =3D prefix + "_" + f.name - else: - name =3D prefix - - if not f.name and f.low =3D=3D 0 and f.shr =3D=3D 0 and f.type not in [= "float", "fixed", "ufixed"]: - pass - elif f.type =3D=3D "boolean" or (f.type is None and f.low =3D=3D f.high= ): - tab_to("#define %s" % name, "0x%08x" % (1 << f.low)) - else: - typespec =3D "ull" if reg64 else "u" - tab_to("#define %s__MASK" % name, "0x%08x%s" % (mask(f.low, f.high), t= ypespec)) - tab_to("#define %s__SHIFT" % name, "%d" % f.low) - type, val =3D f.ctype("val") - ret_type =3D "uint64_t" if reg64 else "uint32_t" - cast =3D "(uint64_t)" if reg64 else "" - - print("static inline %s %s(%s val)\n{" % (ret_type, name, type)) - if f.shr > 0: - print("\tassert(!(val & 0x%x));" % mask(0, f.shr - 1)) - print("\treturn (%s(%s) << %s__SHIFT) & %s__MASK;\n}" % (cast, val, na= me, name)) - print() + def __init__(self, name, template): + self.name =3D name + self.inline =3D False + self.reg =3D None + if template: + self.fields =3D template.fields[:] + else: + self.fields =3D [] + + # Get address field if there is one in the bitset, else return None: + def get_address_field(self): + for f in self.fields: + if f.type in ["address", "waddress"]: + return f + return None + + def dump_regpair_builder(self, reg): + print("#ifndef NDEBUG") + known_mask =3D 0 + for f in self.fields: + known_mask |=3D mask(f.low, f.high) + if f.type in ["boolean", "address", "waddress"]: + continue + type, val =3D f.ctype("fields.%s" % field_name(reg, f)) + print(" assert((%-40s & 0x%08x) =3D=3D 0);" % + (val, 0xffffffff ^ mask(0, f.high - f.low))) + print(" assert((%-40s & 0x%08x) =3D=3D 0);" % + ("fields.unknown", known_mask)) + print("#endif\n") + + print(" return (struct fd_reg_pair) {") + print(" .reg =3D (uint32_t)%s," % reg.reg_offset()) + print(" .value =3D") + cast =3D "(uint64_t)" if reg.bit_size =3D=3D 64 else "" + for f in self.fields: + if f.type in ["address", "waddress"]: + continue + else: + type, val =3D f.ctype("fields.%s" % field_name(reg, f)) + print(" (%s%-40s << %2d) |" % (cast, val, f.low= )) + value_name =3D "dword" + if reg.bit_size =3D=3D 64: + value_name =3D "qword" + print(" fields.unknown | fields.%s," % (value_name,)) + + address =3D self.get_address_field() + if address: + print("#ifndef TU_CS_H") + print(" .bo =3D fields.bo,") + print(" .is_address =3D true,") + print(" .bo_offset =3D fields.bo_offset,") + print(" .bo_shift =3D %d," % address.shr) + print(" .bo_low =3D %d," % address.low) + print("#else") + print(" .is_address =3D true,") + print("#endif") + + print(" };") + + def dump_pack_struct(self, has_variants, reg=3DNone): + if not reg: + return + + prefix =3D reg.full_name + + constexpr_mark =3D " CONSTEXPR" + + print("struct %s {" % prefix) + for f in self.fields: + if f.type in ["address", "waddress"]: + print("#ifndef TU_CS_H") + tab_to(" __bo_type", "bo;") + tab_to(" uint32_t", "bo_offset;") + print("#endif\n") + continue + name =3D field_name(reg, f) + + type, val =3D f.ctype("var") + + tab_to(" %s" % type, "%s;" % name) + + if f.type =3D=3D "float": + # Requires using `fui()` or `_mesa_float_to_half()` + constexpr_mark =3D "" + if reg.bit_size =3D=3D 64: + tab_to(" uint64_t", "qword;") + tab_to(" uint64_t", "unknown;") + else: + tab_to(" uint32_t", "dword;") + tab_to(" uint32_t", "unknown;") + print("};\n") + + if not has_variants: + print("static%s inline struct fd_reg_pair" % constexpr_mark) + if reg.array: + print("pack_%s(uint32_t __i, struct %s fields)\n{" % (pref= ix, prefix)) + else: + print("pack_%s(struct %s fields)\n{" % (prefix, prefix)) + + self.dump_regpair_builder(reg) + + print("\n}\n") + + if self.get_address_field(): + skip =3D ", { .reg =3D 0 }" + else: + skip =3D "" + + if reg.array: + print("#define %s(__i, ...) pack_%s(__i, __struct_cast(%s) { _= _VA_ARGS__ })%s\n" % + (prefix, prefix, prefix, skip)) + else: + print("#define %s(...) pack_%s(__struct_cast(%s) { __VA_ARGS__= })%s\n" % + (prefix, prefix, prefix, skip)) + + def dump(self, has_variants, prefix=3DNone, reg=3DNone): + if prefix is None: + prefix =3D self.name + suffix =3D "" + if self.reg and self.reg.bit_size =3D=3D 64: + print( + "static CONSTEXPR inline uint32_t %s_LO(uint32_t val)\n{" = % prefix) + print("\treturn val;\n}") + print( + "static CONSTEXPR inline uint32_t %s_HI(uint32_t val)\n{" = % prefix) + print("\treturn val;\n}") + suffix =3D "ull" + + for f in self.fields: + if f.name: + name =3D prefix + "_" + f.name + else: + name =3D prefix + + if not f.name and f.low =3D=3D 0 and f.shr =3D=3D 0 and f.type= not in ["float", "fixed", "ufixed"]: + pass + elif f.type =3D=3D "boolean" or (f.type is None and f.low =3D= =3D f.high): + tab_to("#define %s" % name, "0x%08x%s" % ((1 << f.low), su= ffix)) + else: + tab_to("#define %s__MASK" % + name, "0x%08x%s" % (mask(f.low, f.high), suffix)) + tab_to("#define %s__SHIFT" % name, "%d" % f.low) + type, val =3D f.ctype("val") + ret_type =3D "uint64_t" if reg and reg.bit_size =3D=3D 64 = else "uint32_t" + cast =3D "(uint64_t)" if reg and reg.bit_size =3D=3D 64 el= se "" + + constexpr_mark =3D "" if type =3D=3D "float" else " CONSTE= XPR" + print("static%s inline %s %s(%s val)\n{" % ( + constexpr_mark, ret_type, name, type)) + if f.shr > 0: + print("\tassert(!(val & 0x%x));" % mask(0, f.shr - 1)) + print("\treturn (%s(%s) << %s__SHIFT) & %s__MASK;\n}" % + (cast, val, name, name)) + print() + =20 class Array(object): - def __init__(self, attrs, domain, variant, parent, index_type): - if "name" in attrs: - self.local_name =3D attrs["name"] - else: - self.local_name =3D "" - self.domain =3D domain - self.variant =3D variant - self.parent =3D parent - self.children =3D [] - if self.parent: - self.name =3D self.parent.name + "_" + self.local_name - else: - self.name =3D self.local_name - if "offsets" in attrs: - self.offsets =3D map(lambda i: "0x%08x" % int(i, 0), attrs["offsets"].s= plit(",")) - self.fixed_offsets =3D True - elif "doffsets" in attrs: - self.offsets =3D map(lambda s: "(%s)" % s , attrs["doffsets"].split(","= )) - self.fixed_offsets =3D True - else: - self.offset =3D int(attrs["offset"], 0) - self.stride =3D int(attrs["stride"], 0) - self.fixed_offsets =3D False - if "index" in attrs: - self.index_type =3D index_type - else: - self.index_type =3D None - self.length =3D int(attrs["length"], 0) - if "usage" in attrs: - self.usages =3D attrs["usage"].split(',') - else: - self.usages =3D None - - def index_ctype(self): - if not self.index_type: - return "uint32_t" - else: - return "enum %s" % self.index_type.name - - # Generate array of (ctype, stride, __offsets_NAME) - def indices(self): - if self.parent: - indices =3D self.parent.indices() - else: - indices =3D [] - if self.length !=3D 1: - if self.fixed_offsets: - indices.append((self.index_ctype(), None, "__offset_%s" % self.local_n= ame)) - else: - indices.append((self.index_ctype(), self.stride, None)) - return indices - - def total_offset(self): - offset =3D 0 - if not self.fixed_offsets: - offset +=3D self.offset - if self.parent: - offset +=3D self.parent.total_offset() - return offset - - def dump(self, is_deprecated): - depcrstr =3D "" - if is_deprecated: - depcrstr =3D " FD_DEPRECATED" - proto =3D indices_varlist(self.indices()) - strides =3D indices_strides(self.indices()) - array_offset =3D self.total_offset() - if self.fixed_offsets: - print("static inline%s uint32_t __offset_%s(%s idx)" % (depcrstr, self.= local_name, self.index_ctype())) - print("{\n\tswitch (idx) {") - if self.index_type: - for val, offset in zip(self.index_type.names(), self.offsets): - print("\t\tcase %s: return %s;" % (val, offset)) - else: - for idx, offset in enumerate(self.offsets): - print("\t\tcase %d: return %s;" % (idx, offset)) - print("\t\tdefault: return INVALID_IDX(idx);") - print("\t}\n}") - if proto =3D=3D '': - tab_to("#define REG_%s_%s" % (self.domain, self.name), "0x%08x\n" % arr= ay_offset) - else: - tab_to("#define REG_%s_%s(%s)" % (self.domain, self.name, proto), "(0x%= 08x + %s )\n" % (array_offset, strides)) - - def dump_pack_struct(self, is_deprecated): - pass - - def dump_regpair_builder(self): - pass + def __init__(self, attrs, domain, variant, parent, index_type): + if "name" in attrs: + self.local_name =3D attrs["name"] + else: + self.local_name =3D "" + self.domain =3D domain + self.variant =3D variant + self.parent =3D parent + self.children =3D [] + if self.parent: + self.name =3D self.parent.name + "_" + self.local_name + else: + self.name =3D self.local_name + if "offsets" in attrs: + self.offsets =3D map(lambda i: "0x%08x" % + int(i, 0), attrs["offsets"].split(",")) + self.fixed_offsets =3D True + elif "doffsets" in attrs: + self.offsets =3D map(lambda s: "(%s)" % + s, attrs["doffsets"].split(",")) + self.fixed_offsets =3D True + else: + self.offset =3D int(attrs["offset"], 0) + self.stride =3D int(attrs["stride"], 0) + self.fixed_offsets =3D False + if "index" in attrs: + self.index_type =3D index_type + else: + self.index_type =3D None + self.length =3D int(attrs["length"], 0) + if "usage" in attrs: + self.usages =3D attrs["usage"].split(',') + else: + self.usages =3D None + + def index_ctype(self): + if not self.index_type: + return "uint32_t" + else: + return "enum %s" % self.index_type.name + + # Generate array of (ctype, stride, __offsets_NAME) + def indices(self): + if self.parent: + indices =3D self.parent.indices() + else: + indices =3D [] + if self.length !=3D 1: + if self.fixed_offsets: + indices.append((self.index_ctype(), None, + "__offset_%s" % self.local_name)) + else: + indices.append((self.index_ctype(), self.stride, None)) + return indices + + def total_offset(self): + offset =3D 0 + if not self.fixed_offsets: + offset +=3D self.offset + if self.parent: + offset +=3D self.parent.total_offset() + return offset + + def dump(self, has_variants): + proto =3D indices_varlist(self.indices()) + strides =3D indices_strides(self.indices()) + array_offset =3D self.total_offset() + if self.fixed_offsets and not has_variants: + print("static CONSTEXPR inline uint32_t __offset_%s(%s idx)" % + (self.local_name, self.index_ctype())) + print("{\n\tswitch (idx) {") + if self.index_type: + for val, offset in zip(self.index_type.names(), self.offse= ts): + print("\t\tcase %s: return %s;" % (val, offset)) + else: + for idx, offset in enumerate(self.offsets): + print("\t\tcase %d: return %s;" % (idx, offset)) + print("\t\tdefault: return INVALID_IDX(idx);") + print("\t}\n}") + if proto =3D=3D '': + define_macro("#define REG_%s_%s" % + (self.domain, self.name), "0x%08x\n" % array_offs= et, + has_variants) + else: + define_macro("#define REG_%s_%s(%s)" % (self.domain, self.name, + proto), "(0x%08x + %s )\n" % (array_offset, strid= es), + has_variants) + + def dump_pack_struct(self, has_variants): + pass + + def dump_regpair_builder(self): + pass + =20 class Reg(object): - def __init__(self, attrs, domain, array, bit_size): - self.name =3D attrs["name"] - self.domain =3D domain - self.array =3D array - self.offset =3D int(attrs["offset"], 0) - self.type =3D None - self.bit_size =3D bit_size - if array: - self.name =3D array.name + "_" + self.name - array.children.append(self) - self.full_name =3D self.domain + "_" + self.name - if "stride" in attrs: - self.stride =3D int(attrs["stride"], 0) - self.length =3D int(attrs["length"], 0) - else: - self.stride =3D None - self.length =3D None - - # Generate array of (ctype, stride, __offsets_NAME) - def indices(self): - if self.array: - indices =3D self.array.indices() - else: - indices =3D [] - if self.stride: - indices.append(("uint32_t", self.stride, None)) - return indices - - def total_offset(self): - if self.array: - return self.array.total_offset() + self.offset - else: - return self.offset - - def reg_offset(self): - if self.array: - offset =3D self.array.offset + self.offset - return "(0x%08x + 0x%x*__i)" % (offset, self.array.stride) - return "0x%08x" % self.offset - - def dump(self, is_deprecated): - depcrstr =3D "" - if is_deprecated: - depcrstr =3D " FD_DEPRECATED " - proto =3D indices_prototype(self.indices()) - strides =3D indices_strides(self.indices()) - offset =3D self.total_offset() - if proto =3D=3D '': - tab_to("#define REG_%s" % self.full_name, "0x%08x" % offset) - else: - print("static inline%s uint32_t REG_%s(%s) { return 0x%08x + %s; }" % (= depcrstr, self.full_name, proto, offset, strides)) - - if self.bitset.inline: - self.bitset.dump(is_deprecated, self.full_name, self) - print("") - - def dump_pack_struct(self, is_deprecated): - if self.bitset.inline: - self.bitset.dump_pack_struct(is_deprecated, self) - - def dump_regpair_builder(self): - self.bitset.dump_regpair_builder(self) - - def dump_py(self): - print("\tREG_%s =3D 0x%08x" % (self.full_name, self.offset)) + def __init__(self, attrs, domain, array, bit_size): + self.name =3D attrs["name"] + self.domain =3D domain + self.array =3D array + self.offset =3D int(attrs["offset"], 0) + self.type =3D None + self.bit_size =3D bit_size + if array: + self.name =3D array.name + "_" + self.name + array.children.append(self) + self.full_name =3D self.domain + "_" + self.name + if "stride" in attrs: + self.stride =3D int(attrs["stride"], 0) + self.length =3D int(attrs["length"], 0) + else: + self.stride =3D None + self.length =3D None + + # Generate array of (ctype, stride, __offsets_NAME) + def indices(self): + if self.array: + indices =3D self.array.indices() + else: + indices =3D [] + if self.stride: + indices.append(("uint32_t", self.stride, None)) + return indices + + def total_offset(self): + if self.array: + return self.array.total_offset() + self.offset + else: + return self.offset + + def reg_offset(self): + if self.array: + offset =3D self.array.offset + self.offset + return "(0x%08x + 0x%x*__i)" % (offset, self.array.stride) + return "0x%08x" % self.offset + + def dump(self, has_variants): + proto =3D indices_prototype(self.indices()) + strides =3D indices_strides(self.indices()) + offset =3D self.total_offset() + if proto =3D=3D '': + define_macro("#define REG_%s" % self.full_name, "0x%08x" % off= set, has_variants) + elif not has_variants: + depcrstr =3D "" + if has_variants: + depcrstr =3D " __FD_DEPRECATED " + print("static CONSTEXPR inline%s uint32_t REG_%s(%s) { return = 0x%08x + %s; }" % ( + depcrstr, self.full_name, proto, offset, strides)) + + if self.bitset.inline: + self.bitset.dump(has_variants, self.full_name, self) + print("") + + def dump_pack_struct(self, has_variants): + if self.bitset.inline: + self.bitset.dump_pack_struct(has_variants, self) + + def dump_regpair_builder(self): + self.bitset.dump_regpair_builder(self) + + def dump_py(self): + offset =3D self.offset + if self.array: + offset +=3D self.array.offset + print("\tREG_%s =3D 0x%08x" % (self.full_name, offset)) =20 =20 class Parser(object): - def __init__(self): - self.current_array =3D None - self.current_domain =3D None - self.current_prefix =3D None - self.current_prefix_type =3D None - self.current_stripe =3D None - self.current_bitset =3D None - self.current_bitsize =3D 32 - # The varset attribute on the domain specifies the enum which - # specifies all possible hw variants: - self.current_varset =3D None - # Regs that have multiple variants.. we only generated the C++ - # template based struct-packers for these - self.variant_regs =3D {} - # Information in which contexts regs are used, to be used in - # debug options - self.usage_regs =3D collections.defaultdict(list) - self.bitsets =3D {} - self.enums =3D {} - self.variants =3D set() - self.file =3D [] - self.xml_files =3D [] - - def error(self, message): - parser, filename =3D self.stack[-1] - return Error("%s:%d:%d: %s" % (filename, parser.CurrentLineNumber, parse= r.CurrentColumnNumber, message)) - - def prefix(self, variant=3DNone): - if self.current_prefix_type =3D=3D "variant" and variant: - return sanitize_variant(variant) - elif self.current_stripe: - return self.current_stripe + "_" + self.current_domain - elif self.current_prefix: - return self.current_prefix + "_" + self.current_domain - else: - return self.current_domain - - def parse_field(self, name, attrs): - try: - if "pos" in attrs: - high =3D low =3D int(attrs["pos"], 0) - elif "high" in attrs and "low" in attrs: - high =3D int(attrs["high"], 0) - low =3D int(attrs["low"], 0) - else: - low =3D 0 - high =3D self.current_bitsize - 1 - - if "type" in attrs: - type =3D attrs["type"] - else: - type =3D None - - if "shr" in attrs: - shr =3D int(attrs["shr"], 0) - else: - shr =3D 0 - - b =3D Field(name, low, high, shr, type, self) - - if type =3D=3D "fixed" or type =3D=3D "ufixed": - b.radix =3D int(attrs["radix"], 0) - - self.current_bitset.fields.append(b) - except ValueError as e: - raise self.error(e) - - def parse_varset(self, attrs): - # Inherit the varset from the enclosing domain if not overriden: - varset =3D self.current_varset - if "varset" in attrs: - varset =3D self.enums[attrs["varset"]] - return varset - - def parse_variants(self, attrs): - if "variants" not in attrs: - return None - - variant =3D attrs["variants"].split(",")[0] - varset =3D self.parse_varset(attrs) - - if "-" in variant: - # if we have a range, validate that both the start and end - # of the range are valid enums: - start =3D variant[:variant.index("-")] - end =3D variant[variant.index("-") + 1:] - assert varset.has_name(start) - if end !=3D "": - assert varset.has_name(end) - else: - assert varset.has_name(variant) - - return variant - - def add_all_variants(self, reg, attrs, parent_variant): - # TODO this should really handle *all* variants, including dealing - # with open ended ranges (ie. "A2XX,A4XX-") (we have the varset - # enum now to make that possible) - variant =3D self.parse_variants(attrs) - if not variant: - variant =3D parent_variant - - if reg.name not in self.variant_regs: - self.variant_regs[reg.name] =3D {} - else: - # All variants must be same size: - v =3D next(iter(self.variant_regs[reg.name])) - assert self.variant_regs[reg.name][v].bit_size =3D=3D reg.bit_size - - self.variant_regs[reg.name][variant] =3D reg - - def add_all_usages(self, reg, usages): - if not usages: - return - - for usage in usages: - self.usage_regs[usage].append(reg) - - self.variants.add(reg.domain) - - def do_validate(self, schemafile): - if not self.validate: - return - - try: - from lxml import etree - - parser, filename =3D self.stack[-1] - dirname =3D os.path.dirname(filename) - - # we expect this to look like schema.xsd.. I think - # technically it is supposed to be just a URL, but that doesn't - # quite match up to what we do.. Just skip over everything up to - # and including the first whitespace character: - schemafile =3D schemafile[schemafile.rindex(" ")+1:] - - # this is a bit cheezy, but the xml file to validate could be - # in a child director, ie. we don't really know where the schema - # file is, the way the rnn C code does. So if it doesn't exist - # just look one level up - if not os.path.exists(dirname + "/" + schemafile): - schemafile =3D "../" + schemafile - - if not os.path.exists(dirname + "/" + schemafile): - raise self.error("Cannot find schema for: " + filename) - - xmlschema_doc =3D etree.parse(dirname + "/" + schemafile) - xmlschema =3D etree.XMLSchema(xmlschema_doc) - - xml_doc =3D etree.parse(filename) - if not xmlschema.validate(xml_doc): - error_str =3D str(xmlschema.error_log.filter_from_errors()[0]) - raise self.error("Schema validation failed for: " + filename + "\n" + = error_str) - except ImportError as e: - print("lxml not found, skipping validation", file=3Dsys.stderr) - - def do_parse(self, filename): - filepath =3D os.path.abspath(filename) - if filepath in self.xml_files: - return - self.xml_files.append(filepath) - file =3D open(filename, "rb") - parser =3D xml.parsers.expat.ParserCreate() - self.stack.append((parser, filename)) - parser.StartElementHandler =3D self.start_element - parser.EndElementHandler =3D self.end_element - parser.CharacterDataHandler =3D self.character_data - parser.buffer_text =3D True - parser.ParseFile(file) - self.stack.pop() - file.close() - - def parse(self, rnn_path, filename, validate): - self.path =3D rnn_path - self.stack =3D [] - self.validate =3D validate - self.do_parse(filename) - - def parse_reg(self, attrs, bit_size): - self.current_bitsize =3D bit_size - if "type" in attrs and attrs["type"] in self.bitsets: - bitset =3D self.bitsets[attrs["type"]] - if bitset.inline: - self.current_bitset =3D Bitset(attrs["name"], bitset) - self.current_bitset.inline =3D True - else: - self.current_bitset =3D bitset - else: - self.current_bitset =3D Bitset(attrs["name"], None) - self.current_bitset.inline =3D True - if "type" in attrs: - self.parse_field(None, attrs) - - variant =3D self.parse_variants(attrs) - if not variant and self.current_array: - variant =3D self.current_array.variant - - self.current_reg =3D Reg(attrs, self.prefix(variant), self.current_array= , bit_size) - self.current_reg.bitset =3D self.current_bitset - self.current_bitset.reg =3D self.current_reg - - if len(self.stack) =3D=3D 1: - self.file.append(self.current_reg) - - if variant is not None: - self.add_all_variants(self.current_reg, attrs, variant) - - usages =3D None - if "usage" in attrs: - usages =3D attrs["usage"].split(',') - elif self.current_array: - usages =3D self.current_array.usages - - self.add_all_usages(self.current_reg, usages) - - def start_element(self, name, attrs): - self.cdata =3D "" - if name =3D=3D "import": - filename =3D attrs["file"] - self.do_parse(os.path.join(self.path, filename)) - elif name =3D=3D "domain": - self.current_domain =3D attrs["name"] - if "prefix" in attrs: - self.current_prefix =3D sanitize_variant(self.parse_variants(attrs)) - self.current_prefix_type =3D attrs["prefix"] - else: - self.current_prefix =3D None - self.current_prefix_type =3D None - if "varset" in attrs: - self.current_varset =3D self.enums[attrs["varset"]] - elif name =3D=3D "stripe": - self.current_stripe =3D sanitize_variant(self.parse_variants(attrs)) - elif name =3D=3D "enum": - self.current_enum_value =3D 0 - self.current_enum =3D Enum(attrs["name"]) - self.enums[attrs["name"]] =3D self.current_enum - if len(self.stack) =3D=3D 1: - self.file.append(self.current_enum) - elif name =3D=3D "value": - if "value" in attrs: - value =3D int(attrs["value"], 0) - else: - value =3D self.current_enum_value - self.current_enum.values.append((attrs["name"], value)) - elif name =3D=3D "reg32": - self.parse_reg(attrs, 32) - elif name =3D=3D "reg64": - self.parse_reg(attrs, 64) - elif name =3D=3D "array": - self.current_bitsize =3D 32 - variant =3D self.parse_variants(attrs) - index_type =3D self.enums[attrs["index"]] if "index" in attrs else None - self.current_array =3D Array(attrs, self.prefix(variant), variant, self= .current_array, index_type) - if len(self.stack) =3D=3D 1: - self.file.append(self.current_array) - elif name =3D=3D "bitset": - self.current_bitset =3D Bitset(attrs["name"], None) - if "inline" in attrs and attrs["inline"] =3D=3D "yes": - self.current_bitset.inline =3D True - self.bitsets[self.current_bitset.name] =3D self.current_bitset - if len(self.stack) =3D=3D 1 and not self.current_bitset.inline: - self.file.append(self.current_bitset) - elif name =3D=3D "bitfield" and self.current_bitset: - self.parse_field(attrs["name"], attrs) - elif name =3D=3D "database": - self.do_validate(attrs["xsi:schemaLocation"]) - - def end_element(self, name): - if name =3D=3D "domain": - self.current_domain =3D None - self.current_prefix =3D None - self.current_prefix_type =3D None - elif name =3D=3D "stripe": - self.current_stripe =3D None - elif name =3D=3D "bitset": - self.current_bitset =3D None - elif name =3D=3D "reg32": - self.current_reg =3D None - elif name =3D=3D "array": - # if the array has no Reg children, push an implicit reg32: - if len(self.current_array.children) =3D=3D 0: - attrs =3D { - "name": "REG", - "offset": "0", - } - self.parse_reg(attrs, 32) - self.current_array =3D self.current_array.parent - elif name =3D=3D "enum": - self.current_enum =3D None - - def character_data(self, data): - self.cdata +=3D data - - def dump_reg_usages(self): - d =3D collections.defaultdict(list) - for usage, regs in self.usage_regs.items(): - for reg in regs: - variants =3D self.variant_regs.get(reg.name) - if variants: - for variant, vreg in variants.items(): - if reg =3D=3D vreg: - d[(usage, sanitize_variant(variant))].append(reg) - else: - for variant in self.variants: - d[(usage, sanitize_variant(variant))].append(reg) - - print("#ifdef __cplusplus") - - for usage, regs in self.usage_regs.items(): - print("template constexpr inline uint16_t %s_REGS[] =3D {};"= % (usage.upper())) - - for (usage, variant), regs in d.items(): - offsets =3D [] - - for reg in regs: - if reg.array: - for i in range(reg.array.length): - offsets.append(reg.array.offset + reg.offset + i * reg.array.stride) - if reg.bit_size =3D=3D 64: - offsets.append(offsets[-1] + 1) - else: - offsets.append(reg.offset) - if reg.bit_size =3D=3D 64: - offsets.append(offsets[-1] + 1) - - offsets.sort() - - print("template<> constexpr inline uint16_t %s_REGS<%s>[] =3D {" % (usa= ge.upper(), variant)) - for offset in offsets: - print("\t%s," % hex(offset)) - print("};") - - print("#endif") - - def has_variants(self, reg): - return reg.name in self.variant_regs and not is_number(reg.name) and not= is_number(reg.name[1:]) - - def dump(self): - enums =3D [] - bitsets =3D [] - regs =3D [] - for e in self.file: - if isinstance(e, Enum): - enums.append(e) - elif isinstance(e, Bitset): - bitsets.append(e) - else: - regs.append(e) - - for e in enums + bitsets + regs: - e.dump(self.has_variants(e)) - - self.dump_reg_usages() - - - def dump_regs_py(self): - regs =3D [] - for e in self.file: - if isinstance(e, Reg): - regs.append(e) - - for e in regs: - e.dump_py() - - - def dump_reg_variants(self, regname, variants): - if is_number(regname) or is_number(regname[1:]): - return - print("#ifdef __cplusplus") - print("struct __%s {" % regname) - # TODO be more clever.. we should probably figure out which - # fields have the same type in all variants (in which they - # appear) and stuff everything else in a variant specific - # sub-structure. - seen_fields =3D [] - bit_size =3D 32 - array =3D False - address =3D None - for variant in variants.keys(): - print(" /* %s fields: */" % variant) - reg =3D variants[variant] - bit_size =3D reg.bit_size - array =3D reg.array - for f in reg.bitset.fields: - fld_name =3D field_name(reg, f) - if fld_name in seen_fields: - continue - seen_fields.append(fld_name) - name =3D fld_name.lower() - if f.type in [ "address", "waddress" ]: - if address: - continue - address =3D f - tab_to(" __bo_type", "bo;") - tab_to(" uint32_t", "bo_offset;") - continue - type, val =3D f.ctype("var") - tab_to(" %s" %type, "%s;" %name) - print(" /* fallback fields: */") - if bit_size =3D=3D 64: - tab_to(" uint64_t", "unknown;") - tab_to(" uint64_t", "qword;") - else: - tab_to(" uint32_t", "unknown;") - tab_to(" uint32_t", "dword;") - print("};") - # TODO don't hardcode the varset enum name - varenum =3D "chip" - print("template <%s %s>" % (varenum, varenum.upper())) - print("static inline struct fd_reg_pair") - xtra =3D "" - xtravar =3D "" - if array: - xtra =3D "int __i, " - xtravar =3D "__i, " - print("__%s(%sstruct __%s fields) {" % (regname, xtra, regname)) - for variant in variants.keys(): - if "-" in variant: - start =3D variant[:variant.index("-")] - end =3D variant[variant.index("-") + 1:] - if end !=3D "": - print(" if ((%s >=3D %s) && (%s <=3D %s)) {" % (varenum.upper(), sta= rt, varenum.upper(), end)) - else: - print(" if (%s >=3D %s) {" % (varenum.upper(), start)) - else: - print(" if (%s =3D=3D %s) {" % (varenum.upper(), variant)) - reg =3D variants[variant] - reg.dump_regpair_builder() - print(" } else") - print(" assert(!\"invalid variant\");") - print(" return (struct fd_reg_pair){};") - print("}") - - if bit_size =3D=3D 64: - skip =3D ", { .reg =3D 0 }" - else: - skip =3D "" - - print("#define %s(VARIANT, %s...) __%s(%s{__VA_ARGS__})%s" % (r= egname, xtravar, regname, xtravar, skip)) - print("#endif /* __cplusplus */") - - def dump_structs(self): - for e in self.file: - e.dump_pack_struct(self.has_variants(e)) - - for regname in self.variant_regs: - self.dump_reg_variants(regname, self.variant_regs[regname]) + def __init__(self): + self.current_array =3D None + self.current_domain =3D None + self.current_prefix =3D None + self.current_prefix_type =3D None + self.current_stripe =3D None + self.current_bitset =3D None + self.current_bitsize =3D 32 + # The varset attribute on the domain specifies the enum which + # specifies all possible hw variants: + self.current_varset =3D None + # Regs that have multiple variants.. we only generated the C++ + # template based struct-packers for these + self.variant_regs =3D {} + # Information in which contexts regs are used, to be used in + # debug options + self.usage_regs =3D collections.defaultdict(list) + self.bitsets =3D {} + self.enums =3D {} + self.variants =3D set() + self.file =3D [] + self.xml_files =3D [] + + def error(self, message): + parser, filename =3D self.stack[-1] + return Error("%s:%d:%d: %s" % (filename, parser.CurrentLineNumber,= parser.CurrentColumnNumber, message)) + + def prefix(self, variant=3DNone): + if self.current_prefix_type =3D=3D "variant" and variant: + return sanitize_variant(variant) + elif self.current_stripe: + return self.current_stripe + "_" + self.current_domain + elif self.current_prefix: + return self.current_prefix + "_" + self.current_domain + else: + return self.current_domain + + def parse_field(self, name, attrs): + try: + if "pos" in attrs: + high =3D low =3D int(attrs["pos"], 0) + elif "high" in attrs and "low" in attrs: + high =3D int(attrs["high"], 0) + low =3D int(attrs["low"], 0) + else: + low =3D 0 + high =3D self.current_bitsize - 1 + + if "type" in attrs: + type =3D attrs["type"] + else: + type =3D None + + if "shr" in attrs: + shr =3D int(attrs["shr"], 0) + else: + shr =3D 0 + + b =3D Field(name, low, high, shr, type, self) + + if type =3D=3D "fixed" or type =3D=3D "ufixed": + b.radix =3D int(attrs["radix"], 0) + + self.current_bitset.fields.append(b) + except ValueError as e: + raise self.error(e) + + def parse_varset(self, attrs): + # Inherit the varset from the enclosing domain if not overriden: + varset =3D self.current_varset + if "varset" in attrs: + varset =3D self.enums[attrs["varset"]] + return varset + + def parse_variants(self, attrs): + if "variants" not in attrs: + return None + + variant =3D attrs["variants"].split(",")[0] + varset =3D self.parse_varset(attrs) + + if "-" in variant: + # if we have a range, validate that both the start and end + # of the range are valid enums: + start =3D variant[:variant.index("-")] + end =3D variant[variant.index("-") + 1:] + assert varset.has_name(start) + if end !=3D "": + assert varset.has_name(end) + else: + assert varset.has_name(variant) + + return variant + + def add_all_variants(self, reg, attrs, parent_variant): + # TODO this should really handle *all* variants, including dealing + # with open ended ranges (ie. "A2XX,A4XX-") (we have the varset + # enum now to make that possible) + variant =3D self.parse_variants(attrs) + if not variant: + variant =3D parent_variant + + if reg.name not in self.variant_regs: + self.variant_regs[reg.name] =3D {} + else: + # All variants must be same size: + v =3D next(iter(self.variant_regs[reg.name])) + assert self.variant_regs[reg.name][v].bit_size =3D=3D reg.bit_= size + + self.variant_regs[reg.name][variant] =3D reg + + def add_all_usages(self, reg, usages): + if not usages: + return + + for usage in usages: + self.usage_regs[usage].append(reg) + + self.variants.add(reg.domain) + + def do_validate(self, schemafile): + if not self.validate: + return + + try: + from lxml import etree + + parser, filename =3D self.stack[-1] + dirname =3D os.path.dirname(filename) + + # we expect this to look like schema.xsd.. I t= hink + # technically it is supposed to be just a URL, but that doesn't + # quite match up to what we do.. Just skip over everything up = to + # and including the first whitespace character: + schemafile =3D schemafile[schemafile.rindex(" ")+1:] + + # this is a bit cheezy, but the xml file to validate could be + # in a child director, ie. we don't really know where the sche= ma + # file is, the way the rnn C code does. So if it doesn't exist + # just look one level up + if not os.path.exists(dirname + "/" + schemafile): + schemafile =3D "../" + schemafile + + if not os.path.exists(dirname + "/" + schemafile): + raise self.error("Cannot find schema for: " + filename) + + xmlschema_doc =3D etree.parse(dirname + "/" + schemafile) + xmlschema =3D etree.XMLSchema(xmlschema_doc) + + xml_doc =3D etree.parse(filename) + if not xmlschema.validate(xml_doc): + error_str =3D str(xmlschema.error_log.filter_from_errors()= [0]) + raise self.error( + "Schema validation failed for: " + filename + "\n" + e= rror_str) + except ImportError as e: + print("lxml not found, skipping validation", file=3Dsys.stderr) + + def do_parse(self, filename): + filepath =3D os.path.abspath(filename) + if filepath in self.xml_files: + return + self.xml_files.append(filepath) + file =3D open(filename, "rb") + parser =3D xml.parsers.expat.ParserCreate() + self.stack.append((parser, filename)) + parser.StartElementHandler =3D self.start_element + parser.EndElementHandler =3D self.end_element + parser.CharacterDataHandler =3D self.character_data + parser.buffer_text =3D True + parser.ParseFile(file) + self.stack.pop() + file.close() + + def parse(self, rnn_path, filename, validate): + self.path =3D rnn_path + self.stack =3D [] + self.validate =3D validate + self.do_parse(filename) + + def parse_reg(self, attrs, bit_size): + self.current_bitsize =3D bit_size + if "type" in attrs and attrs["type"] in self.bitsets: + bitset =3D self.bitsets[attrs["type"]] + if bitset.inline: + self.current_bitset =3D Bitset(attrs["name"], bitset) + self.current_bitset.inline =3D True + else: + self.current_bitset =3D bitset + else: + self.current_bitset =3D Bitset(attrs["name"], None) + self.current_bitset.inline =3D True + if "type" in attrs: + self.parse_field(None, attrs) + + variant =3D self.parse_variants(attrs) + if not variant and self.current_array: + variant =3D self.current_array.variant + + self.current_reg =3D Reg(attrs, self.prefix( + variant), self.current_array, bit_size) + self.current_reg.bitset =3D self.current_bitset + self.current_bitset.reg =3D self.current_reg + + if len(self.stack) =3D=3D 1: + self.file.append(self.current_reg) + + if variant is not None: + self.add_all_variants(self.current_reg, attrs, variant) + + usages =3D None + if "usage" in attrs: + usages =3D attrs["usage"].split(',') + elif self.current_array: + usages =3D self.current_array.usages + + self.add_all_usages(self.current_reg, usages) + + def start_element(self, name, attrs): + self.cdata =3D "" + if name =3D=3D "import": + filename =3D attrs["file"] + self.do_parse(os.path.join(self.path, filename)) + elif name =3D=3D "domain": + self.current_domain =3D attrs["name"] + if "prefix" in attrs: + self.current_prefix =3D sanitize_variant( + self.parse_variants(attrs)) + self.current_prefix_type =3D attrs["prefix"] + else: + self.current_prefix =3D None + self.current_prefix_type =3D None + if "varset" in attrs: + self.current_varset =3D self.enums[attrs["varset"]] + elif name =3D=3D "stripe": + self.current_stripe =3D sanitize_variant(self.parse_variants(a= ttrs)) + elif name =3D=3D "enum": + self.current_enum_value =3D 0 + self.current_enum =3D Enum(attrs["name"]) + self.enums[attrs["name"]] =3D self.current_enum + if len(self.stack) =3D=3D 1: + self.file.append(self.current_enum) + elif name =3D=3D "value": + if "value" in attrs: + value =3D int(attrs["value"], 0) + else: + value =3D self.current_enum_value + self.current_enum.values.append((attrs["name"], value)) + elif name =3D=3D "reg32": + self.parse_reg(attrs, 32) + elif name =3D=3D "reg64": + self.parse_reg(attrs, 64) + elif name =3D=3D "array": + self.current_bitsize =3D 32 + variant =3D self.parse_variants(attrs) + index_type =3D self.enums[attrs["index"] + ] if "index" in attrs else None + self.current_array =3D Array(attrs, self.prefix( + variant), variant, self.current_array, index_type) + if len(self.stack) =3D=3D 1: + self.file.append(self.current_array) + elif name =3D=3D "bitset": + self.current_bitset =3D Bitset(attrs["name"], None) + if "inline" in attrs and attrs["inline"] =3D=3D "yes": + self.current_bitset.inline =3D True + self.bitsets[self.current_bitset.name] =3D self.current_bitset + if len(self.stack) =3D=3D 1 and not self.current_bitset.inline: + self.file.append(self.current_bitset) + elif name =3D=3D "bitfield" and self.current_bitset: + self.parse_field(attrs["name"], attrs) + elif name =3D=3D "database": + self.do_validate(attrs["xsi:schemaLocation"]) + + def end_element(self, name): + if name =3D=3D "domain": + self.current_domain =3D None + self.current_prefix =3D None + self.current_prefix_type =3D None + elif name =3D=3D "stripe": + self.current_stripe =3D None + elif name =3D=3D "bitset": + self.current_bitset =3D None + elif name =3D=3D "reg32": + self.current_reg =3D None + elif name =3D=3D "array": + # if the array has no Reg children, push an implicit reg32: + if len(self.current_array.children) =3D=3D 0: + attrs =3D { + "name": "REG", + "offset": "0", + } + self.parse_reg(attrs, 32) + self.current_array =3D self.current_array.parent + elif name =3D=3D "enum": + self.current_enum =3D None + + def character_data(self, data): + self.cdata +=3D data + + def dump_reg_usages(self): + d =3D collections.defaultdict(list) + for usage, regs in self.usage_regs.items(): + for reg in regs: + variants =3D self.variant_regs.get(reg.name) + if variants: + for variant, vreg in variants.items(): + if reg =3D=3D vreg: + d[(usage, sanitize_variant(variant))].append(r= eg) + else: + for variant in self.variants: + d[(usage, sanitize_variant(variant))].append(reg) + + print("#ifdef __cplusplus") + + for usage, regs in self.usage_regs.items(): + print("template constexpr inline uint16_t %s_REGS[]= =3D {};" % ( + usage.upper())) + + for (usage, variant), regs in d.items(): + offsets =3D [] + + for reg in regs: + if reg.array: + for i in range(reg.array.length): + offsets.append(reg.array.offset + + reg.offset + i * reg.array.stride) + if reg.bit_size =3D=3D 64: + offsets.append(offsets[-1] + 1) + else: + offsets.append(reg.offset) + if reg.bit_size =3D=3D 64: + offsets.append(offsets[-1] + 1) + + offsets.sort() + + print("template<> constexpr inline uint16_t %s_REGS<%s>[] =3D = {" % ( + usage.upper(), variant)) + for offset in offsets: + print("\t%s," % hex(offset)) + print("};") + + print("#endif") + + def has_variants(self, reg): + return reg.name in self.variant_regs and not is_number(reg.name) a= nd not is_number(reg.name[1:]) + + def dump(self): + enums =3D [] + bitsets =3D [] + regs =3D [] + for e in self.file: + if isinstance(e, Enum): + enums.append(e) + elif isinstance(e, Bitset): + bitsets.append(e) + else: + regs.append(e) + + for e in enums + bitsets + regs: + e.dump(self.has_variants(e)) + + self.dump_reg_usages() + + def dump_regs_py(self): + regs =3D [] + for e in self.file: + if isinstance(e, Reg): + regs.append(e) + + for e in regs: + e.dump_py() + + def dump_reg_variants(self, regname, variants): + if is_number(regname) or is_number(regname[1:]): + return + print("#ifdef __cplusplus") + print("struct __%s {" % regname) + # TODO be more clever.. we should probably figure out which + # fields have the same type in all variants (in which they + # appear) and stuff everything else in a variant specific + # sub-structure. + seen_fields =3D [] + bit_size =3D 32 + array =3D False + address =3D None + constexpr_mark =3D " CONSTEXPR" + for variant in variants.keys(): + print(" /* %s fields: */" % variant) + reg =3D variants[variant] + bit_size =3D reg.bit_size + array =3D reg.array + for f in reg.bitset.fields: + fld_name =3D field_name(reg, f) + if fld_name in seen_fields: + continue + seen_fields.append(fld_name) + name =3D fld_name.lower() + if f.type in ["address", "waddress"]: + if address: + continue + address =3D f + print("#ifndef TU_CS_H") + tab_to(" __bo_type", "bo;") + tab_to(" uint32_t", "bo_offset;") + print("#endif") + continue + type, val =3D f.ctype("var") + tab_to(" %s" % type, "%s;" % name) + if f.type =3D=3D "float": + constexpr_mark =3D "" + print(" /* fallback fields: */") + if bit_size =3D=3D 64: + tab_to(" uint64_t", "unknown;") + tab_to(" uint64_t", "qword;") + else: + tab_to(" uint32_t", "unknown;") + tab_to(" uint32_t", "dword;") + print("};") + # TODO don't hardcode the varset enum name + varenum =3D "chip" + print("template <%s %s>" % (varenum, varenum.upper())) + print("static%s inline struct fd_reg_pair" % (constexpr_mark)) + xtra =3D "" + xtravar =3D "" + if array: + xtra =3D "int __i, " + xtravar =3D "__i, " + print("__%s(%sstruct __%s fields) {" % (regname, xtra, regname)) + for variant in variants.keys(): + if "-" in variant: + start =3D variant[:variant.index("-")] + end =3D variant[variant.index("-") + 1:] + if end !=3D "": + print(" if ((%s >=3D %s) && (%s <=3D %s)) {" % ( + varenum.upper(), start, varenum.upper(), end)) + else: + print(" if (%s >=3D %s) {" % (varenum.upper(), start)) + else: + print(" if (%s =3D=3D %s) {" % (varenum.upper(), variant)) + reg =3D variants[variant] + reg.dump_regpair_builder() + print(" } else") + print(" assert(!\"invalid variant\");") + print(" return (struct fd_reg_pair){};") + print("}") + + if bit_size =3D=3D 64: + skip =3D ", { .reg =3D 0 }" + else: + skip =3D "" + + print("#define %s(VARIANT, %s...) __%s(%s{__VA_ARGS__})%s= " % ( + regname, xtravar, regname, xtravar, skip)) + print("#endif /* __cplusplus */") + + def dump_structs(self): + for e in self.file: + e.dump_pack_struct(self.has_variants(e)) + + for regname in self.variant_regs: + self.dump_reg_variants(regname, self.variant_regs[regname]) =20 =20 def dump_c(args, guard, func): - p =3D Parser() - - try: - p.parse(args.rnn, args.xml, args.validate) - except Error as e: - print(e, file=3Dsys.stderr) - exit(1) - - print("#ifndef %s\n#define %s\n" % (guard, guard)) - - print("/* Autogenerated file, DO NOT EDIT manually! */") - - print() - print("#ifdef __KERNEL__") - print("#include ") - print("#define assert(x) BUG_ON(!(x))") - print("#else") - print("#include ") - print("#endif") - print() - - print("#ifdef __cplusplus") - print("#define __struct_cast(X)") - print("#else") - print("#define __struct_cast(X) (struct X)") - print("#endif") - print() - - print("#ifndef FD_NO_DEPRECATED_PACK") - print("#define FD_DEPRECATED __attribute__((deprecated))") - print("#else") - print("#define FD_DEPRECATED") - print("#endif") - print() - - func(p) - - print() - print("#undef FD_DEPRECATED") - print() - - print("#endif /* %s */" % guard) + p =3D Parser() + + try: + p.parse(args.rnn, args.xml, args.validate) + except Error as e: + print(e, file=3Dsys.stderr) + exit(1) + + print("#ifndef %s\n#define %s\n" % (guard, guard)) + + print("/* Autogenerated file, DO NOT EDIT manually! */") + + print() + print("#ifdef __KERNEL__") + print("#include ") + print("#define assert(x) BUG_ON(!(x))") + print("#else") + print("#include ") + print("#endif") + print() + + print("#ifdef __cplusplus") + print("#define __struct_cast(X)") + print("#define CONSTEXPR constexpr") + print("#else") + print("#define __struct_cast(X) (struct X)") + print("#define CONSTEXPR") + print("#endif") + print() + + # TODO figure out what to do about fd_reg_stomp_allowed() + # vs gcc.. for now only enable the warnings with clang: + print("#if defined(__clang__) && !defined(FD_NO_DEPRECATED_PACK)") + print("#define __FD_DEPRECATED _Pragma (\"GCC warning \\\"Deprecated r= eg builder\\\"\")") + print("#else") + print("#define __FD_DEPRECATED") + print("#endif") + print() + + func(p) + + print("#endif /* %s */" % guard) =20 =20 def dump_c_defines(args): - guard =3D str.replace(os.path.basename(args.xml), '.', '_').upper() - dump_c(args, guard, lambda p: p.dump()) + guard =3D str.replace(os.path.basename(args.xml), '.', '_').upper() + dump_c(args, guard, lambda p: p.dump()) =20 =20 def dump_c_pack_structs(args): - guard =3D str.replace(os.path.basename(args.xml), '.', '_').upper() + '_S= TRUCTS' - dump_c(args, guard, lambda p: p.dump_structs()) - + guard =3D str.replace(os.path.basename(args.xml), + '.', '_').upper() + '_STRUCTS' + dump_c(args, guard, lambda p: p.dump_structs()) + + +def dump_perfcntrs(args): + p =3D Parser() + + try: + p.parse(args.rnn, args.xml, args.validate) + except Error as e: + print(e, file=3Dsys.stderr) + exit(1) + + perfcntrs =3D json.load(open(args.json, "r", encoding=3D"utf-8")) + + chip_type =3D p.enums['chip'] + chip =3D perfcntrs['chip'] + if not chip_type.has_name(chip): + raise Error("Invalid chip: " + chip) + + groups =3D perfcntrs['groups'] + + guard =3D "__" + chip + "_PERFCNTRS_" + print("#ifndef %s\n#define %s\n" % (guard, guard)) + print("/* Autogenerated file, DO NOT EDIT manually! */") + print() + print("#ifdef __KERNEL__") + print("#include \"msm_perfcntr.h\"") + print("#endif") + print() + + def has_variant(variant): + if variant is None: + return True + if "-" in variant: + start =3D chip_type.value(variant[:variant.index("-")]) + end =3D chip_type.value(variant[variant.index("-") + 1:]) + chipn =3D chip_type.value(chip) + + return (start is None or chipn >=3D start) and (end is None or= chipn <=3D end) + return chip =3D=3D variant + + # Split out arrays and regs for later access: + arrays =3D {} + regs =3D {} + for e in p.file: + if isinstance(e, Array) and has_variant(e.variant): + arrays[e.local_name] =3D e + if isinstance(e, Reg): + regs[e.name] =3D e + + # For variant regs, overwrite 'regs' entries with correct variant: + for regname in p.variant_regs: + for (variant, reg) in p.variant_regs[regname].items(): + if has_variant(variant): + regs[regname] =3D reg + break + + for group in groups: + name =3D group['name'] + name_low =3D name.lower() + num =3D group['num'] + countable_type_name =3D group['countable_type'] + + if not countable_type_name in p.enums: + raise Error("Invalid type: " + countable_type_name) + + countable_type =3D p.enums[countable_type_name] + + print("#ifndef __KERNEL__") + print("static const struct fd_perfcntr_countable " + name_low + "_= countables[] =3D {") + for (name, value) in countable_type.values: + # if the countable is prefixed with the chip, strip that: + # (note: avoid py3.9 dependency for kernel) + if name.startswith(chip + "_"): + name =3D name[len(chip)+1:] + print(" { \"" + name + "\", " + str(value) + " },") + print("};") + print("#endif") + + print("static const struct fd_perfcntr_counter " + name_low + "_co= unters[] =3D {") + for i in range(0, num): + if "reserved" in group and i in group["reserved"]: + continue + def get_reg(name): + # if reg has {} pattern, expand that first: + name =3D name.format(i) + + if name in arrays: + arr =3D arrays[name] + return arr.offset + (i * arr.stride) + + if not name in regs: + raise Error("Invalid reg: " + name) + + reg =3D regs[name] + return reg.offset + + def get_counter(): + # if the counter is just a single "counter" value + # should be specified in the json, but for legacy separate + # hi/lo pairs "counter_lo" and "counter_hi" should + # be specified + if "counter" in group: + counter =3D get_reg(group["counter"]) + return [counter, counter+1] + counter_lo =3D get_reg(group["counter_lo"]) + counter_hi =3D get_reg(group["counter_hi"]) + return [counter_lo, counter_hi] + + (counter_lo, counter_hi) =3D get_counter() + select =3D get_reg(group['select']) + + select_offset =3D 0 + if "select_offset" in group: + select_offset =3D int(group["select_offset"]) + select =3D select + select_offset + + slice_select_str =3D "" + if "slice_select" in group: + slice_select =3D group["slice_select"] + for reg in slice_select: + val =3D get_reg(reg) + select_offset + slice_select_str +=3D "0x%04x, " % val + + # TODO add support for things that need enable/clear regs + + print(" { 0x%04x, {%s}, 0x%04x, 0x%04x }," % (select, slice_= select_str, counter_lo, counter_hi)) + print("};") + + print() + + print("const struct fd_perfcntr_group " + chip.lower() + "_perfcntr_gr= oups[] =3D {") + for group in groups: + name =3D group['name'] + name_low =3D name.lower() + pipe =3D 'NONE' + if 'pipe' in group: + pipe =3D group['pipe'] + + print(" GROUP(\"%s\", PIPE_%s, %s_counters, %s_countables)," % (= name, pipe, name_low, name_low)) + + print("};") + print("const unsigned " + chip.lower() + "_num_perfcntr_groups =3D ARR= AY_SIZE(" + chip.lower() + "_perfcntr_groups);") + + print() + print("#endif /* %s */" % guard) =20 def dump_py_defines(args): - p =3D Parser() + p =3D Parser() =20 - try: - p.parse(args.rnn, args.xml, args.validate) - except Error as e: - print(e, file=3Dsys.stderr) - exit(1) + try: + p.parse(args.rnn, args.xml, args.validate) + except Error as e: + print(e, file=3Dsys.stderr) + exit(1) =20 - file_name =3D os.path.splitext(os.path.basename(args.xml))[0] + file_name =3D os.path.splitext(os.path.basename(args.xml))[0] =20 - print("from enum import IntEnum") - print("class %sRegs(IntEnum):" % file_name.upper()) + print("from enum import IntEnum") + print("class %sRegs(IntEnum):" % file_name.upper()) =20 - os.path.basename(args.xml) + os.path.basename(args.xml) =20 - p.dump_regs_py() + p.dump_regs_py() =20 =20 def main(): - parser =3D argparse.ArgumentParser() - parser.add_argument('--rnn', type=3Dstr, required=3DTrue) - parser.add_argument('--xml', type=3Dstr, required=3DTrue) - parser.add_argument('--validate', default=3DFalse, action=3D'store_true') - parser.add_argument('--no-validate', dest=3D'validate', action=3D'store_f= alse') + parser =3D argparse.ArgumentParser() + parser.add_argument('--rnn', type=3Dstr, required=3DTrue) + parser.add_argument('--xml', type=3Dstr, required=3DTrue) + parser.add_argument('--validate', default=3DFalse, action=3D'store_tru= e') + parser.add_argument('--no-validate', dest=3D'validate', action=3D'stor= e_false') + + subparsers =3D parser.add_subparsers() + subparsers.required =3D True =20 - subparsers =3D parser.add_subparsers() - subparsers.required =3D True + parser_c_defines =3D subparsers.add_parser('c-defines') + parser_c_defines.set_defaults(func=3Ddump_c_defines) =20 - parser_c_defines =3D subparsers.add_parser('c-defines') - parser_c_defines.set_defaults(func=3Ddump_c_defines) + parser_c_pack_structs =3D subparsers.add_parser('c-pack-structs') + parser_c_pack_structs.set_defaults(func=3Ddump_c_pack_structs) =20 - parser_c_pack_structs =3D subparsers.add_parser('c-pack-structs') - parser_c_pack_structs.set_defaults(func=3Ddump_c_pack_structs) + parser_perfcntrs =3D subparsers.add_parser('perfcntrs') + parser_perfcntrs.add_argument('--json', type=3Dstr, required=3DTrue) + parser_perfcntrs.set_defaults(func=3Ddump_perfcntrs) =20 - parser_py_defines =3D subparsers.add_parser('py-defines') - parser_py_defines.set_defaults(func=3Ddump_py_defines) + parser_py_defines =3D subparsers.add_parser('py-defines') + parser_py_defines.set_defaults(func=3Ddump_py_defines) =20 - args =3D parser.parse_args() - args.func(args) + args =3D parser.parse_args() + args.func(args) =20 =20 if __name__ =3D=3D '__main__': - main() + main() --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 3A7653C65FF for ; Thu, 14 May 2026 13:54:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766870; cv=none; b=vAzs3N3Dhykym8O4n1M4KP4TleErHk4qXzC0yhJGzxiFftz2Co+UAhQBI0Zo7p1m2KX9SorvxwwHzBNtbm2e8u9qTstR6GhPg9hHPl2F0XcJj4buDK5YAutaXgKfHH+9gjA3+56gN9hQ9LME1B9mNwDyIX4P3YOoMPiSoQx+waE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766870; c=relaxed/simple; bh=ad8gOV1azGZf5n4fWA+X59ZlDbs9g7YGJY1WEJbnxm4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FJ+wk+x/anasIN2gnFE9RM9UV6Wr4GheqrKF1+8AsDisKT/p+1ZDuGJmbTVu1CfOYdLSYM0ldkElWTQQu6hDzvTc8g7PBEWXSVRSjl+rxBHhX3hjjhjPy23VjdIrw/LrtNYOctj8xKPmcSUNszfM372z0ZtbciiRHNIe9Bn+Slg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=d53zf4Xd; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=beyZXb/h; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="d53zf4Xd"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="beyZXb/h" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBesog889760 for ; Thu, 14 May 2026 13:54:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=85pNEjcix7B XTYuYfTDL+x/Rv4knQBmcHLyfr9mvfY8=; b=d53zf4XdCJW9fx5AH+JRENV4eU1 5ndlK8EaW+MQCdUvsCwoqCFh2U6y2Ze5DIRziML+ixVrvNaudTzf2+uF45v0hNJq sHBX77TJeBgnOUHSBSLBGlEYyeq/16MeYund8AlOvp+5ogmhVMeKe76Yg60RWTl3 DeoBJz1qo/rxYaRc5sNZDKSxbK1pZhiSldu8IksaiG27J0IokYuDGLM08RMN6D9L b8U1GsfPiTEvqcGsn5a2dSHkfkGTVtJ9PF9Fqbib0IiOndodmq8me6ERTuNZ+zsq FxvmZMmpa0DtqQCQFex4qXNp2MR5q7HzA2nLsvRUdyD4K4M+WEb9tAE3IPA== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e4vkjm3wf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:24 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2bc6899bfb1so66965715ad.2 for ; Thu, 14 May 2026 06:54:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766864; x=1779371664; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=85pNEjcix7BXTYuYfTDL+x/Rv4knQBmcHLyfr9mvfY8=; b=beyZXb/hK5VuiVVVpzelCX6NxCz/7GepglKzlFXQXDOAu8PNHTiepWA3pDZX0l2awF 0cXWEQFafkjEfYMU/FRJzDAdZJHhO4KG2AFtDOecHZ3z40cMXiy8X1fL27f4t0z166Nr Nj58HqATMQdaqdGCG8PZ+CWH/bFjOvWNUkebn3K0xCj1+3DGUcPksK4d4zH5esmydnEP dz7yElXg8k7b6ZiW8Uqx72Pa4D3bVf12wCUre07NtbMXB+ghQbUsxA9FtWFuPI1ug3yZ vtX8nAaZgAnLw4vjEQ1a85/K6UsEiTJZIY27ylcDtxBubNz5P29yZ6X4pFAiLF0+TQIz QY8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766864; x=1779371664; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=85pNEjcix7BXTYuYfTDL+x/Rv4knQBmcHLyfr9mvfY8=; b=Y7EYL1Va7kW/BC0z0TmE+e+g4gpEkpvC2QBfvfpEhyGiLhYzhJ0+es2CaZ8b+57E7x WNWerpGHs7v+U0cNVFelmTdr1wAYEqhFTLJgL5BXZjFKr6j560+D0khqOBi/mrgw940M wvHOU8H+heHLfy71GywGwxAn2EAFGT21qR5y7x1eSGTlWow+m3qm2n+ygXsiqWJQe+Rq 8x0xKxuc7VMhcmc2/rT27MJRT/Nj5y6sF6c8fzbRsJqzF3fhWQ1JaNG0rn6KMYZXbObf VOGeo492daSsYGlxOyW/atHvpTaZyGCZ+RzbLmXX+Jf/jv2LpkZHZYxbkB10pf6t9I+Z 3IzA== X-Forwarded-Encrypted: i=1; AFNElJ+J3e3vLGGF9I00MvCQspAKqthQa+kHxNU5GI35ZYIrURMyqbS0k9IguJSiMFqhwXu8wQcnP4oSMu7xkfQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yzc3S9R/OPp+EwJNgRpNFmU+PDLnG4PVno4uXdyC/gdatDMHLu4 v64UkpImvapA7E1MApVaDvVKcYfDuQLnlyilz2P0T8DM+AOR/lv/VN6Tm87cGHsXGLmNrDL0Zkr KMPZd1uipAFmF/FknFriSLyftSZfUYDZ78KKgVcFBmZ21k/AfQZFYkoqx4cab/hFKt/M= X-Gm-Gg: Acq92OGr1fIuiPkKsWlGg+Ex9y+foWyKsemH0Awtosdy92A0Q4qYG2EzdFzvV8KKuTS NXRlwMYPzl3kN3iJBkRXrNSZBy/ApNKUjVGmIsu4UMcCU/GXnYdQZqgu+moz1dSMePdD/R5ngBS JFfQuukvS8toOY1lLVJ0rUUf9MbyPccUkNThPeDwTBq2+yuO4ZL1tZiHlJ0th9fKuD2ibnnoPDW 2RRuEJq6DXw2Xu4o+TUg8a1ka7kqYkauUZaSP4oErRXuOxL93DMq2EKa8RhfYXSn8nl+u8CLIHO OwzdWi+1njO04LqE4AfhnDvSJh9rXxvHbUZW8nqzKFWTK4YGK0K2+GeWoiy/BkeIuUfsm7DDz9+ DBTd6I9prNkvin9RlIbQuRayf3N6X8s+B X-Received: by 2002:a17:902:cf04:b0:2b2:5491:e32f with SMTP id d9443c01a7336-2bd2717b33emr88035945ad.16.1778766863472; Thu, 14 May 2026 06:54:23 -0700 (PDT) X-Received: by 2002:a17:902:cf04:b0:2b2:5491:e32f with SMTP id d9443c01a7336-2bd2717b33emr88035295ad.16.1778766862615; Thu, 14 May 2026 06:54:22 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5d12372bsm34755095ad.75.2026.05.14.06.54.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:22 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Konrad Dybcio , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 05/16] drm/msm/registers: Add perfcntr json Date: Thu, 14 May 2026 06:39:53 -0700 Message-ID: <20260514134052.361771-6-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: fysv-CG9gsXPv_gBXr4-nKQC6Nfj73Bm X-Proofpoint-ORIG-GUID: fysv-CG9gsXPv_gBXr4-nKQC6Nfj73Bm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfXxrwTO0qAYi2d GiOtbFlkrroXaF4PDO1PBqw1JhRXiQNnVr63wjeqJeArAwWennAXtSF3u5vWIYBWYuMmmP14glI P50IVEFrD5K5HYZNrIGuIBhvxuWvdcG0pTKui39Fsq5gh6KDN/3p+rlxvbWaPTHF7wcI6l4Py+W f/f6/gTFOFe5v350bQ+Smqof7nZhNGtY4EvVfd/4WQkEBAY7PYjaKw5aCncSrEl+QthvRYpvLQX FwwtTWsjDdUmEruR6RVCQwbzvUk0FLd+2tlWCVkKPILwMyrBqacagq20DwfTxmDkPvNUnmeIrQ4 ffSjUFnSyp28ixdakgC4NXsYfIz9Q/DDfehJvqpanSErqObGndISKTmX1pdXrZ5qOhfB4hax869 DvlhSu7WPE8dEgHhp3PBegFi5PwAb5NQ/sVRKLp3JYcdv26OXiirFjD1h+mqmkivouVnLelq/fS QL2hFpXpO0lBpwDSx7g== X-Authority-Analysis: v=2.4 cv=PbDPQChd c=1 sm=1 tr=0 ts=6a05d410 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=U2HPg71ik5UQ_0Zuz_MA:9 a=PDmnkIS-fa9zh8kb:21 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 suspectscore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 phishscore=0 malwarescore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Pull in perfcntr json and wire up generation of perfcntr tables. Sync from mesa commit d2c4653ee953 ("freedreno/registers: Add gen8 perfcntr= s") Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/Makefile | 25 +- drivers/gpu/drm/msm/msm_perfcntr.h | 48 ++++ .../msm/registers/adreno/a2xx_perfcntrs.json | 109 ++++++++ .../msm/registers/adreno/a5xx_perfcntrs.json | 128 ++++++++++ .../msm/registers/adreno/a6xx_perfcntrs.json | 105 ++++++++ .../msm/registers/adreno/a7xx_perfcntrs.json | 228 +++++++++++++++++ .../msm/registers/adreno/a8xx_perfcntrs.json | 240 ++++++++++++++++++ 7 files changed, 882 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.h create mode 100644 drivers/gpu/drm/msm/registers/adreno/a2xx_perfcntrs.json create mode 100644 drivers/gpu/drm/msm/registers/adreno/a5xx_perfcntrs.json create mode 100644 drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json create mode 100644 drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json create mode 100644 drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile index ce00cfb0a875..337634e7e247 100644 --- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile @@ -176,6 +176,11 @@ quiet_cmd_headergen =3D GENHDR $@ cmd_headergen =3D mkdir -p $(obj)/generated && $(PYTHON3) $(src)/reg= isters/gen_header.py \ $(headergen-opts) --rnn $(src)/registers --xml $< c-defines > $@ =20 +# TODO how to do this for a2xx/a5xx which have different .xml arg? +quiet_cmd_headergen_json =3D GENHDRJSN $@ + cmd_headergen_json =3D mkdir -p $(obj)/generated && $(PYTHON3) $(src= )/registers/gen_header.py \ + $(headergen-opts) --rnn $(src)/registers --xml $(filter %.xml,$^) = perfcntrs --json $< > $@ + $(obj)/generated/%.xml.h: $(src)/registers/adreno/%.xml \ $(src)/registers/adreno/adreno_common.xml \ $(src)/registers/adreno/adreno_pm4.xml \ @@ -192,6 +197,24 @@ $(obj)/generated/%.xml.h: $(src)/registers/display/%.x= ml \ FORCE $(call if_changed,headergen) =20 +ADRENO_PERFCNTRS =3D + +define adreno_perfcntrs +ADRENO_PERFCNTRS +=3D generated/$(1)_perfcntrs.json.c +$$(obj)/generated/$(1)_perfcntrs.json.c: $$(src)/registers/adreno/$(1)_per= fcntrs.json \ + $$(src)/registers/adreno/$(2).xml \ + FORCE + $$(call if_changed,headergen_json) +endef + +$(eval $(call adreno_perfcntrs,a2xx,a2xx)) +$(eval $(call adreno_perfcntrs,a5xx,a5xx)) +$(eval $(call adreno_perfcntrs,a6xx,a6xx)) +$(eval $(call adreno_perfcntrs,a7xx,a6xx)) +$(eval $(call adreno_perfcntrs,a8xx,a6xx)) + +adreno-y +=3D $(ADRENO_PERFCNTRS:.c=3D.o) + ADRENO_HEADERS =3D \ generated/a2xx.xml.h \ generated/a3xx.xml.h \ @@ -226,4 +249,4 @@ DISPLAY_HEADERS =3D \ $(addprefix $(obj)/,$(adreno-y)): $(addprefix $(obj)/,$(ADRENO_HEADERS)) $(addprefix $(obj)/,$(msm-display-y)): $(addprefix $(obj)/,$(DISPLAY_HEADE= RS)) =20 -targets +=3D $(ADRENO_HEADERS) $(DISPLAY_HEADERS) +targets +=3D $(ADRENO_HEADERS) $(DISPLAY_HEADERS) $(ADRENO_PERFCNTRS) diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h new file mode 100644 index 000000000000..305dcde15c5e --- /dev/null +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef __MSM_PERFCNTR_H__ +#define __MSM_PERFCNTR_H__ + +#include "linux/array_size.h" + +#include "adreno_common.xml.h" + +/* + * This is a subset of the tables used by mesa. We don't need to + * enumerate the countables on the kernel side. + */ + +/* Describes a single counter: */ +struct msm_perfcntr_counter { + /* offset of the SELect register to choose what to count: */ + unsigned select_reg; + /* additional SEL regs to enable slice counters (gen8+) */ + unsigned slice_select_regs[2]; + /* offset of the lo/hi 32b to read current counter value: */ + unsigned counter_reg_lo; + unsigned counter_reg_hi; + /* TODO some counters have enable/clear registers */ +}; + +/* Describes an entire counter group: */ +struct msm_perfcntr_group { + const char *name; + enum adreno_pipe pipe; + unsigned num_counters; + const struct msm_perfcntr_counter *counters; +}; + +#define GROUP(_name, _pipe, _counters, _countables) { = \ + .name =3D _name, = \ + .pipe =3D _pipe, = \ + .num_counters =3D ARRAY_SIZE(_counters), = \ + .counters =3D _counters, = \ + } + +#define fd_perfcntr_counter msm_perfcntr_counter +#define fd_perfcntr_group msm_perfcntr_group + +#endif /* __MSM_PERFCNTR_H__ */ diff --git a/drivers/gpu/drm/msm/registers/adreno/a2xx_perfcntrs.json b/dri= vers/gpu/drm/msm/registers/adreno/a2xx_perfcntrs.json new file mode 100644 index 000000000000..8095345ffd8e --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a2xx_perfcntrs.json @@ -0,0 +1,109 @@ +{ + "chip": "A2XX", + "groups": [ + { + "name": "CP", + "num": 1, + "select": "CP_PERFCOUNTER_SELECT", + "counter_lo": "CP_PERFCOUNTER_LO", + "counter_hi": "CP_PERFCOUNTER_HI", + "countable_type": "a2xx_cp_perfcount_sel" + }, + { + "name": "PA_SU", + "num": 4, + "select": "PA_SU_PERFCOUNTER{}_SELECT", + "counter_lo": "PA_SU_PERFCOUNTER{}_LOW", + "counter_hi": "PA_SU_PERFCOUNTER{}_HI", + "countable_type": "a2xx_su_perfcnt_select" + }, + { + "name": "PA_SC", + "num": 1, + "select": "PA_SC_PERFCOUNTER{}_SELECT", + "counter_lo": "PA_SC_PERFCOUNTER{}_LOW", + "counter_hi": "PA_SC_PERFCOUNTER{}_HI", + "countable_type": "a2xx_sc_perfcnt_select" + }, + { + "name": "VGT", + "num": 4, + "select": "VGT_PERFCOUNTER{}_SELECT", + "counter_lo": "VGT_PERFCOUNTER{}_LOW", + "counter_hi": "VGT_PERFCOUNTER{}_HI", + "countable_type": "a2xx_vgt_perfcount_select" + }, + { + "name": "TCR", + "num": 2, + "select": "TCR_PERFCOUNTER{}_SELECT", + "counter_lo": "TCR_PERFCOUNTER{}_LOW", + "counter_hi": "TCR_PERFCOUNTER{}_HI", + "countable_type": "a2xx_tcr_perfcount_select" + }, + { + "name": "TP0", + "num": 2, + "select": "TP0_PERFCOUNTER{}_SELECT", + "counter_lo": "TP0_PERFCOUNTER{}_LOW", + "counter_hi": "TP0_PERFCOUNTER{}_HI", + "countable_type": "a2xx_tp_perfcount_select" + }, + { + "name": "TCM", + "num": 2, + "select": "TCM_PERFCOUNTER{}_SELECT", + "counter_lo": "TCM_PERFCOUNTER{}_LOW", + "counter_hi": "TCM_PERFCOUNTER{}_HI", + "countable_type": "a2xx_tcm_perfcount_select" + }, + { + "name": "TCF", + "num": 12, + "select": "TCF_PERFCOUNTER{}_SELECT", + "counter_lo": "TCF_PERFCOUNTER{}_LOW", + "counter_hi": "TCF_PERFCOUNTER{}_HI", + "countable_type": "a2xx_tcf_perfcount_select" + }, + { + "name": "SQ", + "num": 4, + "select": "SQ_PERFCOUNTER{}_SELECT", + "counter_lo": "SQ_PERFCOUNTER{}_LOW", + "counter_hi": "SQ_PERFCOUNTER{}_HI", + "countable_type": "a2xx_sq_perfcnt_select" + }, + { + "name": "SX", + "num": 1, + "select": "SX_PERFCOUNTER{}_SELECT", + "counter_lo": "SX_PERFCOUNTER{}_LOW", + "counter_hi": "SX_PERFCOUNTER{}_HI", + "countable_type": "a2xx_sx_perfcnt_select" + }, + { + "name": "MH", + "num": 2, + "select": "MH_PERFCOUNTER{}_SELECT", + "counter_lo": "MH_PERFCOUNTER{}_LOW", + "counter_hi": "MH_PERFCOUNTER{}_HI", + "countable_type": "a2xx_mh_perfcnt_select" + }, + { + "name": "RBBM", + "num": 2, + "select": "RBBM_PERFCOUNTER{}_SELECT", + "counter_lo": "RBBM_PERFCOUNTER{}_LO", + "counter_hi": "RBBM_PERFCOUNTER{}_HI", + "countable_type": "a2xx_rbbm_perfcount1_sel" + }, + { + "name": "RB", + "num": 4, + "select": "RB_PERFCOUNTER{}_SELECT", + "counter_lo": "RB_PERFCOUNTER{}_LOW", + "counter_hi": "RB_PERFCOUNTER{}_HI", + "countable_type": "a2xx_rb_perfcnt_select" + } + ] +} diff --git a/drivers/gpu/drm/msm/registers/adreno/a5xx_perfcntrs.json b/dri= vers/gpu/drm/msm/registers/adreno/a5xx_perfcntrs.json new file mode 100644 index 000000000000..d95503543f94 --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a5xx_perfcntrs.json @@ -0,0 +1,128 @@ +{ + "chip": "A5XX", + "groups": [ + { + "name": "CP", + "num": 8, + "reserved": [ 0 ], + "select": "CP_PERFCTR_CP_SEL_{}", + "counter_lo": "RBBM_PERFCTR_CP_{}_LO", + "counter_hi": "RBBM_PERFCTR_CP_{}_HI", + "countable_type": "a5xx_cp_perfcounter_select" + }, + { + "name": "CCU", + "num": 4, + "select": "RB_PERFCTR_CCU_SEL_{}", + "counter_lo": "RBBM_PERFCTR_CCU_{}_LO", + "counter_hi": "RBBM_PERFCTR_CCU_{}_HI", + "countable_type": "a5xx_ccu_perfcounter_select" + }, + { + "name": "TSE", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL_{}", + "counter_lo": "RBBM_PERFCTR_TSE_{}_LO", + "counter_hi": "RBBM_PERFCTR_TSE_{}_HI", + "countable_type": "a5xx_tse_perfcounter_select" + }, + { + "name": "RAS", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL_{}", + "counter_lo": "RBBM_PERFCTR_RAS_{}_LO", + "counter_hi": "RBBM_PERFCTR_RAS_{}_HI", + "countable_type": "a5xx_ras_perfcounter_select" + }, + { + "name": "LRZ", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL_{}", + "counter_lo": "RBBM_PERFCTR_LRZ_{}_LO", + "counter_hi": "RBBM_PERFCTR_LRZ_{}_HI", + "countable_type": "a5xx_lrz_perfcounter_select" + }, + { + "name": "HLSQ", + "num": 8, + "select": "HLSQ_PERFCTR_HLSQ_SEL_{}", + "counter_lo": "RBBM_PERFCTR_HLSQ_{}_LO", + "counter_hi": "RBBM_PERFCTR_HLSQ_{}_HI", + "countable_type": "a5xx_hlsq_perfcounter_select" + }, + { + "name": "PC", + "num": 8, + "select": "PC_PERFCTR_PC_SEL_{}", + "counter_lo": "RBBM_PERFCTR_PC_{}_LO", + "counter_hi": "RBBM_PERFCTR_PC_{}_HI", + "countable_type": "a5xx_pc_perfcounter_select" + }, + { + "name": "RB", + "num": 8, + "select": "RB_PERFCTR_RB_SEL_{}", + "counter_lo": "RBBM_PERFCTR_RB_{}_LO", + "counter_hi": "RBBM_PERFCTR_RB_{}_HI", + "countable_type": "a5xx_rb_perfcounter_select" + }, + { + "name": "RBBM", + "num": 4, + "reserved": [ 0 ], + "select": "RBBM_PERFCTR_RBBM_SEL_{}", + "counter_lo": "RBBM_PERFCTR_RBBM_{}_LO", + "counter_hi": "RBBM_PERFCTR_RBBM_{}_HI", + "countable_type": "a5xx_rbbm_perfcounter_select" + }, + { + "name": "SP", + "num": 12, + "reserved": [ 0 ], + "select": "SP_PERFCTR_SP_SEL_{}", + "counter_lo": "RBBM_PERFCTR_SP_{}_LO", + "counter_hi": "RBBM_PERFCTR_SP_{}_HI", + "countable_type": "a5xx_sp_perfcounter_select" + }, + { + "name": "TP", + "num": 8, + "select": "TPL1_PERFCTR_TP_SEL_{}", + "counter_lo": "RBBM_PERFCTR_TP_{}_LO", + "counter_hi": "RBBM_PERFCTR_TP_{}_HI", + "countable_type": "a5xx_tp_perfcounter_select" + }, + { + "name": "UCHE", + "num": 8, + "select": "UCHE_PERFCTR_UCHE_SEL_{}", + "counter_lo": "RBBM_PERFCTR_UCHE_{}_LO", + "counter_hi": "RBBM_PERFCTR_UCHE_{}_HI", + "countable_type": "a5xx_uche_perfcounter_select" + }, + { + "name": "VFD", + "num": 8, + "select": "VFD_PERFCTR_VFD_SEL_{}", + "counter_lo": "RBBM_PERFCTR_VFD_{}_LO", + "counter_hi": "RBBM_PERFCTR_VFD_{}_HI", + "countable_type": "a5xx_vfd_perfcounter_select" + }, + { + "name": "VPC", + "num": 4, + "select": "VPC_PERFCTR_VPC_SEL_{}", + "counter_lo": "RBBM_PERFCTR_VPC_{}_LO", + "counter_hi": "RBBM_PERFCTR_VPC_{}_HI", + "countable_type": "a5xx_vpc_perfcounter_select" + }, + { + "name": "VSC", + "num": 2, + "select": "VSC_PERFCTR_VSC_SEL_{}", + "counter_lo": "RBBM_PERFCTR_VSC_{}_LO", + "counter_hi": "RBBM_PERFCTR_VSC_{}_HI", + "countable_type": "a5xx_vsc_perfcounter_select" + } + ] +} diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json b/dri= vers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json new file mode 100644 index 000000000000..8bb31820479e --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx_perfcntrs.json @@ -0,0 +1,105 @@ +{ + "chip": "A6XX", + "groups": [ + { + "name": "CP", + "num": 14, + "reserved": [ 0 ], + "select": "CP_PERFCTR_CP_SEL", + "counter": "RBBM_PERFCTR_CP", + "countable_type": "a6xx_cp_perfcounter_select" + }, + { + "name": "CCU", + "num": 5, + "select": "RB_PERFCTR_CCU_SEL", + "counter": "RBBM_PERFCTR_CCU", + "countable_type": "a6xx_ccu_perfcounter_select" + }, + { + "name": "TSE", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL", + "counter": "RBBM_PERFCTR_TSE", + "countable_type": "a6xx_tse_perfcounter_select" + }, + { + "name": "RAS", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL", + "counter": "RBBM_PERFCTR_RAS", + "countable_type": "a6xx_ras_perfcounter_select" + }, + { + "name": "LRZ", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL", + "counter": "RBBM_PERFCTR_LRZ", + "countable_type": "a6xx_lrz_perfcounter_select" + }, + { + "name": "HLSQ", + "num": 6, + "select": "HLSQ_PERFCTR_HLSQ_SEL", + "counter": "RBBM_PERFCTR_HLSQ", + "countable_type": "a6xx_hlsq_perfcounter_select" + }, + { + "name": "PC", + "num": 8, + "select": "PC_PERFCTR_PC_SEL", + "counter": "RBBM_PERFCTR_PC", + "countable_type": "a6xx_pc_perfcounter_select" + }, + { + "name": "RB", + "num": 8, + "select": "RB_PERFCTR_RB_SEL", + "counter": "RBBM_PERFCTR_RB", + "countable_type": "a6xx_rb_perfcounter_select" + }, + { + "name": "SP", + "num": 24, + "reserved": [ 0 ], + "select": "SP_PERFCTR_SP_SEL", + "counter": "RBBM_PERFCTR_SP", + "countable_type": "a6xx_sp_perfcounter_select" + }, + { + "name": "TP", + "num": 12, + "select": "TPL1_PERFCTR_TP_SEL", + "counter": "RBBM_PERFCTR_TP", + "countable_type": "a6xx_tp_perfcounter_select" + }, + { + "name": "UCHE", + "num": 12, + "select": "UCHE_PERFCTR_UCHE_SEL", + "counter": "RBBM_PERFCTR_UCHE", + "countable_type": "a6xx_uche_perfcounter_select" + }, + { + "name": "VFD", + "num": 8, + "select": "VFD_PERFCTR_VFD_SEL", + "counter": "RBBM_PERFCTR_VFD", + "countable_type": "a6xx_vfd_perfcounter_select" + }, + { + "name": "VPC", + "num": 6, + "select": "VPC_PERFCTR_VPC_SEL", + "counter": "RBBM_PERFCTR_VPC", + "countable_type": "a6xx_vpc_perfcounter_select" + }, + { + "name": "VSC", + "num": 2, + "select": "VSC_PERFCTR_VSC_SEL", + "counter": "RBBM_PERFCTR_VSC", + "countable_type": "a6xx_vsc_perfcounter_select" + } + ] +} diff --git a/drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json b/dri= vers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json new file mode 100644 index 000000000000..e60aab1862ec --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a7xx_perfcntrs.json @@ -0,0 +1,228 @@ +{ + "chip": "A7XX", + "groups": [ + { + "name": "CP", + "num": 14, + "reserved": [ 0 ], + "select": "CP_PERFCTR_CP_SEL", + "counter": "RBBM_PERFCTR_CP", + "countable_type": "a7xx_cp_perfcounter_select" + }, + { + "name": "RBBM", + "num": 4, + "select": "RBBM_PERFCTR_RBBM_SEL", + "counter": "RBBM_PERFCTR_RBBM", + "countable_type": "a7xx_rbbm_perfcounter_select" + }, + { + "name": "PC", + "pipe": "BR", + "num": 8, + "select": "PC_PERFCTR_PC_SEL", + "counter": "RBBM_PERFCTR_PC", + "countable_type": "a7xx_pc_perfcounter_select" + }, + { + "name": "VFD", + "pipe": "BR", + "num": 8, + "select": "VFD_PERFCTR_VFD_SEL", + "counter": "RBBM_PERFCTR_VFD", + "countable_type": "a7xx_vfd_perfcounter_select" + }, + { + "name": "HLSQ", + "pipe": "BR", + "num": 6, + "select": "SP_PERFCTR_HLSQ_SEL", + "counter": "RBBM_PERFCTR_HLSQ", + "countable_type": "a7xx_hlsq_perfcounter_select" + }, + { + "name": "VPC", + "pipe": "BR", + "num": 6, + "select": "VPC_PERFCTR_VPC_SEL", + "counter": "RBBM_PERFCTR_VPC", + "countable_type": "a7xx_vpc_perfcounter_select" + }, + { + "name": "TSE", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL", + "counter": "RBBM_PERFCTR_TSE", + "countable_type": "a7xx_tse_perfcounter_select" + }, + { + "name": "RAS", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL", + "counter": "RBBM_PERFCTR_RAS", + "countable_type": "a7xx_ras_perfcounter_select" + }, + { + "name": "UCHE", + "num": 12, + "select": "UCHE_PERFCTR_UCHE_SEL", + "counter": "RBBM_PERFCTR_UCHE", + "countable_type": "a7xx_uche_perfcounter_select" + }, + { + "name": "TP", + "pipe": "BR", + "num": 12, + "select": "TPL1_PERFCTR_TP_SEL", + "counter": "RBBM_PERFCTR_TP", + "countable_type": "a7xx_tp_perfcounter_select" + }, + { + "name": "SP", + "pipe": "BR", + "num": 24, + "select": "SP_PERFCTR_SP_SEL", + "counter": "RBBM_PERFCTR_SP", + "countable_type": "a7xx_sp_perfcounter_select" + }, + { + "name": "RB", + "num": 8, + "select": "RB_PERFCTR_RB_SEL", + "counter": "RBBM_PERFCTR_RB", + "countable_type": "a7xx_rb_perfcounter_select" + }, + { + "name": "VSC", + "num": 2, + "select": "VSC_PERFCTR_VSC_SEL", + "counter": "RBBM_PERFCTR_VSC", + "countable_type": "a7xx_vsc_perfcounter_select" + }, + { + "name": "CCU", + "num": 5, + "select": "RB_PERFCTR_CCU_SEL", + "counter": "RBBM_PERFCTR_CCU", + "countable_type": "a7xx_ccu_perfcounter_select" + }, + { + "name": "LRZ", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL", + "counter": "RBBM_PERFCTR_LRZ", + "countable_type": "a7xx_lrz_perfcounter_select" + }, + { + "name": "CMP", + "num": 4, + "select": "RB_PERFCTR_CMP_SEL", + "counter": "RBBM_PERFCTR_CMP", + "countable_type": "a7xx_cmp_perfcounter_select" + }, + { + "name": "UFC", + "pipe": "BR", + "num": 4, + "select": "RB_PERFCTR_UFC_SEL", + "counter": "RBBM_PERFCTR_UFC", + "countable_type": "a7xx_ufc_perfcounter_select" + }, + { + "name": "BV_CP", + "num": 7, + "select": "CP_BV_PERFCTR_CP_SEL", + "counter": "RBBM_PERFCTR2_CP", + "countable_type": "a7xx_cp_perfcounter_select" + }, + { + "name": "BV_PC", + "pipe": "BV", + "num": 8, + "select_offset": 8, + "select": "PC_PERFCTR_PC_SEL", + "counter": "RBBM_PERFCTR_BV_PC", + "countable_type": "a7xx_pc_perfcounter_select" + }, + { + "name": "BV_VFD", + "pipe": "BV", + "num": 8, + "select_offset": 8, + "select": "VFD_PERFCTR_VFD_SEL", + "counter": "RBBM_PERFCTR_BV_VFD", + "countable_type": "a7xx_vfd_perfcounter_select" + }, + { + "name": "BV_VPC", + "pipe": "BV", + "num": 6, + "select_offset": 6, + "select": "VPC_PERFCTR_VPC_SEL", + "counter": "RBBM_PERFCTR_BV_VPC", + "countable_type": "a7xx_vpc_perfcounter_select" + }, + { + "name": "BV_TP", + "pipe": "BV", + "num": 6, + "select_offset": 12, + "select": "TPL1_PERFCTR_TP_SEL", + "counter": "RBBM_PERFCTR2_TP", + "countable_type": "a7xx_tp_perfcounter_select" + }, + { + "name": "BV_SP", + "pipe": "BV", + "num": 12, + "select_offset": 24, + "select": "SP_PERFCTR_SP_SEL", + "counter": "RBBM_PERFCTR2_SP", + "countable_type": "a7xx_sp_perfcounter_select" + }, + { + "name": "BV_UFC", + "pipe": "BV", + "num": 2, + "select_offset": 4, + "select": "RB_PERFCTR_UFC_SEL", + "counter": "RBBM_PERFCTR2_UFC", + "countable_type": "a7xx_ufc_perfcounter_select" + }, + { + "name": "BV_TSE", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL", + "counter": "RBBM_PERFCTR_BV_TSE", + "countable_type": "a7xx_tse_perfcounter_select" + }, + { + "name": "BV_RAS", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL", + "counter": "RBBM_PERFCTR_BV_RAS", + "countable_type": "a7xx_ras_perfcounter_select" + }, + { + "name": "BV_LRZ", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL", + "counter": "RBBM_PERFCTR_BV_LRZ", + "countable_type": "a7xx_lrz_perfcounter_select" + }, + { + "name": "BV_HLSQ", + "pipe": "BV", + "num": 6, + "select": "SP_PERFCTR_HLSQ_SEL", + "counter": "RBBM_PERFCTR2_HLSQ", + "countable_type": "a7xx_hlsq_perfcounter_select" + } + ] +} diff --git a/drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json b/dri= vers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json new file mode 100644 index 000000000000..503b113df397 --- /dev/null +++ b/drivers/gpu/drm/msm/registers/adreno/a8xx_perfcntrs.json @@ -0,0 +1,240 @@ +{ + "chip": "A8XX", + "groups": [ + { + "name": "CP", + "num": 14, + "reserved": [ 0 ], + "select": "CP_PERFCTR_CP_SEL", + "counter": "RBBM_PERFCTR_CP", + "countable_type": "a8xx_cp_perfcounter_select" + }, + { + "name": "RBBM", + "num": 4, + "select": "RBBM_PERFCTR_RBBM_SEL", + "slice_select": [ "RBBM_SLICE_PERFCTR_RBBM_SEL" ], + "counter": "RBBM_PERFCTR_RBBM", + "countable_type": "a8xx_rbbm_perfcounter_select" + }, + { + "name": "PC", + "pipe": "BR", + "num": 8, + "select": "PC_PERFCTR_PC_SEL", + "slice_select": [ "PC_SLICE_PERFCTR_PC_SEL" ], + "counter": "RBBM_PERFCTR_PC", + "countable_type": "a8xx_pc_perfcounter_select" + }, + { + "name": "VFD", + "pipe": "BR", + "num": 8, + "select": "VFD_PERFCTR_VFD_SEL", + "counter": "RBBM_PERFCTR_VFD", + "countable_type": "a8xx_vfd_perfcounter_select" + }, + { + "name": "HLSQ", + "pipe": "BR", + "num": 6, + "select": "SP_PERFCTR_HLSQ_SEL", + "slice_select": [ "SP_PERFCTR_HLSQ_SEL_2" ], + "counter": "RBBM_PERFCTR_HLSQ", + "countable_type": "a8xx_hlsq_perfcounter_select" + }, + { + "name": "VPC", + "pipe": "BR", + "num": 6, + "select": "VPC_PERFCTR_VPC_SEL", + "slice_select": [ "VPC_PERFCTR_VPC_SEL_1", "VPC_PERFCTR_VPC_SE= L_2" ], + "counter": "RBBM_PERFCTR_VPC", + "countable_type": "a8xx_vpc_perfcounter_select" + }, + { + "name": "TSE", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL", + "slice_select": [ "GRAS_PERFCTR_TSEFE_SEL" ], + "counter": "RBBM_PERFCTR_TSE", + "countable_type": "a8xx_tse_perfcounter_select" + }, + { + "name": "RAS", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL", + "counter": "RBBM_PERFCTR_RAS", + "countable_type": "a8xx_ras_perfcounter_select" + }, + { + "name": "UCHE", + "num": 12, + "select": "UCHE_PERFCTR_UCHE_SEL", + "counter": "RBBM_PERFCTR_UCHE", + "countable_type": "a8xx_uche_perfcounter_select" + }, + { + "name": "TP", + "pipe": "BR", + "num": 12, + "select": "TPL1_PERFCTR_TP_SEL", + "counter": "RBBM_PERFCTR_TP", + "countable_type": "a8xx_tp_perfcounter_select" + }, + { + "name": "SP", + "pipe": "BR", + "num": 24, + "select": "SP_PERFCTR_SP_SEL", + "counter": "RBBM_PERFCTR_SP", + "countable_type": "a8xx_sp_perfcounter_select" + }, + { + "name": "RB", + "pipe": "BR", + "num": 8, + "select": "RB_PERFCTR_RB_SEL", + "counter": "RBBM_PERFCTR_RB", + "countable_type": "a8xx_rb_perfcounter_select" + }, + { + "name": "VSC", + "num": 2, + "select": "VSC_PERFCTR_VSC_SEL", + "counter": "RBBM_PERFCTR_VSC", + "countable_type": "a8xx_vsc_perfcounter_select" + }, + { + "name": "CCU", + "pipe": "BR", + "num": 5, + "select": "RB_PERFCTR_CCU_SEL", + "counter": "RBBM_PERFCTR_CCU", + "countable_type": "a8xx_ccu_perfcounter_select" + }, + { + "name": "LRZ", + "pipe": "BR", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL", + "counter": "RBBM_PERFCTR_LRZ", + "countable_type": "a8xx_lrz_perfcounter_select" + }, + { + "name": "CMP", + "num": 4, + "select": "RB_PERFCTR_CMP_SEL", + "counter": "RBBM_PERFCTR_CMP", + "countable_type": "a8xx_cmp_perfcounter_select" + }, + { + "name": "UFC", + "pipe": "BR", + "num": 4, + "select": "RB_PERFCTR_UFC_SEL", + "counter": "RBBM_PERFCTR_UFC", + "countable_type": "a8xx_ufc_perfcounter_select" + }, + { + "name": "BV_CP", + "num": 7, + "select_offset": 14, + "select": "CP_PERFCTR_CP_SEL", + "counter": "RBBM_PERFCTR2_CP", + "countable_type": "a8xx_cp_perfcounter_select" + }, + { + "name": "BV_PC", + "pipe": "BV", + "num": 8, + "select_offset": 8, + "select": "PC_PERFCTR_PC_SEL", + "slice_select": [ "PC_SLICE_PERFCTR_PC_SEL" ], + "counter": "RBBM_PERFCTR_BV_PC", + "countable_type": "a8xx_pc_perfcounter_select" + }, + { + "name": "BV_VFD", + "pipe": "BV", + "num": 8, + "select_offset": 8, + "select": "VFD_PERFCTR_VFD_SEL", + "counter": "RBBM_PERFCTR_BV_VFD", + "countable_type": "a8xx_vfd_perfcounter_select" + }, + { + "name": "BV_VPC", + "pipe": "BV", + "num": 6, + "select_offset": 6, + "select": "VPC_PERFCTR_VPC_SEL", + "slice_select": [ "VPC_PERFCTR_VPC_SEL_1", "VPC_PERFCTR_VPC_SE= L_2" ], + "counter": "RBBM_PERFCTR_BV_VPC", + "countable_type": "a8xx_vpc_perfcounter_select" + }, + { + "name": "BV_TP", + "pipe": "BV", + "num": 8, + "select_offset": 12, + "select": "TPL1_PERFCTR_TP_SEL", + "counter": "RBBM_PERFCTR2_TP", + "countable_type": "a8xx_tp_perfcounter_select" + }, + { + "name": "BV_SP", + "pipe": "BV", + "num": 12, + "select_offset": 24, + "select": "SP_PERFCTR_SP_SEL", + "counter": "RBBM_PERFCTR2_SP", + "countable_type": "a8xx_sp_perfcounter_select" + }, + { + "name": "BV_UFC", + "pipe": "BV", + "num": 2, + "select_offset": 4, + "select": "RB_PERFCTR_UFC_SEL", + "counter": "RBBM_PERFCTR2_UFC", + "countable_type": "a8xx_ufc_perfcounter_select" + }, + { + "name": "BV_TSE", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_TSE_SEL", + "slice_select": [ "GRAS_PERFCTR_TSEFE_SEL" ], + "counter": "RBBM_PERFCTR_BV_TSE", + "countable_type": "a8xx_tse_perfcounter_select" + }, + { + "name": "BV_RAS", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_RAS_SEL", + "counter": "RBBM_PERFCTR_BV_RAS", + "countable_type": "a8xx_ras_perfcounter_select" + }, + { + "name": "BV_LRZ", + "pipe": "BV", + "num": 4, + "select": "GRAS_PERFCTR_LRZ_SEL", + "counter": "RBBM_PERFCTR_BV_LRZ", + "countable_type": "a8xx_lrz_perfcounter_select" + }, + { + "name": "BV_HLSQ", + "pipe": "BV", + "num": 6, + "select": "SP_PERFCTR_HLSQ_SEL", + "slice_select": [ "SP_PERFCTR_HLSQ_SEL_2" ], + "counter": "RBBM_PERFCTR2_HLSQ", + "countable_type": "a8xx_hlsq_perfcounter_select" + } + ] +} --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 3D36C3F7AB5 for ; Thu, 14 May 2026 13:54:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766869; cv=none; b=omydwpwFJ/OrNKB06bBh8THNXdvDryfXcv5I0AkeQ2k5vQ+3rIVLr3BUFN5CMnLckBFsywiqIM3OIcw48A3B/bnGieXnY0yadWOhPynWd/cl41DYA7O7QoEOwzszG4APaRyYdsqcig4zcVrM05/Swbt1GICndqyI9vePj31pmFI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766869; c=relaxed/simple; bh=9I8fbZtieKCx/gmo5Zwh6/QipI3JStv4Oiuy+n8j+nQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gLdJMOm/iGUZY7f+tkAUK/bykzqNQgDfPSwXBhKT18sWINbMbklbeR3W9Ja0Su15mRNcpaZLpA0Px1MIN7SPnvqx7Wpmjfl1rKyIHInf7zchCSiHec93O8LLC8mJ5f7xy/DJoGlR0nBJrhF6+wqp7OXkeZXxvBqKGsEvgxtMOF0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=k+qM+M/Y; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Pw/lRn8t; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="k+qM+M/Y"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Pw/lRn8t" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeWEL2841099 for ; Thu, 14 May 2026 13:54:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=M7rs8SEMK1L Qu/2/xiK9f0eSs0YeYPU7CAo4VX+afCA=; b=k+qM+M/YsSqPCOCcTYoJhS0HWd8 aIrB5Q3TZRg7rJIvbL/lo1ZRFJaPLj7D7x65Yjfz/CFmN8uTb1RFSg+VTbdPdHv+ /t1rdCgQjLOLq6SDBIjU6YWpev9tVeq2RLgU5HB+I4goP5KjNnASoRYdMj9Vru5Y SIfNmrB7hCY4QrPCbZtA3Yd+j+VxaMcXGUuaREBE4WIaeznHYevwcO1T2f/WD3yN EZvzJV04NiYvkyjoO12UupXJ0trXjoonJyElI9GeDC70QrLG1nbK8KKSxj5hHzfY vS8Sux7HdgT6SmeXmpksN/0ScHCJK5hLnmsLphlIFWAvXk5tdPYQ2ngWK4g== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5899sn5w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:26 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-368ac44b26dso3833313a91.2 for ; Thu, 14 May 2026 06:54:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766865; x=1779371665; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=M7rs8SEMK1LQu/2/xiK9f0eSs0YeYPU7CAo4VX+afCA=; b=Pw/lRn8tEKTze70e2uinZfM5+vfu6uD3Se0FgipQ8UJnMgYEwROBgFrdvPY1boIjPC 8dY0s06zcDw2bRidIAZpiFU/d/MtEgQ7TZWtWUMrDWn4SOWzvUyMoNF3yzd5m2SQiX2P u63tu0yIcgNGF7hqjv/yMVu4ViJcfhkybQtLmlqBTF7kjb1p9mL59ZSM4Q4t85PR5oVy qkYYlV2HwfinC46Q9hkDoXLevIImtveeRwBDpopkSG4Yba5kqFOi7K9voywdoZQQdShO 1aCv4echOm7TUJdinh3xF1stzIfK1S9hbcDHgnAqBhzIGnfIxHoXhdCRxRio+YGjTBl/ MibA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766865; x=1779371665; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=M7rs8SEMK1LQu/2/xiK9f0eSs0YeYPU7CAo4VX+afCA=; b=gEhDyvIjPKzaYbWkgZ0kQet1kZA8GnB+N3v+V0iyqWa8KEK9I74lZzYmNCRxvFmZjt cCXAVtuWQOBVhzurtPVaZ5qDTRZeQXEhO7qhXsydtyebVldHpgrfhMI52wVOTVExErqe lb7skICGpCpnBoV9ORzmzo6zM/aS/Iws70Y6i8aQIsJwDKO9F1YVXVXJ1OxX8DTYJ4aL yLepK0T5a0VzqTZyJeDzl+qZf7SoTcq1K8jPzOpS5F9D08ic6v7SzvwrcUJJ9E9YrUGd d6Pj55ftMm/cB8GmXGt1hJ2vPrNzdpbI53ebnIzpHk27VVaQIGc0AhIY/7JaQvNNH6Ue FjRA== X-Forwarded-Encrypted: i=1; AFNElJ9egE1nxN3RZylc7mllJqYAbiQv/DSJy2eU0tyw+YjYdHm7RLTTgZPOUg8HD2hLNRBdti6sz7i/QHWia5Q=@vger.kernel.org X-Gm-Message-State: AOJu0YyXl+X06H2j7YTVUOmesfkx5XXHMm/7I58SibepxT7aOGfNHH/c imtHM9AXUdFBclbAOzjLGPmgkuMuKwXDhRYEGQGQQvOFOcF0z0S8SuBH+pAkKUM+QVaSvA2PS/t vbyYxF3gidtKG/71vlH+dMwMYJJGtDv1zbUbzYT+EX+MJ8UO45elxt8t+w/rtoW//H1A= X-Gm-Gg: Acq92OEUblvgoWqrDluZbeyg656AEYdKQejGe1FDKBtFx+LbPtL4Czgm9JiC/nDwClb P0nCKsszwQhP+DV6MenCqxBYYTffGY97fzTTpCr2z9On2UMXEtpP2lXCntLqBCI3s8JXujoau+j nl25JYrjiGne2uQb7I4wrHtfUd/hb2F35eepZtgkrWiXJ6zbVotFhy9GcJEkWk8tB+wpKH3NRhF OtjupScNS1oL9Mae8AZe88pXzCVSIhJq4UGzGSRubsWAGbUH3WyN6kaLuAcIM1Zl5JzHv4IrmLI O+ap7yGFjg7mfYXuDGLl5ZViOOZZBaq5KWiV8sK9Vv94msHm+04XVhmbfaVzWFx5Z7N8rHRz3tx etPYGUIDq3hPxWngjhE+dKmoIrA/+kMU2 X-Received: by 2002:a17:90b:3502:b0:366:d9c:91dc with SMTP id 98e67ed59e1d1-368f77c9859mr7089983a91.5.1778766864975; Thu, 14 May 2026 06:54:24 -0700 (PDT) X-Received: by 2002:a17:90b:3502:b0:366:d9c:91dc with SMTP id 98e67ed59e1d1-368f77c9859mr7089919a91.5.1778766864338; Thu, 14 May 2026 06:54:24 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3692716c2e1sm1627921a91.2.2026.05.14.06.54.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:23 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 06/16] drm/msm: Add a6xx+ perfcntr tables Date: Thu, 14 May 2026 06:39:54 -0700 Message-ID: <20260514134052.361771-7-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfXxEv+1X6zDSFO rjDaibeuBGo57vvh661tjjL1ovuUs1Qu6auu7MCtggtX/4Q2JgWJn3QEAbXQUJdP0obCuYprGiL F3Sr0VuzAO7mSDQkJIWcueN1JF0BsnubruXxV73NW+R3CIpKkFcumjZ8yu9wDWzWNNmoyzGodmW akwtkF2axx+WED4KNpG2wZz/l/f4Apvw+rnxM1HO2GHoVUO2mIx9/gtWt//HP5zuahjq0MCobx+ O3kV4pdSRd10R4DDWhqAgXeSlsNwPQ/C+7dKupcTl6Gt2cRRvK83sGe9qFomhJM/26czqYQzczD VryzG2D+DR//VQA4Qd4QRiJiUxWjZx9J0qf5E5cFzHqWpz0TnTsSh7I/LCSnMNW6WDlvPhKijvo XAl2RMIX1K2afM6J+3/ORErQEgWqcPVsUF8HogM7kkvhuCsZt8mXqePBv4wWBcXXkTcUG6ihjCm QS5XyxCOsxMAbe5xBBA== X-Proofpoint-ORIG-GUID: bfWJIHJuc_pFviAVyU_Lp30Dty5atiq0 X-Authority-Analysis: v=2.4 cv=N6AZ0W9B c=1 sm=1 tr=0 ts=6a05d412 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=tmZHKQuSfWdd6biKE2QA:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: bfWJIHJuc_pFviAVyU_Lp30Dty5atiq0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Wire up the generated perfcntr tables for a6xx+. The PERFCNTR_CONFIG ioctl will use this information to assign counters. Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 15 +++++++++++++++ drivers/gpu/drm/msm/msm_gpu.h | 4 ++++ drivers/gpu/drm/msm/msm_perfcntr.h | 9 +++++++++ 3 files changed, 28 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index e578417a4949..727281fbef36 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -5,6 +5,7 @@ #include "msm_gem.h" #include "msm_mmu.h" #include "msm_gpu_trace.h" +#include "msm_perfcntr.h" #include "a6xx_gpu.h" #include "a6xx_gmu.xml.h" =20 @@ -2637,6 +2638,20 @@ static struct msm_gpu *a6xx_gpu_init(struct drm_devi= ce *dev) adreno_gpu =3D &a6xx_gpu->base; gpu =3D &adreno_gpu->base; =20 + if ((ADRENO_6XX_GEN1 <=3D config->info->family) && + (config->info->family <=3D ADRENO_6XX_GEN4)) { + gpu->perfcntr_groups =3D a6xx_perfcntr_groups; + gpu->num_perfcntr_groups =3D a6xx_num_perfcntr_groups; + } else if ((ADRENO_7XX_GEN1 <=3D config->info->family) && + (config->info->family <=3D ADRENO_7XX_GEN3)) { + gpu->perfcntr_groups =3D a7xx_perfcntr_groups; + gpu->num_perfcntr_groups =3D a7xx_num_perfcntr_groups; + } else if ((ADRENO_8XX_GEN1 <=3D config->info->family) && + (config->info->family <=3D ADRENO_8XX_GEN2)) { + gpu->perfcntr_groups =3D a8xx_perfcntr_groups; + gpu->num_perfcntr_groups =3D a8xx_num_perfcntr_groups; + } + mutex_init(&a6xx_gpu->gmu.lock); spin_lock_init(&a6xx_gpu->aperture_lock); =20 diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 78e1478669be..8c08dc065372 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -24,6 +24,7 @@ struct msm_gem_submit; struct msm_gem_vm_log_entry; struct msm_gpu_state; struct msm_context; +struct msm_perfcntr_group; =20 struct msm_gpu_config { const char *ioname; @@ -262,6 +263,9 @@ struct msm_gpu { bool allow_relocs; =20 struct thermal_cooling_device *cooling; + + const struct msm_perfcntr_group *perfcntr_groups; + unsigned num_perfcntr_groups; }; =20 static inline struct msm_gpu *dev_to_gpu(struct device *dev) diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h index 305dcde15c5e..64a5d29feba1 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.h +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -35,6 +35,15 @@ struct msm_perfcntr_group { const struct msm_perfcntr_counter *counters; }; =20 +extern const struct msm_perfcntr_group a6xx_perfcntr_groups[]; +extern const unsigned a6xx_num_perfcntr_groups; + +extern const struct msm_perfcntr_group a7xx_perfcntr_groups[]; +extern const unsigned a7xx_num_perfcntr_groups; + +extern const struct msm_perfcntr_group a8xx_perfcntr_groups[]; +extern const unsigned a8xx_num_perfcntr_groups; + #define GROUP(_name, _pipe, _counters, _countables) { = \ .name =3D _name, = \ .pipe =3D _pipe, = \ --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 85B6B3FADF8 for ; Thu, 14 May 2026 13:54:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766872; cv=none; b=lFcSSm22rcfn7BRuK4v2F7Moddr0At9tszZbtI7p/GJ2h+eVkHBhlbIDb6LCSC5JVdCfmuy3ZT5bLZCdQnvvmbBI+etTQ8K3AHBqbSq34q8reGFApunNZuXh/seJk/j7TkFk+kvnbHPASaMXJ6L2R9k5U6sdp2bWLjkAB50NLug= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766872; c=relaxed/simple; bh=mwv5H2OOJDSZvW2SF1lbkPIcHxfB6ty1LqTAVICmuFM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X9LeCnk4qSQyFg+bIWoUUqYoiNKpH05Dr7eT/Sr+zo7kgj/xCxC6oo6ujUFXb0zwOxtjii/gDeTneJpDQPtVW66OcJilyp+eHaXIn30QykOs8V+zt+6voXB97pJnracwdrXte0iwIfMFnIYt6giOWmszJnRw+PDeCLSHiHCM22E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=diD/mr4x; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=MlK+kQ7o; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="diD/mr4x"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="MlK+kQ7o" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeUT03048537 for ; Thu, 14 May 2026 13:54:28 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=eZl9dR5CO3E sJ00bvvdzTmB9yHRqOUcactLKgwAqf+4=; b=diD/mr4xsccGluPz3RcYKTx3kL+ CxyPBGMQesHKYgAiidlTGoUelSkPSWrZ5xzbI+4YpScOyuPxyVK3vDNEfAS+xrVt Sy27RI6LEXiA+y2WmPbtep7En5eMmWzwJXTS0NZWUG2P0Ctx03LRh0Yir5k3C1fK dwIj5jogeF99rJZr8hGQGko9/cVrJ5LOUSu8dqcpGk3H8LTobQ9bhXaiNT8LM7AV fmNJNHrNfiyA957JDczQKfFmcquPVmF5sC1ici4Tz+jGnDEFx9j9FM0D+SpdNQs5 or0YL5IawhDsrG+HVgDs54waScM/P8XgbMMf89s8t+9uisSEm+z7jWfdvfg== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5492tc67-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:28 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c709551ec08so9743801a12.3 for ; Thu, 14 May 2026 06:54:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766867; x=1779371667; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eZl9dR5CO3EsJ00bvvdzTmB9yHRqOUcactLKgwAqf+4=; b=MlK+kQ7on430gAHwoPjHe7xQNz9GS9dMUwFCmrxyadZ55B+1kRzzDt9d30ifW4f16+ zYcpl7V9alxHUp0E1+D0vItSrmOmfHFmXYkO+aP3TuRss3KcEYByFaPii7zNJ2LnnTfa OcZ3I+NrLSUsvoqVm4cSL/4HSn0NqK86XSqV8YDR2cGMvcuGYiEMm3n6JgCoiSUz0b4C hfRZPwcMzvw46bItsDSlt/kwPvedlp2Qktjxeb883ji8f4bywbUXW/owlZnUHyu8zwKq wO0tloyxam61XhbHOiyrI0fmabxX8YWQl3Zwh+8bFa1igyoKDdVuO3UBxwI16Qkrgen/ dZ1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766867; x=1779371667; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=eZl9dR5CO3EsJ00bvvdzTmB9yHRqOUcactLKgwAqf+4=; b=sCO58AXKBBgR1CCHBXv28onoeRdm9sP6GO3bSwmK0A+UQ1Ke2oZdxGDX/Abo9+tv0Z FClaXFCXYsQwteIzOSYv9+i4HcOJ4SBCeeHQIeWXiUtZRRYidxupzICmVibLHv/+LmUl +zOAwNIYplvXsSfA3aevEwRyxlTHguftwZEFa2b+L8OOLOLItxg14gRWbMAcxy1S2119 AwtXMLdEK91hLFzg6YER07id/Zt86X22NXB46BkIK/uOQ+N+XmWoTDzwkpBlNJFJmzxe Ua0eI/LoMZqIIMnCS4vS0tMhikQ3bO1elf/yZcHp52j8pSI6Ukl454Kj3Z700M9s3j85 Kubg== X-Forwarded-Encrypted: i=1; AFNElJ/LQmTJDmaLRfIzaDIbSTDFeZyW+tdyWBkQ1nrv0bpL5WtpXPqj2sl3Tt4jddrUYUPEY//+CK8GHBNxnkk=@vger.kernel.org X-Gm-Message-State: AOJu0YzzBfbKWsk6hVI8crtZUv7HWW8OlPYsrJSDjRFHFm9KQnRIavCN lIoCbVvE+4SmzlOF0CtZyGDpr1oTV4AA+QfFAKjcB6gTtvjQcU1DCNgoUkMon4rtBBWuvXWgIyw 4hxKhw8/9RWZRlyF8dDY5O9O9EIcsNv4HeW53dKIZBFpHnkwLnCBa494va2aqKl1JU9Y= X-Gm-Gg: Acq92OGSWnBF9P97tBzMkXu8XotJfC51L9WhNbciNdnHJ0cf8vuXxWtv0qaKhP6LifL c8ip3wU4O9WT+PaRQimrGDdb1Uy17a1/CeN5CqJqBw90Rso8UrKkpsI1mc57B5jot6iJUGOYQxh fZjxRm3nnYeVBGHmOZNcQLEQu7aW/HFWVkSDEHNbpMUZir0gs5Ywp9FDkVVjS9IHhrj9SWuxV39 U4G1UYL7JnbzAkyZ+jrz6/oBBTb3x9qqqyHOeD0sdTk36KcD4mYWK9Iah87/USwSs0b+tJQo0SM c04w/JXSpxvqnEwo5USxd0KY/nvSJT0iO4rIl0Y7E1/09eVvLlQdFrp1GraK8g/0tht3aGP8422 MvqBAedvC1zQ32kKiaKhwBUQPm8s0IiGf X-Received: by 2002:a05:6a00:929a:b0:82f:2243:e445 with SMTP id d2e1a72fcca58-83f058b41e8mr8305778b3a.32.1778766866992; Thu, 14 May 2026 06:54:26 -0700 (PDT) X-Received: by 2002:a05:6a00:929a:b0:82f:2243:e445 with SMTP id d2e1a72fcca58-83f058b41e8mr8305716b3a.32.1778766866252; Thu, 14 May 2026 06:54:26 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19f7ccc7sm3623079b3a.58.2026.05.14.06.54.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:25 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 07/16] drm/msm: Add sysprof accessors Date: Thu, 14 May 2026 06:39:55 -0700 Message-ID: <20260514134052.361771-8-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: ubjP8GS08dBqch0UysU8CpXyMtoBfPEW X-Authority-Analysis: v=2.4 cv=R74z39RX c=1 sm=1 tr=0 ts=6a05d414 cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=v4b4B-quZFKF0PxyZCUA:9 a=3WC7DwWrALyhR5TkjVHa:22 X-Proofpoint-ORIG-GUID: ubjP8GS08dBqch0UysU8CpXyMtoBfPEW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX4XdsRW59Fuca O9YC96a8nFYrz0ezY5ryC8YkXrEIWqWOPtydVActbqWov9Sjk6JLdPrfZpt5cZFi6nTI2uBMDRw ReagAfo9lxcqKti/h/HvkdPOUgQi3HrNDCkSnhn1sH2F9KZitt7yKI09yEjBiewaI8+bCxKhdjn WrwnxxHZVDYfejOJ6qzATua53L4q7xl4NPHOyAlWln1JrVsEkpiKlR3De/9IRu2Cc7bc6KdwaRW luGEEE6teIpjQjhHDULHr2TF4YTPxCsftBVxeto8B6syBv8F3AlpyrYWwIP+ceV6PFKC/nuRsNB HB4ZqmbOENLCZEuJDxcsvjcrEM/1H3D6lI5Ow2kiAdinP3AIwBDgfOFcGitRLg4DJL+squQYNP3 l4gEfznCBUtd4xKHI+M4nPTAWVotbF4jvMAl3lxHPsZ8BYpHRV6x04+pteN3nwLR5cXZ34UEvdX iMKlmvtTUMxY+GG4AgQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Currently the sysprof param serves two functions, (a) disabling perfcntr clearing on context switch/preemption, and (b) disabling IFPC. In the future, with kernel side global perfcntr collection/stream, the decision about disabling IFPC will change. To prepare for this, split out two helpers/accessors for the two different cases. For now, they are the same thing, but this will change. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 8 +++----- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 5 +++-- drivers/gpu/drm/msm/adreno/a6xx_preempt.c | 2 +- drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/a8xx_preempt.c | 2 +- drivers/gpu/drm/msm/msm_gpu.h | 18 ++++++++++++++++++ 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.c index 1b44b9e21ad8..aba08fb76249 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -2036,10 +2036,10 @@ static int a6xx_gmu_get_irq(struct a6xx_gmu *gmu, s= truct platform_device *pdev, =20 void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu) { + bool sysprof =3D msm_gpu_sysprof_no_ifpc(gpu); struct adreno_gpu *adreno_gpu =3D to_adreno_gpu(gpu); struct a6xx_gpu *a6xx_gpu =3D to_a6xx_gpu(adreno_gpu); struct a6xx_gmu *gmu =3D &a6xx_gpu->gmu; - unsigned int sysprof_active; =20 /* Nothing to do if GPU is suspended. We will handle this during GMU resu= me */ if (!pm_runtime_get_if_active(&gpu->pdev->dev)) @@ -2047,15 +2047,13 @@ void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu) =20 mutex_lock(&gmu->lock); =20 - sysprof_active =3D refcount_read(&gpu->sysprof_active); - /* * 'Perfcounter select' register values are lost during IFPC collapse. To= avoid that, * use the currently unused perfcounter oob vote to block IFPC when syspr= of is active */ - if ((sysprof_active > 1) && !test_and_set_bit(GMU_STATUS_OOB_PERF_SET, &g= mu->status)) + if (sysprof && !test_and_set_bit(GMU_STATUS_OOB_PERF_SET, &gmu->status)) a6xx_gmu_set_oob(gmu, GMU_OOB_PERFCOUNTER_SET); - else if ((sysprof_active =3D=3D 1) && test_and_clear_bit(GMU_STATUS_OOB_P= ERF_SET, &gmu->status)) + else if (!sysprof && test_and_clear_bit(GMU_STATUS_OOB_PERF_SET, &gmu->st= atus)) a6xx_gmu_clear_oob(gmu, GMU_OOB_PERFCOUNTER_SET); =20 mutex_unlock(&gmu->lock); diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index 727281fbef36..71f54ab5425d 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -203,7 +203,7 @@ static void get_stats_counter(struct msm_ringbuffer *ri= ng, u32 counter, static void a6xx_set_pagetable(struct a6xx_gpu *a6xx_gpu, struct msm_ringbuffer *ring, struct msm_gem_submit *submit) { - bool sysprof =3D refcount_read(&a6xx_gpu->base.base.sysprof_active) > 1; + bool sysprof =3D msm_gpu_sysprof_no_perfcntr_zap(&a6xx_gpu->base.base); struct msm_context *ctx =3D submit->queue->ctx; struct drm_gpuvm *vm =3D msm_context_vm(submit->dev, ctx); struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; @@ -1608,7 +1608,7 @@ static int hw_init(struct msm_gpu *gpu) a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_BOOT_SLUMBER); } =20 - if (!ret && (refcount_read(&gpu->sysprof_active) > 1)) { + if (!ret && msm_gpu_sysprof_no_ifpc(gpu)) { ret =3D a6xx_gmu_set_oob(gmu, GMU_OOB_PERFCOUNTER_SET); if (!ret) set_bit(GMU_STATUS_OOB_PERF_SET, &gmu->status); @@ -2854,6 +2854,7 @@ const struct adreno_gpu_funcs a8xx_gpu_funcs =3D { .create_private_vm =3D a6xx_create_private_vm, .get_rptr =3D a6xx_get_rptr, .progress =3D a8xx_progress, + .sysprof_setup =3D a6xx_gmu_sysprof_setup, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a8xx_gmu_get_timestamp, diff --git a/drivers/gpu/drm/msm/adreno/a6xx_preempt.c b/drivers/gpu/drm/ms= m/adreno/a6xx_preempt.c index df4cbf42e9a4..1e599d4ddea1 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_preempt.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_preempt.c @@ -261,7 +261,7 @@ void a6xx_preempt_trigger(struct msm_gpu *gpu) mod_timer(&a6xx_gpu->preempt_timer, jiffies + msecs_to_jiffies(10000)); =20 /* Enable or disable postamble as needed */ - sysprof =3D refcount_read(&a6xx_gpu->base.base.sysprof_active) > 1; + sysprof =3D msm_gpu_sysprof_no_perfcntr_zap(gpu); =20 if (!sysprof && !a6xx_gpu->postamble_enabled) preempt_prepare_postamble(a6xx_gpu); diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a8xx_gpu.c index ccfccc45133f..e022c9a162a4 100644 --- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c @@ -849,7 +849,7 @@ static int hw_init(struct msm_gpu *gpu) */ a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_GPU_SET); =20 - if (!ret && (refcount_read(&gpu->sysprof_active) > 1)) { + if (!ret && msm_gpu_sysprof_no_perfcntr_zap(gpu)) { ret =3D a6xx_gmu_set_oob(gmu, GMU_OOB_PERFCOUNTER_SET); if (!ret) set_bit(GMU_STATUS_OOB_PERF_SET, &gmu->status); diff --git a/drivers/gpu/drm/msm/adreno/a8xx_preempt.c b/drivers/gpu/drm/ms= m/adreno/a8xx_preempt.c index 3d8c33ba722e..6cb53a071801 100644 --- a/drivers/gpu/drm/msm/adreno/a8xx_preempt.c +++ b/drivers/gpu/drm/msm/adreno/a8xx_preempt.c @@ -242,7 +242,7 @@ void a8xx_preempt_trigger(struct msm_gpu *gpu) mod_timer(&a6xx_gpu->preempt_timer, jiffies + msecs_to_jiffies(10000)); =20 /* Enable or disable postamble as needed */ - sysprof =3D refcount_read(&a6xx_gpu->base.base.sysprof_active) > 1; + sysprof =3D msm_gpu_sysprof_no_perfcntr_zap(gpu); =20 if (!sysprof && !a6xx_gpu->postamble_enabled) preempt_prepare_postamble(a6xx_gpu); diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 8c08dc065372..9e5c753437c2 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -311,6 +311,24 @@ static inline bool msm_gpu_active(struct msm_gpu *gpu) return false; } =20 +static inline bool +msm_gpu_sysprof_no_perfcntr_zap(struct msm_gpu *gpu) +{ + return refcount_read(&gpu->sysprof_active) > 1; +} + +static inline bool +msm_gpu_sysprof_no_ifpc(struct msm_gpu *gpu) +{ + /* + * For now, this is the same condition as disabling perfcntr clears + * on context switch. But once kernel perfcntr IFPC support is in + * place, we will only need to disable IFPC for legacy userspace + * setting SYSPROF param. + */ + return msm_gpu_sysprof_no_perfcntr_zap(gpu); +} + /* * The number of priority levels provided by drm gpu scheduler. The * DRM_SCHED_PRIORITY_KERNEL priority level is treated specially in some --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 6F02D3F9F39 for ; Thu, 14 May 2026 13:54:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766872; cv=none; b=p+iV0Rmf4ZSzS6XUHXQEss8QL4Zph5ncxYykXyjfw/6mNRIe4fqsb21b9NFb0vCtrtFO4Butx0/74wEX4eYhvm/4Pdlj2lRlnjlbrtfr5gtlurtwDT03gvqklHxVBrDs7FFzDDesvDZhCTnl4eVZRi8whkg53wp+udGHdVvsAMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766872; c=relaxed/simple; bh=SUAMjZQYP9AOePOsiJrF8dJnyR56nPusuhXcE6GMh44=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dumrNSoQjotQnlCCmY70dTuswWPgnm/QY2mDb0Kxl+JlULctSHfyr91mKQhcG2ctfwvyco45/hFyjRLxhto/VlPsQpGfPlPD9e87J/P8MS33G+6x9NGJuaGbjtpTOMar6C5Tl4V4zHpn6obI6kY8aoOwqzTpNorUfYLDpYxqorc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Ly+hBnf4; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=azEpis2l; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Ly+hBnf4"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="azEpis2l" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBf8uP2242527 for ; Thu, 14 May 2026 13:54:29 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=t3fkEBTd8c7 M226NlRdLECqyLGtXW1CncR7GLKvMNdQ=; b=Ly+hBnf40YrIKMaD5B+wj/bJsUf 6KzBDm39uQft+bc0Z8k/9w1WvaUuY1eFGFKZUocdP1h55ZoJLe5h2fgVH7RtAZcc M3b4+q0Qa9kjjmkkxevdRpGihQ04E7idgQbzXwV5VRB1N71PoYuB1D1BGr4o5rqS k9IwjGcsT66Sx4WRrxL9kYpY0OeNj86qRNVys1TJ6HAjHVoRvrc3UhZ1MfHgtWei XOEEG71If9J6/fSwHUDiueeOV2t7vIhpdFYf5fzrEb18z2cxaYOKYfEFMGHl8v9T PmXyQnNqXf/lWu/TGuxaNOiEr3NwB/5+K+Ep23XxiS0Jy00ZNRdXw42mmsw== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e513gavvv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:29 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-8386367b23cso6308164b3a.3 for ; Thu, 14 May 2026 06:54:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766869; x=1779371669; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=t3fkEBTd8c7M226NlRdLECqyLGtXW1CncR7GLKvMNdQ=; b=azEpis2lMlbgN+LrYPOQRYk8Hhkq/oZ11MKsdK7jM/3t1bcmz5x5qOQjxDwVi7eNIM bVfZXKSoZg5pubegvr5DIZtwKMsHtPU/03kDYXCu0rhU7XMkO2DzLD6Z0dBEOhqE7yn6 NOx3V51hDNjtpgFimlgz6nDECsigSWDh2uht5XGwtoxy0vaOIpBHF+LsmVyJJvvJ97Bn p9vOEzPsVpNIuMPS3qnQq6jBifo92oKzRigq/Q/3QnwiZZE/yB2FikU6SdV5p3EktZsl qnKWCJm53d1HLoTvUr20EODmDvrsnnpp3KjKEmibtuRYlnNNaP1tMEu0/wuliMQHDfKF BDFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766869; x=1779371669; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=t3fkEBTd8c7M226NlRdLECqyLGtXW1CncR7GLKvMNdQ=; b=MRS7eBjknql/O9YXcXN7J9cMbVyvWhTMLPpwdYs/Ab12SmNBW92FlDCC2k4BHKcSeq SYP0siVUY6XidEqzaaPzoeJbJpveFa0STI5D3fcPWsA7B30gq6BuLkEaOxxIABMaGPfX FA3JTYLS9uf8w3V2CY97x5ZLmasrnPzUcmQ/5OnE78MXo4qjVmwHu3WSaOiw2zq/4YWX 4CmYygjgUrQrhIGpS2DDw4MI2uRXy27eWcKXFZ/sXx8rvM0EB0NZripshUTMPtR/Kxq5 N1tObFbwxrkAFB8Q4+xCPLE3UajsqZ+I/eXo87Rksfwn4UJk5ypQr19jPrTyHvzt5IQb RYPA== X-Forwarded-Encrypted: i=1; AFNElJ9WQZBBTN5AqAJVmXRez14sqIhRn3qhPexNuqx4Z7NA4XBI9pLU13X6wvgBmcmnWVcx92ZcHebQekqPl9Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1NtyI89Jg0Si1gq1t/iyZNlzz998WcGy6mMfQoHQ9dlfddIqH 2aRLfBEYbO++9TBQWgjOKuD036M35XdA0fWohq2PbrRnQ1efl3x7EJwiZGhtZGuML6a5pwIp7EK XkEfFvIOCNR5r7DnUpwAzK+3vPhJXKCAwBCdr1FxaB5We20JMIpkYWkAbjQh67SyDc9M= X-Gm-Gg: Acq92OHvwQB683ZbY4xttweeVj3HNxdBQv03WhNWq73cu6pOuHACWs37W6HgpYRgoai c7Tru0iSOUpA7gjJ7zZ/2/MaUixBo4GtPkl209DYdph+wzz/HUMb/WynEDrxRA0Gg0wwSnwAP5/ sbhOz0IJ+6Ab9z3KvEkQXQACbXxgfWiTqoxSKI2hXT3AR4Q+i6w39CoAnYCZYMuGy+JfNp82ww6 bSD5qEPrMyDCWNqBkubRYvrUDXo/KPmVZ9mVFyz05FWkCu4gptjhOwuc0dTkxEcu4UwBn8QTakD pjIvM9LMy9QgVO/tPj8UDIzvcyktq5QJu9nGT59ShIe617EosybreXqc+3jWiZKnl9vkedS9Lba Gb7btmu76/60NlMlyzuDFKYBftMe2PYYV X-Received: by 2002:a05:6a00:8088:b0:838:20b7:40ed with SMTP id d2e1a72fcca58-83f042bdaebmr8212903b3a.42.1778766868476; Thu, 14 May 2026 06:54:28 -0700 (PDT) X-Received: by 2002:a05:6a00:8088:b0:838:20b7:40ed with SMTP id d2e1a72fcca58-83f042bdaebmr8212852b3a.42.1778766867873; Thu, 14 May 2026 06:54:27 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19664220sm2638819b3a.4.2026.05.14.06.54.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:27 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 08/16] drm/msm/a6xx: Add yield & flush helper Date: Thu, 14 May 2026 06:39:56 -0700 Message-ID: <20260514134052.361771-9-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX40FUhnkpHf16 Le5b9pDtudzK4zJ+z65Pm73A8AlH/kd6n6kHB2wUMyo0lh6BlCKX6f1JCDtCgOXIQr9yHNBzyOf oi7hRWtDXVY6c4w2h7f+nLYcVIDoR7I2xjyl7A/68P+ZNgVDEtoEsnkYX1lzm47M2TX3s+AHSVE 6kWW2/EImRGfgsIwpsAmp/9IJYdueuylBmllNDt+ro1iMs79dYlrKJ/QtbJmgj8ByzXDZ+qEAj1 JR11D0YTz8TftmZBmpxRLayQtogyIjDOmC68gevSA/v73TMn98UkDfZEOIpMmnzDAslupzdc4mV VEv/eBNwCzblr6Bwn9xQ8qOEjB+zySyQD1JwjcRDqBATX5anRxZBtot8RlL6kZVogWnXwjDcFsp dVNzhumMJK5dBvlbz3ypIwU1bZ2c/gDZyv3n+RrzjjUs+wP/MqjhChKmWs4rVMwtBd8qGRYk1Kh lrXr6y89x5JCJAZKBYg== X-Proofpoint-ORIG-GUID: CuCQa9P2ogLGIiLuDSK5gF-UPgPQdcD1 X-Authority-Analysis: v=2.4 cv=Iba3n2qa c=1 sm=1 tr=0 ts=6a05d415 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=7a4_7rcHm0II5uOVc2AA:9 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-GUID: CuCQa9P2ogLGIiLuDSK5gF-UPgPQdcD1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 clxscore=1015 spamscore=0 adultscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" It's a common pattern, needing to insert a yield packet before flushing the rb. And we'll need this once again for configuring perfcntr SEL regs. So add a helper. Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 55 +++++++++++++-------------- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 1 + drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 10 +---- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index 71f54ab5425d..415902f6e5d7 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -189,6 +189,30 @@ void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbu= ffer *ring) spin_unlock_irqrestore(&ring->preempt_lock, flags); } =20 +void +a6xx_flush_yield(struct msm_gpu *gpu, struct msm_ringbuffer *ring) +{ + /* If preemption is enabled */ + if (gpu->nr_rings > 1) { + /* Yield the floor on command completion */ + OUT_PKT7(ring, CP_CONTEXT_SWITCH_YIELD, 4); + + /* + * If dword[2:1] are non zero, they specify an address for + * the CP to write the value of dword[3] to on preemption + * complete. Write 0 to skip the write + */ + OUT_RING(ring, 0x00); + OUT_RING(ring, 0x00); + /* Data value - not used if the address above is 0 */ + OUT_RING(ring, 0x01); + /* generate interrupt on preemption completion */ + OUT_RING(ring, 0x00); + } + + a6xx_flush(gpu, ring); +} + static void get_stats_counter(struct msm_ringbuffer *ring, u32 counter, u64 iova) { @@ -597,28 +621,9 @@ static void a7xx_submit(struct msm_gpu *gpu, struct ms= m_gem_submit *submit) OUT_PKT7(ring, CP_SET_MARKER, 1); OUT_RING(ring, 0x100); /* IFPC enable */ =20 - /* If preemption is enabled */ - if (gpu->nr_rings > 1) { - /* Yield the floor on command completion */ - OUT_PKT7(ring, CP_CONTEXT_SWITCH_YIELD, 4); - - /* - * If dword[2:1] are non zero, they specify an address for - * the CP to write the value of dword[3] to on preemption - * complete. Write 0 to skip the write - */ - OUT_RING(ring, 0x00); - OUT_RING(ring, 0x00); - /* Data value - not used if the address above is 0 */ - OUT_RING(ring, 0x01); - /* generate interrupt on preemption completion */ - OUT_RING(ring, 0x00); - } - - trace_msm_gpu_submit_flush(submit, adreno_gpu->funcs->get_timestamp(gpu)); =20 - a6xx_flush(gpu, ring); + a6xx_flush_yield(gpu, ring); =20 /* Check to see if we need to start preemption */ if (adreno_is_a8xx(adreno_gpu)) @@ -958,15 +963,7 @@ static int a7xx_preempt_start(struct msm_gpu *gpu) =20 a6xx_emit_set_pseudo_reg(ring, a6xx_gpu, NULL); =20 - /* Yield the floor on command completion */ - OUT_PKT7(ring, CP_CONTEXT_SWITCH_YIELD, 4); - OUT_RING(ring, 0x00); - OUT_RING(ring, 0x00); - OUT_RING(ring, 0x00); - /* Generate interrupt on preemption completion */ - OUT_RING(ring, 0x00); - - a6xx_flush(gpu, ring); + a6xx_flush_yield(gpu, ring); =20 return a6xx_idle(gpu, ring) ? 0 : -EINVAL; } diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.h index eb431e5e00b1..99c3e55f5ca8 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -317,6 +317,7 @@ void a6xx_bus_clear_pending_transactions(struct adreno_= gpu *adreno_gpu, bool gx_ void a6xx_gpu_sw_reset(struct msm_gpu *gpu, bool assert); int a6xx_fenced_write(struct a6xx_gpu *gpu, u32 offset, u64 value, u32 mas= k, bool is_64b); void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring); +void a6xx_flush_yield(struct msm_gpu *gpu, struct msm_ringbuffer *ring); int a6xx_zap_shader_init(struct msm_gpu *gpu); =20 void a8xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu, bo= ol gx_off); diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a8xx_gpu.c index e022c9a162a4..124d315b2469 100644 --- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c @@ -488,15 +488,7 @@ static int a8xx_preempt_start(struct msm_gpu *gpu) =20 a6xx_emit_set_pseudo_reg(ring, a6xx_gpu, NULL); =20 - /* Yield the floor on command completion */ - OUT_PKT7(ring, CP_CONTEXT_SWITCH_YIELD, 4); - OUT_RING(ring, 0x00); - OUT_RING(ring, 0x00); - OUT_RING(ring, 0x00); - /* Generate interrupt on preemption completion */ - OUT_RING(ring, 0x00); - - a6xx_flush(gpu, ring); + a6xx_flush_yield(gpu, ring); =20 return a8xx_idle(gpu, ring) ? 0 : -EINVAL; } --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 C449D3FB048 for ; Thu, 14 May 2026 13:54:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766875; cv=none; b=qGd6t11UVA0lLKfCpNkc3viQAFz6peDJn3MLCHjH+15rO4ZcjBn7yKSJwdkEt/T92D9zagHmqLYsErKrcsSYfkYU+78nHHt81rhzKR7oVbmYYZ54TMMqBRgs2Yzwz+TROjAB8v3n9NYmG4PfdcAmrnU8CQl+Lbz8ktStFwpVtzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766875; c=relaxed/simple; bh=KLqRNWMiv1tFIGsviuSyaJygsw/Xhbs5/vugY6rjZSw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ke7CvQYJvbQ8tUwNbmJztFEL/eizVKbdKcj0gqT/y9aNzcHfoJW6nMRU0jgcoOh4b+loqX6dFmzBOUe1Hr4T46TO7G2PQE5telSNwMxOinkUYfR6RUjLIfk0ugFhtJ++swvLiwIzAfhqquAkeHpMD3HFadrpypxUevQnzQpjyns= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=RalYZEG2; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=agCE08gO; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="RalYZEG2"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="agCE08gO" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBf60A2262632 for ; Thu, 14 May 2026 13:54:31 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=tpSYknoSjgu xLp2PhcNLzFD+hJIyTtn62dCNb7J3rZw=; b=RalYZEG2911GXWtZbTlXU6jzXRs l/jppPX9UF0nTeLvSgLDbRpapxeQqwDTBheiR4AvtHmQZd//sYhIx0vNTuIMudVv p+PGX0qChFg5kL4W+5XWs5mufQnMcSwjj8XOEAlJAFK/MtPFoswJ3pDlrLX3UKJS 35lZB1MeLxy7+32mWqFuciKqaY9jyVTJuZW2jYm5tlku5hZiyZSnlYlN2kNmIfud BvMlJ/6BrJ7eeCcMrvfSxNyiMm2tlkz90SggOOvVTKocQgdaPr7H25lbPt3mGL5v vXQtklkprHu6nx54Shhpz+rANFII2Yl2GBD4hRWMsEmDsmdofLIvFweFLrw== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e563hj31a-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:31 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-8386367b23cso6308188b3a.3 for ; Thu, 14 May 2026 06:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766871; x=1779371671; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tpSYknoSjguxLp2PhcNLzFD+hJIyTtn62dCNb7J3rZw=; b=agCE08gOOIV6kez/ntAgUG/ZUK7IaWwN1VmdcOnklySRln5UbCfLThlu0Y1qYJAw2N vWQgD30dRBIIupjVeYUYm23IBqxTEgxrTSUL3L5RQIye3gfF2T0IrQM+9RUzUd6k5Gw5 tZ76y/9YoSjNGIA0lmu0I4MyLy0BPwP1Jh0vBfqaEn9GQiMCmm+/sPrZ+5eB30tDUii4 w5BL5r+q/0KaXdla3i+tAQ06C3Y5rnr70GuXf4cih7v9xHwgG/xyJ/+tTtDDOda1pQbN 9yVQLdjq2VLqWmHm93tGCzGuRsFeT2KqjpvGRJSecFoO84oQREpFUgt0R/9jLbp1OM/6 R44g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766871; x=1779371671; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=tpSYknoSjguxLp2PhcNLzFD+hJIyTtn62dCNb7J3rZw=; b=DIX8ajX4OZQrC8K+Xu5QnYsFYO5oZtojtSS9kdnDVMosuaM80M9eoJ8KQ/QpMl2HjT I2c64RRxjUBPdzDTqr8AFTm4pZrv3vKZ/5ajpx9s3ldf3mQlC51DQjekD1OEN2HZGv3G b9hGOKzdxmmD8biRldYD4Y43rAnQuf4adJJ/V5kaJ2VJpHh0AwZvUFpODfn7tLWLyAcu s+Dlt9oU9dqJIkrnKRG9IbyWfNJOwvu4Ftsd69Bqs0lFuHrsDfWNPBv2t99NsVE1WwZT CuydtfNW3xEoIXY949+psmoqkJp6t9Pk/NcVhGff5aMUjdMsHzZv16fH8RkjmkgEmYSZ mS+w== X-Forwarded-Encrypted: i=1; AFNElJ9SxWBdb/TEy3H/po/YfuPBXNo1dpmHZOAvImBza9wCQNHB3nQPkLWP+cNSjw42+VuqeCQkSQm3FRgZZBk=@vger.kernel.org X-Gm-Message-State: AOJu0YyHrkdtsqtN2c7weAS5weLCj5F65560kU9gawvcWgjhD4xigGYc efUR0d3ZumveKu5XnCEtBOnT9WBZDw5ixsa3gFyhgFx4RsFFq4OBs1UmEclUfwtWfNPM6RXqgtg xd5wm99A+ULG3+k1uWwPRZsyujWnCPXUsqq8+kd8pwb3JdLOLp41BcySejzvcSY1MjBI= X-Gm-Gg: Acq92OEow9LM93uNszaPlDq8iyQ7pvmEBmoV01j3iCnlXcWRBPvLqMGegfGpDZluO6W w50b9XnWm+3vsSwUyAvaThmhjjPZIssFMgLNg51nuM54DWrn+nhCLY4nPYvfMIKcUHL7OR+ls0r KnD8biWp9yp2rFUe7pOdqrp91YKT1/I7t9nCkLBp+eIO9rN9Jf7lcTGzAMf02gKh1eFGeA27/Ib Xs9WR9KcShkbF+haS35gfuBVHb6Pjt1tuRiQ0KFdPCh2XhLffeIonFD+NUbc1birLxh5JfZd61o qPH8pb2gOcVoIFLaj+dDL9MT/Bw8PyahPZvThmSQ8W5kC3o5hOLuGB1EToN3gBmq1ziSkJPEmWf uHC1yoZ8l+h+SveGutxyIRnyfygMofvE0 X-Received: by 2002:a05:6a00:1acb:b0:83e:e03a:f926 with SMTP id d2e1a72fcca58-83f03e910e2mr7999704b3a.9.1778766870644; Thu, 14 May 2026 06:54:30 -0700 (PDT) X-Received: by 2002:a05:6a00:1acb:b0:83e:e03a:f926 with SMTP id d2e1a72fcca58-83f03e910e2mr7999647b3a.9.1778766870087; Thu, 14 May 2026 06:54:30 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c78844sm2721847b3a.47.2026.05.14.06.54.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:29 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 09/16] drm/msm: Add per-context perfcntr state Date: Thu, 14 May 2026 06:39:57 -0700 Message-ID: <20260514134052.361771-10-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: 7sFKckjuiYJTw2671-_pTdatm1wbXSiq X-Proofpoint-ORIG-GUID: 7sFKckjuiYJTw2671-_pTdatm1wbXSiq X-Authority-Analysis: v=2.4 cv=DewnbPtW c=1 sm=1 tr=0 ts=6a05d417 cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=OtV_UDYxk2hhjaRdRjwA:9 a=zc0IvFSfCIW2DFIPzwfm:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX3g9LJt41ynor VcNSpGOsLcebGQ0q+zMouuymUmurHZN1U5qBjvoesFe+B7iN9OGQ6UM03jg4RXkYLnDC1zL/BTx buoLDfqgGhh43vlM6Ni9mRXHwmbVoKjVsaNeAcfOjOPHORnLq2s71s2tihM6CC+/rnTUy80KCWN k9l9YC3khKKYrlufmLBGXIKq+HUdeUE68nOlHj0dpVeT3S9jahU+X8x09sfSl32ksRgVyoBBXht LIx7FHJnocDhDz1zSka+pEU+x6wYlQLOSPcea8RL65dq3/+cZohr0/aDgIBT/mE8n7lKBDI2M4R v9lOxceb0xxHuyvzUQInGPRLcZujdRBrCQ+HifE6GIBi3zsWsl6nsXyGKb+9PevLPrrStcOthDq DCYigbLXKo0DVpiA1M1sz2tmX96W7gt3oWH53W95DjnqFwn9W33BD6m+ge8rUULXbFYFNEQOjfI vXuic7MzvaaVq0uKABw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 phishscore=0 spamscore=0 malwarescore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" The upcoming PERFCNTR_CONFIG ioctl will allow for both global counter collection, and per-context counter reservation for local (ie. within a single GEM_SUBMIT ioctl) counter collection. Any number of contexts can reserve the same counters, but we will need to ensure that counters reserved for local counter collection do not conflict with counters used for global counter collection. So add tracking for per-context local counter reservations. Signed-off-by: Rob Clark Reviewed-by: Dmitry Baryshkov Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/msm_gpu.h | 5 +++++ drivers/gpu/drm/msm/msm_perfcntr.h | 21 +++++++++++++++++++++ drivers/gpu/drm/msm/msm_submitqueue.c | 1 + 3 files changed, 27 insertions(+) diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 9e5c753437c2..19484774f369 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -434,6 +434,11 @@ struct msm_context { * this context. */ atomic64_t ctx_mem; + + /** + * @perfcntrs: Per-context reserved perfcntrs state + */ + struct msm_perfcntr_context_state *perfctx; }; =20 struct drm_gpuvm *msm_context_vm(struct drm_device *dev, struct msm_contex= t *ctx); diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h index 64a5d29feba1..7f0654182496 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.h +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -35,6 +35,27 @@ struct msm_perfcntr_group { const struct msm_perfcntr_counter *counters; }; =20 +/** + * struct msm_perfcntr_context_state - per-msm_context counter state + * + * A given counter can either be unused, reserved for global counter + * collection exclusively, or reserved for local per-context counter + * collection inclusively. Multiple contexts can reserve the same + * counter, since SEL reg programming and counter begin/end sampling + * happen locally (within a single GEM_SUBMIT ioctl). + */ +struct msm_perfcntr_context_state { + /** @dummy: Some compilers dislike structs with only a flex array */ + unsigned dummy; + + /** + * @reserved_counters: + * + * The number of reserved counters indexed by perfcntr group. + */ + unsigned reserved_counters[]; +}; + extern const struct msm_perfcntr_group a6xx_perfcntr_groups[]; extern const unsigned a6xx_num_perfcntr_groups; =20 diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/ms= m_submitqueue.c index 2598d674a99d..a58fe41602c6 100644 --- a/drivers/gpu/drm/msm/msm_submitqueue.c +++ b/drivers/gpu/drm/msm/msm_submitqueue.c @@ -66,6 +66,7 @@ void __msm_context_destroy(struct kref *kref) drm_gpuvm_put(ctx->vm); kfree(ctx->comm); kfree(ctx->cmdline); + kfree(ctx->perfctx); kfree(ctx); } =20 --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 685E5402B8F for ; Thu, 14 May 2026 13:54:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766879; cv=none; b=nK4wWQBdTcOs64wqoM1eA1rQvf1gk83N/B99qQckhErAMWs/OprN5/p8li0uecDcMG3SwLGWrC/+2sjqnhx74GuAMbBldKRFb4TqeQyV1fbUkt7zpBihUetQpcJBVUih4yofBg9LZGyQcRAwkjhFdqTxkQQDNXN5YuAHtmMO9Pg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766879; c=relaxed/simple; bh=TJ0is2J3ziBWvMeON4s6qtfYxjer7eFmrioUbcyC0Ik=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Yhm15TSbfh9ZKyK7rSP2f87a3fhc0zLhIDpMEzeT8HCPZ1f1ajMSDQFxC75qY7QANUvNJ0GNABN0sk0Bhe7EDIK6qxZnppLrzeufaQ7XD4MAI2w6xGTEcBkSPX2Il2VoXLQY3/8ChTICseg/7PnisAPVri6RRKxvt9pEOohMq4s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=bYe7RVF1; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=XClG+8P0; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="bYe7RVF1"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="XClG+8P0" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeQ5C2841032 for ; Thu, 14 May 2026 13:54:35 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=yZQt5Z60cUf moMerqECpQueGDcB1E/D0+Zhq6Y860II=; b=bYe7RVF1Qu5Ch2yTmq2kW+121Xy mPR21HLeUiiUCYu9qLxD+C+jU8xI7wWzl2q42zxDUDA+n03n/yzJNz8QFqGOyRQQ LBfK4ogPGHM+gQ+HZc7YOeNOA1ThV9cCmDj6aZYzRc3DPVjsuXKm7C0ycepHnWgM +EXN/0mIhm1KDA/sSJk3cZ2fr41Lk1t9LdM1dua6EBunJMvz8EjybeNncwY4HNJe PhVk1YCf9UROxvW99flPlVmgB991f48n653NjPEm1Q0ZSeetMVMBxsMeasfCC0vG +Tz5ZkQd5QZ19P55JUeU98Lz47AHJ5UBnQv2jDVpeLscqYw23VbbE+8hERg== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5899sn6m-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:35 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-3663d5e9bf4so7747037a91.1 for ; Thu, 14 May 2026 06:54:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766874; x=1779371674; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yZQt5Z60cUfmoMerqECpQueGDcB1E/D0+Zhq6Y860II=; b=XClG+8P0ihNPR4kWLXmrVbCWduqukpqJBaPXJJWZQy91PMYtG5J3BLHF5wTvBXEwfU 35qY1n1hdz8EMZFA5N6YvIO+/Yomf06gLs3mUF/5zCwQnZP25Ddxj+crvnj2TRXIdy+0 27xJqyDXyCiZH4Xef1ScnpUz4jmE3n9k8P3rzUGJKFIOF0LwVrM57DYm6ceHYewg05ln 3/mlqbJUh7ug9zYBUlRjTii/odK9s7JASV7zDaqd+lrj/fNp1WzcHiwADxTwJ590HOyP W1dEtl+bDBQl+amhbSIT8Te83lhBWtUbyYSPQOBiIkEI71ss1GJJ3C8RG5wdmOCaQPGX Doyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766874; x=1779371674; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=yZQt5Z60cUfmoMerqECpQueGDcB1E/D0+Zhq6Y860II=; b=Sl/D1TrsDPDI7wVK4+7gtWjRJJyuOqsF4xHRCnMyQeCGvbdJu5P+ZObrHhdaWHwdQU pVm5geCd2MT70DEkMgg2GYh6qS6Ki6Nv0DnLGyiCypSrti4KVzDrb/BMWAvLzDanRO3j JJkDG1AnIalIwrL0voNEkXi3Oz2iO7w0fX5JxMvBW0pb0t6mEgfwz2/o9DQIJWYad39S 9kDYUuYfrHK4tN86wZSTELNsGbhi136WFqJ1ppjaxeLDvuQa4PbP+CmLm/OJluA/rpLT j0FFf9djV6CHuXXIl4NhvumilziDJ9l8WYtdV1VYRkx+uwjkK6+NHunmDcf5VligTjcG P8Wg== X-Forwarded-Encrypted: i=1; AFNElJ8JaZ+6ICLTYIG8D64JSn8QuBpTOGXxGGwUV+QpaMvinrmcYvzWI5vz/FZAm3hzBufvkidxYcv1NPrSfQc=@vger.kernel.org X-Gm-Message-State: AOJu0YyMhqSArllpC/h+XdimA8jy8DklG/aWU1HEoi+T7LLFxEGPxL65 zbmx9fApXXFiDQtFvz7ZPN4ewosJ9ba2FU2Mneb4CUCwfqRAruZtpOnsB68RMpLQZHgWpFc1MPK fUW7uY9tFq09GVCMGt3qr6jW+d97+SW9Yt1g2N0LKvd/FzYvO8cmCpGO6gFXQmLU/MiM= X-Gm-Gg: Acq92OHRpMjFtOj6rX6aw/wv4LMPtXj0h8pVukmgPRMecT2yDxXSyla43OeVjOnPDkw DvZrU8eIWrQiKViW0IHRdfxaREJu3Ak3UnM/Cu17qmdGWHEn/W7qPnk/nvODOlHxmMjbXIjrTFc dme+ruzz56Z5D9/0+Zjq/9doAs5+bRybuKaCrnfCjvvuQ9Eg3J7+mEvn67Cv+G/slsVyeEF6K2c EqKpXGawK33AG3g0cXDIdq9YZnrrwt/rtNvs5WPZP+1gK4T7quYRqq5umh8GFBM1NsPQ2Qn777o ivKI/v3DaVBbFWXvVeCn3RmWid8AFrlrpqflFHajaZIqHENFK1bcNF4QIyFKOHzPNrAM2aW/F/O ixg9cxXGuit/3cjjqqXzCkJ60hUu3t/f3 X-Received: by 2002:a17:90b:2887:b0:366:4a47:f26d with SMTP id 98e67ed59e1d1-368f3d25c79mr8670028a91.14.1778766873723; Thu, 14 May 2026 06:54:33 -0700 (PDT) X-Received: by 2002:a17:90b:2887:b0:366:4a47:f26d with SMTP id 98e67ed59e1d1-368f3d25c79mr8669979a91.14.1778766873143; Thu, 14 May 2026 06:54:33 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3694f5bddaasm49095a91.2.2026.05.14.06.54.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:32 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Konrad Dybcio , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 10/16] drm/msm: Add basic perfcntr infrastructure Date: Thu, 14 May 2026 06:39:58 -0700 Message-ID: <20260514134052.361771-11-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfXxSkW0zY+WXq/ XcEI0Lm4bXs2QKi3RwNpSRu0Tc9xRTAakPRXcCMjbt9uERtSLoDmb1sLSQusZu4f08WOSCcBSoO Cy41Qc7fUpLo+GBC0GM58BbXmwMyELR/NW0Hl/6mnxss12oKkOdffypwVJwPy1lYVdZd4SARFc/ romNTYcvjRh2xmyMofgF+yeXwLdVNdJLab3OLlD0uL8/ZTOYzpA9oNICyFVRwHw7Fjlv9CzCvQ1 TO+kZjdPk9OOKtqVUqeXXbyhHpbKKuBTEpsTXY5Hq+nSbYil+Ru2no4vxkqR7G+zoC2pj7rP+nd E18/4VCgd1ouB9ny2ZD4XudGvoLlQ4VN6o3N1nY9E8HgLXTbI2wA2jWjonVxIpP7FYxLhnmPaMx Gnf0l0lqjkOxW90FOGU0KmY9l1ArjeGgppE4VWLdi7mOqpU7hL+aBrmKFoYB22na2XjJP5iqcL4 BgIn7IZ4yDLZz8ZPICA== X-Proofpoint-ORIG-GUID: navUVnVX_gfJVzgLEl78GKMDUFDuhRjU X-Authority-Analysis: v=2.4 cv=N6AZ0W9B c=1 sm=1 tr=0 ts=6a05d41b cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=hddbS_E73Iye693R-v0A:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: navUVnVX_gfJVzgLEl78GKMDUFDuhRjU X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Add the basic infrastructure for tracking assigned perfcntrs. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/Makefile | 1 + drivers/gpu/drm/msm/adreno/adreno_device.c | 8 +- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 5 +- drivers/gpu/drm/msm/msm_drv.h | 6 + drivers/gpu/drm/msm/msm_gpu.c | 12 ++ drivers/gpu/drm/msm/msm_gpu.h | 57 +++++++++- drivers/gpu/drm/msm/msm_perfcntr.c | 126 +++++++++++++++++++++ drivers/gpu/drm/msm/msm_perfcntr.h | 23 ++++ 8 files changed, 232 insertions(+), 6 deletions(-) create mode 100644 drivers/gpu/drm/msm/msm_perfcntr.c diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile index 337634e7e247..2466cb32dac5 100644 --- a/drivers/gpu/drm/msm/Makefile +++ b/drivers/gpu/drm/msm/Makefile @@ -122,6 +122,7 @@ msm-y +=3D \ msm_gpu_devfreq.o \ msm_io_utils.o \ msm_iommu.o \ + msm_perfcntr.o \ msm_rd.o \ msm_ringbuffer.o \ msm_submitqueue.o \ diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/m= sm/adreno/adreno_device.c index fc38331ce640..7f20320ef66a 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_device.c +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c @@ -307,8 +307,10 @@ MODULE_DEVICE_TABLE(of, dt_match); static int adreno_runtime_resume(struct device *dev) { struct msm_gpu *gpu =3D dev_to_gpu(dev); - - return gpu->funcs->pm_resume(gpu); + int ret =3D gpu->funcs->pm_resume(gpu); + if (!ret) + ret =3D msm_perfcntr_resume(gpu); + return ret; } =20 static int adreno_runtime_suspend(struct device *dev) @@ -322,6 +324,8 @@ static int adreno_runtime_suspend(struct device *dev) */ WARN_ON_ONCE(gpu->active_submits); =20 + msm_perfcntr_suspend(gpu); + return gpu->funcs->pm_suspend(gpu); } =20 diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/= adreno/adreno_gpu.c index 72b71e9e44f0..ee0bcf985934 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -702,11 +702,10 @@ void adreno_recover(struct msm_gpu *gpu) struct drm_device *dev =3D gpu->dev; int ret; =20 - // XXX pm-runtime?? we *need* the device to be off after this - // so maybe continuing to call ->pm_suspend/resume() is better? - + msm_perfcntr_suspend(gpu); gpu->funcs->pm_suspend(gpu); gpu->funcs->pm_resume(gpu); + msm_perfcntr_resume(gpu); =20 ret =3D msm_gpu_hw_init(gpu); if (ret) { diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index e53e4f220bed..f00b2e7aeb91 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -235,6 +235,12 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void = *data, int msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file); =20 +int msm_perfcntr_resume(struct msm_gpu *gpu); +void msm_perfcntr_suspend(struct msm_gpu *gpu); + +struct msm_perfcntr_state * msm_perfcntr_init(struct msm_gpu *gpu); +void msm_perfcntr_cleanup(struct msm_gpu *gpu); + #ifdef CONFIG_DEBUG_FS unsigned long msm_gem_shrinker_shrink(struct drm_device *dev, unsigned lon= g nr_to_scan); #endif diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index 1bac70473f80..bf6845e5719e 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -1028,6 +1028,17 @@ int msm_gpu_init(struct drm_device *drm, struct plat= form_device *pdev, =20 refcount_set(&gpu->sysprof_active, 1); =20 + mutex_init(&gpu->perfcntr_lock); + + if (gpu->num_perfcntr_groups > 0) { + gpu->perfcntrs =3D msm_perfcntr_init(gpu); + if (IS_ERR(gpu->perfcntrs)) { + ret =3D PTR_ERR(gpu->perfcntrs); + gpu->perfcntrs =3D NULL; + goto fail; + } + } + return 0; =20 fail: @@ -1066,6 +1077,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu) } =20 msm_devfreq_cleanup(gpu); + msm_perfcntr_cleanup(gpu); =20 platform_set_drvdata(gpu->pdev, NULL); } diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index 19484774f369..be922641a14f 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -25,6 +25,7 @@ struct msm_gem_vm_log_entry; struct msm_gpu_state; struct msm_context; struct msm_perfcntr_group; +struct msm_perfcntr_stream; =20 struct msm_gpu_config { const char *ioname; @@ -93,6 +94,13 @@ struct msm_gpu_funcs { */ bool (*progress)(struct msm_gpu *gpu, struct msm_ringbuffer *ring); void (*sysprof_setup)(struct msm_gpu *gpu); + + /* Configure perfcntr SELect regs: */ + void (*perfcntr_configure)(struct msm_gpu *gpu, struct msm_ringbuffer *ri= ng, + const struct msm_perfcntr_stream *stream); + + /* Flush perfcntrs before reading (optional): */ + void (*perfcntr_flush)(struct msm_gpu *gpu); }; =20 /* Additional state for iommu faults: */ @@ -266,6 +274,11 @@ struct msm_gpu { =20 const struct msm_perfcntr_group *perfcntr_groups; unsigned num_perfcntr_groups; + + struct msm_perfcntr_state *perfcntrs; + + /** @perfcntr_lock: protects perfcntr related state */ + struct mutex perfcntr_lock; }; =20 static inline struct msm_gpu *dev_to_gpu(struct device *dev) @@ -311,10 +324,52 @@ static inline bool msm_gpu_active(struct msm_gpu *gpu) return false; } =20 +/** + * struct msm_perfcntr_group_state - Tracking for the currently allocated = counter state + */ +struct msm_perfcntr_group_state { + /** + * @allocated_counters: + * + * allocated counters for global counter collection. The + * corresponding counters are allocated from highest to + * lowest, to minimize chance of conflict with old userspace + * allocating from lowest to highest. + */ + unsigned allocated_counters; + + /** + * @countables: + * + * The correspnding SELect reg values for the allocated counters + */ + uint32_t countables[]; +}; + +/** + * struct msm_perfcntr_state - overall global perfcntr state + */ +struct msm_perfcntr_state { + /** @stream: current global counter stream if active */ + struct msm_perfcntr_stream *stream; + + /** + * @groups: Global perfcntr stream group state. + * + * Conceptually this is part of msm_perfcntr_stream state, but is + * statically pre-allocated when the gpu is initialized to simplify + * error path cleanup in PERFCNTR_CONFIG ioctl. (__free(kfree) + * doesn't really help with variable length arrays of allocated + * pointers.) + */ + struct msm_perfcntr_group_state *groups[]; +}; + static inline bool msm_gpu_sysprof_no_perfcntr_zap(struct msm_gpu *gpu) { - return refcount_read(&gpu->sysprof_active) > 1; + return (refcount_read(&gpu->sysprof_active) > 1) || + (gpu->perfcntrs && READ_ONCE(gpu->perfcntrs->stream)); } =20 static inline bool diff --git a/drivers/gpu/drm/msm/msm_perfcntr.c b/drivers/gpu/drm/msm/msm_p= erfcntr.c new file mode 100644 index 000000000000..04407260a4e1 --- /dev/null +++ b/drivers/gpu/drm/msm/msm_perfcntr.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include "msm_drv.h" +#include "msm_gpu.h" +#include "msm_perfcntr.h" + +static int +msm_perfcntr_resume_locked(struct msm_perfcntr_stream *stream) +{ + return 0; +} + +int +msm_perfcntr_resume(struct msm_gpu *gpu) +{ + if (!gpu->perfcntrs) + return 0; + guard(mutex)(&gpu->perfcntr_lock); + return msm_perfcntr_resume_locked(gpu->perfcntrs->stream); +} + +static void +msm_perfcntr_suspend_locked(struct msm_perfcntr_stream *stream) +{ +} + +void +msm_perfcntr_suspend(struct msm_gpu *gpu) +{ + if (!gpu->perfcntr_groups) + return; + guard(mutex)(&gpu->perfcntr_lock); + msm_perfcntr_suspend_locked(gpu->perfcntrs->stream); +} + +/** + * msm_perfcntr_group_idx - map idx of perfcntr group to group_idx + * @stream: The global perfcntr stream + * @n: The requested group_idx + * + * The PERFCNTR_CONFIG ioctl requested N counters/countables per perfcntr + * group, but the order of groups is not required to match the order they + * are defined in the perfcntr tables (which is not stable/UABI, only the + * group names are UABI). + * + * But the order samples are returned in the stream should match the + * order they are requested in the PERFCNTR_CONFIG ioctl. This helper + * handles the order remapping. + * + * Returns an index into gpu->perfcntr_groups[] and perfcntrs->groups[]. + */ +uint32_t +msm_perfcntr_group_idx(const struct msm_perfcntr_stream *stream, uint32_t = n) +{ + WARN_ON_ONCE(n > stream->nr_groups); + return stream->group_idx[n]; +} + +/** + * msm_perfcntr_counter_base - get idx of the first counter in group + * @stream: The global perfcntr stream + * @group_idx: the index of the counter group + * + * For global counter collection, counters are allocated from the end + * (last counter) while UMD allocates them from the start (0..N-1). + * Since UMD always allocated them from the start this also minimizes + * the chance of conflict when using old UMD which predates + * PERFCNTR_CONFIG ioctl. + * + * Returns the index of first counter to use. An index into + * msm_perfcntr_group::counters[]. + */ +uint32_t +msm_perfcntr_counter_base(const struct msm_perfcntr_stream *stream, uint32= _t group_idx) +{ + struct msm_gpu *gpu =3D stream->gpu; + struct msm_perfcntr_state *perfcntrs =3D gpu->perfcntrs; + unsigned num_counters =3D gpu->perfcntr_groups[group_idx].num_counters; + unsigned allocated_counters =3D perfcntrs->groups[group_idx]->allocated_c= ounters; + + return num_counters - allocated_counters; +} + +struct msm_perfcntr_state * +msm_perfcntr_init(struct msm_gpu *gpu) +{ + struct msm_perfcntr_state *perfcntrs; + struct device *dev =3D &gpu->pdev->dev; + size_t sz; + + sz =3D struct_size(perfcntrs, groups, gpu->num_perfcntr_groups); + perfcntrs =3D devm_kzalloc(dev, sz, GFP_KERNEL); + if (!perfcntrs) + return ERR_PTR(-ENOMEM); + + for (unsigned i =3D 0; i < gpu->num_perfcntr_groups; i++) { + const struct msm_perfcntr_group *group =3D + &gpu->perfcntr_groups[i]; + + sz =3D struct_size(perfcntrs->groups[i], countables, group->num_counters= ); + perfcntrs->groups[i] =3D devm_kzalloc(dev, sz, GFP_KERNEL); + if (!perfcntrs->groups[i]) { + msm_perfcntr_cleanup(gpu); + return ERR_PTR(-ENOMEM); + } + } + + return perfcntrs; +} + +void +msm_perfcntr_cleanup(struct msm_gpu *gpu) +{ + struct msm_perfcntr_state *perfcntrs =3D gpu->perfcntrs; + struct device *dev =3D &gpu->pdev->dev; + + gpu->perfcntrs =3D NULL; + + for (unsigned i =3D 0; i < gpu->num_perfcntr_groups; i++) + devm_kfree(dev, perfcntrs->groups[i]); + + devm_kfree(dev, perfcntrs); +} diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h index 7f0654182496..bfda19e01535 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.h +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -35,6 +35,29 @@ struct msm_perfcntr_group { const struct msm_perfcntr_counter *counters; }; =20 +/** + * struct msm_perfcntr_stream - state for a single open stream fd + */ +struct msm_perfcntr_stream { + /** @gpu: Back-link to the GPU */ + struct msm_gpu *gpu; + + /** @nr_groups: # of counter groups with enabled counters */ + uint32_t nr_groups; + + /** + * @group_idx: array of nr_groups + * + * Maps the order of groups in PERFCNTR_CONFIG ioctl to group idx, + * so that results in the results stream can be ordered to match + * the ioctl call that setup the stream + */ + uint32_t *group_idx; +}; + +uint32_t msm_perfcntr_group_idx(const struct msm_perfcntr_stream *stream, = uint32_t n); +uint32_t msm_perfcntr_counter_base(const struct msm_perfcntr_stream *strea= m, uint32_t group_idx); + /** * struct msm_perfcntr_context_state - per-msm_context counter state * --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 0BCE8402BAE for ; Thu, 14 May 2026 13:54:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766881; cv=none; b=s8ZmVsTsV3Fu9Ypiq1Fm+MaDKMOK3VQypx3XjlulJ32ytWDVniA0tRkZ/Mj52vV9vw16cPAVOQ+ZzXwITljIq+HjDc5ftMBWwPUoBKELCx7Koge32ilOTcOKOAJwJ1/voo6S/22hB+oAxx3OIyzcMdANpw7JP1KT0MOy/pFBaSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766881; c=relaxed/simple; bh=6KGYZWLyS2FjrVAien+Mi5u9NQS/vFb5P8qdni4ohb4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=irrToZ1AU4MEJunLfxQjPz2Nls9u2vlc38UyDi9HKQGyKa+m5+tvqAKxiY0AzOV4rEGpc816HL7ehD0dxPh0HV3GNXVd5XwbW5h0PZadnrYnUi65M6VHmYMdBtXGeLf4SAZg5rjRsQJ/H8092IqmYIp015UAVqcCUAXTaY9oABQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=CqbXjaWf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gTOhkfBZ; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="CqbXjaWf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gTOhkfBZ" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeQGe3951585 for ; Thu, 14 May 2026 13:54:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=ntrYj/Ki13u 4Ie8f2izhqt5WotaMwwL8t/FAwrisOvU=; b=CqbXjaWfVH7ccfrdW/KNfNnEyqq IQelHsCaIZrxNENvrjK8T1LI+y/MvKLZ9hlPFvOAypBZydJZo8RBr9YCa6JH/fCv 09WX4qByDbkHbmK2RRPbUydms3NFLH9mzKXyoclBASluTmqqB6gya0XI1BJ7eOAN QRp7V0viOJv3Ncc+lW+u2p44mN0XMGeY3Ko7a4z5ZAEJIs8fF4LU6i7+HTmFiFRj 183a6Ulxa2izGxsjjbCIVdK9Q6uaODlJVgt5qBpQHhQHTPGjmTs5oNIPbalG8gHo NWHMILKoYlasob7zrBvYlrWUSrw+PLJHXySG0JpFta7xKdFPw80AGqaxNUQ== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e57ksssf3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:36 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c828cee4fcdso2943432a12.3 for ; Thu, 14 May 2026 06:54:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766875; x=1779371675; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ntrYj/Ki13u4Ie8f2izhqt5WotaMwwL8t/FAwrisOvU=; b=gTOhkfBZQZhFOOuexYIsTBIjkuU65tOIyXJbLVcj4ml+AoMNKwJpVJy8GJNCIBuk1b N37f9fLU7h7PqDV1sFSZvDnSbJHHUhNxy/+yj1u75ZeR7uEWV9ucs1px0gp254mVqXo/ lmTTgfqFjI88iQf4xympszqIRkIVkTV9nJSKbKYLhMlpy0+9doMmoG9+Dk2lwR8HTC76 Uzglsefz9XRVaIIrHSlXXNBZf3m8QUGOlhUb/XfyGrCjDAxdhcn1RB4BkbF+sE1HwtWi Lr+wfLTBxb5Xkx92d8xnwfCTCyP7d67KKV5och4fpEPlPu2R0QQey1mhgtbpYDNm5zIR U1IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766875; x=1779371675; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ntrYj/Ki13u4Ie8f2izhqt5WotaMwwL8t/FAwrisOvU=; b=TKNAUhBa5uSLZBr3aGrGq+OYDHsdIdzjxmqdRblSqLfcWB9K21H173yYxR6azY+csq NV3nubwVfbwvZyy7l0RfX1oe+1xrweRWn7Pj87y8AsUYRWt5CcNR4ZdFOoXqz6wq9UtG HluVInVt9GiO/RDH6lS5Otl1v9I8BJDmKftl88rnLgZoiSj7RbtRpC7WFTk7alLXx0lF vRQolaGMFkVUpsnzTYi4xeUz1++GcIXwuY0d0twERP4U8QIYezlX8C8S9QmzUWBUWv0S JrJXJ5h6xFMkO0t2A7IYbadsNsifBlPpVoQz04L8KrakPHqasvilRiooxVl8SotX2i/M rW6A== X-Forwarded-Encrypted: i=1; AFNElJ+W+s9rtD9/hHVuxNbRKgzzSCFXEuS5lAJGbwMXJAJRI2WK0bm2u7YgTT/O67NIY4VhgPmM63DYaLVExH8=@vger.kernel.org X-Gm-Message-State: AOJu0YxKtqlFqQkXqcFAKLKmIc6bu73qTsf4hp4YZKFWVxeNPFMmXvYl BWMbFpMdIKM5Nlp+XJiOAZ6IZW7z1TRxulOjycpIQ3JnGY+crS4RcEBFpSBD6O/Pc/+7bcDUn5j Gg8d2Tn/is/tvdt52ZMQ+5T8n3sAb8SDLwx0zNy71QsPHBeoaaWSyXXVW9MnHjsG7p1E= X-Gm-Gg: Acq92OHG2v0UwxmwHBpl+VsWczmn2h+SrOZ61/o54eB1rE8Q0SISCFrWnSRc9q3Uehi 2csEAojsnrMGYnkCuuvhavzsKdpV0WeETPZZWWnZ/aUKZDMn7MA6M0QyHNBb27nBRNjT0ggQyV5 CfUeirxvIKIy8qJbo8U+MlazhR4fF5jWhP5mjjAk90mXeyquXZs5NoyJKvj6K6sdIY0FWsnhv8B rxiWwNAlnzniayENuaiHgOOKgSzCQ0EBrQT8D8qE3pUB2mE/fqGUqWmcBetAayqLwBRAAweqAUm bhvnzyGWDZqlHWiHGdlSbUbpjN4C8d6qSLxGtHanZ4IBvBzwm1CUekAJZBxOSpX95PbsgdVLU/q q0yizitNkNBBt52WuhPLaJUqgpgAFFOaaJf9Lo5Q3HkE= X-Received: by 2002:a05:6a00:929a:b0:82d:29f:d003 with SMTP id d2e1a72fcca58-83f0578088bmr8503833b3a.12.1778766875408; Thu, 14 May 2026 06:54:35 -0700 (PDT) X-Received: by 2002:a05:6a00:929a:b0:82d:29f:d003 with SMTP id d2e1a72fcca58-83f0578088bmr8503791b3a.12.1778766874847; Thu, 14 May 2026 06:54:34 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f196818efsm3793780b3a.16.2026.05.14.06.54.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:34 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 11/16] drm/msm/a6xx+: Add support to configure perfcntrs Date: Thu, 14 May 2026 06:39:59 -0700 Message-ID: <20260514134052.361771-12-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: jk47NkXz8CVO2VtptiCptp_Xf9tn3dIy X-Authority-Analysis: v=2.4 cv=KZbidwYD c=1 sm=1 tr=0 ts=6a05d41c cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=F-OJb-hlSlUoWALVX24A:9 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX/vRKalNm0WeQ Wn7YpP61E0fUCgJM+PKlAGla3yPh43K1WZNcEyRY45P8LG1AjASVOgHyNy/lM/jUkfkWiCBj5Va TI65cllJnBNPtiWdkm4ywY6Icr8ZtUJe4jlSSFbFXihMeMoeH39NJxAMdayLhx6M/LBkRCjv5Xs Yme8OdBkCMF+oK5ySACVidrtyrBr9wI/I+Bi20LBQ/7+ZXaAiFMEFQec9mCHh08uqZ9+WrsrZYl D+Bhd7nTpksbIeR1MryPzx4ok8n7q07GSTbVLZBYUO2hAMZGOR1UnTUIFzFxAjn9tEYaBekOqpq p8ICVIgANE1f4r+mCif3tSa0+XCf6a4ahonHaCg16k/iGLkPrVpcGKVeRamtCDVPmmtzUa1jYSg aEq8zmb2BhCdD6xEoSBVMAk0Ye3yA5lsSIn7dcCs65B4UvAlOHNHK7pYU8DtSQn9g6usp2/K3D9 De/YEO/dB7bfkKpLCqA== X-Proofpoint-ORIG-GUID: jk47NkXz8CVO2VtptiCptp_Xf9tn3dIy X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 bulkscore=0 impostorscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Add support to configure counter SELect regs. In some cases the reg writes need to happen while the GPU is idle. And for a7xx+, in some cases SEL regs need to be configured from BV or BR aperture. The easiest way to deal with this is to configure from the RB. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 69 +++++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_perfcntr.h | 3 ++ drivers/gpu/drm/msm/msm_ringbuffer.h | 2 + 3 files changed, 74 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index 415902f6e5d7..30df9bfa9ef8 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -2535,6 +2535,71 @@ static bool a6xx_progress(struct msm_gpu *gpu, struc= t msm_ringbuffer *ring) return progress; } =20 +static void +a6xx_perfcntr_configure(struct msm_gpu *gpu, struct msm_ringbuffer *ring, + const struct msm_perfcntr_stream *stream) +{ + enum adreno_pipe pipe =3D PIPE_NONE; + + for (unsigned i =3D 0; i < stream->nr_groups; i++) { + unsigned group_idx =3D msm_perfcntr_group_idx(stream, i); + unsigned base =3D msm_perfcntr_counter_base(stream, group_idx); + + const struct msm_perfcntr_group *group =3D + &gpu->perfcntr_groups[group_idx]; + + struct msm_perfcntr_group_state *group_state =3D + gpu->perfcntrs->groups[group_idx]; + + if (group->pipe !=3D pipe) { + pipe =3D group->pipe; + + OUT_PKT7(ring, CP_THREAD_CONTROL, 1); + + if (pipe =3D=3D PIPE_BR) { + OUT_RING(ring, CP_SET_THREAD_BR); + } else if (pipe =3D=3D PIPE_BV) { + OUT_RING(ring, CP_SET_THREAD_BV); + } else { + OUT_RING(ring, CP_SET_THREAD_BOTH); + } + } + + const struct msm_perfcntr_counter *counter =3D &group->counters[base]; + unsigned nr =3D group_state->allocated_counters; + OUT_PKT4(ring, counter->select_reg, nr); + for (unsigned c =3D 0; c < nr; c++) + OUT_RING(ring, group_state->countables[c]); + + for (unsigned s =3D 0; s < ARRAY_SIZE(counter->slice_select_regs); s++) { + if (!counter->slice_select_regs[s]) + break; + + OUT_PKT4(ring, counter->slice_select_regs[s], nr); + for (unsigned c =3D 0; c < nr; c++) + OUT_RING(ring, group_state->countables[c]); + } + } + + if (pipe !=3D PIPE_NONE) { + OUT_PKT7(ring, CP_THREAD_CONTROL, 1); + OUT_RING(ring, CP_SET_THREAD_BOTH); + } + + OUT_PKT7(ring, CP_MEM_WRITE, 3); + OUT_RING(ring, lower_32_bits(rbmemptr(ring, perfcntr_fence))); + OUT_RING(ring, upper_32_bits(rbmemptr(ring, perfcntr_fence))); + OUT_RING(ring, stream->sel_fence); + + a6xx_flush_yield(gpu, ring); + + /* Check to see if we need to start preemption */ + if (adreno_is_a8xx(to_adreno_gpu(gpu))) + a8xx_preempt_trigger(gpu); + else + a6xx_preempt_trigger(gpu); +} + static u32 fuse_to_supp_hw(const struct adreno_info *info, u32 fuse) { if (!info->speedbins) @@ -2753,6 +2818,7 @@ const struct adreno_gpu_funcs a6xx_gpu_funcs =3D { .get_rptr =3D a6xx_get_rptr, .progress =3D a6xx_progress, .sysprof_setup =3D a6xx_gmu_sysprof_setup, + .perfcntr_configure =3D a6xx_perfcntr_configure, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a6xx_gmu_get_timestamp, @@ -2786,6 +2852,7 @@ const struct adreno_gpu_funcs a6xx_gmuwrapper_funcs = =3D { .create_private_vm =3D a6xx_create_private_vm, .get_rptr =3D a6xx_get_rptr, .progress =3D a6xx_progress, + .perfcntr_configure =3D a6xx_perfcntr_configure, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a6xx_get_timestamp, @@ -2822,6 +2889,7 @@ const struct adreno_gpu_funcs a7xx_gpu_funcs =3D { .get_rptr =3D a6xx_get_rptr, .progress =3D a6xx_progress, .sysprof_setup =3D a6xx_gmu_sysprof_setup, + .perfcntr_configure =3D a6xx_perfcntr_configure, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a6xx_gmu_get_timestamp, @@ -2852,6 +2920,7 @@ const struct adreno_gpu_funcs a8xx_gpu_funcs =3D { .get_rptr =3D a6xx_get_rptr, .progress =3D a8xx_progress, .sysprof_setup =3D a6xx_gmu_sysprof_setup, + .perfcntr_configure =3D a6xx_perfcntr_configure, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a8xx_gmu_get_timestamp, diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h index bfda19e01535..14506bc37d05 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.h +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -45,6 +45,9 @@ struct msm_perfcntr_stream { /** @nr_groups: # of counter groups with enabled counters */ uint32_t nr_groups; =20 + /** @sel_fence: Fence for SEL reg programming */ + uint32_t sel_fence; + /** * @group_idx: array of nr_groups * diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.h b/drivers/gpu/drm/msm/msm= _ringbuffer.h index d1e49f701c81..28ca8c9f7463 100644 --- a/drivers/gpu/drm/msm/msm_ringbuffer.h +++ b/drivers/gpu/drm/msm/msm_ringbuffer.h @@ -37,6 +37,8 @@ struct msm_rbmemptrs { volatile struct msm_gpu_submit_stats stats[MSM_GPU_SUBMIT_STATS_COUNT]; volatile u64 ttbr0; volatile u32 context_idr; + + volatile u32 perfcntr_fence; }; =20 struct msm_cp_state { --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 6339C40757E for ; Thu, 14 May 2026 13:54:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766881; cv=none; b=PwPvxtWPwbLf7CsNJD7zpMaBu+ymbiVCRxN6AtBDn0dWDKlOGcd8NfVTBeX1f4ei4/y0l7DlnkWFIxYxtKqma3HO/4/nEtauqlB4gDv2uKUbyJ/AVNZcv4A1U5MfuZOK8BrGWqhpgSRMvnsF2h4biDzeH1bUjN1sk0T5BedqU0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766881; c=relaxed/simple; bh=Go4EyvhlQyWzHCh2p+9M+OIk/P0VvfEAaU7NdiQe9WE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Oc7QkndLAM9t7vsJ378SOZ4l/A1o2yYP6wsxCT0hESwzU98TvhegNbs6FcSPKuFxewU4Ctz9Ex77354H//otFayLbD7f3VZ/nH/nwtTkTeN/R86yHhpoHg7OkJuTOjoqY+Wh1KQ36WEvFtR+/fqq0PYnaI62xxnBr48YUnUWEWw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=bB1NJuNy; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DUiJwDGz; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="bB1NJuNy"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DUiJwDGz" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeV2i2713286 for ; Thu, 14 May 2026 13:54:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=Rv3QXoFqyvR 3pKOjjPZUAdbwE5pf1YjcLxou3Iv6008=; b=bB1NJuNyqhGZYoB2UByMtpH1iEq dvl2cWOj9TZpqH5wBD5+cVCo9lqPkWjpRmh3FFH2DO90NzLNyL0FTYoOPQOoTq1T vaZ/lYPdLe3fBvy6QIzf2eJgYuzitLmllS4c10+DwxOf+7r3yq2EMO5INynEHM0C gCgGYHh5eFwobxuPPoTFrrCiz1j1pvWwrFrgKzAnmoFSyjcFxk9FF7L9uqj0kC7q qgyHYPqX6RDsqO0nqCqu0vEqDjUCS6JfFk79yxhUA6x3D95E+Bk5EkdbMAsVwcV3 US3CFuAtEOY/x5jayfrUehSiFmrQNGYAqm9WVI9O4VNfUErXFFd5ADGbJpA== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e58v89h9s-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:38 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-83536dc3be5so8872526b3a.1 for ; Thu, 14 May 2026 06:54:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766878; x=1779371678; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Rv3QXoFqyvR3pKOjjPZUAdbwE5pf1YjcLxou3Iv6008=; b=DUiJwDGzEPxf6CFzuVUkIdH2uzhnFogdZ8dku/fxEeYwxxLWjTQWeDHyw/46UqUGwJ vJo5D0TxDkLEjMm7tmJE4GLM9E28fyJlv4Wgx9E8L0km2gFAGf5oiYB1e4rLZYxSPQBo oTuLlP9+qEDHNfqVtnqKcz5l/1Tb8H2k66y9jeQfLAHqR8cfeTCB272AJwFcgdQEhArQ 8GziNqEN/bvNDPGtgZSWayxu5OUGNQ4xpYWXmqgwqYb8QQSBadFJNcEj1eErdcalPGww fdlSxtFcgrCJDVYkGw3cafMjcI1fGRVpMpp0Mun2KkwJ6OJo0cfz10eOoP9wEPbbz6f1 adfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766878; x=1779371678; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Rv3QXoFqyvR3pKOjjPZUAdbwE5pf1YjcLxou3Iv6008=; b=nWvoW6QyDg3kDDWQAHt9cPD5Z7YONWGUDPN6MwYAxGkBRsSHLH7lzc8ZD3aEiGzJNB kVm0d8456mS5IZehDcKwDprbi9pW6mYTgYIzTIFgmrRY/q3SCxFdTzhHU+rbAxM8K9Sg 5a0ZNiYXvnP1kLAuH84Lg1rTU1WInb58uvpYkKt1yv9+MfNIi3efU4PXxSZWKqkSRaPX cfi/gmfXvZXGXE7/g2o0xarRXVW34+1vgqrMo89MhHzLriAjYIzdQU+T2EzFYRRw30rH CxJTjF8mUUr8/7Wp1dWCm4bml2z8/6qj1Y60mC0mlvPvNpvdSBlG5ooLFRcSPxydREzA ulnA== X-Forwarded-Encrypted: i=1; AFNElJ+TK4yYvu+SHgcEXiDdB+a/xkjsy2yZsprnRbzKzwL25/SH3Q2euWXq/SFUSUUYJSKgjQtVmrTdDE8iuGY=@vger.kernel.org X-Gm-Message-State: AOJu0YxjgZGShs7l1v9fFyyVowFQZDkzoZQWEdhGs+1KV3/UVaPyVQDq ZDyP49S2jtNMPBZkvsMi7IiE+2jCUnIjs6uEexAZG4a20XY9YPBPoRJmyf5YMM8M9CJUqp3NhwM F/4K+1R8MJ2Ot9kvP9JI/o1a6nlKEwu5e/qMsOr09xeLNgIAoXsFaJmydGOFkWEeW6iI= X-Gm-Gg: Acq92OE67WNE4/HXX0fowwyXIVBYX8Sa5KNTTmrXSfDYYcLzShGtMempvOK1MalRsHB kHZOlB7fNatuSVdRb8b4VvlY0T8IDOPHh6zBJdhFJO3SHUAqXE47HFMxal1WHl0idQHsbSxU1DX 2mktXFjqRxW+f9WcjoOzJrwxkEtgPUEtyRePiDsGhr8NORaLNQMlMK6L/dI//GMwEwSN5VzpjUf EnsJ6vXVJsguVSpcGo35o9ftK9aHAzwQGsXIE83Jq/koqw0xwQEygHoVBK10GeqdR+XmnI66Ye/ p9xzEbk2Xruhq5jSiexNSNQ58o4W4ufAQwS+OW77XL3/sQkEMZfStG62uux975CWOjWazsORpJw uDX+87G2uvvjQe5s+75zfzhWpCRHyLxW0 X-Received: by 2002:a05:6a00:44c6:b0:83a:7516:5be0 with SMTP id d2e1a72fcca58-83f05bfdfa7mr7252559b3a.50.1778766877708; Thu, 14 May 2026 06:54:37 -0700 (PDT) X-Received: by 2002:a05:6a00:44c6:b0:83a:7516:5be0 with SMTP id d2e1a72fcca58-83f05bfdfa7mr7252531b3a.50.1778766877167; Thu, 14 May 2026 06:54:37 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c5c020sm2828875b3a.30.2026.05.14.06.54.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:36 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 12/16] drm/msm/a8xx: Add perfcntr flush sequence Date: Thu, 14 May 2026 06:40:00 -0700 Message-ID: <20260514134052.361771-13-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX5tvEgprHnDPi 52qTM778hvrtjIG9uhSM3GLGWHGexjyRdHhSTnjfxKugE/U9zzfIBU+2RvR+b0YHDM/bHsUU0bF oYHs+BVka6y5r/2TUj11s980wxo0qcS0nqwpdVC6JUX0wNFFA3upl48qfOENyTzPFmlpUJAw+Ts VUS/JgsygqIHMZYVDv2a0Tufy6IRVvblOVDqERu5TvMJPQvFY9MNMsCROMoOdhguZN7vXFZoQAA 91GGbFqlawWRSdkpwLPL2AUp+w6Vg1lmv9mdMmIUcfE2FSRCCg/Dd2Jxtikp2hRXGTPOrQKgdGh BuPUHz2Hnu+XGLe+yvukRkFhW9BQER0MAqTY2GBBHSt2EfZZqu67gq1UucN18G8o1YX2QaoqRtt A/ppSZYJx+AkMp/aoDior74hU228X1IYIqV1iZhXTSWVZt6F2V9n/hmstm094his3JD9oKpfr5V U4d8mqcGhFDsPoIgidw== X-Proofpoint-GUID: 3CF_d85Quj2mr8G9WOdhFIzpPZtmvsrA X-Authority-Analysis: v=2.4 cv=YZSNIQRf c=1 sm=1 tr=0 ts=6a05d41e cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=W-43u8CF5Pkpiqpb4b0A:9 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-ORIG-GUID: 3CF_d85Quj2mr8G9WOdhFIzpPZtmvsrA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 impostorscore=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" With the slice architecture, we need to flush the slice and unslice counters to perf RAM before reading counters. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 1 + drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 1 + drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index 30df9bfa9ef8..a329d20033d7 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -2921,6 +2921,7 @@ const struct adreno_gpu_funcs a8xx_gpu_funcs =3D { .progress =3D a8xx_progress, .sysprof_setup =3D a6xx_gmu_sysprof_setup, .perfcntr_configure =3D a6xx_perfcntr_configure, + .perfcntr_flush =3D a8xx_perfcntr_flush, }, .init =3D a6xx_gpu_init, .get_timestamp =3D a8xx_gmu_get_timestamp, diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.h index 99c3e55f5ca8..3491a24a9320 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -334,5 +334,6 @@ void a8xx_preempt_hw_init(struct msm_gpu *gpu); void a8xx_preempt_trigger(struct msm_gpu *gpu); void a8xx_preempt_irq(struct msm_gpu *gpu); bool a8xx_progress(struct msm_gpu *gpu, struct msm_ringbuffer *ring); +void a8xx_perfcntr_flush(struct msm_gpu *gpu); void a8xx_recover(struct msm_gpu *gpu); #endif /* __A6XX_GPU_H__ */ diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a8xx_gpu.c index 124d315b2469..6c040f718176 100644 --- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c @@ -1345,3 +1345,23 @@ bool a8xx_progress(struct msm_gpu *gpu, struct msm_r= ingbuffer *ring) { return true; } + +void a8xx_perfcntr_flush(struct msm_gpu *gpu) +{ + u32 val; + + /* + * Flush delta counters (both perf counters and pipe stats) present in + * RBBM_S and RBBM_US to perf RAM logic to get the latest data. + */ + gpu_write(gpu, REG_A8XX_RBBM_PERFCTR_FLUSH_HOST_CMD, BIT(0)); + gpu_write(gpu, REG_A8XX_RBBM_SLICE_PERFCTR_FLUSH_HOST_CMD, BIT(0)); + + /* Ensure all writes are posted before polling status register */ + wmb(); + + if (gpu_poll_timeout(gpu, REG_A8XX_RBBM_PERFCTR_FLUSH_HOST_STATUS, val, + val & BIT(0), 100, 100 * 1000)) { + dev_err(&gpu->pdev->dev, "Perfcounter flush timed out: status=3D0x%08x\n= ", val); + } +} --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 5AC7540FD84 for ; Thu, 14 May 2026 13:54:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766888; cv=none; b=qQ0hJ1zRxkNATy9bWzAWIckXw7myzQR7lWMdH1sUmA2U84+s7X9C7SQEtzevY465sDsmb5DCF9d5HHw9gx4M+l5EsQjx3LnjYrB0vwFqweacAYdh4BYmT/Nw8GoGOPDSxLhx37kz2dB2KNn4RpGeRpAaGrIKuPW3+n58T+c4dGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766888; c=relaxed/simple; bh=LeVU+hmK7H5MLMz80TgGx7r9x6BTvjOiTye/VVMyqUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e/UvLWFjk5m8sajondVrHPrh+/zDra5KVv8Lvp8FL2jTJ4ZmRfiaoX8TyjfKOy0+PzcFrLGCv0tGzZmdSU+1QOB5M3TGxHjulPsY8yZiyBWZV7T3jVQeN7cW0Ly+HcITzHZoimuk1cXFE/O+O+NE2AAH/mqLDudCzdMc8aIrN3M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fwoGx+7K; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=PKdtQGjo; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fwoGx+7K"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="PKdtQGjo" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeWVb3048562 for ; Thu, 14 May 2026 13:54:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=NgbLFKj2Ox/ +BqDElf7egdw32fjl3Rv4pdZtcTVKv1g=; b=fwoGx+7Kh6OPEcVlDD7TNmvtFg/ vdHeSy2CH9yxGIXWWiGnKccXjKB1cvkXhYdrXt1LfpwsqaVf7A3PtvbsrXVVTcHJ KHFVER5XI4oT26YmhnJ7kHx0OvLuiMIIkzprEtQw2diaJNhsFhH3mEN1BcHns7gJ ZbBYcilGLKyj12uUV257jO88nvj/ppADy8pRmaeBTYidEqQc2hn48F0TJMXg2RGL 3qVn2eFss8OcHbe3snnFYV/4ncX+FUn3vlMbeU6bQzr3C4IruWvMOlga+lwt0Ncl GIbaxPvT/WHQrA7x82HC0fk0PctLoZYDIBwLkoQe95I3diDCnIoVVEbQy0w== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5492tc7w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:44 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-c827c880e39so3041652a12.0 for ; Thu, 14 May 2026 06:54:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766883; x=1779371683; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NgbLFKj2Ox/+BqDElf7egdw32fjl3Rv4pdZtcTVKv1g=; b=PKdtQGjoQ0tlkluvueITpDvUUpw4vdVSv5EPmCUuuIXYyno1sdzFug/1sOVLlwNKb/ dXk39cWd+uYAwWQzlrCXk8Plpd6t035VtF1rYdusXD7SZs2BXnDpzYDYDDt2XesTB19+ vLHFqyZISWnelgHLFT6LKJMvBhumDHbHJjci+sEUQBLErNdO2/3szblyvnkQrJ0+wrNt hrFtApzJmy+qaUUJEvIjdm50MgozTtMdQpCtMCGlZpUus4dSvi/vxNf2IwRqD9nohq5M s5bFpUV0+GRjVeMr8N1SKOJIvcwjbhsdu5rdGgdjXlSDywJa6c0aAn1eBd6uDmsI2r9E RSxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766883; x=1779371683; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NgbLFKj2Ox/+BqDElf7egdw32fjl3Rv4pdZtcTVKv1g=; b=OdtbuTm3J8sO7fiXXJ2D0XAiZjY39K4LKsij3Z7QKeh35Ny/fiC3FLA/c28dENyDhO FTjaWoSqTXkDZ4GNuCq+yrKMB5tREMvooYjSyh7Znccr+IPjRJ3M2UbZ1L9mt/rIYiDm CTc7P07ANvEZMdFGhhm6G18tqTINEFgjw54KYkzj0d++gX0KvslMa+nZX0+DskY39ywh QybpbK7247uJlmsoBWpfVC5Wt9UlL4KxSTRB7LugdTwDCZg+oUM15ivqIgnn8nPpvIsU c1BFs1GeByqLQSzjc4LMi0dTiZp4sIPlhHvJyB9Y/iKk9cHJxrnHGGjAH0ZdwKIg+bdS s3lw== X-Forwarded-Encrypted: i=1; AFNElJ/lou/rM9j1D1ZuIgaf8V61HwsYy8kl0gxHU4saZ9pgX8+gJrtlfTKxJa2fTQIyKE0cGwSHJt6aoy6iOiU=@vger.kernel.org X-Gm-Message-State: AOJu0YxAB/pHJuxxSpIYMTvWuZiWZF/X+TuMiJ/JpS67SikEhPkMllwv RabdoVrzx/6zISdfnWV1DJFznZtpnhOc+Abo3hbSl2pcN/UWdETTtcY8XZIahewF5dR9gci7K0A EzXCYaPgEKh6qHPYNpdjHwLQMG4U7G4p6YTbWWCTbAeCDoTTfgxZ7gW/QrBSxQvIE7Xc= X-Gm-Gg: Acq92OEE0Gf/fc6Wk+JqsOOLMoftphbnmUvT+8oNV+hGw+TFnR1mD8WcLyQV/9yEnEb mxwc2csW/BAMIBHpnXl+ej5LKXhsd5iRYJIyVXFfnh4n68FRk8XrxuQTWYn3OivRNXfb5CynGr6 STYAgNuNzHFirhoSy7SOyHOrwmec3FGKRUE8/IhJV8muhTZlVzBmxMt9XGT3IpNpVwvUfAnFHEe BXWVpXoe8GJYakjR6OzGojxnKyb7SA2oQWO0dWq9Or1AbxlEQbHW8B14KCCNYfFYAGJ1CO4dCiN 6g9r4XhTIaJFrpTYi658fT0zZH4Q595Lf5tnDS+geK9T4m5oZwRjN2CLicTeqYiKdavMdNkjaB2 EX6IcwOgISXfo5IMuVFjGHIhdtH60kND8 X-Received: by 2002:a05:6a20:3950:b0:3a2:d989:2b3a with SMTP id adf61e73a8af0-3af7f875047mr9159201637.20.1778766882799; Thu, 14 May 2026 06:54:42 -0700 (PDT) X-Received: by 2002:a05:6a20:3950:b0:3a2:d989:2b3a with SMTP id adf61e73a8af0-3af7f875047mr9159121637.20.1778766881963; Thu, 14 May 2026 06:54:41 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f1977b779sm2977644b3a.23.2026.05.14.06.54.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:40 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Konrad Dybcio , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 13/16] drm/msm: Add PERFCNTR_CONFIG ioctl Date: Thu, 14 May 2026 06:40:01 -0700 Message-ID: <20260514134052.361771-14-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-GUID: F4EKhIwYx4kmcQ1yuUoDyT064gbxxBl- X-Authority-Analysis: v=2.4 cv=R74z39RX c=1 sm=1 tr=0 ts=6a05d424 cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=W4oHwWUT8aixCVaBVEUA:9 a=3WC7DwWrALyhR5TkjVHa:22 X-Proofpoint-ORIG-GUID: F4EKhIwYx4kmcQ1yuUoDyT064gbxxBl- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX4zi5at4DbOr8 9WSdruK90Bqfc9ZCx3d/cgQpIo66tfx3Q5fINrxQjFytjKaTOODcly+UZWDZhLKeJRaW1jz2Bfv ppSG1QXH3KrkHdDbwrq6HxACTx5C7hs/HCfZG/JQP86TztWQMyLpuK0jrkHPIaA92yBJVY5Ia+a HTecoeudMIYdT0uKuzFScwtyCFf40dSIdls1j3pI2vsls9R7kftcicEoaMbhgbK0jVBhyIYqyT1 qvT3xvCx1ydqZKsxHnFHR3c9ULwi70EAMLT/v6JL/kRnm/pkZFUWeLX7SFu9EZddowjdRmnGTf/ U/Q9vIu/QzU79SCpD6iJhkQsPl8KWrD8r0bJuwqhee9fTmnwW9R7AMY8Dy6ktykUvcNhJN4JvQQ 4j6LONazeAzhRT6eXERMRHDZ51+3HJf+dPtTzKU0FG9MurCfbvKxktKvwNxfw8k746+3RPxfjsE hpXpZNq3I47EDjDlN5g== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 impostorscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Add new UABI and implementation of PERFCNTR_CONFIG ioctl. A bit more work is required to configure the pwrup_reglist for the GMU to restore SELect regs on exist of IFPC, before we can stop disabling IFPC while global counter collection. This will follow in a later commit, but will be transparent to userspace. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/msm_drv.c | 1 + drivers/gpu/drm/msm/msm_drv.h | 2 + drivers/gpu/drm/msm/msm_gpu.h | 3 + drivers/gpu/drm/msm/msm_perfcntr.c | 516 +++++++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_perfcntr.h | 51 +++ include/uapi/drm/msm_drm.h | 48 +++ 6 files changed, 621 insertions(+) diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 3066547f319b..0a7fc06113e0 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -801,6 +801,7 @@ static const struct drm_ioctl_desc msm_ioctls[] =3D { DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM= _RENDER_ALLOW), DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query, DRM= _RENDER_ALLOW), DRM_IOCTL_DEF_DRV(MSM_VM_BIND, msm_ioctl_vm_bind, DRM_RENDER_AL= LOW), + DRM_IOCTL_DEF_DRV(MSM_PERFCNTR_CONFIG, msm_ioctl_perfcntr_config, DR= M_RENDER_ALLOW), }; =20 static void msm_show_fdinfo(struct drm_printer *p, struct drm_file *file) diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index f00b2e7aeb91..204e140ac8e9 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -237,6 +237,8 @@ int msm_ioctl_vm_bind(struct drm_device *dev, void *dat= a, =20 int msm_perfcntr_resume(struct msm_gpu *gpu); void msm_perfcntr_suspend(struct msm_gpu *gpu); +int msm_ioctl_perfcntr_config(struct drm_device *dev, void *data, + struct drm_file *file); =20 struct msm_perfcntr_state * msm_perfcntr_init(struct msm_gpu *gpu); void msm_perfcntr_cleanup(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index be922641a14f..cb74b7606987 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -353,6 +353,9 @@ struct msm_perfcntr_state { /** @stream: current global counter stream if active */ struct msm_perfcntr_stream *stream; =20 + /** @sel_seqno: counter for sel_fence */ + uint32_t sel_seqno; + /** * @groups: Global perfcntr stream group state. * diff --git a/drivers/gpu/drm/msm/msm_perfcntr.c b/drivers/gpu/drm/msm/msm_p= erfcntr.c index 04407260a4e1..d6716ce0657a 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.c +++ b/drivers/gpu/drm/msm/msm_perfcntr.c @@ -3,13 +3,44 @@ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ =20 +#include "drm/drm_file.h" +#include "drm/msm_drm.h" + +#include "linux/anon_inodes.h" +#include "linux/gfp_types.h" +#include "linux/poll.h" +#include "linux/slab.h" + #include "msm_drv.h" #include "msm_gpu.h" #include "msm_perfcntr.h" =20 +#include "adreno/adreno_gpu.h" + +/* space used: */ +#define fifo_count(stream) \ + (CIRC_CNT((stream)->fifo.head, (stream)->fifo.tail, (stream)->fifo_size)) +#define fifo_count_to_end(stream) \ + (CIRC_CNT_TO_END((stream)->fifo.head, (stream)->fifo.tail, (stream)->fifo= _size)) +/* space available: */ +#define fifo_space(stream) \ + (CIRC_SPACE((stream)->fifo.head, (stream)->fifo.tail, (stream)->fifo_size= )) + static int msm_perfcntr_resume_locked(struct msm_perfcntr_stream *stream) { + if (!stream) + return 0; + + /* Reprogram SEL regs on highest priority rb: */ + struct msm_ringbuffer *ring =3D stream->gpu->rb[0]; + + queue_work(ring->sched.submit_wq, &stream->sel_work); + + hrtimer_start(&stream->sample_timer, + ns_to_ktime(stream->sample_period_ns), + HRTIMER_MODE_REL_PINNED); + return 0; } =20 @@ -25,6 +56,22 @@ msm_perfcntr_resume(struct msm_gpu *gpu) static void msm_perfcntr_suspend_locked(struct msm_perfcntr_stream *stream) { + if (!stream) + return; + + hrtimer_cancel(&stream->sample_timer); + kthread_cancel_work_sync(&stream->sample_work); + + /* + * We can't use cancel_work_sync() here, since sel_work acquires + * gpu->lock which (a) in suspend path can already be held, or + * (b) in release path would invert the order of gpu->lock and + * gpu->perfcntr_lock. Either would cause deadlock. + */ + cancel_work(&stream->sel_work); + + stream->sel_fence =3D ++stream->gpu->perfcntrs->sel_seqno; + stream->seqno =3D 0; } =20 void @@ -36,6 +83,475 @@ msm_perfcntr_suspend(struct msm_gpu *gpu) msm_perfcntr_suspend_locked(gpu->perfcntrs->stream); } =20 +static int +msm_perfcntrs_stream_release(struct inode *inode, struct file *file) +{ + struct msm_perfcntr_stream *stream =3D file->private_data; + struct msm_gpu *gpu =3D stream->gpu; + + scoped_guard (mutex, &gpu->perfcntr_lock) { + struct msm_perfcntr_state *perfcntrs =3D gpu->perfcntrs; + + msm_perfcntr_suspend_locked(stream); + perfcntrs->stream =3D NULL; + + /* release previously allocated counters: */ + for (unsigned i =3D 0; i < gpu->num_perfcntr_groups; i++) + perfcntrs->groups[i]->allocated_counters =3D 0; + } + + /* + * In the suspend path we use async cancel_work(), to avoid blocking + * on sel_work, which acquires gpu->lock (which could deadlock since + * other paths acquire gpu->lock before perfcntr_lock) or already + * hold gpu->lock. + * + * But since we are freeing the stream, after dropping perfcntr_lock + * we need to block until sel_work is done: + */ + cancel_work_sync(&stream->sel_work); + + kfree(stream->group_idx); + kfree(stream->fifo.buf); + kfree(stream); + + return 0; +} + +static __poll_t +msm_perfcntrs_stream_poll(struct file *file, poll_table *wait) +{ + struct msm_perfcntr_stream *stream =3D file->private_data; + __poll_t events =3D 0; + + poll_wait(file, &stream->poll_wq, wait); + + /* Are there samples to read? */ + if (fifo_count(stream) > 0) + events |=3D EPOLLIN; + + return events; +} + +static ssize_t +msm_perfcntrs_stream_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + struct msm_perfcntr_stream *stream =3D file->private_data; + int ret; + + if (!(file->f_flags & O_NONBLOCK)) { + ret =3D wait_event_interruptible(stream->poll_wq, + fifo_count(stream) > 0); + if (ret) + return ret; + } + + guard(mutex)(&stream->read_lock); + + struct circ_buf *fifo =3D &stream->fifo; + const char *fptr =3D &fifo->buf[fifo->tail]; + + /* + * Note that smp_load_acquire() is not strictly required + * as CIRC_CNT_TO_END() does not access the head more than + * once. + */ + count =3D min_t(size_t, count, fifo_count_to_end(stream)); + if (copy_to_user(buf, fptr, count)) + return -EFAULT; + + smp_store_release(&fifo->tail, (fifo->tail + count) & (stream->fifo_size = - 1)); + *ppos +=3D count; + + return count; +} + +static const struct file_operations stream_fops =3D { + .owner =3D THIS_MODULE, + .release =3D msm_perfcntrs_stream_release, + .poll =3D msm_perfcntrs_stream_poll, + .read =3D msm_perfcntrs_stream_read, +}; + +static void +sel_worker(struct work_struct *w) +{ + struct msm_perfcntr_stream *stream =3D + container_of(w, typeof(*stream), sel_work); + struct msm_gpu *gpu =3D stream->gpu; + /* Reprogram SEL regs on highest priority rb: */ + struct msm_ringbuffer *ring =3D stream->gpu->rb[0]; + + /* + * If in the process of resuming, wait for that. Otherwise sel_worker + * which is enqueued in the resume path can be scheduled before the + * resume completes. + */ + pm_runtime_barrier(&gpu->pdev->dev); + + /* + * sel_work could end up scheduled before suspend, but running + * after. See msm_perfcntr_suspend_locked() + * + * So if we end up running sel_work after the GPU is already + * suspended, just bail. It will be scheduled again after + * the GPU is resumed. + */ + if (!pm_runtime_get_if_active(&gpu->pdev->dev)) + return; + + scoped_guard (mutex, &gpu->lock) { + guard(mutex)(&gpu->perfcntr_lock); + + if (stream =3D=3D gpu->perfcntrs->stream) { + msm_gpu_hw_init(gpu); + gpu->funcs->perfcntr_configure(gpu, ring, stream); + } + } + + pm_runtime_put_autosuspend(&gpu->pdev->dev); +} + +static void +sample_write(struct msm_perfcntr_stream *stream, int *head, const void *bu= f, size_t sz) +{ + /* + * FIFO size is power-of-two, and guaranteed to have enough space to + * fit what we are writing. So we should not hit the wrap-around + * point writing things that are power-of-two sized + */ + WARN_ON(CIRC_SPACE_TO_END(*head, stream->fifo.tail, stream->fifo_size) < = sz); + + memcpy(&stream->fifo.buf[*head], buf, sz); + + /* Advance head, wrapping around if necessary: */ + *head =3D (*head + sz) & (stream->fifo_size - 1); +} + +static void +sample_write_u32(struct msm_perfcntr_stream *stream, int *head, uint32_t v= al) +{ + sample_write(stream, head, &val, sizeof(val)); +} + +static void +sample_write_u64(struct msm_perfcntr_stream *stream, int *head, uint64_t v= al) +{ + sample_write(stream, head, &val, sizeof(val)); +} + +static void +sample_worker(struct kthread_work *work) +{ + struct msm_perfcntr_stream *stream =3D + container_of(work, typeof(*stream), sample_work); + struct msm_gpu *gpu =3D stream->gpu; + struct msm_rbmemptrs *memptrs =3D gpu->rb[0]->memptrs; + + if (memptrs->perfcntr_fence !=3D stream->sel_fence) + return; + + /* + * Ensure we have enough space to capture a sample period's + * worth of data: + */ + if (stream->period_size > fifo_space(stream)) { + stream->seqno =3D 0; + return; + } + + if (gpu->funcs->perfcntr_flush) + gpu->funcs->perfcntr_flush(gpu); + + /* Keep local copy of head to avoid updating fifo until the end: */ + int head =3D stream->fifo.head; + + /* + * We expect the GPU to be powered at this point, as the timer + * and kthread work are canceled/flushed in the suspend path: + */ + sample_write_u64(stream, &head, + to_adreno_gpu(gpu)->funcs->get_timestamp(gpu)); + sample_write_u32(stream, &head, stream->seqno++); + sample_write_u32(stream, &head, 0); + + for (unsigned i =3D 0; i < stream->nr_groups; i++) { + unsigned group_idx =3D msm_perfcntr_group_idx(stream, i); + unsigned base =3D msm_perfcntr_counter_base(stream, group_idx); + + const struct msm_perfcntr_group *group =3D + &gpu->perfcntr_groups[group_idx]; + + struct msm_perfcntr_group_state *group_state =3D + gpu->perfcntrs->groups[group_idx]; + + unsigned nr =3D group_state->allocated_counters; + for (unsigned j =3D 0; j < nr; j++) { + const struct msm_perfcntr_counter *counter =3D + &group->counters[j + base]; + uint64_t val =3D gpu_read64(gpu, counter->counter_reg_lo); + sample_write_u64(stream, &head, val); + } + } + + smp_store_release(&stream->fifo.head, head); + wake_up_all(&stream->poll_wq); +} + +static enum hrtimer_restart +sample_timer(struct hrtimer *hrtimer) +{ + struct msm_perfcntr_stream *stream =3D + container_of(hrtimer, typeof(*stream), sample_timer); + + kthread_queue_work(stream->gpu->worker, &stream->sample_work); + + hrtimer_forward_now(hrtimer, ns_to_ktime(stream->sample_period_ns)); + + return HRTIMER_RESTART; +} + +static int +get_group_idx(struct msm_gpu *gpu, const char *name, size_t len) +{ + for (unsigned i =3D 0; i < gpu->num_perfcntr_groups; i++) { + const struct msm_perfcntr_group *group =3D + &gpu->perfcntr_groups[i]; + if (!strncmp(group->name, name, len)) + return i; + } + + return -1; +} + +static int +get_available_counters(struct msm_gpu *gpu, int group_idx, uint32_t flags) +{ + struct msm_perfcntr_state *perfcntrs =3D gpu->perfcntrs; + + /* + * For local counter reservation, anything that is not used by + * global perfcntr stream is available: + */ + if (!(flags & MSM_PERFCNTR_STREAM)) { + return gpu->perfcntr_groups[group_idx].num_counters - + perfcntrs->groups[group_idx]->allocated_counters; + } + + /* + * For global counter collection, anything that is not reserved by + * one or more contexts is available: + */ + guard(mutex)(&gpu->dev->filelist_mutex); + + unsigned reserved_counters =3D 0; + struct drm_file *file; + + list_for_each_entry (file, &gpu->dev->filelist, lhead) { + struct msm_context *ctx =3D file->driver_priv; + + if (!ctx || !ctx->perfctx) + continue; + + unsigned n =3D ctx->perfctx->reserved_counters[group_idx]; + reserved_counters =3D max(reserved_counters, n); + } + + return gpu->perfcntr_groups[group_idx].num_counters - reserved_counters; +} + +int +msm_ioctl_perfcntr_config(struct drm_device *dev, void *data, struct drm_f= ile *file) +{ + struct msm_drm_private *priv =3D dev->dev_private; + const struct drm_msm_perfcntr_config *args =3D data; + struct msm_context *ctx =3D file->driver_priv; + struct msm_gpu *gpu =3D priv->gpu; + int stream_fd =3D 0; + + if (!gpu || !gpu->num_perfcntr_groups) + return -ENXIO; + + struct msm_perfcntr_state *perfcntrs =3D gpu->perfcntrs; + + /* + * Validate args that don't require locks/power first: + */ + + if (args->flags & ~MSM_PERFCNTR_FLAGS) + return UERR(EINVAL, dev, "invalid flags"); + + if (args->nr_groups && !args->group_stride) + return UERR(EINVAL, dev, "invalid group_stride"); + + if (args->flags & MSM_PERFCNTR_STREAM) { + if (!perfmon_capable()) + return UERR(EPERM, dev, "invalid permissions"); + if (!args->nr_groups) + return UERR(EINVAL, dev, "invalid nr_groups"); + if (!args->period) + return UERR(EINVAL, dev, "invalid sampling period"); + } else { + if (args->period) + return UERR(EINVAL, dev, "sampling period not allowed"); + if (args->bufsz_shift) + return UERR(EINVAL, dev, "sample buf size not allowed"); + } + + if (args->nr_groups && !args->groups) + return UERR(EINVAL, dev, "no groups"); + + /* + * To avoid iterating over the groups multiple times, allocate and setup + * both a ctx and global stream object. Only one of the two will be + * kept in the end. + */ + + struct msm_perfcntr_context_state *perfctx __free(kfree) =3D kzalloc( + struct_size(perfctx, reserved_counters, gpu->num_perfcntr_groups), + GFP_KERNEL); + if (!perfctx) + return -ENOMEM; + + struct msm_perfcntr_stream *stream __free(kfree) =3D + kzalloc(sizeof(*stream), GFP_KERNEL); + if (!stream) + return -ENOMEM; + + uint32_t *group_idx __free(kfree) =3D + kcalloc(args->nr_groups, sizeof(uint32_t), GFP_KERNEL); + if (!group_idx) + return -ENOMEM; + + stream->gpu =3D gpu; + stream->sample_period_ns =3D args->period; + stream->nr_groups =3D args->nr_groups; + stream->fifo_size =3D 1 << args->bufsz_shift; + + mutex_init(&stream->read_lock); + + guard(mutex)(&gpu->perfcntr_lock); + + if (args->flags & MSM_PERFCNTR_STREAM) { + if (perfcntrs->stream) + return UERR(EBUSY, dev, "perfcntr stream already open"); + } + + size_t bufsz =3D 16; /* header size includes seqno and 64b timestamp: */ + int ret =3D 0; + + for (unsigned i =3D 0; i < args->nr_groups; i++) { + struct drm_msm_perfcntr_group g =3D {0}; + void __user *userptr =3D + u64_to_user_ptr(args->groups + (i * args->group_stride)); + + if (copy_from_user(&g, userptr, args->group_stride)) + return -EFAULT; + + if (g.pad) + return UERR(EINVAL, dev, "groups[%d]: invalid pad", i); + + int idx =3D get_group_idx(gpu, g.group_name, sizeof(g.group_name)); + + if (idx < 0) + return UERR(EINVAL, dev, "groups[%d]: unknown group", i); + + if (g.nr_countables > gpu->perfcntr_groups[idx].num_counters) + return UERR(EINVAL, dev, "groups[%d]: too many counters", i); + + if (args->flags & MSM_PERFCNTR_STREAM) { + if (g.nr_countables && !g.countables) + return UERR(EINVAL, dev, "groups[%d]: no countables", i); + } else { + if (g.countables) + return UERR(EINVAL, dev, "groups[%d]: countables should be NULL", i); + } + + int avail_counters =3D get_available_counters(gpu, idx, args->flags); + if (g.nr_countables > avail_counters) { + /* + * Defer error return until we process all groups, in + * case there are other E2BIG groups: + */ + ret =3D UERR(E2BIG, dev, "groups[%d]: too few counters available", i); + + if (args->flags & MSM_PERFCNTR_UPDATE) { + /* Let userspace know how many counters are actually avail: */ + g.nr_countables =3D avail_counters; + if (copy_to_user(userptr, &g, args->group_stride)) + return -EFAULT; + } + } + + group_idx[i] =3D idx; + perfctx->reserved_counters[idx] =3D g.nr_countables; + + if (args->flags & MSM_PERFCNTR_STREAM) { + perfcntrs->groups[idx]->allocated_counters =3D g.nr_countables; + + size_t sz =3D sizeof(uint32_t) * g.nr_countables; + void __user *userptr =3D u64_to_user_ptr(g.countables); + + if (copy_from_user(perfcntrs->groups[idx]->countables, userptr, sz)) + return -EFAULT; + + /* Samples are 64b per countable: */ + bufsz +=3D 2 * sz; + } + } + + if (ret) + return ret; + + if (args->flags & MSM_PERFCNTR_STREAM) { + /* + * Validate requested buffer size is large enough for at least + * a single sample period. + * + * Note the circ_buf implementation needs to be 1 byte larger + * than max it can hold (see CIRC_SPACE()). + */ + if (stream->fifo_size <=3D bufsz) + return UERR(EINVAL, dev, "required buffer size: %zu", bufsz); + + if (stream->fifo_size > SZ_128M) + return UERR(EINVAL, dev, "buffer size too big (>128M): %zu", bufsz); + + /* There aren't enough counters to hit this limit: */ + WARN_ON(bufsz > SZ_128M); + + stream->period_size =3D bufsz; + + void *buf __free(kfree) =3D + kmalloc(1 << args->bufsz_shift, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + stream_fd =3D anon_inode_getfd("[msm_perfcntrs]", &stream_fops, stream, = 0); + if (stream_fd < 0) + return stream_fd; + + INIT_WORK(&stream->sel_work, sel_worker); + kthread_init_work(&stream->sample_work, sample_worker); + init_waitqueue_head(&stream->poll_wq); + hrtimer_setup(&stream->sample_timer, sample_timer, + CLOCK_MONOTONIC, HRTIMER_MODE_REL); + + stream->sel_fence =3D ++perfcntrs->sel_seqno; + stream->group_idx =3D no_free_ptr(group_idx); + stream->fifo.buf =3D no_free_ptr(buf); + perfcntrs->stream =3D no_free_ptr(stream); + + msm_perfcntr_resume_locked(perfcntrs->stream); + } else { + kfree(ctx->perfctx); + ctx->perfctx =3D no_free_ptr(perfctx); + } + + return stream_fd; +} + /** * msm_perfcntr_group_idx - map idx of perfcntr group to group_idx * @stream: The global perfcntr stream diff --git a/drivers/gpu/drm/msm/msm_perfcntr.h b/drivers/gpu/drm/msm/msm_p= erfcntr.h index 14506bc37d05..198856b18445 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.h +++ b/drivers/gpu/drm/msm/msm_perfcntr.h @@ -7,6 +7,11 @@ #define __MSM_PERFCNTR_H__ =20 #include "linux/array_size.h" +#include "linux/circ_buf.h" +#include "linux/hrtimer.h" +#include "linux/kthread.h" +#include "linux/wait.h" +#include "linux/workqueue.h" =20 #include "adreno_common.xml.h" =20 @@ -42,12 +47,49 @@ struct msm_perfcntr_stream { /** @gpu: Back-link to the GPU */ struct msm_gpu *gpu; =20 + /** @sample_timer: Timer to sample counters */ + struct hrtimer sample_timer; + + /** @poll_wq: Wait queue for waiting for OA data to be available */ + wait_queue_head_t poll_wq; + + /** @sample_period_ns: Sampling period */ + uint64_t sample_period_ns; + /** @nr_groups: # of counter groups with enabled counters */ uint32_t nr_groups; =20 + /** @seqno: counter for collected samples */ + uint32_t seqno; + /** @sel_fence: Fence for SEL reg programming */ uint32_t sel_fence; =20 + /** + * @sel_work: Worker for SEL reg programming + * + * Initial SEL reg programming (as opposed to restoring the SEL + * regs on runpm resume) must run on the same ordered wq as is + * used by drm_sched, to serialize it with GEM_SUBMITs written + * into the same ringbuffer. + */ + struct work_struct sel_work; + + /** + * @sample_work: Worker for collecting samples + */ + struct kthread_work sample_work; + + /** + * @read_lock: + * + * Fifo access is synchronied on the producer side by virtue + * of there being a single timer collecting samples and writing + * into the fifo. It is protected on the consumer side by + * @read_lock. + */ + struct mutex read_lock; + /** * @group_idx: array of nr_groups * @@ -56,6 +98,15 @@ struct msm_perfcntr_stream { * the ioctl call that setup the stream */ uint32_t *group_idx; + + /** @fifo: circular buffer for samples */ + struct circ_buf fifo; + + /** @fifo_size: circular buffer size */ + size_t fifo_size; + + /** @period_size: size of data for single sampling period */ + size_t period_size; }; =20 uint32_t msm_perfcntr_group_idx(const struct msm_perfcntr_stream *stream, = uint32_t n); diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h index b99098792371..7f2e594be4eb 100644 --- a/include/uapi/drm/msm_drm.h +++ b/include/uapi/drm/msm_drm.h @@ -491,6 +491,52 @@ struct drm_msm_submitqueue_query { __u32 pad; }; =20 +#define MSM_PERFCNTR_STREAM 0x00000001 +#define MSM_PERFCNTR_UPDATE 0x00000002 +#define MSM_PERFCNTR_FLAGS ( \ + MSM_PERFCNTR_STREAM | \ + MSM_PERFCNTR_UPDATE | \ + 0) + +struct drm_msm_perfcntr_group { + char group_name[16]; + __u32 nr_countables; + __u32 pad; /* mbz */ + __u64 countables; /* pointer to an array of nr_countables u32 */ +}; + +/* + * Note, for MSM_PERFCNTR_STREAM, the ioctl returns an fd to read recorded + * counters. This only works because the ioctl is DRM_IOW(), if we return= ed + * a out param in the ioctl struct the copy_to_user() (in drm_ioctl()) + * could fault, causing us to leak the fd. + * + * If the ioctl returns with error E2BIG, that means more counters/countab= les + * are requested than are currently available. If MSM_PERFCNTR_UPDATE flag + * is set, drm_msm_perfcntr_group::nr_countables will be updated to return + * the actual # of counters available. + * + * The data read from the has the following format for each sampling perio= d: + * + * uint64_t timestamp; // CP_ALWAYS_ON_COUNTER captured at sample time + * uint32_t seqno; // increments by 1 each period, reset to 0 on = discontinuity + * uint32_t mbz; // pad out counters to 64b + * struct { + * uint64_t counter[nr_countables]; + * } groups[nr_groups]; + * + * The ordering of groups and counters matches the order in PERFCNTR_CONFIG + * ioctl. + */ +struct drm_msm_perfcntr_config { + __u32 flags; /* bitmask of MSM_PERFCNTR_x */ + __u32 nr_groups; /* # of entries in groups array */ + __u64 groups; /* pointer to array of drm_msm_perfcntr_group */ + __u64 period; /* sampling period in ns */ + __u32 bufsz_shift; /* sample buffer size in bytes is 1<; Thu, 14 May 2026 13:54:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766889; cv=none; b=BjUlRvQ0r5iLwvYVm28ctPyjiRST7+X1YWrTYnRh/+eKa4254TKjB8VLHF3RpxFJQSTseWuX//LHdIET0cENZ2hJDgiVbsfZHfTplobrTW2hzY6BF2OjGyM2IZWCAYv+zluWHH6muo6lOFc2J5A1PGMi1hrYLv7tlp82KEInH7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766889; c=relaxed/simple; bh=8mip4aYW915pX9J0+2O7rm1fdDX8AudK3aRzsfX3xKc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DpVdnoiYUd7MCWVJYQUOeY/LOwKMN+8mgUclG/BEwT7s85kjc8/oo2FpPt8AAKaVYlOc8Rg/cS+kc8clEWo0p2xETzy8ULgsHHrUtfw+VNQ1paiHEAQoW0TvE0iUQajx0KMEaHcj7rwfATu8nm/NqtubYiw2mtK0vovZqWo3AM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=HJ2A2hUP; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=SGT8VB7G; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="HJ2A2hUP"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="SGT8VB7G" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeQBG2841036 for ; Thu, 14 May 2026 13:54:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=Xuhe6ygR1yI ktoZp9sFxJLTtkjCvrYy2WoD60aoQU8w=; b=HJ2A2hUP+CGmiN0vNOWTUvpjPp+ JLqrhQ06jbl/4p3HxRpQQjMhTsj3k7vwrIYXEh53lRjkyCHSfeWuNcee4Gk71TqV TtdTlFbCvIVxfVl8NFjYJRw3tHBGQeX8NDokfOqCgWb48515BtXH2xACP2gMcCQ2 dd1fTjU+xa7nt4/s6Hc9VQlMhTnj+yxILGLZGU8wuQlsfRyDaGEcKT2TlMB63DHl +hCo9CdHPNyqPB670SUKeB64Y+AgBECz+loopuPV8+cdDOQzP/poU0gtbJmQNkiu gokSLpK4U76LMwe7Uu5ybGEkZzetFFexxuxAvZEs01C/ey17PISFOMFO6sA== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e5899sn7c-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:45 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-36865d109dcso4834633a91.1 for ; Thu, 14 May 2026 06:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766884; x=1779371684; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Xuhe6ygR1yIktoZp9sFxJLTtkjCvrYy2WoD60aoQU8w=; b=SGT8VB7G8evkB1ujkDKGwP6k97HhitulKJwydhd8w1tVDTLHel7WUthkQ7/vo5pKcr cJRlk0rUkqP4gWr+lFtEzsJoTTjh+U54Xol2CPX0WzkPOI37oxLvLQSINRcSy7RLm077 tp0OvM2HltwoxzbTga0jyJfCX69jdvNbrIvcRJdyr/UvpnnXVjVCZAvg9f6hp3YcENLq DlHPo+/hlAZQ+11ZOu0BuHkj4oBSiG7Y6dC87Dk8vn3Gf8L9swP15eZq5OflFtOJrxxK 2ksAhIRHo3xgCt4VekkyOSLaXLTcyGTnp+fHp47krTQbdnurqwXgvnUQs3IZ//aKOiYu NYBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766884; x=1779371684; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Xuhe6ygR1yIktoZp9sFxJLTtkjCvrYy2WoD60aoQU8w=; b=GWTwXWrbQuX6wcjgkdEDCN0TlKEHhNeOW1bvn8SIQMVVzE4V95vlg9rQ7qx6qA2CIF MuhgAprimiWn71YErx83XFhdgyDBXBXNRHMsjg2A33HnQ5PiLdMkfBggX3Pv7jBsUOH6 88Kj5cs3dtNaSWLJmkFNCj10JnX4DBx5NL43WP7S1oarGMVB1ZA0v2iQZoeBy7ROy3+l jX0kWBDWVZ64Ak+rxJvoM7J/0376Djsjooxf7je5YNz7RtryHLGmb65V6a2GWRwKtpIs 4nOf1maCI6jmIUKlFTTq8amjYnq5Sm1SZTMd40uCzi8NB72JtVqoMZcOi8P4aDQFZg7w YEfA== X-Forwarded-Encrypted: i=1; AFNElJ92HCecYXTWE4Y5NCworTPzNWZQw1TbBlSE0x1nupBYLYcvXywJYtG7jHiYwEN1MBCdnJpL2O2NUAI+1Yk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1pS6xOkbKUigV9zvRfiZZuLD25QxgssMnwSuTxl5R1jKIdcqK 0gJO13fvHbmkD9Yk/J3YQiQTgKHhdAqlkZaWT3H9PEPd7IOohSI7nA6MpOEtm9wr5XnY1UBhABF OsVFCcaSZyzxtW9COE4h/qYEEyw21JWws4hGzSBIycotWDvGrUrCJAQ/gKcHdvVTiPq4= X-Gm-Gg: Acq92OHQg4Jr4TvQgEzoYpjGZs1roF8HV3uffllQl1+r244k+8zAGm/Zf2e8GqqIh1K gSRnkCrmeT8a9W55q2SEyr0v3OZiAJpRRhY2QdOWDYSjlWr4eNLt2yUQmp29AyLGkSdHUvstuCe HPMLO36mHHOQsfggpUlkLdLBjgCMunEAOXKoBrBYm59Dsf8R4UZyH2C5ajOIOu45EvuhKZMWOE+ V33Y05MuP2fg5lbHPpWCFcXjr4ATzD13cjeAFZXrI20YTLHtODExGgEpGuOV7DBecTow0fH5qnv W76KGK4Zsfeh4lrgGWWi9OIPKb7VDcHStf3tgmh+FAgtlZfw7ICDb3jUYrf9NRdmycIyQeTPpxY 3qG/BA41A43J3bGGTPkiDi30k6GYCGlxC X-Received: by 2002:a17:90b:2b90:b0:366:decb:d119 with SMTP id 98e67ed59e1d1-368f780753emr7829560a91.11.1778766884328; Thu, 14 May 2026 06:54:44 -0700 (PDT) X-Received: by 2002:a17:90b:2b90:b0:366:decb:d119 with SMTP id 98e67ed59e1d1-368f780753emr7829515a91.11.1778766883832; Thu, 14 May 2026 06:54:43 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3694f5cd7edsm48006a91.5.2026.05.14.06.54.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:43 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 14/16] drm/msm/a6xx: Increase pwrup_reglist size Date: Thu, 14 May 2026 06:40:02 -0700 Message-ID: <20260514134052.361771-15-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfXzBWFJBMkeq4e JlrzBbzKg1e3uH/V1mkXposV+DH26mcnwS3gEJxmWiZmrr/ZESpc0gT6B+3B+rTkB+BmpxNmQPA uj3EicXcZlQ8HQdrvaIdxh0EvM3lKwUUkWXXsakGV/Mcjn/6Em/nVoyh3+l0tpTy56ctoQugY+G Zolqr5GGqDwkuNCNO2sxUTse0TY7FNFGUNuErAZYgk8XnG554OJI0pganm/qvSoJB5JETbwTMPN HMnsRniDNA1fZT6JSFM+TVPdnq5vGZLM7/fCYySXrLoHdFuqNxshc9H+mrJ5++s7vWBxCnlptJt BDzF6Z5dRykXuhVUhNBNskOmLpkH5AmVNoVhmJjwEST0CHXOOLG/UvkfWV7c0ZcZKCxuXS5O2qr ZyxOGnsH+TfIw3fCmxVyaXuaeUUX5Q2LIBBBMhJnfNtYiy4kwubxttFdjYclJCZ2LMyWedTvMmA y8dF3+l1G2UI566zwSA== X-Proofpoint-ORIG-GUID: HKBb_YdL2dvVU6kjuW1MhTc1CTapc_GY X-Authority-Analysis: v=2.4 cv=N6AZ0W9B c=1 sm=1 tr=0 ts=6a05d425 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=bkW2Msa_OoTtud3PmHQA:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: HKBb_YdL2dvVU6kjuW1MhTc1CTapc_GY X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" To make room for appending SEL reg programming. Without increasing the size, we would overflow the pwrup_reglist at ~190 counters on gen8. Or possibly fewer, considering that some gen8 counter groups also have separate slice vs unslice SELectors. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index a329d20033d7..61c6b0e781ce 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -1183,7 +1183,7 @@ static int a6xx_ucode_load(struct msm_gpu *gpu) msm_gem_object_set_name(a6xx_gpu->shadow_bo, "shadow"); } =20 - a6xx_gpu->pwrup_reglist_ptr =3D msm_gem_kernel_new(gpu->dev, PAGE_SIZE, + a6xx_gpu->pwrup_reglist_ptr =3D msm_gem_kernel_new(gpu->dev, 2 * PAGE_SIZ= E, MSM_BO_WC | MSM_BO_MAP_PRIV, gpu->vm, &a6xx_gpu->pwrup_reglist_bo, &a6xx_gpu->pwrup_reglist_iova); --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 C1A13421A13 for ; Thu, 14 May 2026 13:54:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766890; cv=none; b=nIXDyYE7/ZQxA21woZLYGhBZpr9OTCQ/YfGxRRyZpTlLJX8kucDlxvF09TCe+iP7Rs150hoZOzCSH8bq6setYxPpo/CCqvB8pT7nQNl8awxnjrGs7Oyr6dd88v0eQzI8nl07F9k4U1nJqu02/epCTBmlr8TbRQ6hW4yu+JBI0zc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766890; c=relaxed/simple; bh=YXlsVRsxsY8HQJhxxv03/h8be909bFJIUchGlum4u/U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AZ74ru7Rw71u6o+1DtnBu/HYzuVgaTLsZ0zo2HP9StjYZbc8ynj0N01Gs4JF+Q3tfmJgVCNdLN3KIo9yQjX1VFhQ758Cg+OdtQTw131lpUK75zHvclqDsJ5NszejD9rzlel9ErjkKlotLhWiRzIyHoJQK/cPYzYI/qHqUN4NA+U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=EMpKWF8V; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=PjEasyjd; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="EMpKWF8V"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="PjEasyjd" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBekN13891688 for ; Thu, 14 May 2026 13:54:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=lSG8Ggz0BAp HT/OdECps9ZrqwsJXbtBLlduou4IQHiI=; b=EMpKWF8VGMFXeilUYYHIIKOXwnL uHu8zdqGFvZIHkY7f4PJeeyULy9DMTTBh1L/tkXXqSSSKcDW3EudRCyipmHQHC5Y AkZjX98R1KAvikxyhPoYqZQ2LkeZCpK82X/GjnHIsINQcpybWOzYI1D4wTYVcbRV kMi8fRCORQDkUSVpA4FtqEeIUkbZOExEiSBXpvN25ZpWob4YC6H06cfRPv01plEz ZZkP5EPnc/h4NZAsljQNo8LO6/zGHtbyT4JQ0UvyDtRWeP1UE5a560Vig/HrI0vf HYEJrQLLsRQVahGmanwHxn631VAkM1Th73SAaZBSuE+73+gf1//vWhDbiLw== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e4v4tv8b6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:47 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2b4678c6171so85496295ad.1 for ; Thu, 14 May 2026 06:54:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766887; x=1779371687; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lSG8Ggz0BApHT/OdECps9ZrqwsJXbtBLlduou4IQHiI=; b=PjEasyjdfvK63AjkcG5/9ex5giQb8uXWKpFGd8xsgF4qRzZeP6jquVzxDh7Y84Ckig Es9KoIxcHfb7A0Kr01dI/KsfAUSZDi5+QsfRZoy22udBouG9uDuipjP+xnpcQhys+wG/ wc6YmdTM1Z9tPRdX6/3nMmZqCIzmwPuWxzyQQvj/cVXoCxC3v26pu1wEupJLklGSs48R 2jVIwQv4CsXrNnAtTbImWHeQ24YeOL9Y/s5u3l+EDFlTH209lGRyrk5x3LqNcCr6LO3a BLplfi9hYiMueTzke3sLFWnKUaBq4zR/PyfO/r7wW1ZrqQgvz60XJIWKQCLvCgmG0mXG MWlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766887; x=1779371687; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lSG8Ggz0BApHT/OdECps9ZrqwsJXbtBLlduou4IQHiI=; b=kZXuQnAf7D7bXSo8z/Tu3uUTudJQ2QG/zYqN0itSu0V5mb3fbQBY4xll7k1NRZsbqw /imkzL+ovlcfv9nDJYoHD7m4a+56Fz5Zn1RF2mikTXEJtw5nWwaNHuUZl/dSYq8kLVjl CFXJkv8D0Lve6jaCqFpeK1dqjZ7+4r4xNE+0oe4z+AvSrd7FTK7UW5ZroKkODQ0aRT0m VM14xJzg/eKnihF12Yk2DJhy4y+qMMoINeq5UNUvm1mMcQhtolPZktWop7AS0KqJLobs k+E/qZVxFQQSisI8cdYcHHAkHOln4PrR9UrViuZs4zoLbLnZi5h8CWjvRS9m9SRB9uV1 Ztaw== X-Forwarded-Encrypted: i=1; AFNElJ9TJrHSRkmScl1Wx/f2pp0wRHIllK7hJ1zL8Eq5rjBtB2s1uG07nqRDjMV4+B9fsTEI1oWVMu1OzY2toTc=@vger.kernel.org X-Gm-Message-State: AOJu0YxekWkV2ZcVI9dNsEWbsnX2LUBdgVXvxIOC5mIjilMNXApGyRLg jw11yRPVVp6XQ5SzfCHgRSjjMp7T+QD+YiMq9sAY5qndSa8f8mg7cZj/pCpO2Cvqt0UN1EH1xhR wJ/CrkSwouPxDzAymZkKDIH7jgm9TA6u9q61LpBFXZWLgTYbLgQfWtEK6okJtqA23DYY= X-Gm-Gg: Acq92OHEpiChdwL22HM2RIgYpOFF3MNwJpGQi+uT7/2RcuBUAef7zg54vYVDZ5NpE25 FQgBQCyemPSFOzIu86JgTJM5hCZBrcbaxp8OoU3g4Ue4LkiJ/ybketASKy7XHVD5O4DkgeZVc4R OXDLLjHpfIPbKap1kbtJLiRKntqIjXwDbm0dbPuiLlRC5Z6ysodogj6T6FltgvBdcqoqWnO/sNv ZfnaKeHZa6xO9plMoJb2eI3kImfiOAyVFnpfHHboBadtqX5NYVNbR0HWhL+kuV86B9rWGQHpzEv l+WuuQ5+C6ZDTDPQmz8LeKePYRj0sKDPGwLMdI2rdFB87bnUcxL4VgChjdioWqeVlBY6xmQFBTf Zpzcuu0UaodTHsn1rdNrrRAxkWMgdxioMmW5pkSmEUVM= X-Received: by 2002:a17:902:f54f:b0:2bd:7ca:e67d with SMTP id d9443c01a7336-2bd276dfda1mr91696705ad.29.1778766887240; Thu, 14 May 2026 06:54:47 -0700 (PDT) X-Received: by 2002:a17:902:f54f:b0:2bd:7ca:e67d with SMTP id d9443c01a7336-2bd276dfda1mr91696205ad.29.1778766886583; Thu, 14 May 2026 06:54:46 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5cfe4935sm27139415ad.42.2026.05.14.06.54.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:45 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 15/16] drm/msm/a6xx: Append SEL regs to dyn pwrup reglist Date: Thu, 14 May 2026 06:40:03 -0700 Message-ID: <20260514134052.361771-16-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Authority-Analysis: v=2.4 cv=XIIAjwhE c=1 sm=1 tr=0 ts=6a05d428 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=gjKahejJLxXXi_JFjLAA:9 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfXwGN3ZmbOnkQR 0BuMlfMncx3uIdA7N8AxF3raI3o9GHL0/16Ti0DSelt0o8JvAcWcHI0N7y0NRAzd1OQl8KAh2fa qs6HhbfEvjFzLEUOp5AbTNgItl/VoY561LOxHC+F6GTTaGeoYn72k1SAYGOMNHiks+VEf2Zm/ib sZ2XG2WVnd3Jc0qwKnw0x+f97lA+e95gwoq+5o+uMjVkAa7dt+tw3i7OElfXRHuAVHtPO1vGOKZ CE4I5Kra4VQRZnvtjAJV+/gOOzmx7Ckyi9dFLcRShAmYmB4kDf8NZgan1eEk+5cq/rZda7Ws6W6 5huiklRZhGMCt0KontWm+6hcjSE4bi0PvgtGEBGntYioecd2PY+BOBbo3hf8twuqN+HA61BBH4e 4M0ACUS8gQRbs56hlHeJXQu+wHrGWGbrrbIUvDHIi52H+dhXdhWdyzCyfdultNSCSy7fdIZcLo8 Ph56Cr0Z031SKI4jhCw== X-Proofpoint-ORIG-GUID: JsabmgytfR9TGEuemrk7Bno_vdP_WY-6 X-Proofpoint-GUID: JsabmgytfR9TGEuemrk7Bno_vdP_WY-6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 bulkscore=0 clxscore=1015 spamscore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" This is needed so that SEL reg values are restored on exit from IFPC. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 82 +++++++++++++++++++++++++-- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 11 +++- drivers/gpu/drm/msm/adreno/a8xx_gpu.c | 1 + 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index 61c6b0e781ce..47627e76adcf 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -946,6 +946,7 @@ static void a7xx_patch_pwrup_reglist(struct msm_gpu *gp= u) A7XX_CP_APERTURE_CNTL_HOST_PIPE(PIPE_NONE)); } lock->dynamic_list_len =3D dyn_pwrup_reglist_count; + a6xx_gpu->dynamic_sel_reglist_offset =3D dyn_pwrup_reglist_count; } =20 static int a7xx_preempt_start(struct msm_gpu *gpu) @@ -2535,11 +2536,60 @@ static bool a6xx_progress(struct msm_gpu *gpu, stru= ct msm_ringbuffer *ring) return progress; } =20 +static void +perfcntr_select(struct msm_ringbuffer *ring, enum adreno_pipe pipe, + uint32_t regidx, uint32_t *countables, uint32_t nr, + uint32_t **reglist) +{ + OUT_PKT4(ring, regidx, nr); + for (unsigned i =3D 0; i < nr; i++) + OUT_RING(ring, countables[i]); + + if (!*reglist) + return; + + for (unsigned i =3D 0; i < nr; i++) { + /* + * Bitfield is in same position on a7xx, but only 2 bits.. + * which is sufficient for NONE/BR/BV: + */ + *(*reglist)++ =3D A8XX_CP_APERTURE_CNTL_HOST_PIPEID(pipe); + *(*reglist)++ =3D regidx + i; + *(*reglist)++ =3D countables[i]; + } +} + static void a6xx_perfcntr_configure(struct msm_gpu *gpu, struct msm_ringbuffer *ring, const struct msm_perfcntr_stream *stream) { + struct adreno_gpu *adreno_gpu =3D to_adreno_gpu(gpu); + struct a6xx_gpu *a6xx_gpu =3D to_a6xx_gpu(adreno_gpu); enum adreno_pipe pipe =3D PIPE_NONE; + uint32_t *reglist =3D NULL; + uint32_t *reglist_sel_start; + + if (to_adreno_gpu(gpu)->info->family >=3D ADRENO_7XX_GEN1) { + WARN_ON(!a6xx_gpu->pwrup_reglist_emitted); + + struct cpu_gpu_lock *lock =3D a6xx_gpu->pwrup_reglist_ptr; + int off =3D (2 * lock->ifpc_list_len) + + (2 * lock->preemption_list_len) + + (3 * a6xx_gpu->dynamic_sel_reglist_offset); + + reglist =3D (uint32_t *)&lock->regs[0]; + reglist +=3D off; + reglist_sel_start =3D reglist; + + /* Clear any previously configured SEL reg entries: */ + lock->dynamic_list_len =3D a6xx_gpu->dynamic_sel_reglist_offset; + + /* + * Ensure CP sees the dynamic_list_len update before we + * start modifying the SEL entries: + */ + wmb(); + } =20 for (unsigned i =3D 0; i < stream->nr_groups; i++) { unsigned group_idx =3D msm_perfcntr_group_idx(stream, i); @@ -2567,17 +2617,15 @@ a6xx_perfcntr_configure(struct msm_gpu *gpu, struct= msm_ringbuffer *ring, =20 const struct msm_perfcntr_counter *counter =3D &group->counters[base]; unsigned nr =3D group_state->allocated_counters; - OUT_PKT4(ring, counter->select_reg, nr); - for (unsigned c =3D 0; c < nr; c++) - OUT_RING(ring, group_state->countables[c]); + perfcntr_select(ring, pipe, counter->select_reg, + group_state->countables, nr, ®list); =20 for (unsigned s =3D 0; s < ARRAY_SIZE(counter->slice_select_regs); s++) { if (!counter->slice_select_regs[s]) break; =20 - OUT_PKT4(ring, counter->slice_select_regs[s], nr); - for (unsigned c =3D 0; c < nr; c++) - OUT_RING(ring, group_state->countables[c]); + perfcntr_select(ring, pipe, counter->slice_select_regs[s], + group_state->countables, nr, ®list); } } =20 @@ -2591,6 +2639,28 @@ a6xx_perfcntr_configure(struct msm_gpu *gpu, struct = msm_ringbuffer *ring, OUT_RING(ring, upper_32_bits(rbmemptr(ring, perfcntr_fence))); OUT_RING(ring, stream->sel_fence); =20 + /* + * Update the pwrup reglist size before flushing. Kgsl does a shared- + * memory spinlock dance with SQE to avoid racing with IFPC exit. But + * we can skip that since the ringbuffer programming will be executed + * by SQE after dynamic reglist size is updated. So even if we lose + * the race, the register programming in the rb will overwrite/correct + * the SEL regs restored by SQE on IFPC exit, before sampling begins. + */ + if (reglist) { + struct cpu_gpu_lock *lock =3D a6xx_gpu->pwrup_reglist_ptr; + unsigned nr_regs =3D (reglist - reglist_sel_start) / 3; + + /* + * Ensure CP sees updates to the pwrup_reglist before it + * sees the new (increased) length: + */ + wmb(); + + /* Update dynamic reglist len to include new SEL reg programming: */ + lock->dynamic_list_len =3D a6xx_gpu->dynamic_sel_reglist_offset + nr_reg= s; + } + a6xx_flush_yield(gpu, ring); =20 /* Check to see if we need to start preemption */ diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.h index 3491a24a9320..f3cc9478b079 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -21,17 +21,19 @@ struct cpu_gpu_lock { uint32_t cpu_req; uint32_t turn; union { + /* a6xx: */ struct { uint16_t list_length; uint16_t list_offset; }; + /* a7xx+: */ struct { uint8_t ifpc_list_len; uint8_t preemption_list_len; uint16_t dynamic_list_len; }; }; - uint64_t regs[62]; + uint64_t regs[]; }; =20 /** @@ -100,6 +102,13 @@ struct a6xx_gpu { uint64_t pwrup_reglist_iova; bool pwrup_reglist_emitted; =20 + /* + * Offset of start of SEL regs appended to pwrup_reglist. This + * is equal to lock->dynamic_list_len if no SEL regs are appended + * to the end of the dynamic reglist. + */ + uint16_t dynamic_sel_reglist_offset; + bool has_whereami; =20 void __iomem *llc_mmio; diff --git a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a8xx_gpu.c index 6c040f718176..2ce7c6ac4521 100644 --- a/drivers/gpu/drm/msm/adreno/a8xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a8xx_gpu.c @@ -468,6 +468,7 @@ static void a8xx_patch_pwrup_reglist(struct msm_gpu *gp= u) } =20 lock->dynamic_list_len =3D dyn_pwrup_reglist_count; + a6xx_gpu->dynamic_sel_reglist_offset =3D dyn_pwrup_reglist_count; =20 done: a8xx_aperture_clear(gpu); --=20 2.54.0 From nobody Fri Jun 12 13:56:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 E8D173FB05B for ; Thu, 14 May 2026 13:54:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766892; cv=none; b=rT0ERfptYyaZTe+szgoeyQMdhXAx/Qsblaz4Lpfh1wSLTD8Jhql4h//WI4dC3f5Ii+Sq4mJRdA6pk/QNChE05FRxZ/5y6+5D3HH4K8Du551wsWnLV+hWPPyZs4Chu7n7XR3FrWKyYnwgfy+7c1gjQyipjPNFfQHXfQNqfnE7Y4g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778766892; c=relaxed/simple; bh=GhAfgX9cJ7jP15j1+grgn8Gt5zI3BjvXaBhW/QC8YrQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n+Z8yqUbIoFxgYzmUQaMrGKIgxaYDR2iTk20Oo3w6LfGV/GRRr8Y6Ault2Q7aMh8OqoRAGlmHEH1j0uqIPzqpl4oJteJiXsL7UqHgKQyNgJAOsz8bvAJ9oCRO0PgyyZusAF4KCyN0JIFNWLAhDfI44nCmnJLo+klvvVlfIh6WRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=psN6SNR4; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=AykCxkbl; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="psN6SNR4"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="AykCxkbl" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeYof1717897 for ; Thu, 14 May 2026 13:54:50 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=jWB8IsiT3LX TyyABiITmFtV+44Tckxt2wHe2PuWE1WE=; b=psN6SNR4Qwpg6h9puonGz/3AZ89 BUs2yHNi2GiBaHU1VAuqgtvmZAseDQklEp9JImWZthUGmkl9O+Ox2mV1W9qDRdPH qRoZDNPPCl48adb3Ejw4aajmQG9NUssI8BqhLTUDF414AXoIWinCVG1KF3RIpMf8 DRPoj3NHR3VBERAJvNAytw8wx7sgZWV2jlBt1y+o61Pjdn4XaWDakLmtqbgEUo2n lfnVL0UhJ7f5gWsLaY+AUaHUXuSOdySn5wrezne9eOpOZJ2NfzXcE4IHvyOwVvHW k87Yx3aTWGMT2Q+U4hgfWY9AdjtQYRFqt4U9FW1ChrK4VmENP5+V+W1Gs/A== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e57y7hr66-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 13:54:50 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-837d0d71c61so4825713b3a.1 for ; Thu, 14 May 2026 06:54:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778766889; x=1779371689; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jWB8IsiT3LXTyyABiITmFtV+44Tckxt2wHe2PuWE1WE=; b=AykCxkbl8IN7n1zHxV/pdIjA443eZWxgdJD5PplB0fPUSYMbFPkKkBKNJotW0uIrT9 BPmNhqRMtY1+9onAl0TtxA5SCEw/WIGpuYeo++lhi9M842TICeQ4KS2KmqHC/j9n6H0w 3X5h+DOO3PR4B+7OhAqCNnVp9hZbuhHDRPh7SBhi7SP2/t2ROQH08aihm3fPcHNQSmwv PTo9zlW/b1k+NAst0mpJszqrq7FgouQebQ7b0P3knglAt5wkP0Cg94IPXygOEXBnAs8o oAd3TZ5sh7zcjrL+R9i5BncClkahsN/gwgz0hGJpW2/pAFq5i5S2M5efIaF5aTXeqs69 SSIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778766889; x=1779371689; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jWB8IsiT3LXTyyABiITmFtV+44Tckxt2wHe2PuWE1WE=; b=PLjEjQ0TC+EFI61u3vrwVsm5FVVg1tbxfVwfp0GWOxRKZ1mNUhlOvhjNQ9Yr46TOZ/ v8VuTW6gQHucJqs6MYhvDBygM3Ee+b/SLKvKZwGhu40qWZT6ayZuXRq6uQ3VK5gPg/+C FvfW+M5ajZBasNl4rOZ6Qt3cef+V9zROK+Qg3xcClLN9O7xfK+HAfnzahLNenePuTykg MNvK7In0ZCpUnFSBxc/BFjgv+2I5VV7AZwCsXskS0foxRu720k9X80E1U6RsA3jTTfkR Vhn3IIfaB2K1DXLhVFmeQe4SuWCJvfpWSEDjJeCB1LsS03Zx7eEi/bJ9RNBbGvWDP66O c9XA== X-Forwarded-Encrypted: i=1; AFNElJ/zk4ZBMfnU8FFSqw7lwF2gf1vQcFdWnmqI1d/7CY2ewthXkbyh4BPmtguGK7apyglUYSND38WWbq//ciM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx3XoZg8/M0O1QUEyWCq2ArrGJGb4zQn5M8hwGX8czqKgRTEATs CHbzcbQ2jrezdljxHAsvBjyFFNDE2xhqW1g8e9UeyHJ3GlryH3QzDGG3psP2lDy6nqzh1CzLvLY x+eM+X8dEJ3KZHjAOLV4rDqAsSB3QfY3cQS4FA9g14JCYhX06E5on++bHfg/l+eancmk= X-Gm-Gg: Acq92OFyxXD6/m8gEP4KOSfC+dX0lw/wnDwRupQMgfoP5Rixw2hJvz+qaCtBwGOuKh3 re7m+buOyXeNvDkbCuu1Nl7gEwtgR5IhaYxBG8lKLC8b9Rdy43FCrqAiDUzxxmE6s+uG1LsZPrA mfm8jf+HN2Zp9Uz/stiCtzgEWMKPSXTfphaa25m9agi1rHkKxw9FPm1fLVfZ9sSmx8yEYVcsw7j w1YGePtFd9unqFOroc3Q7zoza7Dkk5OlU1C93UCSoCzBTfTD0HjaC6SEERiutTVQxC4hYg/CeMx B/Nm95CrT7xXdoxMCK7DKfX9Jj6aBttKXC9iL4n3YvQi64Mfl8BD/82xFEVgpHsOBSm+MWLD4oE bAGKC8UNqCIV/iUfWip2yRw2sGb9gLn3f X-Received: by 2002:a05:6a00:194e:b0:837:40f6:cb88 with SMTP id d2e1a72fcca58-83f0427d8b2mr8611805b3a.26.1778766889358; Thu, 14 May 2026 06:54:49 -0700 (PDT) X-Received: by 2002:a05:6a00:194e:b0:837:40f6:cb88 with SMTP id d2e1a72fcca58-83f0427d8b2mr8611772b3a.26.1778766888800; Thu, 14 May 2026 06:54:48 -0700 (PDT) Received: from localhost ([2601:1c0:5000:d5c:4ec8:83f5:8254:6891]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19f79b60sm3162132b3a.52.2026.05.14.06.54.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 06:54:47 -0700 (PDT) From: Rob Clark To: dri-devel@lists.freedesktop.org Cc: linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Akhil P Oommen , Anna Maniscalco , Rob Clark , Sean Paul , Konrad Dybcio , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v6 16/16] drm/msm/a6xx: Allow IFPC with perfcntr stream Date: Thu, 14 May 2026 06:40:04 -0700 Message-ID: <20260514134052.361771-17-robin.clark@oss.qualcomm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260514134052.361771-1-robin.clark@oss.qualcomm.com> References: <20260514134052.361771-1-robin.clark@oss.qualcomm.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-Proofpoint-ORIG-GUID: VnrBhsiFK0D1uTH2ynPEtWMl6F8mXu9N X-Authority-Analysis: v=2.4 cv=UY9hjqSN c=1 sm=1 tr=0 ts=6a05d42a cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=xqWC_Br6kY4A:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=pGLkceISAAAA:8 a=5obZvuzjGUYrwyXX1KsA:9 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-GUID: VnrBhsiFK0D1uTH2ynPEtWMl6F8mXu9N X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE0MCBTYWx0ZWRfX1bMvYb9BX8Dn sSa0LB5ubqqMw9uqlVp2Ff6wur8wVK7YKNDkXy0hECps229Kbd6xCQgYNC6n05H/0VzyERozGcF iRRIgIiMX+4pVNrL9aLyF65ZHTVdSBDZ1Zp6Bzzh7keToDGahypOuNOBoBJNe5f3URGmV6/bODN r9yMW7WfPyXXy/9VXNEYog40qYeCXnfvCZTjjZEuAuDg4FZcrtBaEo4W4wxm9Y3qiW724Ny+cIw iFVq7zofDS6alb2XpoyFG16loARqPzcE86ToEZI22saKHFd+ZbBLuNEafgWd6yv5j9adwM1Lh7y dywXzOWsX6VQyZ29sEeQWcu8by5sWsH88lbqLHtiEt8wcYm0bz91EY29f+rvu7sqLNWcsvMir7p 6k4Q7ujrSoWoWYNIFcxxK9ruQnK3+pAoHxnJ5yEBWLK0axgcYtF3rZ3kq45T0lkZy1jM5I+KMjc XJdZ5Z3CJ7Z9vJTET8Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-14_03,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 priorityscore=1501 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140140 Content-Type: text/plain; charset="utf-8" Now that the dynamic pwrup reglist has SEL reg values to restore appended, so that SEL regs are restored on IFPC exit, we can stop completely disabling IFPC while global counter sampling is active. To accomplish this, we re-use sysprof_setup() with a force_on param to inhibit IFPC specifically while the counter regs are being read, while leaving IFPC enabled the rest of the time. Signed-off-by: Rob Clark Reviewed-by: Anna Maniscalco --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 4 ++-- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 2 +- drivers/gpu/drm/msm/msm_gpu.h | 10 ++-------- drivers/gpu/drm/msm/msm_perfcntr.c | 8 ++++++++ drivers/gpu/drm/msm/msm_submitqueue.c | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.c index aba08fb76249..0a7d49a2c877 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -2034,9 +2034,9 @@ static int a6xx_gmu_get_irq(struct a6xx_gmu *gmu, str= uct platform_device *pdev, return irq; } =20 -void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu) +void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu, bool force_on) { - bool sysprof =3D msm_gpu_sysprof_no_ifpc(gpu); + bool sysprof =3D msm_gpu_sysprof_no_ifpc(gpu) || force_on; struct adreno_gpu *adreno_gpu =3D to_adreno_gpu(gpu); struct a6xx_gpu *a6xx_gpu =3D to_a6xx_gpu(adreno_gpu); struct a6xx_gmu *gmu =3D &a6xx_gpu->gmu; diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.h index f3cc9478b079..eecc71843bed 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -280,7 +280,7 @@ void a6xx_gmu_clear_oob(struct a6xx_gmu *gmu, enum a6xx= _gmu_oob_state state); int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node); int a6xx_gmu_wrapper_init(struct a6xx_gpu *a6xx_gpu, struct device_node *n= ode); void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu); -void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu); +void a6xx_gmu_sysprof_setup(struct msm_gpu *gpu, bool force_on); =20 void a6xx_preempt_init(struct msm_gpu *gpu); void a6xx_preempt_hw_init(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index cb74b7606987..e3b5fab6f68f 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -93,7 +93,7 @@ struct msm_gpu_funcs { * for cmdstream that is buffered in this FIFO upstream of the CP fw. */ bool (*progress)(struct msm_gpu *gpu, struct msm_ringbuffer *ring); - void (*sysprof_setup)(struct msm_gpu *gpu); + void (*sysprof_setup)(struct msm_gpu *gpu, bool force_on); =20 /* Configure perfcntr SELect regs: */ void (*perfcntr_configure)(struct msm_gpu *gpu, struct msm_ringbuffer *ri= ng, @@ -378,13 +378,7 @@ msm_gpu_sysprof_no_perfcntr_zap(struct msm_gpu *gpu) static inline bool msm_gpu_sysprof_no_ifpc(struct msm_gpu *gpu) { - /* - * For now, this is the same condition as disabling perfcntr clears - * on context switch. But once kernel perfcntr IFPC support is in - * place, we will only need to disable IFPC for legacy userspace - * setting SYSPROF param. - */ - return msm_gpu_sysprof_no_perfcntr_zap(gpu); + return refcount_read(&gpu->sysprof_active) > 1; } =20 /* diff --git a/drivers/gpu/drm/msm/msm_perfcntr.c b/drivers/gpu/drm/msm/msm_p= erfcntr.c index d6716ce0657a..df8c2602b4bc 100644 --- a/drivers/gpu/drm/msm/msm_perfcntr.c +++ b/drivers/gpu/drm/msm/msm_perfcntr.c @@ -261,6 +261,10 @@ sample_worker(struct kthread_work *work) return; } =20 + /* Inhibit IFPC while accessing registers: */ + if (gpu->funcs->sysprof_setup) + gpu->funcs->sysprof_setup(gpu, true); + if (gpu->funcs->perfcntr_flush) gpu->funcs->perfcntr_flush(gpu); =20 @@ -295,6 +299,10 @@ sample_worker(struct kthread_work *work) } } =20 + /* Re-enable IFPC: */ + if (gpu->funcs->sysprof_setup) + gpu->funcs->sysprof_setup(gpu, false); + smp_store_release(&stream->fifo.head, head); wake_up_all(&stream->poll_wq); } diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/ms= m_submitqueue.c index a58fe41602c6..1a5a77b28016 100644 --- a/drivers/gpu/drm/msm/msm_submitqueue.c +++ b/drivers/gpu/drm/msm/msm_submitqueue.c @@ -42,7 +42,7 @@ int msm_context_set_sysprof(struct msm_context *ctx, stru= ct msm_gpu *gpu, int sy =20 /* Some gpu families require additional setup for sysprof */ if (gpu->funcs->sysprof_setup) - gpu->funcs->sysprof_setup(gpu); + gpu->funcs->sysprof_setup(gpu, false); =20 ctx->sysprof =3D sysprof; =20 --=20 2.54.0