drm/msm/gpu: add ocmem init/cleanup functions
authorBrian Masney <masneyb@onstation.org>
Fri, 23 Aug 2019 12:16:36 +0000 (05:16 -0700)
committerRob Clark <robdclark@chromium.org>
Mon, 7 Oct 2019 15:17:39 +0000 (08:17 -0700)
The files a3xx_gpu.c and a4xx_gpu.c have ifdefs for the OCMEM support
that was missing upstream. Add two new functions (adreno_gpu_ocmem_init
and adreno_gpu_ocmem_cleanup) that removes some duplicated code.

Signed-off-by: Brian Masney <masneyb@onstation.org>
Reviewed-by: Jordan Crouse <jcrouse@codeaurora.org>
Tested-by: Gabriel Francisco <frc.gabrielgmail.com>
Signed-off-by: Rob Clark <robdclark@chromium.org>
drivers/gpu/drm/msm/Kconfig
drivers/gpu/drm/msm/adreno/a3xx_gpu.c
drivers/gpu/drm/msm/adreno/a3xx_gpu.h
drivers/gpu/drm/msm/adreno/a4xx_gpu.c
drivers/gpu/drm/msm/adreno/a4xx_gpu.h
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/adreno/adreno_gpu.h

index e9160ce..6deaa7d 100644 (file)
@@ -7,6 +7,7 @@ config DRM_MSM
        depends on OF && COMMON_CLK
        depends on MMU
        depends on INTERCONNECT || !INTERCONNECT
+       depends on QCOM_OCMEM || QCOM_OCMEM=n
        select QCOM_MDT_LOADER if ARCH_QCOM
        select REGULATOR
        select DRM_KMS_HELPER
index 5f7e980..7ad1493 100644 (file)
@@ -6,10 +6,6 @@
  * Copyright (c) 2014 The Linux Foundation. All rights reserved.
  */
 
-#ifdef CONFIG_MSM_OCMEM
-#  include <mach/ocmem.h>
-#endif
-
 #include "a3xx_gpu.h"
 
 #define A3XX_INT0_MASK \
@@ -195,9 +191,9 @@ static int a3xx_hw_init(struct msm_gpu *gpu)
                gpu_write(gpu, REG_A3XX_RBBM_GPR0_CTL, 0x00000000);
 
        /* Set the OCMEM base address for A330, etc */
-       if (a3xx_gpu->ocmem_hdl) {
+       if (a3xx_gpu->ocmem.hdl) {
                gpu_write(gpu, REG_A3XX_RB_GMEM_BASE_ADDR,
-                       (unsigned int)(a3xx_gpu->ocmem_base >> 14));
+                       (unsigned int)(a3xx_gpu->ocmem.base >> 14));
        }
 
        /* Turn on performance counters: */
@@ -318,10 +314,7 @@ static void a3xx_destroy(struct msm_gpu *gpu)
 
        adreno_gpu_cleanup(adreno_gpu);
 
-#ifdef CONFIG_MSM_OCMEM
-       if (a3xx_gpu->ocmem_base)
-               ocmem_free(OCMEM_GRAPHICS, a3xx_gpu->ocmem_hdl);
-#endif
+       adreno_gpu_ocmem_cleanup(&a3xx_gpu->ocmem);
 
        kfree(a3xx_gpu);
 }
@@ -494,17 +487,10 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
 
        /* if needed, allocate gmem: */
        if (adreno_is_a330(adreno_gpu)) {
-#ifdef CONFIG_MSM_OCMEM
-               /* TODO this is different/missing upstream: */
-               struct ocmem_buf *ocmem_hdl =
-                               ocmem_allocate(OCMEM_GRAPHICS, adreno_gpu->gmem);
-
-               a3xx_gpu->ocmem_hdl = ocmem_hdl;
-               a3xx_gpu->ocmem_base = ocmem_hdl->addr;
-               adreno_gpu->gmem = ocmem_hdl->len;
-               DBG("using %dK of OCMEM at 0x%08x", adreno_gpu->gmem / 1024,
-                               a3xx_gpu->ocmem_base);
-#endif
+               ret = adreno_gpu_ocmem_init(&adreno_gpu->base.pdev->dev,
+                                           adreno_gpu, &a3xx_gpu->ocmem);
+               if (ret)
+                       goto fail;
        }
 
        if (!gpu->aspace) {
index 5dc33e5..c555fb1 100644 (file)
@@ -19,8 +19,7 @@ struct a3xx_gpu {
        struct adreno_gpu base;
 
        /* if OCMEM is used for GMEM: */
-       uint32_t ocmem_base;
-       void *ocmem_hdl;
+       struct adreno_ocmem ocmem;
 };
 #define to_a3xx_gpu(x) container_of(x, struct a3xx_gpu, base)
 
index ab2b752..b01388a 100644 (file)
@@ -2,9 +2,6 @@
 /* Copyright (c) 2014 The Linux Foundation. All rights reserved.
  */
 #include "a4xx_gpu.h"
-#ifdef CONFIG_MSM_OCMEM
-#  include <soc/qcom/ocmem.h>
-#endif
 
 #define A4XX_INT0_MASK \
        (A4XX_INT0_RBBM_AHB_ERROR |        \
@@ -188,7 +185,7 @@ static int a4xx_hw_init(struct msm_gpu *gpu)
                        (1 << 30) | 0xFFFF);
 
        gpu_write(gpu, REG_A4XX_RB_GMEM_BASE_ADDR,
-                       (unsigned int)(a4xx_gpu->ocmem_base >> 14));
+                       (unsigned int)(a4xx_gpu->ocmem.base >> 14));
 
        /* Turn on performance counters: */
        gpu_write(gpu, REG_A4XX_RBBM_PERFCTR_CTL, 0x01);
@@ -318,10 +315,7 @@ static void a4xx_destroy(struct msm_gpu *gpu)
 
        adreno_gpu_cleanup(adreno_gpu);
 
-#ifdef CONFIG_MSM_OCMEM
-       if (a4xx_gpu->ocmem_base)
-               ocmem_free(OCMEM_GRAPHICS, a4xx_gpu->ocmem_hdl);
-#endif
+       adreno_gpu_ocmem_cleanup(&a4xx_gpu->ocmem);
 
        kfree(a4xx_gpu);
 }
@@ -578,17 +572,10 @@ struct msm_gpu *a4xx_gpu_init(struct drm_device *dev)
 
        /* if needed, allocate gmem: */
        if (adreno_is_a4xx(adreno_gpu)) {
-#ifdef CONFIG_MSM_OCMEM
-               /* TODO this is different/missing upstream: */
-               struct ocmem_buf *ocmem_hdl =
-                               ocmem_allocate(OCMEM_GRAPHICS, adreno_gpu->gmem);
-
-               a4xx_gpu->ocmem_hdl = ocmem_hdl;
-               a4xx_gpu->ocmem_base = ocmem_hdl->addr;
-               adreno_gpu->gmem = ocmem_hdl->len;
-               DBG("using %dK of OCMEM at 0x%08x", adreno_gpu->gmem / 1024,
-                               a4xx_gpu->ocmem_base);
-#endif
+               ret = adreno_gpu_ocmem_init(dev->dev, adreno_gpu,
+                                           &a4xx_gpu->ocmem);
+               if (ret)
+                       goto fail;
        }
 
        if (!gpu->aspace) {
index d506311..a01448c 100644 (file)
@@ -16,8 +16,7 @@ struct a4xx_gpu {
        struct adreno_gpu base;
 
        /* if OCMEM is used for GMEM: */
-       uint32_t ocmem_base;
-       void *ocmem_hdl;
+       struct adreno_ocmem ocmem;
 };
 #define to_a4xx_gpu(x) container_of(x, struct a4xx_gpu, base)
 
index 048c8be..0783e4b 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/pm_opp.h>
 #include <linux/slab.h>
 #include <linux/soc/qcom/mdt_loader.h>
+#include <soc/qcom/ocmem.h>
 #include "adreno_gpu.h"
 #include "msm_gem.h"
 #include "msm_mmu.h"
@@ -893,6 +894,45 @@ static int adreno_get_pwrlevels(struct device *dev,
        return 0;
 }
 
+int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu,
+                         struct adreno_ocmem *adreno_ocmem)
+{
+       struct ocmem_buf *ocmem_hdl;
+       struct ocmem *ocmem;
+
+       ocmem = of_get_ocmem(dev);
+       if (IS_ERR(ocmem)) {
+               if (PTR_ERR(ocmem) == -ENODEV) {
+                       /*
+                        * Return success since either the ocmem property was
+                        * not specified in device tree, or ocmem support is
+                        * not compiled into the kernel.
+                        */
+                       return 0;
+               }
+
+               return PTR_ERR(ocmem);
+       }
+
+       ocmem_hdl = ocmem_allocate(ocmem, OCMEM_GRAPHICS, adreno_gpu->gmem);
+       if (IS_ERR(ocmem_hdl))
+               return PTR_ERR(ocmem_hdl);
+
+       adreno_ocmem->ocmem = ocmem;
+       adreno_ocmem->base = ocmem_hdl->addr;
+       adreno_ocmem->hdl = ocmem_hdl;
+       adreno_gpu->gmem = ocmem_hdl->len;
+
+       return 0;
+}
+
+void adreno_gpu_ocmem_cleanup(struct adreno_ocmem *adreno_ocmem)
+{
+       if (adreno_ocmem && adreno_ocmem->base)
+               ocmem_free(adreno_ocmem->ocmem, OCMEM_GRAPHICS,
+                          adreno_ocmem->hdl);
+}
+
 int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                struct adreno_gpu *adreno_gpu,
                const struct adreno_gpu_funcs *funcs, int nr_rings)
index c7441fb..d225a8a 100644 (file)
@@ -126,6 +126,12 @@ struct adreno_gpu {
 };
 #define to_adreno_gpu(x) container_of(x, struct adreno_gpu, base)
 
+struct adreno_ocmem {
+       struct ocmem *ocmem;
+       unsigned long base;
+       void *hdl;
+};
+
 /* platform config data (ie. from DT, or pdata) */
 struct adreno_platform_config {
        struct adreno_rev rev;
@@ -236,6 +242,10 @@ void adreno_dump(struct msm_gpu *gpu);
 void adreno_wait_ring(struct msm_ringbuffer *ring, uint32_t ndwords);
 struct msm_ringbuffer *adreno_active_ring(struct msm_gpu *gpu);
 
+int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu,
+                         struct adreno_ocmem *ocmem);
+void adreno_gpu_ocmem_cleanup(struct adreno_ocmem *ocmem);
+
 int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
                struct adreno_gpu *gpu, const struct adreno_gpu_funcs *funcs,
                int nr_rings);