From nobody Tue Dec 2 02:52:39 2025 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 F01263112B6 for ; Tue, 18 Nov 2025 08:52: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=1763455968; cv=none; b=QSXeAMa+clTvGxKF27huZpuyTUAlHaPm2vCBMKNSwyaNZSqW1xBeb8bpG4KEGhqvEAWj1PSW6BmRNsIgCFJntEhsYqODBr5HPPmpClUCOwNoEa4fNt1ueM2J4uYFBLXihxy3mih9nyjj/ITeRac0Y2lse2HTRWcW+tBciUUibf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763455968; c=relaxed/simple; bh=l8eQ+OjtwQ+Kdn5+76wA0r9aVpYaIeDyUezuh2oNZvA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gx2HuewoZMFe9EABAcfzIb7sDOxr2YLKr+WOflbK8TsAbRAqNu8Akgy2aUVrJMNoKfTIGdRiNGH3hCLNDX38fTZVh4SL44lwi6KZQM/+XPvHjrGFcV/S4C2YaTsNCL8cKHqFvpyDrbP6EKsjNnXwc9Kj+yNOT/jevMuX1ETm6HU= 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=JHQWg/44; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=hPAlnild; 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="JHQWg/44"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="hPAlnild" 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 5AI2x8WS375824 for ; Tue, 18 Nov 2025 08:52:45 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= u0rrCmFIRoPOnEoTHrwMmrIsBRs0fYQvOXtmgln1HkY=; b=JHQWg/44pa4lNstH FW1JyWhCSp+T5QP3OduEQ4lyIguTud/3t+B3dV8nfJTHEcXNMLBBbfETQCPRjmgW PkcaA9AtTvvCZcA6lcCGeFGchnf6NuR4jHvJiesbPxHh2tDGhfO21dhStl+UkXRS 7LdMMDH9zBc8hBuLZWN1vgWSFDk/FPTtg57g7u3Gida/j4Afj2ti0gzD07kUwTvo hv0bn27NCLOrYeIYH/YshR/xkoXWbaBiwS47m2w29bm1Ko66gTxpyWTUKiQ71BUD 07H1JVwcQCKA1gT+A8Hs3ZpTPpzA54lRUSSktYSpqL7Tja6nSoESqIzf5RNe4UtU P1KviQ== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ag76njfup-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 18 Nov 2025 08:52:44 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-299d221b749so34448755ad.3 for ; Tue, 18 Nov 2025 00:52:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1763455964; x=1764060764; 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=u0rrCmFIRoPOnEoTHrwMmrIsBRs0fYQvOXtmgln1HkY=; b=hPAlnild7sMtzrTGCo78QUQ8dvHvi3UGYsLKkZdhq3K5c3UYJM1ZnC0g779ZIi7Bkp 5+x9lRH08A/fLgogR7MvMKqZGdOZ2nX76EUOUjTxzh68PUBClHXPoVMc8VCUwOG9fcDN kA+UBJ1PqX4B0mqD1GYumHKXNLA0hGEmFCqDTJ5y3sNgFWzK4R3A8rSbHYONAZaxBdZo 2ZUhrT0P1dZ2+OVy++qz1r/CXpQna93tl8ULlE0Gr59dzBnFRv2mKKa+pS7/fvW9PKBa 30hA4jGTndzteyeI3Y+xwy/bEdLcpmn9sufSU3Qebi+MHF3g3g2HYa2fASowN87R4P4j 4ASA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763455964; x=1764060764; 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=u0rrCmFIRoPOnEoTHrwMmrIsBRs0fYQvOXtmgln1HkY=; b=Fu6Hmeu/853szXBckqcYSkuLpDHk26ktjGRPcvZL1uhf9oYvSP7YPgVbAZGPdXV8Uz sJgrIkyIpJf4bU0Ru8DEQlH867bGZqDscikr+vpiwN+/Rlsu8CG0vGU9TJ22o8UegaC3 e1U83xS3WYQC8f673c5tAKQIOQDA5NGAucWk5pej6hkm0l3+Y07n+pZlcgUanxHeVGuw X1vj9dHzfUxQwmK5A3pdz5vuXeHUsqW75m0anpd1JCsusFma9ShiuZRTD65UzMaWVg98 pGMZ2q+QqpFa1rCoPVYn3KRPfzSkfZGVwwwyK4pbCPIDjHJIv/rDq6XShs7RWRWnSJZG Jy4A== X-Forwarded-Encrypted: i=1; AJvYcCV1UYoVokeiRh1Y3xtpMflQXwmxqiJuZjLPoQc9TEfuz8AsGiIeBOkNRAwiWFxvv+hR6GhrkEOOTLKGqfk=@vger.kernel.org X-Gm-Message-State: AOJu0Yx9cCZdd5bddOv73UOWS7wd0cOpQXr60r7o4mcUqlUxNtSBapEP sH/0TVYaFzfXSEBLEoGocUqu1b52lQJiEL9JXsCzhLfvnZ58sdfvOb5JzT/Q9a89pxa2NkICP4v B0cg9PKlYACeV8g8+LgcnwyesOyss441ORMG5A/+YY5/lfrxKlp94vanJhoyp+FFnors= X-Gm-Gg: ASbGncsesTVx0K8SBh4KeExH8u/X10nMbS4vsAQVKqLrGeHyP71QeFT9aY9XCBtPLjC 5dlJe5Corpj1DsHSn9E6RDLnNMPKCOjpvldxDxG5OjNov7ZjDsIOPWtX0pGjZiqjxK4gMTF+5BT wHDN8pwcOHo7KMORE5aWhTOTDmrB3xrIPIzFdis1a5fHA5qeIjGBftAnviykH5/dHyq8O8NpiDG ER0tgw/P+Uc1jTXFGneQ7mphMvcPwh9ls4M6NhKz6XIC1uz/9fxQHnBICn+geR0BHPNp84hvUB7 xUAlx7DxihK1vrFJmXApc81kt7FhK/l5kn73AVIw4tdYFOYrVY+wp2pbZBzfAu7p1WZlaJ2tw88 0M/VGDy1l8Iw+zzK1zyEjcWY= X-Received: by 2002:a17:903:1a30:b0:298:529b:8956 with SMTP id d9443c01a7336-2986a755cfdmr173518695ad.56.1763455963571; Tue, 18 Nov 2025 00:52:43 -0800 (PST) X-Google-Smtp-Source: AGHT+IGrYjrcnosQO9zJggHiQ0QBRijo+SBZHxKQvn++MOd5uI8tGmpTkC2AD/GviQKH4LZp90bfYw== X-Received: by 2002:a17:903:1a30:b0:298:529b:8956 with SMTP id d9443c01a7336-2986a755cfdmr173518215ad.56.1763455963011; Tue, 18 Nov 2025 00:52:43 -0800 (PST) Received: from hu-akhilpo-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568c1sm162910695ad.47.2025.11.18.00.52.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Nov 2025 00:52:42 -0800 (PST) From: Akhil P Oommen Date: Tue, 18 Nov 2025 14:20:38 +0530 Subject: [PATCH v4 11/22] drm/msm/a8xx: Add support for A8x GMU 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: <20251118-kaana-gpu-support-v4-11-86eeb8e93fb6@oss.qualcomm.com> References: <20251118-kaana-gpu-support-v4-0-86eeb8e93fb6@oss.qualcomm.com> In-Reply-To: <20251118-kaana-gpu-support-v4-0-86eeb8e93fb6@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 , Konrad Dybcio X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1763455868; l=18648; i=akhilpo@oss.qualcomm.com; s=20240726; h=from:subject:message-id; bh=l8eQ+OjtwQ+Kdn5+76wA0r9aVpYaIeDyUezuh2oNZvA=; b=RBao9YVQxMrVRgpv7s9gQeKNVwtNik1A+el7uz9BnckxOaHrq++7ak05d423soKoCnpG0s9pP eC/c+nWWWT4DFFXmQ7WbxSg9geOWlPOpLWr50xrrLgnKQMY/3Uo+3V6 X-Developer-Key: i=akhilpo@oss.qualcomm.com; a=ed25519; pk=lmVtttSHmAUYFnJsQHX80IIRmYmXA4+CzpGcWOOsfKA= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTE4MDA2OSBTYWx0ZWRfXx4/bJcLDtQnQ ue7L4fZtcVTEy+uTbIAFVytiIbbf4deTbuq6wyswvwI2WCtAaQ2l7EeTz+ui+9mNUQfnZUcAOSH iSU8hGJDIWMJaZtwm5NyKhqxV9bt/gyL28nLzibxMoAGlyMKodsmzla85sE5Ph/u0FH7M/WekfH LxcUU6NswpaFCYB4icv7T7vzlURi0bbNH2AEQdT2wBsM0LICjliKQj765h8pOVHIgFj1rzOWUo5 IePiZ81LYFJt/88+0jR8583q9Uvwky0n4JHNz6WDsbe3rLMzHzfRCiFxERUbNOIomVJk6onkqOv 1VPFezHLYj71NoAZEzq5SmDqbFYKHMVc6IN9BlJXoC89/YZEZScbdECb1V89+J3epIHbnxgyjXR 4ZC+oEAyFddiAIraUe5AbnGNkkCsDg== X-Proofpoint-GUID: tjDG3f1m0gQjlUtqjdGpKU2_PpxBGG6j X-Proofpoint-ORIG-GUID: tjDG3f1m0gQjlUtqjdGpKU2_PpxBGG6j X-Authority-Analysis: v=2.4 cv=a4I9NESF c=1 sm=1 tr=0 ts=691c33dc cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==: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=BnPpZdVtioYmAKrWMJ8A:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 a=Vxmtnl_E_bksehYqCbjh:22 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-17_04,2025-11-13_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 spamscore=0 clxscore=1015 bulkscore=0 adultscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511180069 A8x GMU configurations are very similar to A7x. Unfortunately, there are minor shuffling in the register offsets in the GMU CX register region. So, update the driver to use the correct register offsets on A8x hw. Some A8x GPUs have more than 16 powerlevels on GX domain and 4 on CX domain. To accommodate this, increase the arrays' sizes which hold gx and cx power levels. Reviewed-by: Konrad Dybcio Signed-off-by: Akhil P Oommen --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 77 +++++++++++++++++--= ---- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 4 +- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 7 +++ drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml | 48 ++++++++++---- 4 files changed, 102 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.c index a5aceb906827..e566f3b7eab4 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -224,14 +224,19 @@ unsigned long a6xx_gmu_get_freq(struct msm_gpu *gpu) =20 static bool a6xx_gmu_check_idle_level(struct a6xx_gmu *gmu) { - u32 val; + struct a6xx_gpu *a6xx_gpu =3D container_of(gmu, struct a6xx_gpu, gmu); + struct adreno_gpu *adreno_gpu =3D &a6xx_gpu->base; int local =3D gmu->idle_level; + u32 val; =20 /* SPTP and IFPC both report as IFPC */ if (gmu->idle_level =3D=3D GMU_IDLE_STATE_SPTP) local =3D GMU_IDLE_STATE_IFPC; =20 - val =3D gmu_read(gmu, REG_A6XX_GPU_GMU_CX_GMU_RPMH_POWER_STATE); + if (adreno_is_a8xx(adreno_gpu)) + val =3D gmu_read(gmu, REG_A8XX_GPU_GMU_CX_GMU_RPMH_POWER_STATE); + else + val =3D gmu_read(gmu, REG_A6XX_GPU_GMU_CX_GMU_RPMH_POWER_STATE); =20 if (val =3D=3D local) { if (gmu->idle_level !=3D GMU_IDLE_STATE_IFPC || @@ -269,7 +274,9 @@ static int a6xx_gmu_start(struct a6xx_gmu *gmu) /* Set the log wptr index * note: downstream saves the value in poweroff and restores it here */ - if (adreno_is_a7xx(adreno_gpu)) + if (adreno_is_a8xx(adreno_gpu)) + gmu_write(gmu, REG_A8XX_GMU_GENERAL_9, 0); + else if (adreno_is_a7xx(adreno_gpu)) gmu_write(gmu, REG_A7XX_GMU_GENERAL_9, 0); else gmu_write(gmu, REG_A6XX_GPU_GMU_CX_GMU_PWR_COL_CP_RESP, 0); @@ -511,7 +518,9 @@ static void a6xx_gemnoc_workaround(struct a6xx_gmu *gmu) * in the power down sequence not being fully executed. That in turn can * prevent CX_GDSC from collapsing. Assert Qactive to avoid this. */ - if (adreno_is_a7xx(adreno_gpu) || (adreno_is_a621(adreno_gpu) || + if (adreno_is_a8xx(adreno_gpu)) + gmu_write(gmu, REG_A8XX_GPU_GMU_CX_GMU_CX_FALNEXT_INTF, BIT(0)); + else if (adreno_is_a7xx(adreno_gpu) || (adreno_is_a621(adreno_gpu) || adreno_is_7c3(adreno_gpu))) gmu_write(gmu, REG_A6XX_GPU_GMU_CX_GMU_CX_FALNEXT_INTF, BIT(0)); } @@ -519,10 +528,15 @@ static void a6xx_gemnoc_workaround(struct a6xx_gmu *g= mu) /* Let the GMU know that we are about to go into slumber */ static int a6xx_gmu_notify_slumber(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; int ret; =20 /* Disable the power counter so the GMU isn't busy */ - gmu_write(gmu, REG_A6XX_GMU_CX_GMU_POWER_COUNTER_ENABLE, 0); + if (adreno_is_a8xx(adreno_gpu)) + gmu_write(gmu, REG_A8XX_GMU_CX_GMU_POWER_COUNTER_ENABLE, 0); + else + gmu_write(gmu, REG_A6XX_GMU_CX_GMU_POWER_COUNTER_ENABLE, 0); =20 /* Disable SPTP_PC if the CPU is responsible for it */ if (gmu->idle_level < GMU_IDLE_STATE_SPTP) @@ -615,12 +629,17 @@ 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 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; + void __iomem *pdcptr; bool pdc_in_aop =3D false; =20 + /* On A8x and above, RPMH/PDC configurations are entirely configured in A= OP */ + if (adreno_is_a8xx(adreno_gpu)) + return; + + pdcptr =3D devm_platform_ioremap_resource_byname(pdev, "gmu_pdc"); if (IS_ERR(pdcptr)) return; =20 @@ -749,7 +768,7 @@ static void a6xx_gmu_power_config(struct a6xx_gmu *gmu) gmu_write(gmu, REG_A6XX_GMU_DCACHE_CONFIG, 0x1); =20 /* A7xx knows better by default! */ - if (adreno_is_a7xx(adreno_gpu)) + if (adreno_is_a7xx(adreno_gpu) || adreno_is_a8xx(adreno_gpu)) return; =20 gmu_write(gmu, REG_A6XX_GMU_PWR_COL_INTER_FRAME_CTRL, 0x9c40400); @@ -812,7 +831,9 @@ static int a6xx_gmu_fw_load(struct a6xx_gmu *gmu) u32 itcm_base =3D 0x00000000; u32 dtcm_base =3D 0x00040000; =20 - if (adreno_is_a650_family(adreno_gpu) || adreno_is_a7xx(adreno_gpu)) + if (adreno_is_a650_family(adreno_gpu) || + adreno_is_a7xx(adreno_gpu) || + adreno_is_a8xx(adreno_gpu)) dtcm_base =3D 0x10004000; =20 if (gmu->legacy) { @@ -876,12 +897,15 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, un= signed int state) if (adreno_is_a650_family(adreno_gpu) || adreno_is_a7xx(adreno_gpu)) { gmu_write(gmu, REG_A6XX_GPU_GMU_CX_GMU_CX_FALNEXT_INTF, 1); gmu_write(gmu, REG_A6XX_GPU_GMU_CX_GMU_CX_FAL_INTF, 1); + } else if (adreno_is_a8xx(adreno_gpu)) { + gmu_write(gmu, REG_A8XX_GPU_GMU_CX_GMU_CX_FALNEXT_INTF, 1); + gmu_write(gmu, REG_A8XX_GPU_GMU_CX_GMU_CX_FAL_INTF, 1); } =20 /* Turn on TCM (Tightly Coupled Memory) retention */ if (adreno_is_a7xx(adreno_gpu)) a6xx_llc_write(a6xx_gpu, REG_A7XX_CX_MISC_TCM_RET_CNTL, 1); - else + else if (!adreno_is_a8xx(adreno_gpu)) gmu_write(gmu, REG_A6XX_GMU_GENERAL_7, 1); =20 ret =3D a6xx_rpmh_start(gmu); @@ -906,7 +930,10 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, uns= igned int state) gmu_write(gmu, REG_A6XX_GMU_HFI_QTBL_ADDR, gmu->hfi.iova); gmu_write(gmu, REG_A6XX_GMU_HFI_QTBL_INFO, 1); =20 - if (adreno_is_a7xx(adreno_gpu)) { + if (adreno_is_a8xx(adreno_gpu)) { + fence_range_upper =3D 0x32; + fence_range_lower =3D 0x8c0; + } else if (adreno_is_a7xx(adreno_gpu)) { fence_range_upper =3D 0x32; fence_range_lower =3D 0x8a0; } else { @@ -940,7 +967,12 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, uns= igned int state) chipid |=3D (adreno_gpu->chip_id << 8) & 0x0f00; /* patchid */ } =20 - if (adreno_is_a7xx(adreno_gpu)) { + if (adreno_is_a8xx(adreno_gpu)) { + gmu_write(gmu, REG_A8XX_GMU_GENERAL_10, chipid); + gmu_write(gmu, REG_A8XX_GMU_GENERAL_8, + (gmu->log.iova & GENMASK(31, 12)) | + ((gmu->log.size / SZ_4K - 1) & GENMASK(7, 0))); + } else if (adreno_is_a7xx(adreno_gpu)) { gmu_write(gmu, REG_A7XX_GMU_GENERAL_10, chipid); gmu_write(gmu, REG_A7XX_GMU_GENERAL_8, (gmu->log.iova & GENMASK(31, 12)) | @@ -1003,7 +1035,7 @@ static void a6xx_gmu_rpmh_off(struct a6xx_gmu *gmu) u32 val, seqmem_off =3D 0; =20 /* The second spin of A7xx GPUs messed with some register offsets.. */ - if (adreno_is_a740_family(adreno_gpu)) + if (adreno_is_a740_family(adreno_gpu) || adreno_is_a8xx(adreno_gpu)) seqmem_off =3D 4; =20 /* Make sure there are no outstanding RPMh votes */ @@ -1016,7 +1048,7 @@ static void a6xx_gmu_rpmh_off(struct a6xx_gmu *gmu) gmu_poll_timeout_rscc(gmu, REG_A6XX_RSCC_TCS3_DRV0_STATUS + seqmem_off, val, (val & 1), 100, 1000); =20 - if (!adreno_is_a740_family(adreno_gpu)) + if (!adreno_is_a740_family(adreno_gpu) && !adreno_is_a8xx(adreno_gpu)) return; =20 gmu_poll_timeout_rscc(gmu, REG_A7XX_RSCC_TCS4_DRV0_STATUS + seqmem_off, @@ -1044,7 +1076,10 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu) * Turn off keep alive that might have been enabled by the hang * interrupt */ - gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_GMU_PWR_COL_KEEPALIVE, 0); + if (adreno_is_a8xx(adreno_gpu)) + gmu_write(&a6xx_gpu->gmu, REG_A8XX_GMU_GMU_PWR_COL_KEEPALIVE, 0); + else + gmu_write(&a6xx_gpu->gmu, REG_A6XX_GMU_GMU_PWR_COL_KEEPALIVE, 0); =20 /* Flush all the queues */ a6xx_hfi_stop(gmu); @@ -1148,7 +1183,7 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) enable_irq(gmu->gmu_irq); =20 /* Check to see if we are doing a cold or warm boot */ - if (adreno_is_a7xx(adreno_gpu)) { + if (adreno_is_a7xx(adreno_gpu) || adreno_is_a8xx(adreno_gpu)) { status =3D a6xx_llc_read(a6xx_gpu, REG_A7XX_CX_MISC_TCM_RET_CNTL) =3D=3D= 1 ? GMU_WARM_BOOT : GMU_COLD_BOOT; } else if (gmu->legacy) { @@ -1477,7 +1512,7 @@ static int a6xx_gmu_rpmh_bw_votes_init(struct adreno_= gpu *adreno_gpu, vote =3D clamp(peak, 1, BCM_TCS_CMD_VOTE_MASK); =20 /* GMUs on A7xx votes on both x & y */ - if (adreno_is_a7xx(adreno_gpu)) + if (adreno_is_a7xx(adreno_gpu) || adreno_is_a8xx(adreno_gpu)) data[bcm_index] =3D BCM_TCS_CMD(commit, true, vote, vote); else data[bcm_index] =3D BCM_TCS_CMD(commit, true, 0, vote); @@ -2070,13 +2105,14 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct= device_node *node) */ gmu->dummy.size =3D SZ_4K; if (adreno_is_a660_family(adreno_gpu) || - adreno_is_a7xx(adreno_gpu)) { + adreno_is_a7xx(adreno_gpu) || + adreno_is_a8xx(adreno_gpu)) { ret =3D a6xx_gmu_memory_alloc(gmu, &gmu->debug, SZ_4K * 7, 0x60400000, "debug"); if (ret) goto err_memory; =20 - gmu->dummy.size =3D SZ_8K; + gmu->dummy.size =3D SZ_16K; } =20 /* Allocate memory for the GMU dummy page */ @@ -2087,7 +2123,8 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct d= evice_node *node) =20 /* Note that a650 family also includes a660 family: */ if (adreno_is_a650_family(adreno_gpu) || - adreno_is_a7xx(adreno_gpu)) { + adreno_is_a7xx(adreno_gpu) || + adreno_is_a8xx(adreno_gpu)) { ret =3D a6xx_gmu_memory_alloc(gmu, &gmu->icache, SZ_16M - SZ_16K, 0x04000, "icache"); if (ret) @@ -2151,6 +2188,8 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct d= evice_node *node) ret =3D -ENODEV; goto err_mmio; } + } else if (adreno_is_a8xx(adreno_gpu)) { + gmu->rscc =3D gmu->mmio + 0x19000; } else { gmu->rscc =3D gmu->mmio + 0x23000; } diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.h index 55b1c78daa8b..edf6c282cd76 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h @@ -19,8 +19,8 @@ struct a6xx_gmu_bo { u64 iova; }; =20 -#define GMU_MAX_GX_FREQS 16 -#define GMU_MAX_CX_FREQS 4 +#define GMU_MAX_GX_FREQS 32 +#define GMU_MAX_CX_FREQS 6 #define GMU_MAX_BCMS 3 =20 struct a6xx_bcm { diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/= adreno/adreno_gpu.h index 922d2dee70fb..dfc1bf499b08 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h @@ -50,6 +50,8 @@ enum adreno_family { ADRENO_7XX_GEN1, /* a730 family */ ADRENO_7XX_GEN2, /* a740 family */ ADRENO_7XX_GEN3, /* a750 family */ + ADRENO_8XX_GEN1, /* a830 family */ + ADRENO_8XX_GEN2, /* a840 family */ }; =20 #define ADRENO_QUIRK_TWO_PASS_USE_WFI BIT(0) @@ -565,6 +567,11 @@ static inline int adreno_is_a7xx(struct adreno_gpu *gp= u) adreno_is_a740_family(gpu); } =20 +static inline int adreno_is_a8xx(struct adreno_gpu *gpu) +{ + return gpu->info->family >=3D ADRENO_8XX_GEN1; +} + /* Put vm_start above 32b to catch issues with not setting xyz_BASE_HI */ #define ADRENO_VM_START 0x100000000ULL u64 adreno_private_vm_size(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml b/drivers/gp= u/drm/msm/registers/adreno/a6xx_gmu.xml index 09b8a0b9c0de..5dce7934056d 100644 --- a/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml +++ b/drivers/gpu/drm/msm/registers/adreno/a6xx_gmu.xml @@ -66,10 +66,15 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> + + + + + @@ -89,7 +94,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/free= dreno/ rules-fd.xsd"> - + @@ -99,7 +104,11 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> - + + + + + @@ -120,9 +129,12 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/f= reedreno/ rules-fd.xsd"> - - - + + + + + + @@ -130,8 +142,10 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/f= reedreno/ rules-fd.xsd"> - - + + + + @@ -164,6 +178,14 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/f= reedreno/ rules-fd.xsd"> + + + + + + + + @@ -233,12 +255,12 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/= freedreno/ rules-fd.xsd"> - - - - - - + + + + + + =20 --=20 2.51.0