We'll need to initialize the HVS structure without a backing device to
create a mock we'll use for testing.

Split the structure initialization part into a separate function.

Reviewed-by: Javier Martinez Canillas <javi...@redhat.com>
Signed-off-by: Maxime Ripard <max...@cerno.tech>
---
 drivers/gpu/drm/vc4/vc4_drv.h |  1 +
 drivers/gpu/drm/vc4/vc4_hvs.c | 81 +++++++++++++++++++++++++------------------
 2 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 54352db48476..e0be7a81a24a 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -1009,6 +1009,7 @@ void vc4_irq_reset(struct drm_device *dev);
 
 /* vc4_hvs.c */
 extern struct platform_driver vc4_hvs_driver;
+struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device 
*pdev);
 void vc4_hvs_stop_channel(struct vc4_hvs *hvs, unsigned int output);
 int vc4_hvs_get_fifo_from_output(struct vc4_hvs *hvs, unsigned int output);
 u8 vc4_hvs_get_fifo_frame_count(struct vc4_hvs *hvs, unsigned int fifo);
diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c
index c4453a5ae163..94c29f8547bb 100644
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
@@ -768,22 +768,60 @@ int vc4_hvs_debugfs_init(struct drm_minor *minor)
        return 0;
 }
 
-static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
+struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device 
*pdev)
 {
-       struct platform_device *pdev = to_platform_device(dev);
-       struct drm_device *drm = dev_get_drvdata(master);
-       struct vc4_dev *vc4 = to_vc4_dev(drm);
-       struct vc4_hvs *hvs = NULL;
-       int ret;
-       u32 dispctrl;
-       u32 reg;
+       struct drm_device *drm = &vc4->base;
+       struct vc4_hvs *hvs;
 
        hvs = drmm_kzalloc(drm, sizeof(*hvs), GFP_KERNEL);
        if (!hvs)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
+
        hvs->vc4 = vc4;
        hvs->pdev = pdev;
 
+       spin_lock_init(&hvs->mm_lock);
+
+       /* Set up the HVS display list memory manager.  We never
+        * overwrite the setup from the bootloader (just 128b out of
+        * our 16K), since we don't want to scramble the screen when
+        * transitioning from the firmware's boot setup to runtime.
+        */
+       drm_mm_init(&hvs->dlist_mm,
+                   HVS_BOOTLOADER_DLIST_END,
+                   (SCALER_DLIST_SIZE >> 2) - HVS_BOOTLOADER_DLIST_END);
+
+       /* Set up the HVS LBM memory manager.  We could have some more
+        * complicated data structure that allowed reuse of LBM areas
+        * between planes when they don't overlap on the screen, but
+        * for now we just allocate globally.
+        */
+       if (!vc4->is_vc5)
+               /* 48k words of 2x12-bit pixels */
+               drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024);
+       else
+               /* 60k words of 4x12-bit pixels */
+               drm_mm_init(&hvs->lbm_mm, 0, 60 * 1024);
+
+       vc4->hvs = hvs;
+
+       return hvs;
+}
+
+static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *drm = dev_get_drvdata(master);
+       struct vc4_dev *vc4 = to_vc4_dev(drm);
+       struct vc4_hvs *hvs = NULL;
+       int ret;
+       u32 dispctrl;
+       u32 reg;
+
+       hvs = __vc4_hvs_alloc(vc4, NULL);
+       if (IS_ERR(hvs))
+               return PTR_ERR(hvs);
+
        hvs->regs = vc4_ioremap_regs(pdev, 0);
        if (IS_ERR(hvs->regs))
                return PTR_ERR(hvs->regs);
@@ -835,29 +873,6 @@ static int vc4_hvs_bind(struct device *dev, struct device 
*master, void *data)
        else
                hvs->dlist = hvs->regs + SCALER5_DLIST_START;
 
-       spin_lock_init(&hvs->mm_lock);
-
-       /* Set up the HVS display list memory manager.  We never
-        * overwrite the setup from the bootloader (just 128b out of
-        * our 16K), since we don't want to scramble the screen when
-        * transitioning from the firmware's boot setup to runtime.
-        */
-       drm_mm_init(&hvs->dlist_mm,
-                   HVS_BOOTLOADER_DLIST_END,
-                   (SCALER_DLIST_SIZE >> 2) - HVS_BOOTLOADER_DLIST_END);
-
-       /* Set up the HVS LBM memory manager.  We could have some more
-        * complicated data structure that allowed reuse of LBM areas
-        * between planes when they don't overlap on the screen, but
-        * for now we just allocate globally.
-        */
-       if (!vc4->is_vc5)
-               /* 48k words of 2x12-bit pixels */
-               drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024);
-       else
-               /* 60k words of 4x12-bit pixels */
-               drm_mm_init(&hvs->lbm_mm, 0, 60 * 1024);
-
        /* Upload filter kernels.  We only have the one for now, so we
         * keep it around for the lifetime of the driver.
         */
@@ -867,8 +882,6 @@ static int vc4_hvs_bind(struct device *dev, struct device 
*master, void *data)
        if (ret)
                return ret;
 
-       vc4->hvs = hvs;
-
        reg = HVS_READ(SCALER_DISPECTRL);
        reg &= ~SCALER_DISPECTRL_DSP2_MUX_MASK;
        HVS_WRITE(SCALER_DISPECTRL,

-- 
2.38.1-b4-0.11.0-dev-d416f

Reply via email to