diff mbox series

[1/3] drm/msm/a3xx: Pass the revision information

Message ID 20230620173305.896438-1-festevam@gmail.com (mailing list archive)
State New, archived
Headers show
Series [1/3] drm/msm/a3xx: Pass the revision information | expand

Commit Message

Fabio Estevam June 20, 2023, 5:33 p.m. UTC
From: Fabio Estevam <festevam@denx.de>

Commit cc943f43ece7 ("drm/msm/adreno: warn if chip revn is verified
before being set") exposes the need of setting the GPU revision fields
prior to using the adreno_is_xxx() functions.

Pass the GPU revision information to avoid run-time warning.

Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Build-tested only.

 drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

Comments

Dmitry Baryshkov June 20, 2023, 5:40 p.m. UTC | #1
On 20/06/2023 20:33, Fabio Estevam wrote:
> From: Fabio Estevam <festevam@denx.de>
> 
> Commit cc943f43ece7 ("drm/msm/adreno: warn if chip revn is verified
> before being set") exposes the need of setting the GPU revision fields
> prior to using the adreno_is_xxx() functions.
> 
> Pass the GPU revision information to avoid run-time warning.
> 
> Signed-off-by: Fabio Estevam <festevam@denx.de>

I'll take a glance later. Generic comment, you missed freedreno@, so 
these patches will not pop up in our patch tracker. Also could you 
please use git send-email passing all patches to the command, so that 
they are threaded?

> ---
> Build-tested only.
> 
>   drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 21 +++++++++++++++++++++
>   1 file changed, 21 insertions(+)
> 
> diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> index c86b377f6f0d..fc23810d7684 100644
> --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
> @@ -530,6 +530,8 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
>   	struct msm_gpu *gpu;
>   	struct msm_drm_private *priv = dev->dev_private;
>   	struct platform_device *pdev = priv->gpu_pdev;
> +	struct adreno_platform_config *config = pdev->dev.platform_data;
> +	const struct adreno_info *info;
>   	struct icc_path *ocmem_icc_path;
>   	struct icc_path *icc_path;
>   	int ret;
> @@ -558,6 +560,25 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
>   	if (ret)
>   		goto fail;
>   
> +	/*
> +	 * We need to know the platform type before calling into adreno_gpu_init
> +	 * so that the hw_apriv flag can be correctly set. Snoop into the info
> +	 * and grab the revision number
> +	 */
> +	info = adreno_info(config->rev);
> +	if (!info) {
> +		ret = -EINVAL;
> +		goto fail;
> +	}
> +
> +	/* Assign these early so that we can use the is_aXYZ helpers */
> +	/* Numeric revision IDs (e.g. 630) */
> +	adreno_gpu->revn = info->revn;
> +	/* New-style ADRENO_REV()-only */
> +	adreno_gpu->rev = info->rev;
> +	/* Quirk data */
> +	adreno_gpu->info = info;

This looks like a boilerplate being added to all aYxx drivers (and then 
these fields are also set in adreno_gpu_init()). Can we remove 
duplication somehow?

> +
>   	/* if needed, allocate gmem: */
>   	if (adreno_is_a330(adreno_gpu)) {
>   		ret = adreno_gpu_ocmem_init(&adreno_gpu->base.pdev->dev,
Fabio Estevam June 20, 2023, 6:14 p.m. UTC | #2
On 20/06/2023 14:40, Dmitry Baryshkov wrote:

> This looks like a boilerplate being added to all aYxx drivers (and
> then these fields are also set in adreno_gpu_init()). Can we remove
> duplication somehow?

Sorry, I missed this comment prior to sending v2.

Maybe a simpler fix for a2xx_gpu would be:

--- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
@@ -540,6 +540,10 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device 
*dev)
         gpu->perfcntrs = perfcntrs;
         gpu->num_perfcntrs = ARRAY_SIZE(perfcntrs);

+       ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1);
+       if (ret)
+               goto fail;
+
         if (adreno_is_a20x(adreno_gpu))
                 adreno_gpu->registers = a200_registers;
         else if (adreno_is_a225(adreno_gpu))
@@ -547,10 +551,6 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device 
*dev)
         else
                 adreno_gpu->registers = a220_registers;

-       ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1);
-       if (ret)
-               goto fail;
-
         if (!gpu->aspace) {
                 dev_err(dev->dev, "No memory protection without MMU\n");
                 if (!allow_vram_carveout) {

What do you think?

a3xx and a4xx call adreno_gpu_init() prior to adreno_is_xxx() so they 
don't have issues.
Dmitry Baryshkov June 20, 2023, 10:08 p.m. UTC | #3
On Tue, 20 Jun 2023 at 21:14, Fabio Estevam <festevam@denx.de> wrote:
>
> On 20/06/2023 14:40, Dmitry Baryshkov wrote:
>
> > This looks like a boilerplate being added to all aYxx drivers (and
> > then these fields are also set in adreno_gpu_init()). Can we remove
> > duplication somehow?
>
> Sorry, I missed this comment prior to sending v2.
>
> Maybe a simpler fix for a2xx_gpu would be:
>
> --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
> @@ -540,6 +540,10 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device
> *dev)
>          gpu->perfcntrs = perfcntrs;
>          gpu->num_perfcntrs = ARRAY_SIZE(perfcntrs);
>
> +       ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1);
> +       if (ret)
> +               goto fail;
> +
>          if (adreno_is_a20x(adreno_gpu))
>                  adreno_gpu->registers = a200_registers;
>          else if (adreno_is_a225(adreno_gpu))
> @@ -547,10 +551,6 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device
> *dev)
>          else
>                  adreno_gpu->registers = a220_registers;
>
> -       ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1);
> -       if (ret)
> -               goto fail;
> -
>          if (!gpu->aspace) {
>                  dev_err(dev->dev, "No memory protection without MMU\n");
>                  if (!allow_vram_carveout) {
>
> What do you think?
>
> a3xx and a4xx call adreno_gpu_init() prior to adreno_is_xxx() so they
> don't have issues.

Yes, this seems like a perfect solution. Please send it with the
proper commit message. Also please add:

Fixes: 21af872cd8c6 ("drm/msm/adreno: add a2xx")
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
index c86b377f6f0d..fc23810d7684 100644
--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
@@ -530,6 +530,8 @@  struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
 	struct msm_gpu *gpu;
 	struct msm_drm_private *priv = dev->dev_private;
 	struct platform_device *pdev = priv->gpu_pdev;
+	struct adreno_platform_config *config = pdev->dev.platform_data;
+	const struct adreno_info *info;
 	struct icc_path *ocmem_icc_path;
 	struct icc_path *icc_path;
 	int ret;
@@ -558,6 +560,25 @@  struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
 	if (ret)
 		goto fail;
 
+	/*
+	 * We need to know the platform type before calling into adreno_gpu_init
+	 * so that the hw_apriv flag can be correctly set. Snoop into the info
+	 * and grab the revision number
+	 */
+	info = adreno_info(config->rev);
+	if (!info) {
+		ret = -EINVAL;
+		goto fail;
+	}
+
+	/* Assign these early so that we can use the is_aXYZ helpers */
+	/* Numeric revision IDs (e.g. 630) */
+	adreno_gpu->revn = info->revn;
+	/* New-style ADRENO_REV()-only */
+	adreno_gpu->rev = info->rev;
+	/* Quirk data */
+	adreno_gpu->info = info;
+
 	/* if needed, allocate gmem: */
 	if (adreno_is_a330(adreno_gpu)) {
 		ret = adreno_gpu_ocmem_init(&adreno_gpu->base.pdev->dev,