]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/vc4: hvs: Change prototype of __vc4_hvs_alloc to pass registers
authorMaxime Ripard <mripard@kernel.org>
Fri, 21 Jun 2024 15:20:52 +0000 (16:20 +0100)
committerDave Stevenson <dave.stevenson@raspberrypi.com>
Mon, 9 Sep 2024 12:02:54 +0000 (13:02 +0100)
The BCM2712 HVS has registers to report the size of the various SRAM the
driver uses, and their size actually differ depending on the stepping.

The initialisation of the memory pools happen in the __vc4_hvs_alloc()
function that also allocates the main HVS structure, that will then hold
the pointer to the memory mapping of the registers.

This creates some kind of circular dependency that we can break by
passing the mapping pointer as an argument for __vc4_hvs_alloc() to use
to query to get the SRAM sizes and initialise the memory pools
accordingly.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-29-dave.stevenson@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/tests/vc4_mock.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_hvs.c

index 922849dd4b4787dce713993f819a606bc6935cb6..6527fb1db71ef9034a3aaa76ec0b53e550b1ffcc 100644 (file)
@@ -175,7 +175,7 @@ static struct vc4_dev *__mock_device(struct kunit *test, enum vc4_gen gen)
        vc4->dev = dev;
        vc4->gen = gen;
 
-       vc4->hvs = __vc4_hvs_alloc(vc4, NULL);
+       vc4->hvs = __vc4_hvs_alloc(vc4, NULL, NULL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4->hvs);
 
        drm = &vc4->base;
index 559118824bf795cafd79d319699d071c6a086446..7a9faea748e6abaaf89f73059299ec4040764e05 100644 (file)
@@ -1004,7 +1004,9 @@ 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);
+struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4,
+                               void __iomem *regs,
+                               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);
index ecba1f7bc1e00d3cf7b5d604aa0bb173110edb9b..8e6327910d9f1e04ad4608dd989abf501b075f61 100644 (file)
@@ -811,7 +811,9 @@ int vc4_hvs_debugfs_init(struct drm_minor *minor)
        return 0;
 }
 
-struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device *pdev)
+struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4,
+                               void __iomem *regs,
+                               struct platform_device *pdev)
 {
        struct drm_device *drm = &vc4->base;
        struct vc4_hvs *hvs;
@@ -821,6 +823,7 @@ struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device *pde
                return ERR_PTR(-ENOMEM);
 
        hvs->vc4 = vc4;
+       hvs->regs = regs;
        hvs->pdev = pdev;
 
        spin_lock_init(&hvs->mm_lock);
@@ -1017,16 +1020,17 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
        struct drm_device *drm = dev_get_drvdata(master);
        struct vc4_dev *vc4 = to_vc4_dev(drm);
        struct vc4_hvs *hvs = NULL;
+       void __iomem *regs;
        int ret;
 
-       hvs = __vc4_hvs_alloc(vc4, NULL);
+       regs = vc4_ioremap_regs(pdev, 0);
+       if (IS_ERR(regs))
+               return PTR_ERR(regs);
+
+       hvs = __vc4_hvs_alloc(vc4, regs, pdev);
        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);
-
        hvs->regset.base = hvs->regs;
        hvs->regset.regs = vc4_hvs_regs;
        hvs->regset.nregs = ARRAY_SIZE(vc4_hvs_regs);