From nobody Tue Dec 2 02:52:38 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 4C3B9304BDA for ; Tue, 18 Nov 2025 08:52:07 +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=1763455933; cv=none; b=BN6iqUiXLnjzS5m2BENZ09W7E7fIe0Y0IG3WKwgIgZfCH5u2c9rr5jDcc48DKj6Jom0q46vgBbeF4voMOTTy4UjMbi5HsT+pGDd/Mq+nj2eVDpYIgsFCGr1Ky9TQwqhQ/cnkdW/urdsqOybFA+yM7DZ4P9z6GcRroCrtnn/eMyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763455933; c=relaxed/simple; bh=hI0Ubv/QGB2+bldfijTXg+iFk4Gyrwu6OME8hK7Ka1Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pcd4eR5K5mEP4WHG79roldxY0PLW+F5g8utBVZpFk9re8nnTrSkP7IrEeQmCmYKFWZ8uMjgCuklGOZ7Dz49lSrU406hYLGszW4qioTjfoAedTtcAtIfGrLj4JKfRlAfRwr1PkihaRsfOqASF5bbEozksB83qvz4+NjE45Vs48bM= 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=aYIBaDR2; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=U/8KT4Zk; 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="aYIBaDR2"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="U/8KT4Zk" 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 5AI6ePkm1106928 for ; Tue, 18 Nov 2025 08:52:06 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= 65CpwLFEFxs9CB1wYZ06Y+HHuOxCkau2GkqthL/Ua6Y=; b=aYIBaDR2ptGlmtDH oNJ6AYREOf7fya3AvFcN2df3J6Gp0G1JaBY1evOsGILopd1m3UXtAxvpn4ytKqcQ Eh3kvMgc5zQPiakXuoIKbixf7zfIUEdh3g3cvgPG/WNEqV7F/bIu6JYohApsKOC2 rB6XthGW35VXtB+aocdUq299xjV6RAaFxfSPiK+HTfp234ocp742GJO0e/1I2I// ernIhwn+HC/fMXv2BmG2FhyaJE9VYy3eSusyMCAS7L9doLTY9UhFU18X1Sa2j2xy lHhfJ+XMvNRrY2RBaVKX6lDzEpqK/oPIWLmt0Z2X7JsaX1POt2g7GWwAk3tMi9o3 6Os4hg== 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 4ag2hpbd2w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 18 Nov 2025 08:52:05 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-297dfae179bso133278985ad.1 for ; Tue, 18 Nov 2025 00:52:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1763455925; x=1764060725; 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=65CpwLFEFxs9CB1wYZ06Y+HHuOxCkau2GkqthL/Ua6Y=; b=U/8KT4Zkoo6BCIyEC8sX8RTQXDgH9KlDuI1ersk23YBmSq+woAYd9vjIfKEZKxK6DY iHk2jvfkNNJyo9d6JLmJXZ6vgnoU0cijx0ycfmwZCFza0A3ClZmbhSuT2ykO4pUG2qm3 XO0LNLWHIP7NWnrsHHOb9R7epb0fCGPFLCM6R1Cz35d/C7avIsAlUj3cL2Nh5F5Mjk2l uVMM8tOIgaMtr20RHROjBEEudmaw7kgllQpTmg54luH1/PHbjcmcOyPu8Lm/1ssEr0RE 06By0d5jxRXY2WbYbIxXl7LtdJ/zDKP9Y0Cz+i9tpNMMiQNRFB1KP9p/RD0THdFMC+vd lBVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763455925; x=1764060725; 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=65CpwLFEFxs9CB1wYZ06Y+HHuOxCkau2GkqthL/Ua6Y=; b=bjBdzYQe6TyuQ+I8OJot7CycHGsvSFaiPHM42g/3urFmr+Pqv0lEM5n1dy3pdhWuYV tiVwPMNW0YvR8HO6QrFlnD1nCeLOoTgOPIcRiTD1wkhvBGq9elOS1dgZROqW2KOAHU+A zWsayL4lJSfRVeXHx7Ao4MWgRonCkbKc6u3d/dhNn7FsEc80YzhvmmgHqx5QBCeE0WoQ aPb3vW5G+uVeVQM6Osg0z22T4nEQNie/fwBxGaO0LMOc+AqoeWhj3JhRnCMfR3Czjq6e tJy5mwjRIyK8QvNZwY3s/S72+H9ya1jHx/AA7WSpRRrQGg0IZsxwthm9LZ5/UHjqgL0T /3Zw== X-Forwarded-Encrypted: i=1; AJvYcCWh43HTBP7qjzVDG1V7zYCczB/vu7k8B+PxQLM2RlFdzjapQWXhbEg2YwYk8fKK+mLmBCADpjXoFKBvuvk=@vger.kernel.org X-Gm-Message-State: AOJu0YxsbvsKiuxTjNR1jMJ6Su3ULaf9PgLD/dWxgaXGvzEtK8GXK0gn i1FDoGw/ddyvAxIRSQH7+/j1wgEOTW8yYXNWUKWn3Xl97lDLLTfZoKs1v3ZGFOIyOkMx3HJotdU nrzlA7KYWbY5KQR2DevyqqvwE2By9+vVf2THm0Fn/Gkvu/akQQJeOJIXTB52R65sOAno= X-Gm-Gg: ASbGncuOqQbsr3jzrmp6IS4QecjbLVJu08Kr5T3Kvy+IqG4LyZf6C7Ty+hC87q00an7 OnYFlvyGf7hLi+VjyYsgJXP9NfHZKqvVvu3j/gSyj1hdAnWmqrO97H2jXpRIdX4LMLOvUAHukpe j0CfUK7TNudRDMbJleuaZ4Iw8JC/80PwVK6i/Gs026JxSAvsthB0ZghE0FM/V6Jp8BMUjOSjAtD WOnTow0fbi945JwtgDjo6eLrUxsiaWi9v/p9G133HO7RLnY61P3qnXoPgHhCi2Bm3JLVdY+wOfv 8t2uNPTrCZh2RNbkS5FTjqfbuBPklqOwl1FKk6OCEEvIbrI3Od3ogNw7tZ4K4dxFhRYXzTFZNPm udCMmVYaexZfIKTOyA/zDPsE= X-Received: by 2002:a17:902:f78d:b0:299:bdaa:a71b with SMTP id d9443c01a7336-299bdaaa8f7mr155163915ad.2.1763455924536; Tue, 18 Nov 2025 00:52:04 -0800 (PST) X-Google-Smtp-Source: AGHT+IG8YKtuEmGD+PifNMxxkUUz2QfmYoNFknEzZIBCMeIpT05x8NGnxYNIJjJxgRYma23+V7TKag== X-Received: by 2002:a17:902:f78d:b0:299:bdaa:a71b with SMTP id d9443c01a7336-299bdaaa8f7mr155163375ad.2.1763455923871; Tue, 18 Nov 2025 00:52:03 -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.51.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Nov 2025 00:52:03 -0800 (PST) From: Akhil P Oommen Date: Tue, 18 Nov 2025 14:20:33 +0530 Subject: [PATCH v4 06/22] drm/msm/adreno: Move adreno_gpu_func to catalogue 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-6-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=39760; i=akhilpo@oss.qualcomm.com; s=20240726; h=from:subject:message-id; bh=hI0Ubv/QGB2+bldfijTXg+iFk4Gyrwu6OME8hK7Ka1Y=; b=zNAIjSkVokNkzSwWWe0KGrJ0WmKFbCPSZuosPR+rrHxs5fzZ1hUilLjlnNDmXg8eAiH3eBXpn im24ZoTbSeACqwcwqF+e9QsS0zvOJjTPjbPoUUa43T4/QEQd5YK2pKW X-Developer-Key: i=akhilpo@oss.qualcomm.com; a=ed25519; pk=lmVtttSHmAUYFnJsQHX80IIRmYmXA4+CzpGcWOOsfKA= X-Proofpoint-GUID: _V1dCWQzhUidDIOKJMgKVrEZKDJN00cM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMTE4MDA2OSBTYWx0ZWRfX43f+0JKgo5QY yo3rvenYpxbgPJ4WMgv+yGmOScyiIMH0rvOr5QypipqjODghE94hfNqU91gmtFy8Xp+H3rdm5NZ K27UxqcPQZKpwCASnBBrjt9rS9hZqdORlgAOxX0/t6540LkVo0MuK7fEp4nhYqpbaqDjWUMcRJh huCWwz3YqAkQdhG3W/I+Za+zjS1LNBmX/nTDUFkcvxZxhc7A525jKeaKmMRxh4Ne6X7BT4/20GZ t5R7f/4o5UZT8wLLaPKKrEaR1JYTXS0jFQ/laT63sT2Xy4yyBI4ON7xozoAZPfpvEAe+6NFws/W NIAkPJRTwFB5xM8QuqGdLqqwcGlAHQymw0GZQq7wmcpBY4qIqXpiz3KtPOEV/bPW13I7K6+iFjy ubQrGXXTsxKtdkjtf/9tv0Y6493DKw== X-Proofpoint-ORIG-GUID: _V1dCWQzhUidDIOKJMgKVrEZKDJN00cM X-Authority-Analysis: v=2.4 cv=Y5L1cxeN c=1 sm=1 tr=0 ts=691c33b6 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=6UeiqGixMTsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=ZW5s_5jsAU3U6Z_Cp8gA:9 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC: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 In A6x family (which is a pretty big one), there are separate adreno_func definitions for each sub-generations. To streamline the identification of the correct struct for a gpu, move it to the catalogue and move the gpu_init routine to struct adreno_gpu_funcs. Signed-off-by: Akhil P Oommen --- drivers/gpu/drm/msm/adreno/a2xx_catalog.c | 7 +- drivers/gpu/drm/msm/adreno/a2xx_gpu.c | 50 +++---- drivers/gpu/drm/msm/adreno/a2xx_gpu.h | 2 + drivers/gpu/drm/msm/adreno/a3xx_catalog.c | 13 +- drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 52 ++++---- drivers/gpu/drm/msm/adreno/a3xx_gpu.h | 2 + drivers/gpu/drm/msm/adreno/a4xx_catalog.c | 7 +- drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 54 ++++---- drivers/gpu/drm/msm/adreno/a4xx_gpu.h | 2 + drivers/gpu/drm/msm/adreno/a5xx_catalog.c | 17 +-- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 61 ++++----- drivers/gpu/drm/msm/adreno/a5xx_gpu.h | 1 + drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 48 +++---- drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 202 ++++++++++++++-----------= ---- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 4 + drivers/gpu/drm/msm/adreno/adreno_device.c | 2 +- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 11 +- 17 files changed, 275 insertions(+), 260 deletions(-) diff --git a/drivers/gpu/drm/msm/adreno/a2xx_catalog.c b/drivers/gpu/drm/ms= m/adreno/a2xx_catalog.c index 5ddd015f930d..e9dbf3ddf89e 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a2xx_catalog.c @@ -7,6 +7,7 @@ */ =20 #include "adreno_gpu.h" +#include "a2xx_gpu.h" =20 static const struct adreno_info a2xx_gpus[] =3D { { @@ -19,7 +20,7 @@ static const struct adreno_info a2xx_gpus[] =3D { }, .gmem =3D SZ_256K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a2xx_gpu_init, + .funcs =3D &a2xx_gpu_funcs, }, { /* a200 on i.mx51 has only 128kib gmem */ .chip_ids =3D ADRENO_CHIP_IDS(0x02000001), .family =3D ADRENO_2XX_GEN1, @@ -30,7 +31,7 @@ static const struct adreno_info a2xx_gpus[] =3D { }, .gmem =3D SZ_128K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a2xx_gpu_init, + .funcs =3D &a2xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x02020000), .family =3D ADRENO_2XX_GEN2, @@ -41,7 +42,7 @@ static const struct adreno_info a2xx_gpus[] =3D { }, .gmem =3D SZ_512K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a2xx_gpu_init, + .funcs =3D &a2xx_gpu_funcs, } }; DECLARE_ADRENO_GPULIST(a2xx); diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a2xx_gpu.c index 963c0f669ee5..1b1ee14b65cf 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c @@ -486,39 +486,18 @@ static u32 a2xx_get_rptr(struct msm_gpu *gpu, struct = msm_ringbuffer *ring) return ring->memptrs->rptr; } =20 -static const struct adreno_gpu_funcs funcs =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a2xx_hw_init, - .pm_suspend =3D msm_gpu_pm_suspend, - .pm_resume =3D msm_gpu_pm_resume, - .recover =3D a2xx_recover, - .submit =3D a2xx_submit, - .active_ring =3D adreno_active_ring, - .irq =3D a2xx_irq, - .destroy =3D a2xx_destroy, -#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) - .show =3D adreno_show, -#endif - .gpu_state_get =3D a2xx_gpu_state_get, - .gpu_state_put =3D adreno_gpu_state_put, - .create_vm =3D a2xx_create_vm, - .get_rptr =3D a2xx_get_rptr, - }, -}; - static const struct msm_gpu_perfcntr perfcntrs[] =3D { /* TODO */ }; =20 -struct msm_gpu *a2xx_gpu_init(struct drm_device *dev) +static struct msm_gpu *a2xx_gpu_init(struct drm_device *dev) { struct a2xx_gpu *a2xx_gpu =3D NULL; struct adreno_gpu *adreno_gpu; struct msm_gpu *gpu; struct msm_drm_private *priv =3D dev->dev_private; struct platform_device *pdev =3D priv->gpu_pdev; + struct adreno_platform_config *config =3D pdev->dev.platform_data; int ret; =20 if (!pdev) { @@ -539,7 +518,7 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device *dev) gpu->perfcntrs =3D perfcntrs; gpu->num_perfcntrs =3D ARRAY_SIZE(perfcntrs); =20 - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1); + ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); if (ret) goto fail; =20 @@ -558,3 +537,26 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device *dev) =20 return ERR_PTR(ret); } + +const struct adreno_gpu_funcs a2xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a2xx_hw_init, + .pm_suspend =3D msm_gpu_pm_suspend, + .pm_resume =3D msm_gpu_pm_resume, + .recover =3D a2xx_recover, + .submit =3D a2xx_submit, + .active_ring =3D adreno_active_ring, + .irq =3D a2xx_irq, + .destroy =3D a2xx_destroy, +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) + .show =3D adreno_show, +#endif + .gpu_state_get =3D a2xx_gpu_state_get, + .gpu_state_put =3D adreno_gpu_state_put, + .create_vm =3D a2xx_create_vm, + .get_rptr =3D a2xx_get_rptr, + }, + .init =3D a2xx_gpu_init, +}; diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a2xx_gpu.h index 53702f19990f..162ef98951f5 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.h @@ -19,6 +19,8 @@ struct a2xx_gpu { }; #define to_a2xx_gpu(x) container_of(x, struct a2xx_gpu, base) =20 +extern const struct adreno_gpu_funcs a2xx_gpu_funcs; + struct msm_mmu *a2xx_gpummu_new(struct device *dev, struct msm_gpu *gpu); void a2xx_gpummu_params(struct msm_mmu *mmu, dma_addr_t *pt_base, dma_addr_t *tran_error); diff --git a/drivers/gpu/drm/msm/adreno/a3xx_catalog.c b/drivers/gpu/drm/ms= m/adreno/a3xx_catalog.c index 1498e6532f62..6ae8716fc08a 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_catalog.c @@ -7,6 +7,7 @@ */ =20 #include "adreno_gpu.h" +#include "a3xx_gpu.h" =20 static const struct adreno_info a3xx_gpus[] =3D { { @@ -18,7 +19,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_128K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x03000520), .family =3D ADRENO_3XX, @@ -29,7 +30,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_256K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x03000600), .family =3D ADRENO_3XX, @@ -40,7 +41,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_128K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x03000620), .family =3D ADRENO_3XX, @@ -51,7 +52,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_128K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS( 0x03020000, @@ -66,7 +67,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_512K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS( 0x03030000, @@ -81,7 +82,7 @@ static const struct adreno_info a3xx_gpus[] =3D { }, .gmem =3D SZ_1M, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a3xx_gpu_init, + .funcs =3D &a3xx_gpu_funcs, } }; DECLARE_ADRENO_GPULIST(a3xx); diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a3xx_gpu.c index a956cd79195e..f22d33e99e81 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c @@ -508,29 +508,6 @@ static u32 a3xx_get_rptr(struct msm_gpu *gpu, struct m= sm_ringbuffer *ring) return ring->memptrs->rptr; } =20 -static const struct adreno_gpu_funcs funcs =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a3xx_hw_init, - .pm_suspend =3D msm_gpu_pm_suspend, - .pm_resume =3D msm_gpu_pm_resume, - .recover =3D a3xx_recover, - .submit =3D a3xx_submit, - .active_ring =3D adreno_active_ring, - .irq =3D a3xx_irq, - .destroy =3D a3xx_destroy, -#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) - .show =3D adreno_show, -#endif - .gpu_busy =3D a3xx_gpu_busy, - .gpu_state_get =3D a3xx_gpu_state_get, - .gpu_state_put =3D adreno_gpu_state_put, - .create_vm =3D adreno_create_vm, - .get_rptr =3D a3xx_get_rptr, - }, -}; - 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" }, @@ -538,13 +515,14 @@ static const struct msm_gpu_perfcntr perfcntrs[] =3D { SP_FS_FULL_ALU_INSTRUCTIONS, "ALUFULL" }, }; =20 -struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) +static struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) { struct a3xx_gpu *a3xx_gpu =3D NULL; struct adreno_gpu *adreno_gpu; struct msm_gpu *gpu; struct msm_drm_private *priv =3D dev->dev_private; struct platform_device *pdev =3D priv->gpu_pdev; + struct adreno_platform_config *config =3D pdev->dev.platform_data; struct icc_path *ocmem_icc_path; struct icc_path *icc_path; int ret; @@ -569,7 +547,7 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) =20 adreno_gpu->registers =3D a3xx_registers; =20 - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1); + ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); if (ret) goto fail; =20 @@ -613,3 +591,27 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) =20 return ERR_PTR(ret); } + +const struct adreno_gpu_funcs a3xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a3xx_hw_init, + .pm_suspend =3D msm_gpu_pm_suspend, + .pm_resume =3D msm_gpu_pm_resume, + .recover =3D a3xx_recover, + .submit =3D a3xx_submit, + .active_ring =3D adreno_active_ring, + .irq =3D a3xx_irq, + .destroy =3D a3xx_destroy, +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) + .show =3D adreno_show, +#endif + .gpu_busy =3D a3xx_gpu_busy, + .gpu_state_get =3D a3xx_gpu_state_get, + .gpu_state_put =3D adreno_gpu_state_put, + .create_vm =3D adreno_create_vm, + .get_rptr =3D a3xx_get_rptr, + }, + .init =3D a3xx_gpu_init, +}; diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a3xx_gpu.h index c555fb13e0d7..3d4ec9dbd918 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.h @@ -23,4 +23,6 @@ struct a3xx_gpu { }; #define to_a3xx_gpu(x) container_of(x, struct a3xx_gpu, base) =20 +extern const struct adreno_gpu_funcs a3xx_gpu_funcs; + #endif /* __A3XX_GPU_H__ */ diff --git a/drivers/gpu/drm/msm/adreno/a4xx_catalog.c b/drivers/gpu/drm/ms= m/adreno/a4xx_catalog.c index 09f9f228b75e..9192586f7ef0 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a4xx_catalog.c @@ -7,6 +7,7 @@ */ =20 #include "adreno_gpu.h" +#include "a4xx_gpu.h" =20 static const struct adreno_info a4xx_gpus[] =3D { { @@ -19,7 +20,7 @@ static const struct adreno_info a4xx_gpus[] =3D { }, .gmem =3D SZ_256K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a4xx_gpu_init, + .funcs =3D &a4xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x04020000), .family =3D ADRENO_4XX, @@ -30,7 +31,7 @@ static const struct adreno_info a4xx_gpus[] =3D { }, .gmem =3D (SZ_1M + SZ_512K), .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a4xx_gpu_init, + .funcs =3D &a4xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x04030002), .family =3D ADRENO_4XX, @@ -41,7 +42,7 @@ static const struct adreno_info a4xx_gpus[] =3D { }, .gmem =3D (SZ_1M + SZ_512K), .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a4xx_gpu_init, + .funcs =3D &a4xx_gpu_funcs, } }; DECLARE_ADRENO_GPULIST(a4xx); diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a4xx_gpu.c index 83f6329accba..db06c06067ae 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c @@ -627,37 +627,14 @@ static u32 a4xx_get_rptr(struct msm_gpu *gpu, struct = msm_ringbuffer *ring) return ring->memptrs->rptr; } =20 -static const struct adreno_gpu_funcs funcs =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a4xx_hw_init, - .pm_suspend =3D a4xx_pm_suspend, - .pm_resume =3D a4xx_pm_resume, - .recover =3D a4xx_recover, - .submit =3D a4xx_submit, - .active_ring =3D adreno_active_ring, - .irq =3D a4xx_irq, - .destroy =3D a4xx_destroy, -#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) - .show =3D adreno_show, -#endif - .gpu_busy =3D a4xx_gpu_busy, - .gpu_state_get =3D a4xx_gpu_state_get, - .gpu_state_put =3D adreno_gpu_state_put, - .create_vm =3D adreno_create_vm, - .get_rptr =3D a4xx_get_rptr, - }, - .get_timestamp =3D a4xx_get_timestamp, -}; - -struct msm_gpu *a4xx_gpu_init(struct drm_device *dev) +static struct msm_gpu *a4xx_gpu_init(struct drm_device *dev) { struct a4xx_gpu *a4xx_gpu =3D NULL; struct adreno_gpu *adreno_gpu; struct msm_gpu *gpu; struct msm_drm_private *priv =3D dev->dev_private; struct platform_device *pdev =3D priv->gpu_pdev; + struct adreno_platform_config *config =3D pdev->dev.platform_data; struct icc_path *ocmem_icc_path; struct icc_path *icc_path; int ret; @@ -680,7 +657,7 @@ struct msm_gpu *a4xx_gpu_init(struct drm_device *dev) gpu->perfcntrs =3D NULL; gpu->num_perfcntrs =3D 0; =20 - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1); + ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, 1); if (ret) goto fail; =20 @@ -726,3 +703,28 @@ struct msm_gpu *a4xx_gpu_init(struct drm_device *dev) =20 return ERR_PTR(ret); } + +const struct adreno_gpu_funcs a4xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a4xx_hw_init, + .pm_suspend =3D a4xx_pm_suspend, + .pm_resume =3D a4xx_pm_resume, + .recover =3D a4xx_recover, + .submit =3D a4xx_submit, + .active_ring =3D adreno_active_ring, + .irq =3D a4xx_irq, + .destroy =3D a4xx_destroy, +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) + .show =3D adreno_show, +#endif + .gpu_busy =3D a4xx_gpu_busy, + .gpu_state_get =3D a4xx_gpu_state_get, + .gpu_state_put =3D adreno_gpu_state_put, + .create_vm =3D adreno_create_vm, + .get_rptr =3D a4xx_get_rptr, + }, + .init =3D a4xx_gpu_init, + .get_timestamp =3D a4xx_get_timestamp, +}; diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a4xx_gpu.h index a01448cba2ea..71b164439f62 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.h @@ -20,4 +20,6 @@ struct a4xx_gpu { }; #define to_a4xx_gpu(x) container_of(x, struct a4xx_gpu, base) =20 +extern const struct adreno_gpu_funcs a4xx_gpu_funcs; + #endif /* __A4XX_GPU_H__ */ diff --git a/drivers/gpu/drm/msm/adreno/a5xx_catalog.c b/drivers/gpu/drm/ms= m/adreno/a5xx_catalog.c index b48a636d8237..babd320f3b73 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_catalog.c @@ -7,6 +7,7 @@ */ =20 #include "adreno_gpu.h" +#include "a5xx_gpu.h" =20 static const struct adreno_info a5xx_gpus[] =3D { { @@ -21,7 +22,7 @@ static const struct adreno_info a5xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_TWO_PASS_USE_WFI | ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x05000600), .family =3D ADRENO_5XX, @@ -38,7 +39,7 @@ static const struct adreno_info a5xx_gpus[] =3D { .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_TWO_PASS_USE_WFI | ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, .zapfw =3D "a506_zap.mdt", }, { .chip_ids =3D ADRENO_CHIP_IDS(0x05000800), @@ -55,7 +56,7 @@ static const struct adreno_info a5xx_gpus[] =3D { */ .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, .zapfw =3D "a508_zap.mdt", }, { .chip_ids =3D ADRENO_CHIP_IDS(0x05000900), @@ -72,7 +73,7 @@ static const struct adreno_info a5xx_gpus[] =3D { */ .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, /* Adreno 509 uses the same ZAP as 512 */ .zapfw =3D "a512_zap.mdt", }, { @@ -89,7 +90,7 @@ static const struct adreno_info a5xx_gpus[] =3D { * the GDSC which appears to make it grumpy */ .inactive_period =3D 250, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, }, { .chip_ids =3D ADRENO_CHIP_IDS(0x05010200), .family =3D ADRENO_5XX, @@ -105,7 +106,7 @@ static const struct adreno_info a5xx_gpus[] =3D { */ .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, .zapfw =3D "a512_zap.mdt", }, { .chip_ids =3D ADRENO_CHIP_IDS( @@ -127,7 +128,7 @@ static const struct adreno_info a5xx_gpus[] =3D { .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_TWO_PASS_USE_WFI | ADRENO_QUIRK_FAULT_DETECT_MASK, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, .zapfw =3D "a530_zap.mdt", }, { .chip_ids =3D ADRENO_CHIP_IDS(0x05040001), @@ -145,7 +146,7 @@ static const struct adreno_info a5xx_gpus[] =3D { */ .inactive_period =3D 250, .quirks =3D ADRENO_QUIRK_LMLOADKILL_DISABLE, - .init =3D a5xx_gpu_init, + .funcs =3D &a5xx_gpu_funcs, .zapfw =3D "a540_zap.mdt", } }; diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a5xx_gpu.c index 4a04dc43a8e6..56eaff2ee4e4 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c @@ -1691,34 +1691,6 @@ static uint32_t a5xx_get_rptr(struct msm_gpu *gpu, s= truct msm_ringbuffer *ring) return ring->memptrs->rptr =3D gpu_read(gpu, REG_A5XX_CP_RB_RPTR); } =20 -static const struct adreno_gpu_funcs funcs =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a5xx_hw_init, - .ucode_load =3D a5xx_ucode_load, - .pm_suspend =3D a5xx_pm_suspend, - .pm_resume =3D a5xx_pm_resume, - .recover =3D a5xx_recover, - .submit =3D a5xx_submit, - .active_ring =3D a5xx_active_ring, - .irq =3D a5xx_irq, - .destroy =3D a5xx_destroy, -#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) - .show =3D a5xx_show, -#endif -#if defined(CONFIG_DEBUG_FS) - .debugfs_init =3D a5xx_debugfs_init, -#endif - .gpu_busy =3D a5xx_gpu_busy, - .gpu_state_get =3D a5xx_gpu_state_get, - .gpu_state_put =3D a5xx_gpu_state_put, - .create_vm =3D adreno_create_vm, - .get_rptr =3D a5xx_get_rptr, - }, - .get_timestamp =3D a5xx_get_timestamp, -}; - static void check_speed_bin(struct device *dev) { struct nvmem_cell *cell; @@ -1751,7 +1723,7 @@ static void check_speed_bin(struct device *dev) devm_pm_opp_set_supported_hw(dev, &val, 1); } =20 -struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) +static struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) { struct msm_drm_private *priv =3D dev->dev_private; struct platform_device *pdev =3D priv->gpu_pdev; @@ -1781,7 +1753,7 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) if (config->info->revn =3D=3D 510) nr_rings =3D 1; =20 - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, nr_rings); + ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, nr_ri= ngs); if (ret) { a5xx_destroy(&(a5xx_gpu->base.base)); return ERR_PTR(ret); @@ -1806,3 +1778,32 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev) =20 return gpu; } + +const struct adreno_gpu_funcs a5xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a5xx_hw_init, + .ucode_load =3D a5xx_ucode_load, + .pm_suspend =3D a5xx_pm_suspend, + .pm_resume =3D a5xx_pm_resume, + .recover =3D a5xx_recover, + .submit =3D a5xx_submit, + .active_ring =3D a5xx_active_ring, + .irq =3D a5xx_irq, + .destroy =3D a5xx_destroy, +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP) + .show =3D a5xx_show, +#endif +#if defined(CONFIG_DEBUG_FS) + .debugfs_init =3D a5xx_debugfs_init, +#endif + .gpu_busy =3D a5xx_gpu_busy, + .gpu_state_get =3D a5xx_gpu_state_get, + .gpu_state_put =3D a5xx_gpu_state_put, + .create_vm =3D adreno_create_vm, + .get_rptr =3D a5xx_get_rptr, + }, + .init =3D a5xx_gpu_init, + .get_timestamp =3D a5xx_get_timestamp, +}; diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.h b/drivers/gpu/drm/msm/ad= reno/a5xx_gpu.h index 9c0d701fe4b8..407bb950d350 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.h @@ -133,6 +133,7 @@ struct a5xx_preempt_record { */ #define A5XX_PREEMPT_COUNTER_SIZE (16 * 4) =20 +extern const struct adreno_gpu_funcs a5xx_gpu_funcs; =20 int a5xx_power_init(struct msm_gpu *gpu); void a5xx_gpmu_ucode_init(struct msm_gpu *gpu); diff --git a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c b/drivers/gpu/drm/ms= m/adreno/a6xx_catalog.c index 5db01fa2ed44..70433965c303 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_catalog.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_catalog.c @@ -683,7 +683,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .gmem =3D (SZ_128K + SZ_4K), .quirks =3D ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gmuwrapper_funcs, .zapfw =3D "a610_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a612_hwcg, @@ -714,7 +714,7 @@ static const struct adreno_info a6xx_gpus[] =3D { }, .gmem =3D (SZ_128K + SZ_4K), .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gmuwrapper_funcs, .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a612_hwcg, .protect =3D &a630_protect, @@ -732,7 +732,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .gmem =3D SZ_512K, .quirks =3D ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a615_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a615_hwcg, @@ -763,7 +763,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a615_zap.mbn", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a615_hwcg, @@ -790,7 +790,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .a6xx =3D &(const struct a6xx_info) { .protect =3D &a630_protect, .gmu_cgc_mode =3D 0x00000222, @@ -813,7 +813,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .gmem =3D SZ_512K, .quirks =3D ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a615_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a615_hwcg, @@ -838,7 +838,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .gmem =3D SZ_512K, .quirks =3D ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a615_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a615_hwcg, @@ -863,7 +863,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a615_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a615_hwcg, @@ -889,7 +889,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a620_zap.mbn", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a620_hwcg, @@ -912,7 +912,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a690_hwcg, .protect =3D &a650_protect, @@ -949,7 +949,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a630_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a630_hwcg, @@ -969,7 +969,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a640_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a640_hwcg, @@ -993,7 +993,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a650_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a650_hwcg, @@ -1019,7 +1019,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a660_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a660_hwcg, @@ -1038,7 +1038,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a690_hwcg, .protect =3D &a660_protect, @@ -1061,7 +1061,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a660_zap.mbn", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a660_hwcg, @@ -1088,7 +1088,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_4GB_VA, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a640_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a640_hwcg, @@ -1107,7 +1107,7 @@ static const struct adreno_info a6xx_gpus[] =3D { .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gpu_funcs, .zapfw =3D "a690_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a690_hwcg, @@ -1442,7 +1442,7 @@ static const struct adreno_info a7xx_gpus[] =3D { .gmem =3D SZ_128K, .inactive_period =3D DRM_MSM_INACTIVE_PERIOD, .quirks =3D ADRENO_QUIRK_HAS_HW_APRIV, - .init =3D a6xx_gpu_init, + .funcs =3D &a6xx_gmuwrapper_funcs, .zapfw =3D "a702_zap.mbn", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a702_hwcg, @@ -1468,7 +1468,7 @@ static const struct adreno_info a7xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV | ADRENO_QUIRK_PREEMPTION, - .init =3D a6xx_gpu_init, + .funcs =3D &a7xx_gpu_funcs, .zapfw =3D "a730_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a730_hwcg, @@ -1489,7 +1489,7 @@ static const struct adreno_info a7xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV | ADRENO_QUIRK_PREEMPTION, - .init =3D a6xx_gpu_init, + .funcs =3D &a7xx_gpu_funcs, .zapfw =3D "a740_zap.mdt", .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a740_hwcg, @@ -1523,7 +1523,7 @@ static const struct adreno_info a7xx_gpus[] =3D { ADRENO_QUIRK_HAS_HW_APRIV | ADRENO_QUIRK_PREEMPTION | ADRENO_QUIRK_IFPC, - .init =3D a6xx_gpu_init, + .funcs =3D &a7xx_gpu_funcs, .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a740_hwcg, .protect =3D &a730_protect, @@ -1564,7 +1564,7 @@ static const struct adreno_info a7xx_gpus[] =3D { ADRENO_QUIRK_HAS_HW_APRIV | ADRENO_QUIRK_PREEMPTION | ADRENO_QUIRK_IFPC, - .init =3D a6xx_gpu_init, + .funcs =3D &a7xx_gpu_funcs, .zapfw =3D "gen70900_zap.mbn", .a6xx =3D &(const struct a6xx_info) { .protect =3D &a730_protect, @@ -1597,7 +1597,7 @@ static const struct adreno_info a7xx_gpus[] =3D { .quirks =3D ADRENO_QUIRK_HAS_CACHED_COHERENT | ADRENO_QUIRK_HAS_HW_APRIV | ADRENO_QUIRK_PREEMPTION, - .init =3D a6xx_gpu_init, + .funcs =3D &a7xx_gpu_funcs, .a6xx =3D &(const struct a6xx_info) { .hwcg =3D a740_hwcg, .protect =3D &a730_protect, diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/ad= reno/a6xx_gpu.c index c6b2fdb86c17..ba95b29855a3 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -2555,100 +2555,7 @@ static int a6xx_set_supported_hw(struct device *dev= , const struct adreno_info *i return 0; } =20 -static const struct adreno_gpu_funcs funcs =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a6xx_hw_init, - .ucode_load =3D a6xx_ucode_load, - .pm_suspend =3D a6xx_gmu_pm_suspend, - .pm_resume =3D a6xx_gmu_pm_resume, - .recover =3D a6xx_recover, - .submit =3D a6xx_submit, - .active_ring =3D a6xx_active_ring, - .irq =3D a6xx_irq, - .destroy =3D a6xx_destroy, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .show =3D a6xx_show, -#endif - .gpu_busy =3D a6xx_gpu_busy, - .gpu_get_freq =3D a6xx_gmu_get_freq, - .gpu_set_freq =3D a6xx_gpu_set_freq, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .gpu_state_get =3D a6xx_gpu_state_get, - .gpu_state_put =3D a6xx_gpu_state_put, -#endif - .create_vm =3D a6xx_create_vm, - .create_private_vm =3D a6xx_create_private_vm, - .get_rptr =3D a6xx_get_rptr, - .progress =3D a6xx_progress, - .sysprof_setup =3D a6xx_gmu_sysprof_setup, - }, - .get_timestamp =3D a6xx_gmu_get_timestamp, -}; - -static const struct adreno_gpu_funcs funcs_gmuwrapper =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a6xx_hw_init, - .ucode_load =3D a6xx_ucode_load, - .pm_suspend =3D a6xx_pm_suspend, - .pm_resume =3D a6xx_pm_resume, - .recover =3D a6xx_recover, - .submit =3D a6xx_submit, - .active_ring =3D a6xx_active_ring, - .irq =3D a6xx_irq, - .destroy =3D a6xx_destroy, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .show =3D a6xx_show, -#endif - .gpu_busy =3D a6xx_gpu_busy, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .gpu_state_get =3D a6xx_gpu_state_get, - .gpu_state_put =3D a6xx_gpu_state_put, -#endif - .create_vm =3D a6xx_create_vm, - .create_private_vm =3D a6xx_create_private_vm, - .get_rptr =3D a6xx_get_rptr, - .progress =3D a6xx_progress, - }, - .get_timestamp =3D a6xx_get_timestamp, -}; - -static const struct adreno_gpu_funcs funcs_a7xx =3D { - .base =3D { - .get_param =3D adreno_get_param, - .set_param =3D adreno_set_param, - .hw_init =3D a6xx_hw_init, - .ucode_load =3D a6xx_ucode_load, - .pm_suspend =3D a6xx_gmu_pm_suspend, - .pm_resume =3D a6xx_gmu_pm_resume, - .recover =3D a6xx_recover, - .submit =3D a7xx_submit, - .active_ring =3D a6xx_active_ring, - .irq =3D a6xx_irq, - .destroy =3D a6xx_destroy, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .show =3D a6xx_show, -#endif - .gpu_busy =3D a6xx_gpu_busy, - .gpu_get_freq =3D a6xx_gmu_get_freq, - .gpu_set_freq =3D a6xx_gpu_set_freq, -#if defined(CONFIG_DRM_MSM_GPU_STATE) - .gpu_state_get =3D a6xx_gpu_state_get, - .gpu_state_put =3D a6xx_gpu_state_put, -#endif - .create_vm =3D a6xx_create_vm, - .create_private_vm =3D a6xx_create_private_vm, - .get_rptr =3D a6xx_get_rptr, - .progress =3D a6xx_progress, - .sysprof_setup =3D a6xx_gmu_sysprof_setup, - }, - .get_timestamp =3D a6xx_gmu_get_timestamp, -}; - -struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) +static struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) { struct msm_drm_private *priv =3D dev->dev_private; struct platform_device *pdev =3D priv->gpu_pdev; @@ -2659,7 +2566,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) struct msm_gpu *gpu; extern int enable_preemption; bool is_a7xx; - int ret; + int ret, nr_rings =3D 1; =20 a6xx_gpu =3D kzalloc(sizeof(*a6xx_gpu), GFP_KERNEL); if (!a6xx_gpu) @@ -2698,14 +2605,9 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) =20 if ((enable_preemption =3D=3D 1) || (enable_preemption =3D=3D -1 && (config->info->quirks & ADRENO_QUIRK_PREEMPTION))) - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_a7xx, 4); - else if (is_a7xx) - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_a7xx, 1); - else if (adreno_has_gmu_wrapper(adreno_gpu) || - of_device_is_compatible(node, "qcom,adreno-rgmu")) - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs_gmuwrapper, 1); - else - ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1); + nr_rings =3D 4; + + ret =3D adreno_gpu_init(dev, pdev, adreno_gpu, config->info->funcs, nr_ri= ngs); if (ret) { a6xx_destroy(&(a6xx_gpu->base.base)); return ERR_PTR(ret); @@ -2752,3 +2654,97 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) =20 return gpu; } + +const struct adreno_gpu_funcs a6xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a6xx_hw_init, + .ucode_load =3D a6xx_ucode_load, + .pm_suspend =3D a6xx_gmu_pm_suspend, + .pm_resume =3D a6xx_gmu_pm_resume, + .recover =3D a6xx_recover, + .submit =3D a6xx_submit, + .active_ring =3D a6xx_active_ring, + .irq =3D a6xx_irq, + .destroy =3D a6xx_destroy, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .show =3D a6xx_show, +#endif + .gpu_busy =3D a6xx_gpu_busy, + .gpu_get_freq =3D a6xx_gmu_get_freq, + .gpu_set_freq =3D a6xx_gpu_set_freq, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .gpu_state_get =3D a6xx_gpu_state_get, + .gpu_state_put =3D a6xx_gpu_state_put, +#endif + .create_vm =3D a6xx_create_vm, + .create_private_vm =3D a6xx_create_private_vm, + .get_rptr =3D a6xx_get_rptr, + .progress =3D a6xx_progress, + }, + .init =3D a6xx_gpu_init, + .get_timestamp =3D a6xx_gmu_get_timestamp, +}; + +const struct adreno_gpu_funcs a6xx_gmuwrapper_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a6xx_hw_init, + .ucode_load =3D a6xx_ucode_load, + .pm_suspend =3D a6xx_pm_suspend, + .pm_resume =3D a6xx_pm_resume, + .recover =3D a6xx_recover, + .submit =3D a6xx_submit, + .active_ring =3D a6xx_active_ring, + .irq =3D a6xx_irq, + .destroy =3D a6xx_destroy, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .show =3D a6xx_show, +#endif + .gpu_busy =3D a6xx_gpu_busy, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .gpu_state_get =3D a6xx_gpu_state_get, + .gpu_state_put =3D a6xx_gpu_state_put, +#endif + .create_vm =3D a6xx_create_vm, + .create_private_vm =3D a6xx_create_private_vm, + .get_rptr =3D a6xx_get_rptr, + .progress =3D a6xx_progress, + }, + .init =3D a6xx_gpu_init, + .get_timestamp =3D a6xx_get_timestamp, +}; + +const struct adreno_gpu_funcs a7xx_gpu_funcs =3D { + .base =3D { + .get_param =3D adreno_get_param, + .set_param =3D adreno_set_param, + .hw_init =3D a6xx_hw_init, + .ucode_load =3D a6xx_ucode_load, + .pm_suspend =3D a6xx_gmu_pm_suspend, + .pm_resume =3D a6xx_gmu_pm_resume, + .recover =3D a6xx_recover, + .submit =3D a7xx_submit, + .active_ring =3D a6xx_active_ring, + .irq =3D a6xx_irq, + .destroy =3D a6xx_destroy, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .show =3D a6xx_show, +#endif + .gpu_busy =3D a6xx_gpu_busy, + .gpu_get_freq =3D a6xx_gmu_get_freq, + .gpu_set_freq =3D a6xx_gpu_set_freq, +#if defined(CONFIG_DRM_MSM_GPU_STATE) + .gpu_state_get =3D a6xx_gpu_state_get, + .gpu_state_put =3D a6xx_gpu_state_put, +#endif + .create_vm =3D a6xx_create_vm, + .create_private_vm =3D a6xx_create_private_vm, + .get_rptr =3D a6xx_get_rptr, + .progress =3D a6xx_progress, + }, + .init =3D a6xx_gpu_init, + .get_timestamp =3D a6xx_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 0b17d36c36a9..ef66e1eb9152 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.h @@ -216,6 +216,10 @@ struct a7xx_cp_smmu_info { #define A6XX_PROTECT_RDONLY(_reg, _len) \ ((((_len) & 0x3FFF) << 18) | ((_reg) & 0x3FFFF)) =20 +extern const struct adreno_gpu_funcs a6xx_gpu_funcs; +extern const struct adreno_gpu_funcs a6xx_gmuwrapper_funcs; +extern const struct adreno_gpu_funcs a7xx_gpu_funcs; + static inline bool a6xx_has_gbif(struct adreno_gpu *gpu) { if(adreno_is_a630(gpu)) diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/m= sm/adreno/adreno_device.c index 28f744f3caf7..cb4113612b82 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_device.c +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c @@ -235,7 +235,7 @@ static int adreno_bind(struct device *dev, struct devic= e *master, void *data) priv->has_cached_coherent =3D !!(info->quirks & ADRENO_QUIRK_HAS_CACHED_COHERENT); =20 - gpu =3D info->init(drm); + gpu =3D info->funcs->init(drm); if (IS_ERR(gpu)) { dev_warn(drm->dev, "failed to load adreno gpu\n"); return PTR_ERR(gpu); diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/= adreno/adreno_gpu.h index 4acb03dcbc60..335acd5feb82 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h @@ -71,8 +71,11 @@ enum adreno_family { (((_c) >> 8) & 0xff), \ ((_c) & 0xff) =20 +struct adreno_gpu; + struct adreno_gpu_funcs { struct msm_gpu_funcs base; + struct msm_gpu *(*init)(struct drm_device *dev); int (*get_timestamp)(struct msm_gpu *gpu, uint64_t *value); }; =20 @@ -101,7 +104,7 @@ struct adreno_info { const char *fw[ADRENO_FW_MAX]; uint32_t gmem; u64 quirks; - struct msm_gpu *(*init)(struct drm_device *dev); + const struct adreno_gpu_funcs *funcs; const char *zapfw; u32 inactive_period; union { @@ -685,12 +688,6 @@ OUT_PKT7(struct msm_ringbuffer *ring, uint8_t opcode, = uint16_t cnt) OUT_RING(ring, PKT7(opcode, cnt)); } =20 -struct msm_gpu *a2xx_gpu_init(struct drm_device *dev); -struct msm_gpu *a3xx_gpu_init(struct drm_device *dev); -struct msm_gpu *a4xx_gpu_init(struct drm_device *dev); -struct msm_gpu *a5xx_gpu_init(struct drm_device *dev); -struct msm_gpu *a6xx_gpu_init(struct drm_device *dev); - static inline uint32_t get_wptr(struct msm_ringbuffer *ring) { return (ring->cur - ring->start) % (MSM_GPU_RINGBUFFER_SZ >> 2); --=20 2.51.0