From nobody Mon Feb 9 07:05:27 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 CBEC3284896 for ; Mon, 10 Nov 2025 16:39:24 +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=1762792767; cv=none; b=P4XbjJlOE4OCtizO5XTezz54LdyFqFPPjqnvW+JNEurdGIF0waNomijjqsTqxIpNpSZnUJClMX2pgV9t+uVasyEmF3QpOtHURAcABxW+TGcPIdSH5wwSfTE0pchkpg/iZmZ0/7fmyg/vts1QXK6Gp/YsEIAoKRYRCW5O8YMnWYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762792767; c=relaxed/simple; bh=r5aNW3E/uItx4ZgEv5XbsTsCl67yqo8Wr7EDeQUCiVU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VOi6edxEKcek0N6a11n4OxKXn8i0AGqIJdyYuDqy99GH8dXEv6E6X53FOpyotKCX4FPC412jhJx2PHAPU4uYSfbfLJoKmFU+OPQ/4czGbFad/qAmQufvzqT646ogAI8smLNkkUZ5AJA2hc/3jTG4LFpb/+8sIswOqXmOfNTE3Tc= 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=B9SJqo/c; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=djdrog8Y; 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="B9SJqo/c"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="djdrog8Y" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5AAGYNoE4070797 for ; Mon, 10 Nov 2025 16:39:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= s54gvATO6D8ni0BziC5bOrsJP88CdVIwOWTVNSqeo7Y=; b=B9SJqo/ccar0DWwm EpGN4e5nk45JX3Q3g/WSim1PyJ1W/UZeLzFZVzvYrV95RguJTnBRRIGqahHA+nDY PWnrB/2dV4UizaPrtinAqA6zb2s8IiOgqwfWc3GZ1RzU/scM0HQUlKS2khnljzfO 7legFp+imW6wTUosyMVa4GtE5d9Fxw/QwhHvQ56I4HJlmqem43H/lVx/UhoCsWQJ 201RSClraABtvjGwaj+GW5XDOq7yogfHkLUbQtEGybE7MSx6yTwAmyP7vv11jBep d2WF8/E4p2diJFAgn56Kb1RLzfyV2nnT7AIG/vp+jvJ0CCzSx7XtcuO9TdeI6KKj TVgz0A== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4abkpj80nv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 10 Nov 2025 16:39:23 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-3436d53e990so2093079a91.2 for ; Mon, 10 Nov 2025 08:39:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1762792762; x=1763397562; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=s54gvATO6D8ni0BziC5bOrsJP88CdVIwOWTVNSqeo7Y=; b=djdrog8YFUuuAql48fHeRqL7QBU7ixEey5g9lFcdjZbNfLoouGVj6XDF8DC6LdF0ue BzeKknjPftU18hpw3/Y6FVCzFHG2AO/iOlbrMUeW3x7hs7sZWexUXnaSqueGX2G68dxr jxpxW57sLs6qlKSJMBDf4mPkZQtWQ2gllZrZngCPlaWeEudGoQGbmPC7hGfVo5VBbZ4l q/5L1ju4di4CiCjF4ZOoq2syTqM2CUrQWYnQwLp5EdHg9kJ+hyR3yH7UY8Tgz/jT4D0x KhUkhEpyOoSiToxMNbKIi9y87TXnq+p7GOOIoFl3qdMzPsboHIgQ1jFu4V8TMek5/FUU 09Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762792762; x=1763397562; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=s54gvATO6D8ni0BziC5bOrsJP88CdVIwOWTVNSqeo7Y=; b=AwqQmtC8swpoMW5rFTBV60Jig6TghJkZydmLT66Sawoc2t35nJcVh27dKpgfqyEhyU 4QZZU0gxR9nQwRdorTnQ75gJjf0wF7pRjRxBzdDiVAiX9tsSAecN25eVULMXUi0hJ/+E 48VfR0wzkwu8kmwBMs6oeHy6aC8Sa+uY7OcS22xFxhbUpHJOVeOqjDSplJDNoJTYchTT L7IcpCI/yYcxsFlr8TiXYiweM9UxRGDJYJFbeKUDHckFj9E51hEcc6lvFAZmiU2w8w/w K3hQuVR6Uh2nLqgc4e1zZ+r/WP1hexd0Rjo84t1IJVQmqCxiHGGd5HjC30oicNkeYRLV GDXQ== X-Forwarded-Encrypted: i=1; AJvYcCWovI7+jjNtYhp8VXO952EEoDtYU8Nq870ZTc9ZPlmSYV66EQq28AUIhukLQD2rdsYEscwuhPymmecS1nM=@vger.kernel.org X-Gm-Message-State: AOJu0YwP2qv1DXVZU0TIIjGpOLLlM8iAiotdOiNNUo+qxUb/XiqbpNwN Viy7L+N7g0tY2lZyrboXoJFIdeAjwzMZI281/OrYWAGWNmD7ItFrHz1fa6C2dsg6igxhjeghXUx s+5zYqyg+o2QZyuXYdPwa0o1zy+ZvrMcUaCPVfwSFNujwmNzle9E0a1dmkyYLoDSBeN8= X-Gm-Gg: ASbGnct+kQB+6TmGQSJzMZ3orI1FM7mNAQNnjdVraQc6G0peCQKyfLuhAn8z4VLXgXA pmG1cIG4FIDIrJtWlgTgNdTsh8SRufZyGxhuPQ6rM1CMYqwE7XJAHbvPL1Y5OlTjqb4HBOtcRrx vxZ9+vaA2XAaBauD/rmI8bjYuak/0Ie78n0yBa7EO82g76YEDLGlLif+DnGcH8iWafxQu4WeFNW S1Vo4iCmck1e9uNg+PKj+G6gZKqHGGA9dS7nGaFnsL67dwnI5pNh/McVQPIJm6yjvldCbT/BOIe 4AzOGYetW3mhL7gQrPoDrTMbeaKDZ7u6b8RWJbrtEbPX7CK0DlOTP5S4JxIAgyF8bLY459jgo+M 7xo7Z8PhcAhANFNAXjwe8btg= X-Received: by 2002:a17:90b:4f8b:b0:32e:d599:1f66 with SMTP id 98e67ed59e1d1-3436ccfef31mr9815561a91.30.1762792762248; Mon, 10 Nov 2025 08:39:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IH8T54Xq/plXK42McJSnIumoygP0uzqkucpZsWL3h9kKQjf++KmCwibd/524qGt+Z7/DHeBUw== X-Received: by 2002:a17:90b:4f8b:b0:32e:d599:1f66 with SMTP id 98e67ed59e1d1-3436ccfef31mr9815507a91.30.1762792761612; Mon, 10 Nov 2025 08:39:21 -0800 (PST) Received: from hu-akhilpo-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3434c337b20sm11468922a91.13.2025.11.10.08.39.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Nov 2025 08:39:21 -0800 (PST) From: Akhil P Oommen Date: Mon, 10 Nov 2025 22:07:15 +0530 Subject: [PATCH v2 09/21] drm/msm/a6xx: Rebase GMU register offsets Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251110-kaana-gpu-support-v2-9-bef18acd5e94@oss.qualcomm.com> References: <20251110-kaana-gpu-support-v2-0-bef18acd5e94@oss.qualcomm.com> In-Reply-To: <20251110-kaana-gpu-support-v2-0-bef18acd5e94@oss.qualcomm.com> To: Rob Clark , Bjorn Andersson , Konrad Dybcio , Sean Paul , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Marijn Suijten , David Airlie , Simona Vetter , Jonathan Marek , Jordan Crouse , Will Deacon , Robin Murphy , Joerg Roedel , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Connor Abbott Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, devicetree@vger.kernel.org, Akhil P Oommen X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1762792679; l=27180; i=akhilpo@oss.qualcomm.com; s=20240726; h=from:subject:message-id; bh=r5aNW3E/uItx4ZgEv5XbsTsCl67yqo8Wr7EDeQUCiVU=; b=KLRb/kV79oAUFE3WpjtQ7ul+kwRjNIKfTCiREgvTaOHu6rpx2bIefgyVIKWPboclvpvWlVi3H 68lEJEFdVmVDQDAFGZFpKzsDu/jAThLwWOzVy397e8RaUXlnAlEXxSq X-Developer-Key: i=akhilpo@oss.qualcomm.com; a=ed25519; pk=lmVtttSHmAUYFnJsQHX80IIRmYmXA4+CzpGcWOOsfKA= X-Proofpoint-ORIG-GUID: ezpNqn6uBId5CvNs4L2cwIgsfwU4v1H6 X-Authority-Analysis: v=2.4 cv=GZoaXAXL c=1 sm=1 tr=0 ts=6912153b cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=e5mUnYsNAAAA:8 a=EUspDBNiAAAA:8 a=MFT4mc8oYmYGVuw2jiIA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 a=Vxmtnl_E_bksehYqCbjh:22 X-Proofpoint-GUID: ezpNqn6uBId5CvNs4L2cwIgsfwU4v1H6 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTEwMDEzOSBTYWx0ZWRfX3LhfZKq0ar6y /4Q1UFI4Q0/zzlhSoby3QSVyb9+p1FxbBjhOcMu8IedlP/wzHBfguYOilKqSlVbVsrXHvIBMAow Vaz7Iote0ftk5h3M/+OUfEcsb+9JUgxoOllDoMItXcyI6eYk3zv+rXb5pwfNDjJC1j+J5WCUVXo qHDJeqGaL5bK57hkYS1qo6AUm9BAn4UU1G021sb1zoa0n8gZs9CDlX7n9s4deDHNUE40pBX02CS oMLCrtm48WHqAOByreref7+RkxEtVUBsUNlRyuzKaSXHl4k1yZukUG/G11eBtU5dBfK5KpD1xa7 fxspjkmkZ1xh7kQD8LmR7NhVWzMoeVTE538bntcjcXLTdNSj1RkAbteLVBoAzWLXb7TiAnRbKjy jHKrdHP5FIxLHtY1uLiEqrMKgs7J6A== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-10_06,2025-11-10_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 spamscore=0 adultscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511100139 GMU registers are always at a fixed offset from the GPU base address, a consistency maintained at least within a given architecture generation. In A8x family, the base address of the GMU has changed, but the offsets of the gmu registers remain largely the same. To enable reuse of the gmu code for A8x chipsets, update the gmu register offsets to be relative to the GPU's base address instead of GMU's. Signed-off-by: Akhil P Oommen --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 100 +++++---- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 20 +- drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml | 248 +++++++++++-------= ---- 3 files changed, 193 insertions(+), 175 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.c index 306fc08492e4..1495f874e30e 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -584,22 +584,19 @@ static inline void pdc_write(void __iomem *ptr, u32 o= ffset, u32 value) writel(value, ptr + (offset << 2)); } =20 -static void __iomem *a6xx_gmu_get_mmio(struct platform_device *pdev, - const char *name); - static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu) { struct a6xx_gpu *a6xx_gpu =3D container_of(gmu, struct a6xx_gpu, gmu); struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; struct platform_device *pdev =3D to_platform_device(gmu->dev); - void __iomem *pdcptr =3D a6xx_gmu_get_mmio(pdev, "gmu_pdc"); + void __iomem *pdcptr =3D devm_platform_ioremap_resource_byname(pdev, "gmu= _pdc"); u32 seqmem0_drv0_reg =3D REG_A6XX_RSCC_SEQ_MEM_0_DRV0; void __iomem *seqptr =3D NULL; uint32_t pdc_address_offset; bool pdc_in_aop =3D false; =20 if (IS_ERR(pdcptr)) - goto err; + return; =20 if (adreno_is_a650_family(adreno_gpu) || adreno_is_a7xx(adreno_gpu)) @@ -612,9 +609,9 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu) pdc_address_offset =3D 0x30080; =20 if (!pdc_in_aop) { - seqptr =3D a6xx_gmu_get_mmio(pdev, "gmu_pdc_seq"); + seqptr =3D devm_platform_ioremap_resource_byname(pdev, "gmu_pdc_seq"); if (IS_ERR(seqptr)) - goto err; + return; } =20 /* Disable SDE clock gating */ @@ -704,12 +701,6 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu) =20 /* ensure no writes happen before the uCode is fully written */ wmb(); - -err: - if (!IS_ERR_OR_NULL(pdcptr)) - iounmap(pdcptr); - if (!IS_ERR_OR_NULL(seqptr)) - iounmap(seqptr); } =20 /* @@ -1795,27 +1786,6 @@ static int a6xx_gmu_clocks_probe(struct a6xx_gmu *gm= u) return 0; } =20 -static void __iomem *a6xx_gmu_get_mmio(struct platform_device *pdev, - const char *name) -{ - void __iomem *ret; - struct resource *res =3D platform_get_resource_byname(pdev, - IORESOURCE_MEM, name); - - if (!res) { - DRM_DEV_ERROR(&pdev->dev, "Unable to find the %s registers\n", name); - return ERR_PTR(-EINVAL); - } - - ret =3D ioremap(res->start, resource_size(res)); - if (!ret) { - DRM_DEV_ERROR(&pdev->dev, "Unable to map the %s registers\n", name); - return ERR_PTR(-EINVAL); - } - - return ret; -} - static int a6xx_gmu_get_irq(struct a6xx_gmu *gmu, struct platform_device *= pdev, const char *name, irq_handler_t handler) { @@ -1866,7 +1836,6 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) { struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; struct a6xx_gmu *gmu =3D &a6xx_gpu->gmu; - struct platform_device *pdev =3D to_platform_device(gmu->dev); =20 mutex_lock(&gmu->lock); if (!gmu->initialized) { @@ -1895,8 +1864,6 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) qmp_put(gmu->qmp); =20 iounmap(gmu->mmio); - if (platform_get_resource_byname(pdev, IORESOURCE_MEM, "rscc")) - iounmap(gmu->rscc); gmu->mmio =3D NULL; gmu->rscc =3D NULL; =20 @@ -1922,10 +1889,38 @@ static int cxpd_notifier_cb(struct notifier_block *= nb, return 0; } =20 +static void __iomem *a6xx_gmu_get_mmio(struct platform_device *pdev, + const char *name, resource_size_t *start) +{ + void __iomem *ret; + struct resource *res =3D platform_get_resource_byname(pdev, + IORESOURCE_MEM, name); + + if (!res) { + DRM_DEV_ERROR(&pdev->dev, "Unable to find the %s registers\n", name); + return ERR_PTR(-EINVAL); + } + + ret =3D ioremap(res->start, resource_size(res)); + if (!ret) { + DRM_DEV_ERROR(&pdev->dev, "Unable to map the %s registers\n", name); + return ERR_PTR(-EINVAL); + } + + if (start) + *start =3D res->start; + + return ret; +} + int a6xx_gmu_wrapper_init(struct a6xx_gpu *a6xx_gpu, struct device_node *n= ode) { struct platform_device *pdev =3D of_find_device_by_node(node); + struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; + struct msm_gpu *gpu =3D &adreno_gpu->base; struct a6xx_gmu *gmu =3D &a6xx_gpu->gmu; + resource_size_t start; + struct resource *res; int ret; =20 if (!pdev) @@ -1943,12 +1938,21 @@ int a6xx_gmu_wrapper_init(struct a6xx_gpu *a6xx_gpu= , struct device_node *node) gmu->legacy =3D true; =20 /* Map the GMU registers */ - gmu->mmio =3D a6xx_gmu_get_mmio(pdev, "gmu"); + gmu->mmio =3D a6xx_gmu_get_mmio(pdev, "gmu", &start); if (IS_ERR(gmu->mmio)) { ret =3D PTR_ERR(gmu->mmio); goto err_mmio; } =20 + res =3D platform_get_resource_byname(gpu->pdev, IORESOURCE_MEM, "kgsl_3d0= _reg_memory"); + if (!res) { + ret =3D -EINVAL; + goto err_mmio; + } + + /* Identify gmu base offset from gpu base address */ + gmu->mmio_offset =3D (u32)(start - res->start); + gmu->cxpd =3D dev_pm_domain_attach_by_name(gmu->dev, "cx"); if (IS_ERR(gmu->cxpd)) { ret =3D PTR_ERR(gmu->cxpd); @@ -1989,10 +1993,13 @@ int a6xx_gmu_wrapper_init(struct a6xx_gpu *a6xx_gpu= , struct device_node *node) =20 int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node) { + struct platform_device *pdev =3D of_find_device_by_node(node); struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; + struct msm_gpu *gpu =3D &adreno_gpu->base; struct a6xx_gmu *gmu =3D &a6xx_gpu->gmu; - struct platform_device *pdev =3D of_find_device_by_node(node); struct device_link *link; + resource_size_t start; + struct resource *res; int ret; =20 if (!pdev) @@ -2087,15 +2094,24 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct= device_node *node) goto err_memory; =20 /* Map the GMU registers */ - gmu->mmio =3D a6xx_gmu_get_mmio(pdev, "gmu"); + gmu->mmio =3D a6xx_gmu_get_mmio(pdev, "gmu", &start); if (IS_ERR(gmu->mmio)) { ret =3D PTR_ERR(gmu->mmio); goto err_memory; } =20 + res =3D platform_get_resource_byname(gpu->pdev, IORESOURCE_MEM, "kgsl_3d0= _reg_memory"); + if (!res) { + ret =3D -EINVAL; + goto err_mmio; + } + + /* Identify gmu base offset from gpu base address */ + gmu->mmio_offset =3D (u32)(start - res->start); + if (adreno_is_a650_family(adreno_gpu) || adreno_is_a7xx(adreno_gpu)) { - gmu->rscc =3D a6xx_gmu_get_mmio(pdev, "rscc"); + gmu->rscc =3D devm_platform_ioremap_resource_byname(pdev, "rscc"); if (IS_ERR(gmu->rscc)) { ret =3D -ENODEV; goto err_mmio; @@ -2173,8 +2189,6 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct d= evice_node *node) =20 err_mmio: iounmap(gmu->mmio); - if (platform_get_resource_byname(pdev, IORESOURCE_MEM, "rscc")) - iounmap(gmu->rscc); free_irq(gmu->gmu_irq, gmu); free_irq(gmu->hfi_irq, gmu); =20 diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.h index 06cfc294016f..55b1c78daa8b 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h @@ -68,6 +68,7 @@ struct a6xx_gmu { struct drm_gpuvm *vm; =20 void __iomem *mmio; + u32 mmio_offset; void __iomem *rscc; =20 int hfi_irq; @@ -130,20 +131,23 @@ struct a6xx_gmu { unsigned long status; }; =20 +#define GMU_BYTE_OFFSET(gmu, offset) (((offset) << 2) - (gmu)->mmio_offset) + static inline u32 gmu_read(struct a6xx_gmu *gmu, u32 offset) { - return readl(gmu->mmio + (offset << 2)); + /* The 'offset' is based on GPU's start address. Adjust it */ + return readl(gmu->mmio + GMU_BYTE_OFFSET(gmu, offset)); } =20 static inline void gmu_write(struct a6xx_gmu *gmu, u32 offset, u32 value) { - writel(value, gmu->mmio + (offset << 2)); + writel(value, gmu->mmio + GMU_BYTE_OFFSET(gmu, offset)); } =20 static inline void gmu_write_bulk(struct a6xx_gmu *gmu, u32 offset, const u32 *data, u32 size) { - memcpy_toio(gmu->mmio + (offset << 2), data, size); + memcpy_toio(gmu->mmio + GMU_BYTE_OFFSET(gmu, offset), data, size); wmb(); } =20 @@ -160,17 +164,17 @@ static inline u64 gmu_read64(struct a6xx_gmu *gmu, u3= 2 lo, u32 hi) { u64 val; =20 - val =3D (u64) readl(gmu->mmio + (lo << 2)); - val |=3D ((u64) readl(gmu->mmio + (hi << 2)) << 32); + val =3D gmu_read(gmu, lo); + val |=3D ((u64) gmu_read(gmu, hi) << 32); =20 return val; } =20 #define gmu_poll_timeout(gmu, addr, val, cond, interval, timeout) \ - readl_poll_timeout((gmu)->mmio + ((addr) << 2), val, cond, \ - interval, timeout) + readl_poll_timeout((gmu)->mmio + (GMU_BYTE_OFFSET(gmu, addr)), val, \ + cond, interval, timeout) #define gmu_poll_timeout_atomic(gmu, addr, val, cond, interval, timeout) \ - readl_poll_timeout_atomic((gmu)->mmio + ((addr) << 2), val, cond, \ + readl_poll_timeout_atomic((gmu)->mmio + (GMU_BYTE_OFFSET(gmu, addr)), val= , cond, \ interval, timeout) =20 static inline u32 gmu_read_rscc(struct a6xx_gmu *gmu, u32 offset) diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml b/drivers/gp= u/drm/msm/registers/adreno/a6xx_gmu.xml index b15a242d974d..09b8a0b9c0de 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml @@ -40,56 +40,56 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> =20 - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + @@ -99,15 +99,15 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> - + - + - + @@ -119,71 +119,71 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -191,27 +191,27 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + =20 --=20 2.51.0