]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/vc4: Introduce generation number enum
authorMaxime Ripard <mripard@kernel.org>
Fri, 21 Jun 2024 15:20:44 +0000 (16:20 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 12:53:13 +0000 (13:53 +0100)
[ Upstream commit 24c5ed3ddf27313b248900455b0312bd7a9d3554 ]

With the introduction of the BCM2712 support, we will get yet another
generation of display engine to support.

The binary check of whether it's VC5 or not thus doesn't work anymore,
especially since some parts of the driver will have changed with BCM2711,
and some others with BCM2712.

Let's introduce an enum to store the generation the driver is running
on, which should provide more flexibility.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240621152055.4180873-21-dave.stevenson@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Stable-dep-of: cf1c87d978d4 ("drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_lut_load")
Signed-off-by: Sasha Levin <sashal@kernel.org>
16 files changed:
drivers/gpu/drm/vc4/tests/vc4_mock.c
drivers/gpu/drm/vc4/vc4_bo.c
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_drv.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_gem.c
drivers/gpu/drm/vc4/vc4_hdmi.c
drivers/gpu/drm/vc4/vc4_hvs.c
drivers/gpu/drm/vc4/vc4_irq.c
drivers/gpu/drm/vc4/vc4_kms.c
drivers/gpu/drm/vc4/vc4_perfmon.c
drivers/gpu/drm/vc4/vc4_plane.c
drivers/gpu/drm/vc4/vc4_render_cl.c
drivers/gpu/drm/vc4/vc4_v3d.c
drivers/gpu/drm/vc4/vc4_validate.c
drivers/gpu/drm/vc4/vc4_validate_shaders.c

index 0731a7d85d7abc205b7e42637beda993c890ff67..922849dd4b4787dce713993f819a606bc6935cb6 100644 (file)
@@ -155,11 +155,11 @@ KUNIT_DEFINE_ACTION_WRAPPER(kunit_action_drm_dev_unregister,
                            drm_dev_unregister,
                            struct drm_device *);
 
-static struct vc4_dev *__mock_device(struct kunit *test, bool is_vc5)
+static struct vc4_dev *__mock_device(struct kunit *test, enum vc4_gen gen)
 {
        struct drm_device *drm;
-       const struct drm_driver *drv = is_vc5 ? &vc5_drm_driver : &vc4_drm_driver;
-       const struct vc4_mock_desc *desc = is_vc5 ? &vc5_mock : &vc4_mock;
+       const struct drm_driver *drv = (gen == VC4_GEN_5) ? &vc5_drm_driver : &vc4_drm_driver;
+       const struct vc4_mock_desc *desc = (gen == VC4_GEN_5) ? &vc5_mock : &vc4_mock;
        struct vc4_dev *vc4;
        struct device *dev;
        int ret;
@@ -173,7 +173,7 @@ static struct vc4_dev *__mock_device(struct kunit *test, bool is_vc5)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4);
 
        vc4->dev = dev;
-       vc4->is_vc5 = is_vc5;
+       vc4->gen = gen;
 
        vc4->hvs = __vc4_hvs_alloc(vc4, NULL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vc4->hvs);
@@ -198,10 +198,10 @@ static struct vc4_dev *__mock_device(struct kunit *test, bool is_vc5)
 
 struct vc4_dev *vc4_mock_device(struct kunit *test)
 {
-       return __mock_device(test, false);
+       return __mock_device(test, VC4_GEN_4);
 }
 
 struct vc4_dev *vc5_mock_device(struct kunit *test)
 {
-       return __mock_device(test, true);
+       return __mock_device(test, VC4_GEN_5);
 }
index 86d629e45307d201fbcdddea147e44d71593e733..89e427c9ed327a3bfbe2f522b5014cdb4270baae 100644 (file)
@@ -251,7 +251,7 @@ void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo)
 {
        struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        mutex_lock(&vc4->purgeable.lock);
@@ -265,7 +265,7 @@ static void vc4_bo_remove_from_purgeable_pool_locked(struct vc4_bo *bo)
 {
        struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        /* list_del_init() is used here because the caller might release
@@ -396,7 +396,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_bo *bo;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return ERR_PTR(-ENODEV);
 
        bo = kzalloc(sizeof(*bo), GFP_KERNEL);
@@ -427,7 +427,7 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,
        struct drm_gem_dma_object *dma_obj;
        struct vc4_bo *bo;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return ERR_PTR(-ENODEV);
 
        if (size == 0)
@@ -496,7 +496,7 @@ int vc4_bo_dumb_create(struct drm_file *file_priv,
        struct vc4_bo *bo = NULL;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        ret = vc4_dumb_fixup_args(args);
@@ -622,7 +622,7 @@ int vc4_bo_inc_usecnt(struct vc4_bo *bo)
        struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev);
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        /* Fast path: if the BO is already retained by someone, no need to
@@ -661,7 +661,7 @@ void vc4_bo_dec_usecnt(struct vc4_bo *bo)
 {
        struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        /* Fast path: if the BO is still retained by someone, no need to test
@@ -783,7 +783,7 @@ int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
        struct vc4_bo *bo = NULL;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        ret = vc4_grab_bin_bo(vc4, vc4file);
@@ -813,7 +813,7 @@ int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,
        struct drm_vc4_mmap_bo *args = data;
        struct drm_gem_object *gem_obj;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        gem_obj = drm_gem_object_lookup(file_priv, args->handle);
@@ -839,7 +839,7 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
        struct vc4_bo *bo = NULL;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (args->size == 0)
@@ -918,7 +918,7 @@ int vc4_set_tiling_ioctl(struct drm_device *dev, void *data,
        struct vc4_bo *bo;
        bool t_format;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (args->flags != 0)
@@ -964,7 +964,7 @@ int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,
        struct drm_gem_object *gem_obj;
        struct vc4_bo *bo;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (args->flags != 0 || args->modifier != 0)
@@ -1007,7 +1007,7 @@ int vc4_bo_cache_init(struct drm_device *dev)
        int ret;
        int i;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        /* Create the initial set of BO labels that the kernel will
@@ -1071,7 +1071,7 @@ int vc4_label_bo_ioctl(struct drm_device *dev, void *data,
        struct drm_gem_object *gem_obj;
        int ret = 0, label;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!args->len)
index 8b5a7e5eb1466c27604afdbd49b4b67b99e01262..26a7cf7f6465150c06011984a49d18eeb0ebaeae 100644 (file)
@@ -263,7 +263,7 @@ static u32 vc4_get_fifo_full_level(struct vc4_crtc *vc4_crtc, u32 format)
                 * Removing 1 from the FIFO full level however
                 * seems to completely remove that issue.
                 */
-               if (!vc4->is_vc5)
+               if (vc4->gen == VC4_GEN_4)
                        return fifo_len_bytes - 3 * HVS_FIFO_LATENCY_PIX - 1;
 
                return fifo_len_bytes - 3 * HVS_FIFO_LATENCY_PIX;
@@ -428,7 +428,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encode
        if (is_dsi)
                CRTC_WRITE(PV_HACT_ACT, mode->hdisplay * pixel_rep);
 
-       if (vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_5)
                CRTC_WRITE(PV_MUX_CFG,
                           VC4_SET_FIELD(PV_MUX_CFG_RGB_PIXEL_MUX_MODE_NO_SWAP,
                                         PV_MUX_CFG_RGB_PIXEL_MUX_MODE));
@@ -913,7 +913,7 @@ static int vc4_async_set_fence_cb(struct drm_device *dev,
        struct dma_fence *fence;
        int ret;
 
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
                struct vc4_bo *bo = to_vc4_bo(&dma_bo->base);
 
                return vc4_queue_seqno_cb(dev, &flip_state->cb.seqno, bo->seqno,
@@ -1000,7 +1000,7 @@ static int vc4_async_page_flip(struct drm_crtc *crtc,
        struct vc4_bo *bo = to_vc4_bo(&dma_bo->base);
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        /*
@@ -1043,7 +1043,7 @@ int vc4_page_flip(struct drm_crtc *crtc,
                struct drm_device *dev = crtc->dev;
                struct vc4_dev *vc4 = to_vc4_dev(dev);
 
-               if (vc4->is_vc5)
+               if (vc4->gen == VC4_GEN_5)
                        return vc5_async_page_flip(crtc, fb, event, flags);
                else
                        return vc4_async_page_flip(crtc, fb, event, flags);
@@ -1338,9 +1338,8 @@ int __vc4_crtc_init(struct drm_device *drm,
 
        drm_crtc_helper_add(crtc, crtc_helper_funcs);
 
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
                drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r));
-
                drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size);
 
                /* We support CTM, but only for one CRTC at a time. It's therefore
index c133e96b8aca250fccc932a2a81117cb04d6bc84..550324819f37fc35790d6b561132ed8c0c091b38 100644 (file)
@@ -98,7 +98,7 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
        if (args->pad != 0)
                return -EINVAL;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d)
@@ -147,7 +147,7 @@ static int vc4_open(struct drm_device *dev, struct drm_file *file)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_file *vc4file;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        vc4file = kzalloc(sizeof(*vc4file), GFP_KERNEL);
@@ -165,7 +165,7 @@ static void vc4_close(struct drm_device *dev, struct drm_file *file)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_file *vc4file = file->driver_priv;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (vc4file->bin_bo_used)
@@ -291,13 +291,17 @@ static int vc4_drm_bind(struct device *dev)
        struct vc4_dev *vc4;
        struct device_node *node;
        struct drm_crtc *crtc;
-       bool is_vc5;
+       enum vc4_gen gen;
        int ret = 0;
 
        dev->coherent_dma_mask = DMA_BIT_MASK(32);
 
-       is_vc5 = of_device_is_compatible(dev->of_node, "brcm,bcm2711-vc5");
-       if (is_vc5)
+       if (of_device_is_compatible(dev->of_node, "brcm,bcm2711-vc5"))
+               gen = VC4_GEN_5;
+       else
+               gen = VC4_GEN_4;
+
+       if (gen == VC4_GEN_5)
                driver = &vc5_drm_driver;
        else
                driver = &vc4_drm_driver;
@@ -315,13 +319,13 @@ static int vc4_drm_bind(struct device *dev)
        vc4 = devm_drm_dev_alloc(dev, driver, struct vc4_dev, base);
        if (IS_ERR(vc4))
                return PTR_ERR(vc4);
-       vc4->is_vc5 = is_vc5;
+       vc4->gen = gen;
        vc4->dev = dev;
 
        drm = &vc4->base;
        platform_set_drvdata(pdev, drm);
 
-       if (!is_vc5) {
+       if (gen == VC4_GEN_4) {
                ret = drmm_mutex_init(drm, &vc4->bin_bo_lock);
                if (ret)
                        goto err;
@@ -335,7 +339,7 @@ static int vc4_drm_bind(struct device *dev)
        if (ret)
                goto err;
 
-       if (!is_vc5) {
+       if (gen == VC4_GEN_4) {
                ret = vc4_gem_init(drm);
                if (ret)
                        goto err;
index d463fabf5ecce29530a89606419ac1dc059fa6d5..dd452e6a114304e73791badf24c0b0e680d8ad5e 100644 (file)
@@ -80,11 +80,16 @@ struct vc4_perfmon {
        u64 counters[] __counted_by(ncounters);
 };
 
+enum vc4_gen {
+       VC4_GEN_4,
+       VC4_GEN_5,
+};
+
 struct vc4_dev {
        struct drm_device base;
        struct device *dev;
 
-       bool is_vc5;
+       enum vc4_gen gen;
 
        unsigned int irq;
 
index 03648f954985e5ddf1711a02737a8b1aaa954ed3..b4f72f2aaf1ba71ef866d9cb766b75b40f86a9e5 100644 (file)
@@ -76,7 +76,7 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
        u32 i;
        int ret = 0;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d) {
@@ -389,7 +389,7 @@ vc4_wait_for_seqno(struct drm_device *dev, uint64_t seqno, uint64_t timeout_ns,
        unsigned long timeout_expire;
        DEFINE_WAIT(wait);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (vc4->finished_seqno >= seqno)
@@ -474,7 +474,7 @@ vc4_submit_next_bin_job(struct drm_device *dev)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct vc4_exec_info *exec;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
 again:
@@ -522,7 +522,7 @@ vc4_submit_next_render_job(struct drm_device *dev)
        if (!exec)
                return;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        /* A previous RCL may have written to one of our textures, and
@@ -543,7 +543,7 @@ vc4_move_job_to_render(struct drm_device *dev, struct vc4_exec_info *exec)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        bool was_empty = list_empty(&vc4->render_job_list);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        list_move_tail(&exec->head, &vc4->render_job_list);
@@ -970,7 +970,7 @@ vc4_job_handle_completed(struct vc4_dev *vc4)
        unsigned long irqflags;
        struct vc4_seqno_cb *cb, *cb_temp;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        spin_lock_irqsave(&vc4->job_lock, irqflags);
@@ -1009,7 +1009,7 @@ int vc4_queue_seqno_cb(struct drm_device *dev,
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        unsigned long irqflags;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        cb->func = func;
@@ -1065,7 +1065,7 @@ vc4_wait_seqno_ioctl(struct drm_device *dev, void *data,
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct drm_vc4_wait_seqno *args = data;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        return vc4_wait_for_seqno_ioctl_helper(dev, args->seqno,
@@ -1082,7 +1082,7 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        struct drm_gem_object *gem_obj;
        struct vc4_bo *bo;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (args->pad != 0)
@@ -1131,7 +1131,7 @@ vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
                                  args->shader_rec_size,
                                  args->bo_handle_count);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d) {
@@ -1268,7 +1268,7 @@ int vc4_gem_init(struct drm_device *dev)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        vc4->dma_fence_context = dma_fence_context_alloc(1);
@@ -1327,7 +1327,7 @@ int vc4_gem_madvise_ioctl(struct drm_device *dev, void *data,
        struct vc4_bo *bo;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        switch (args->madv) {
index 2b8e1642f9cf4ac950d4d6ef39ed6f36a1713f62..727575fdc2841b6031283f2efe51158358c6ce6e 100644 (file)
@@ -2109,7 +2109,7 @@ static int vc4_hdmi_audio_prepare(struct device *dev, void *data,
                                             VC4_HDMI_AUDIO_PACKET_CEA_MASK);
 
        /* Set the MAI threshold */
-       if (vc4->is_vc5)
+       if (vc4->gen >= VC4_GEN_5)
                HDMI_WRITE(HDMI_MAI_THR,
                           VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICHIGH) |
                           VC4_SET_FIELD(0x10, VC4_HD_MAI_THR_PANICLOW) |
index 27c8fb9efa85457fafa76978071f6d2fdfe7b596..64d2410b4b860ffea7a3358995ab7a3719ae9643 100644 (file)
@@ -224,7 +224,7 @@ static void vc4_hvs_lut_load(struct vc4_hvs *hvs,
        if (!drm_dev_enter(drm, &idx))
                return;
 
-       if (hvs->vc4->is_vc5)
+       if (hvs->vc4->gen == VC4_GEN_4)
                return;
 
        /* The LUT memory is laid out with each HVS channel in order,
@@ -296,7 +296,7 @@ int vc4_hvs_get_fifo_from_output(struct vc4_hvs *hvs, unsigned int output)
        u32 reg;
        int ret;
 
-       if (!vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_4)
                return output;
 
        /*
@@ -377,7 +377,7 @@ static int vc4_hvs_init_channel(struct vc4_hvs *hvs, struct drm_crtc *crtc,
        dispctrl = SCALER_DISPCTRLX_ENABLE;
        dispbkgndx = HVS_READ(SCALER_DISPBKGNDX(chan));
 
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
                dispctrl |= VC4_SET_FIELD(mode->hdisplay,
                                          SCALER_DISPCTRLX_WIDTH) |
                            VC4_SET_FIELD(mode->vdisplay,
@@ -399,7 +399,7 @@ static int vc4_hvs_init_channel(struct vc4_hvs *hvs, struct drm_crtc *crtc,
        dispbkgndx &= ~SCALER_DISPBKGND_INTERLACE;
 
        HVS_WRITE(SCALER_DISPBKGNDX(chan), dispbkgndx |
-                 ((!vc4->is_vc5) ? SCALER_DISPBKGND_GAMMA : 0) |
+                 ((vc4->gen == VC4_GEN_4) ? SCALER_DISPBKGND_GAMMA : 0) |
                  (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
 
        /* Reload the LUT, since the SRAMs would have been disabled if
@@ -671,7 +671,8 @@ void vc4_hvs_atomic_flush(struct drm_crtc *crtc,
 
 void vc4_hvs_mask_underrun(struct vc4_hvs *hvs, int channel)
 {
-       struct drm_device *drm = &hvs->vc4->base;
+       struct vc4_dev *vc4 = hvs->vc4;
+       struct drm_device *drm = &vc4->base;
        u32 dispctrl;
        int idx;
 
@@ -679,8 +680,9 @@ void vc4_hvs_mask_underrun(struct vc4_hvs *hvs, int channel)
                return;
 
        dispctrl = HVS_READ(SCALER_DISPCTRL);
-       dispctrl &= ~(hvs->vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
-                                        SCALER_DISPCTRL_DSPEISLUR(channel));
+       dispctrl &= ~((vc4->gen == VC4_GEN_5) ?
+                     SCALER5_DISPCTRL_DSPEISLUR(channel) :
+                     SCALER_DISPCTRL_DSPEISLUR(channel));
 
        HVS_WRITE(SCALER_DISPCTRL, dispctrl);
 
@@ -689,7 +691,8 @@ void vc4_hvs_mask_underrun(struct vc4_hvs *hvs, int channel)
 
 void vc4_hvs_unmask_underrun(struct vc4_hvs *hvs, int channel)
 {
-       struct drm_device *drm = &hvs->vc4->base;
+       struct vc4_dev *vc4 = hvs->vc4;
+       struct drm_device *drm = &vc4->base;
        u32 dispctrl;
        int idx;
 
@@ -697,8 +700,9 @@ void vc4_hvs_unmask_underrun(struct vc4_hvs *hvs, int channel)
                return;
 
        dispctrl = HVS_READ(SCALER_DISPCTRL);
-       dispctrl |= (hvs->vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
-                                       SCALER_DISPCTRL_DSPEISLUR(channel));
+       dispctrl |= ((vc4->gen == VC4_GEN_5) ?
+                    SCALER5_DISPCTRL_DSPEISLUR(channel) :
+                    SCALER_DISPCTRL_DSPEISLUR(channel));
 
        HVS_WRITE(SCALER_DISPSTAT,
                  SCALER_DISPSTAT_EUFLOW(channel));
@@ -741,8 +745,10 @@ static irqreturn_t vc4_hvs_irq_handler(int irq, void *data)
        control = HVS_READ(SCALER_DISPCTRL);
 
        for (channel = 0; channel < SCALER_CHANNELS_COUNT; channel++) {
-               dspeislur = vc4->is_vc5 ? SCALER5_DISPCTRL_DSPEISLUR(channel) :
-                                         SCALER_DISPCTRL_DSPEISLUR(channel);
+               dspeislur = (vc4->gen == VC4_GEN_5) ?
+                       SCALER5_DISPCTRL_DSPEISLUR(channel) :
+                       SCALER_DISPCTRL_DSPEISLUR(channel);
+
                /* Interrupt masking is not always honored, so check it here. */
                if (status & SCALER_DISPSTAT_EUFLOW(channel) &&
                    control & dspeislur) {
@@ -770,7 +776,7 @@ int vc4_hvs_debugfs_init(struct drm_minor *minor)
        if (!vc4->hvs)
                return -ENODEV;
 
-       if (!vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_4)
                debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR,
                                    minor->debugfs_root,
                                    &vc4->load_tracker_enabled);
@@ -813,7 +819,7 @@ struct vc4_hvs *__vc4_hvs_alloc(struct vc4_dev *vc4, struct platform_device *pde
         * between planes when they don't overlap on the screen, but
         * for now we just allocate globally.
         */
-       if (!vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_4)
                /* 48k words of 2x12-bit pixels */
                drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024);
        else
@@ -847,7 +853,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
        hvs->regset.regs = hvs_regs;
        hvs->regset.nregs = ARRAY_SIZE(hvs_regs);
 
-       if (vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_5) {
                struct rpi_firmware *firmware;
                struct device_node *node;
                unsigned int max_rate;
@@ -885,7 +891,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
                }
        }
 
-       if (!vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_4)
                hvs->dlist = hvs->regs + SCALER_DLIST_START;
        else
                hvs->dlist = hvs->regs + SCALER5_DLIST_START;
@@ -926,7 +932,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
                    SCALER_DISPCTRL_DISPEIRQ(1) |
                    SCALER_DISPCTRL_DISPEIRQ(2);
 
-       if (!vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_4)
                dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ |
                              SCALER_DISPCTRL_SLVWREIRQ |
                              SCALER_DISPCTRL_SLVRDEIRQ |
@@ -970,7 +976,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)
 
        /* Recompute Composite Output Buffer (COB) allocations for the displays
         */
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
                /* The COB is 20736 pixels, or just over 10 lines at 2048 wide.
                 * The bottom 2048 pixels are full 32bpp RGBA (intended for the
                 * TXP composing RGBA to memory), whilst the remainder are only
index 563b3dfeb9b90b675ac3dc3b893c3c0f79ddc423..c006d20b5a78da23c951536e83aff0c494bab39b 100644 (file)
@@ -263,7 +263,7 @@ vc4_irq_enable(struct drm_device *dev)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (!vc4->v3d)
@@ -280,7 +280,7 @@ vc4_irq_disable(struct drm_device *dev)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (!vc4->v3d)
@@ -303,7 +303,7 @@ int vc4_irq_install(struct drm_device *dev, int irq)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (irq == IRQ_NOTCONNECTED)
@@ -324,7 +324,7 @@ void vc4_irq_uninstall(struct drm_device *dev)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        vc4_irq_disable(dev);
@@ -337,7 +337,7 @@ void vc4_irq_reset(struct drm_device *dev)
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        unsigned long irqflags;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        /* Acknowledge any stale IRQs. */
index 5495f2a94fa92604ae652c5eef30bb74fd281e87..bddfcad1095013c64d94a4781612f3c12294d9a7 100644 (file)
@@ -369,7 +369,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
                old_hvs_state->fifo_state[channel].pending_commit = NULL;
        }
 
-       if (vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_5) {
                unsigned long state_rate = max(old_hvs_state->core_clock_rate,
                                               new_hvs_state->core_clock_rate);
                unsigned long core_rate = clamp_t(unsigned long, state_rate,
@@ -388,7 +388,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 
        vc4_ctm_commit(vc4, state);
 
-       if (vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_5)
                vc5_hvs_pv_muxing_commit(vc4, state);
        else
                vc4_hvs_pv_muxing_commit(vc4, state);
@@ -406,7 +406,7 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)
 
        drm_atomic_helper_cleanup_planes(dev, state);
 
-       if (vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_5) {
                unsigned long core_rate = min_t(unsigned long,
                                                hvs->max_core_rate,
                                                new_hvs_state->core_clock_rate);
@@ -461,7 +461,7 @@ static struct drm_framebuffer *vc4_fb_create(struct drm_device *dev,
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        struct drm_mode_fb_cmd2 mode_cmd_local;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return ERR_PTR(-ENODEV);
 
        /* If the user didn't specify a modifier, use the
@@ -1040,7 +1040,7 @@ int vc4_kms_load(struct drm_device *dev)
         * the BCM2711, but the load tracker computations are used for
         * the core clock rate calculation.
         */
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
                /* Start with the load tracker enabled. Can be
                 * disabled through the debugfs load_tracker file.
                 */
@@ -1056,7 +1056,7 @@ int vc4_kms_load(struct drm_device *dev)
                return ret;
        }
 
-       if (vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_5) {
                dev->mode_config.max_width = 7680;
                dev->mode_config.max_height = 7680;
        } else {
@@ -1064,7 +1064,7 @@ int vc4_kms_load(struct drm_device *dev)
                dev->mode_config.max_height = 2048;
        }
 
-       dev->mode_config.funcs = vc4->is_vc5 ? &vc5_mode_funcs : &vc4_mode_funcs;
+       dev->mode_config.funcs = (vc4->gen > VC4_GEN_4) ? &vc5_mode_funcs : &vc4_mode_funcs;
        dev->mode_config.helper_private = &vc4_mode_config_helpers;
        dev->mode_config.preferred_depth = 24;
        dev->mode_config.async_page_flip = true;
index c00a5cc2316d20e04c2fff21f861b26cd05d668f..e4fda72c19f92f1d127dc8b29c48ad24d32348b1 100644 (file)
@@ -23,7 +23,7 @@ void vc4_perfmon_get(struct vc4_perfmon *perfmon)
                return;
 
        vc4 = perfmon->dev;
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        refcount_inc(&perfmon->refcnt);
@@ -37,7 +37,7 @@ void vc4_perfmon_put(struct vc4_perfmon *perfmon)
                return;
 
        vc4 = perfmon->dev;
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (refcount_dec_and_test(&perfmon->refcnt))
@@ -49,7 +49,7 @@ void vc4_perfmon_start(struct vc4_dev *vc4, struct vc4_perfmon *perfmon)
        unsigned int i;
        u32 mask;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (WARN_ON_ONCE(!perfmon || vc4->active_perfmon))
@@ -69,7 +69,7 @@ void vc4_perfmon_stop(struct vc4_dev *vc4, struct vc4_perfmon *perfmon,
 {
        unsigned int i;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        if (WARN_ON_ONCE(!vc4->active_perfmon ||
@@ -90,7 +90,7 @@ struct vc4_perfmon *vc4_perfmon_find(struct vc4_file *vc4file, int id)
        struct vc4_dev *vc4 = vc4file->dev;
        struct vc4_perfmon *perfmon;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return NULL;
 
        mutex_lock(&vc4file->perfmon.lock);
@@ -105,7 +105,7 @@ void vc4_perfmon_open_file(struct vc4_file *vc4file)
 {
        struct vc4_dev *vc4 = vc4file->dev;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        mutex_init(&vc4file->perfmon.lock);
@@ -131,7 +131,7 @@ void vc4_perfmon_close_file(struct vc4_file *vc4file)
 {
        struct vc4_dev *vc4 = vc4file->dev;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        mutex_lock(&vc4file->perfmon.lock);
@@ -151,7 +151,7 @@ int vc4_perfmon_create_ioctl(struct drm_device *dev, void *data,
        unsigned int i;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d) {
@@ -205,7 +205,7 @@ int vc4_perfmon_destroy_ioctl(struct drm_device *dev, void *data,
        struct drm_vc4_perfmon_destroy *req = data;
        struct vc4_perfmon *perfmon;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d) {
@@ -233,7 +233,7 @@ int vc4_perfmon_get_values_ioctl(struct drm_device *dev, void *data,
        struct vc4_perfmon *perfmon;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (!vc4->v3d) {
index 07caf2a47c6cef2ff8a4ccbea0f5d6ee87218a66..866bc46ee6d53aa088f8e802f5a5e52250996204 100644 (file)
@@ -587,10 +587,10 @@ static u32 vc4_lbm_size(struct drm_plane_state *state)
        }
 
        /* Align it to 64 or 128 (hvs5) bytes */
-       lbm = roundup(lbm, vc4->is_vc5 ? 128 : 64);
+       lbm = roundup(lbm, vc4->gen == VC4_GEN_5 ? 128 : 64);
 
        /* Each "word" of the LBM memory contains 2 or 4 (hvs5) pixels */
-       lbm /= vc4->is_vc5 ? 4 : 2;
+       lbm /= vc4->gen == VC4_GEN_5 ? 4 : 2;
 
        return lbm;
 }
@@ -706,7 +706,7 @@ static int vc4_plane_allocate_lbm(struct drm_plane_state *state)
                ret = drm_mm_insert_node_generic(&vc4->hvs->lbm_mm,
                                                 &vc4_state->lbm,
                                                 lbm_size,
-                                                vc4->is_vc5 ? 64 : 32,
+                                                vc4->gen == VC4_GEN_5 ? 64 : 32,
                                                 0, 0);
                spin_unlock_irqrestore(&vc4->hvs->mm_lock, irqflags);
 
@@ -1057,7 +1057,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
        mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE &&
                          fb->format->has_alpha;
 
-       if (!vc4->is_vc5) {
+       if (vc4->gen == VC4_GEN_4) {
        /* Control word */
                vc4_dlist_write(vc4_state,
                                SCALER_CTL0_VALID |
@@ -1632,7 +1632,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
        };
 
        for (i = 0; i < ARRAY_SIZE(hvs_formats); i++) {
-               if (!hvs_formats[i].hvs5_only || vc4->is_vc5) {
+               if (!hvs_formats[i].hvs5_only || vc4->gen == VC4_GEN_5) {
                        formats[num_formats] = hvs_formats[i].drm;
                        num_formats++;
                }
@@ -1647,7 +1647,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
                return ERR_CAST(vc4_plane);
        plane = &vc4_plane->base;
 
-       if (vc4->is_vc5)
+       if (vc4->gen == VC4_GEN_5)
                drm_plane_helper_add(plane, &vc5_plane_helper_funcs);
        else
                drm_plane_helper_add(plane, &vc4_plane_helper_funcs);
index 1bda5010f15a8673239583e1bb4fa00f2e12cdeb..ae4ad956f04ff8215585f6364c1885bcf846e153 100644 (file)
@@ -599,7 +599,7 @@ int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec)
        bool has_bin = args->bin_cl_size != 0;
        int ret;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        if (args->min_x_tile > args->max_x_tile ||
index 04ac7805e6d5fe3d218460039f5d336f79b33e40..f703e6e9ace8a28eea664baa884530fe7b6c7646 100644 (file)
@@ -127,7 +127,7 @@ static int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused)
 int
 vc4_v3d_pm_get(struct vc4_dev *vc4)
 {
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        mutex_lock(&vc4->power_lock);
@@ -148,7 +148,7 @@ vc4_v3d_pm_get(struct vc4_dev *vc4)
 void
 vc4_v3d_pm_put(struct vc4_dev *vc4)
 {
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        mutex_lock(&vc4->power_lock);
@@ -178,7 +178,7 @@ int vc4_v3d_get_bin_slot(struct vc4_dev *vc4)
        uint64_t seqno = 0;
        struct vc4_exec_info *exec;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
 try_again:
@@ -325,7 +325,7 @@ int vc4_v3d_bin_bo_get(struct vc4_dev *vc4, bool *used)
 {
        int ret = 0;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        mutex_lock(&vc4->bin_bo_lock);
@@ -360,7 +360,7 @@ static void bin_bo_release(struct kref *ref)
 
 void vc4_v3d_bin_bo_put(struct vc4_dev *vc4)
 {
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return;
 
        mutex_lock(&vc4->bin_bo_lock);
index 7dff3ca5af6ba6939c71756c7f4516b80988dbe2..4f14cba6b46fb94fa3dc92806383214ced41859e 100644 (file)
@@ -109,7 +109,7 @@ vc4_use_bo(struct vc4_exec_info *exec, uint32_t hindex)
        struct drm_gem_dma_object *obj;
        struct vc4_bo *bo;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return NULL;
 
        if (hindex >= exec->bo_count) {
@@ -169,7 +169,7 @@ vc4_check_tex_size(struct vc4_exec_info *exec, struct drm_gem_dma_object *fbo,
        uint32_t utile_w = utile_width(cpp);
        uint32_t utile_h = utile_height(cpp);
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return false;
 
        /* The shaded vertex format stores signed 12.4 fixed point
@@ -495,7 +495,7 @@ vc4_validate_bin_cl(struct drm_device *dev,
        uint32_t dst_offset = 0;
        uint32_t src_offset = 0;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        while (src_offset < len) {
@@ -942,7 +942,7 @@ vc4_validate_shader_recs(struct drm_device *dev,
        uint32_t i;
        int ret = 0;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return -ENODEV;
 
        for (i = 0; i < exec->shader_state_count; i++) {
index 9745f8810eca6d2559f8a2e912eca5f28d01eb65..afb1a4d826846521649c4ae8b55f9082b4e6ec97 100644 (file)
@@ -786,7 +786,7 @@ vc4_validate_shader(struct drm_gem_dma_object *shader_obj)
        struct vc4_validated_shader_info *validated_shader = NULL;
        struct vc4_shader_validation_state validation_state;
 
-       if (WARN_ON_ONCE(vc4->is_vc5))
+       if (WARN_ON_ONCE(vc4->gen == VC4_GEN_5))
                return NULL;
 
        memset(&validation_state, 0, sizeof(validation_state));