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 7A704322C8A for ; Tue, 18 Nov 2025 08:53:01 +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=1763455983; cv=none; b=MIQFmTUUMt3E0lzDawm3DAElFT0jMVt7ESzN6LCqitPRsIt9E93j/RPUU7JplPhyPbvcOH4E/VgnkjMu8v4Jn3TtDxhVb4M3ECwdDXTF2GCG8u6w8/nm6wxSG1pkwskaTdPB6Zlp3/4GW5IteboiUCIwG2DZa40CslwWCun0UOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763455983; c=relaxed/simple; bh=DEV55TnpxC+ZAc5oDFgekUuq413l/3/UK41L3U9jZiY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jffNkPbTKZLiOyLtfNsCcB4ti5WoHn+uWDO/MaVUGisPChniYHcTDdOZtoDxYedz6wS39Gbq7R4pVPUjemTTAiWxhAlxCH/6ilookZuD2IxmLOjotiIAmdx3LOOQxH/u8w4YFOTwUFbiyIymg0c/grg3XDE/tQSqhJfcUHam/48= 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=ZuqEM5q6; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=RPR9sxbR; 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="ZuqEM5q6"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="RPR9sxbR" 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 5AI6BNmW4107469 for ; Tue, 18 Nov 2025 08:53:00 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= gJHpFB1M0Fa2jX7zQfciXysNKzSZz/9fw/KmefWGV18=; b=ZuqEM5q6TvySaIKR 5lCog14AuSxrpqezfJkboiAtujg9sl2IpLDzPq/IFCefNyrWj+mpQT5e5dYkkZbH edfYR5pIkTOel5xq5v8WH8rcxavAU4Xl3JqTeb1Sq0KubAJIQshAFxJkkGZvY527 DYV/EPcwXYBuHLSEHRPpmFA7x48ogCl2ORCn0ISVNVoTsgijI0gwV9X895SVZ6Ym 4JLEu9HG1Hzxx1Fy7ub5wIJDs6RRt4S7L2za9za0bb6m1uq4VDmHusCps20xfWVU FZvE0eUXiys73xhVMpGj+eWz4JZESZcOvt75/ppyPnhoL5HPSTaDCoIkpYkehruk LRYGiQ== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ag2hpbd6w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 18 Nov 2025 08:53:00 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-297f48e81b8so85698375ad.0 for ; Tue, 18 Nov 2025 00:53:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1763455979; x=1764060779; 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=gJHpFB1M0Fa2jX7zQfciXysNKzSZz/9fw/KmefWGV18=; b=RPR9sxbRQPtCDokqjo5QXeeO5j/L+IyakEOygiIBnwhV7UEW63IlH+mX+yf+6hv9/I qXfKNi7s6M3T1n5A5aP45yfBW1xUji4/or/elYmu7W+58Q6yNL7tMfz9+tYViBpdJtN/ JGZOL2/xTtYA0sjq/eNxZfzme+zbB58IhRQOceUB7OyTCR0aoGfXZectATEmUnuYOfE1 mWa2VH+MgmTjZtfGEs8N3nokWm0/slXa27o34EdkEeYJfWKkrTuLDKuq6JfAAc9DaLeP m17p+uvXr7W2485+PfC84DYvAkVbwSLPLwySpOdcyA6oQsUad7BRlP0gvdapKeyNRWSg gjWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763455979; x=1764060779; 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=gJHpFB1M0Fa2jX7zQfciXysNKzSZz/9fw/KmefWGV18=; b=eDFt/44nYl0y+57ll7Cv9ycG2fQod1oce+mNDDYmBdb0yBF6oiWewPT5Guj/ruk73w Pcx0c2GJzcEv/BR/x7rQKxNinEcjxudZ6Hj7MxvPDlBj1SZedUM+8Af/OELvrg1/RLxv FPbX74cPpttgqzfIxZh9+UQ4OLkXL7kFKTP3J93j2sgDbpwcUegemdGNJg6lfoUzOqtX wwqbcCJp6G65fIA+b5bPIv7F4yhqzUed5HMWReb/AwDs783Mcgq67DsAUSPkQt5zv3jC LH+78zE2YCq3986mryh7m9Rv+0qTaJqWYp1uRPfZJjk4Sry/v0HrCP/wHyrV3CatWXWh 9/EA== X-Forwarded-Encrypted: i=1; AJvYcCVFixi+ClstTTurWzkRuPkbg0Vbiz1bvAP+fuVjVzPvo5jX+fabzZDkua5ScJ/bnJLcZIUm7xac7w3dH88=@vger.kernel.org X-Gm-Message-State: AOJu0YyAlfvO6Vw6Ut8OAmz/hNxiG5/2jX7j9QtxEmohKYjypGKnrFRI zU6N2ivn9OoRk2Wa/tBeiSFXWqXXNsaKNBQ1KC3q+JKJvuD97oe3nYcdobtK/oiqBpZXCeqBFKU dDwiMHr3M87IGOB5Tqlg0gVi9zB/ev8XJ5JKn52kySKcxskI7JnjiEskaMVrGusJa9II= X-Gm-Gg: ASbGncvFxzBAN99unR8iGb8fU8SVTPFTytNOc+wuPZwVRaBXcsLpNUYQW3b4GsjWxwN 3R4fKSP36sw6QG1JrzBUWsL/fcDZU1L76XPKwYumHlljFajOSajo7RouyMmniOaElZOg4npZuU1 O8Rg1E0wxGx1BJqadalZTTxgSM1MQFy1jvQ6GTOhvHqk7V64F4kHuJIsiZfzFgimzGonDYttsVq euUUAGYtZEctZ76xH+POfxVpDnpjrO4dpkIFZmggpTBlFULP8TkWouAeIkY6x2Hz24WPqJtM0DD gk+SoQ3XHmHzB4kAnlAWvzUb/lrHm1xf0jDtEnbm8TbUncqwId1bLjwWC6uFz4Px/Fb5VP+pbKt StfI2iJq8CaeSZNg9WVFD2t0= X-Received: by 2002:a17:903:1448:b0:299:d5a5:7e with SMTP id d9443c01a7336-299f5587d6dmr29425795ad.15.1763455979203; Tue, 18 Nov 2025 00:52:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IGXHTTncLm+wwNsQtax/ncNNDvvaKtLHgtViPzEistOPdMAF1zdbYET87bo4fTF9/xDBrWiLA== X-Received: by 2002:a17:903:1448:b0:299:d5a5:7e with SMTP id d9443c01a7336-299f5587d6dmr29425335ad.15.1763455978576; Tue, 18 Nov 2025 00:52:58 -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.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Nov 2025 00:52:58 -0800 (PST) From: Akhil P Oommen Date: Tue, 18 Nov 2025 14:20:40 +0530 Subject: [PATCH v4 13/22] drm/msm/a6xx: Share dependency vote table with 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-13-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 X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1763455868; l=6424; i=akhilpo@oss.qualcomm.com; s=20240726; h=from:subject:message-id; bh=DEV55TnpxC+ZAc5oDFgekUuq413l/3/UK41L3U9jZiY=; b=Qcn9XMDdWDAliWUeS66kttJUuzO6qdmx47XxB3qQH+8k4C9wsMVO8Xz6ePGlqUJFDv5VcDd6D evB2LIuW67ZDt97vKaX3ciTLZsHvaQXeTY0kX0vrpmjyAbZsIQznJNf X-Developer-Key: i=akhilpo@oss.qualcomm.com; a=ed25519; pk=lmVtttSHmAUYFnJsQHX80IIRmYmXA4+CzpGcWOOsfKA= X-Proofpoint-GUID: doA2tM3lZ_2HRvRRFLSat8KAFqwN7XSi X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTE4MDA2OSBTYWx0ZWRfX40TmcLEV6qNT RMOVaFAFwOjvLtIOTlm9AVXm5HBJzbV1DjdzPxumYo11C/9NwLoklY3Tq2711WK+2+kKXNGLgRA ChLtwmMj3vmEk1zcJmV8Rh5kMvsjw7A5+Uhq7uC0X35WtwXxj6W9pgBqq+yUXrogWyVdQqCIXRB sv2dSi9i/akXldtaCT9hNOoMz2SIE3Sz5eN471Yz83QNyigYdv7tOh/B7gXbtcuy+Wc3y6iwvOL rTXR47MAc/mcrGA67bdpS13G3n2sgPXjiVhLqOhB6F1asgTMX0Nniindr7vcZqbvConSLTt5c5v 5gJ3gFzbrB0C2ij2Es5Q4IUrdqufsRPm+EySLS+Tm3OI0GBsXI4zKB1+/ab57yO5auUapdXqOqz d3Ees8IYIBWaBKPR5/6sTY5wyUE1mQ== X-Proofpoint-ORIG-GUID: doA2tM3lZ_2HRvRRFLSat8KAFqwN7XSi X-Authority-Analysis: v=2.4 cv=Y5L1cxeN c=1 sm=1 tr=0 ts=691c33ec cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=jvJuTtenM57zLa_9FEIA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q: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 suspectscore=0 spamscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 impostorscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2511180069 A8x GMU firmwares expect a separate vote table which describes the relationship between the Gx rail and MxA rail (and possibly Cx rail). Create this new vote table and implement the new HFI message which allows passing vote tables to send this data to GMU. Signed-off-by: Akhil P Oommen --- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 54 +++++++++++++++++++++++++++++++= ++++ drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 1 + drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 53 +++++++++++++++++++++++++++++++= +++ drivers/gpu/drm/msm/adreno/a6xx_hfi.h | 17 +++++++++++ 4 files changed, 125 insertions(+) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.c index b76960c6d444..cede210a0a78 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -1616,6 +1616,57 @@ static int a6xx_gmu_rpmh_arc_votes_init(struct devic= e *dev, u32 *votes, return 0; } =20 +static int a6xx_gmu_rpmh_dep_votes_init(struct device *dev, u32 *votes, + unsigned long *freqs, int freqs_count) +{ + const u16 *mx; + size_t count; + + mx =3D cmd_db_read_aux_data("mx.lvl", &count); + if (IS_ERR(mx)) + return PTR_ERR(mx); + /* + * The data comes back as an array of unsigned shorts so adjust the + * count accordingly + */ + count >>=3D 1; + if (!count) + return -EINVAL; + + /* Fix the vote for zero frequency */ + votes[0] =3D 0xffffffff; + + /* Construct a vote for rest of the corners */ + for (int i =3D 1; i < freqs_count; i++) { + unsigned int level =3D a6xx_gmu_get_arc_level(dev, freqs[i]); + u8 j, index =3D 0; + + /* Get the primary index that matches the arc level */ + for (j =3D 0; j < count; j++) { + if (mx[j] >=3D level) { + index =3D j; + break; + } + } + + if (j =3D=3D count) { + DRM_DEV_ERROR(dev, + "Mx Level %u not found in the RPMh list\n", + level); + DRM_DEV_ERROR(dev, "Available levels:\n"); + for (j =3D 0; j < count; j++) + DRM_DEV_ERROR(dev, " %u\n", mx[j]); + + return -EINVAL; + } + + /* Construct the vote */ + votes[i] =3D (0x3fff << 14) | (index << 8) | (0xff); + } + + return 0; +} + /* * The GMU votes with the RPMh for itself and on behalf of the GPU but we = need * to construct the list of votes on the CPU and send it over. Query the R= PMh @@ -1649,6 +1700,9 @@ static int a6xx_gmu_rpmh_votes_init(struct a6xx_gmu *= gmu) ret |=3D a6xx_gmu_rpmh_arc_votes_init(gmu->dev, gmu->cx_arc_votes, gmu->gmu_freqs, gmu->nr_gmu_freqs, "cx.lvl", "mx.lvl"); =20 + ret |=3D a6xx_gmu_rpmh_dep_votes_init(gmu->dev, gmu->dep_arc_votes, + gmu->gpu_freqs, gmu->nr_gpu_freqs); + /* Build the interconnect votes */ if (info->bcms && gmu->nr_gpu_bws > 1) ret |=3D a6xx_gmu_rpmh_bw_votes_init(adreno_gpu, info, gmu); diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/ad= reno/a6xx_gmu.h index edf6c282cd76..2af074c8e8cf 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h @@ -97,6 +97,7 @@ struct a6xx_gmu { int nr_gpu_freqs; unsigned long gpu_freqs[GMU_MAX_GX_FREQS]; u32 gx_arc_votes[GMU_MAX_GX_FREQS]; + u32 dep_arc_votes[GMU_MAX_GX_FREQS]; struct a6xx_hfi_acd_table acd_table; =20 int nr_gpu_bws; diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c b/drivers/gpu/drm/msm/ad= reno/a6xx_hfi.c index 206eb204cea1..53cfdf4e6c34 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.c @@ -23,6 +23,7 @@ static const char * const a6xx_hfi_msg_id[] =3D { HFI_MSG_ID(HFI_H2F_MSG_START), HFI_MSG_ID(HFI_H2F_FEATURE_CTRL), HFI_MSG_ID(HFI_H2F_MSG_CORE_FW_START), + HFI_MSG_ID(HFI_H2F_MSG_TABLE), HFI_MSG_ID(HFI_H2F_MSG_GX_BW_PERF_VOTE), HFI_MSG_ID(HFI_H2F_MSG_PREPARE_SLUMBER), }; @@ -270,11 +271,63 @@ static int a6xx_hfi_send_perf_table_v1(struct a6xx_gm= u *gmu) NULL, 0); } =20 +static int a8xx_hfi_send_perf_table(struct a6xx_gmu *gmu) +{ + unsigned int num_gx_votes =3D 3, num_cx_votes =3D 2; + struct a6xx_hfi_table_entry *entry; + struct a6xx_hfi_table *tbl; + int ret, i; + u32 size; + + size =3D sizeof(*tbl) + (2 * sizeof(tbl->entry[0])) + + (gmu->nr_gpu_freqs * num_gx_votes * sizeof(gmu->gx_arc_votes[0])) + + (gmu->nr_gmu_freqs * num_cx_votes * sizeof(gmu->cx_arc_votes[0])); + tbl =3D kzalloc(size, GFP_KERNEL); + tbl->type =3D HFI_TABLE_GPU_PERF; + + /* First fill GX votes */ + entry =3D &tbl->entry[0]; + entry->count =3D gmu->nr_gpu_freqs; + entry->stride =3D num_gx_votes; + + for (i =3D 0; i < gmu->nr_gpu_freqs; i++) { + unsigned int base =3D i * entry->stride; + + entry->data[base+0] =3D gmu->gx_arc_votes[i]; + entry->data[base+1] =3D gmu->dep_arc_votes[i]; + entry->data[base+2] =3D gmu->gpu_freqs[i] / 1000; + } + + /* Then fill CX votes */ + entry =3D (struct a6xx_hfi_table_entry *) + &tbl->entry[0].data[gmu->nr_gpu_freqs * num_gx_votes]; + + entry->count =3D gmu->nr_gmu_freqs; + entry->stride =3D num_cx_votes; + + for (i =3D 0; i < gmu->nr_gmu_freqs; i++) { + unsigned int base =3D i * entry->stride; + + entry->data[base] =3D gmu->cx_arc_votes[i]; + entry->data[base+1] =3D gmu->gmu_freqs[i] / 1000; + } + + ret =3D a6xx_hfi_send_msg(gmu, HFI_H2F_MSG_TABLE, tbl, size, NULL, 0); + + kfree(tbl); + return ret; +} + static int a6xx_hfi_send_perf_table(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 a6xx_hfi_msg_perf_table msg =3D { 0 }; int i; =20 + if (adreno_is_a8xx(adreno_gpu)) + return a8xx_hfi_send_perf_table(gmu); + msg.num_gpu_levels =3D gmu->nr_gpu_freqs; msg.num_gmu_levels =3D gmu->nr_gmu_freqs; =20 diff --git a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h b/drivers/gpu/drm/msm/ad= reno/a6xx_hfi.h index 653ef720e2da..6f9f74a0bc85 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_hfi.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_hfi.h @@ -185,6 +185,23 @@ struct a6xx_hfi_msg_core_fw_start { u32 handle; }; =20 +#define HFI_H2F_MSG_TABLE 15 + +struct a6xx_hfi_table_entry { + u32 count; + u32 stride; + u32 data[]; +}; + +struct a6xx_hfi_table { + u32 header; + u32 version; + u32 type; +#define HFI_TABLE_BW_VOTE 0 +#define HFI_TABLE_GPU_PERF 1 + struct a6xx_hfi_table_entry entry[]; +}; + #define HFI_H2F_MSG_GX_BW_PERF_VOTE 30 =20 struct a6xx_hfi_gx_bw_perf_vote_cmd { --=20 2.51.0