21018e11b79313d4dd2616426fd7faa125c88640
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0538-drm-vc4-drv-Support-BCM2711.patch
1 From d52f29a5e0ee9882f6f734c057224686b9820152 Mon Sep 17 00:00:00 2001
2 From: Maxime Ripard <maxime@cerno.tech>
3 Date: Thu, 6 Feb 2020 15:40:34 +0100
4 Subject: [PATCH] drm/vc4: drv: Support BCM2711
5
6 The BCM2711 has a reworked display pipeline, and the load tracker needs
7 some adjustement to operate properly. Let's add a compatible for BCM2711
8 and disable the load tracker until properly supported.
9
10 Signed-off-by: Maxime Ripard <maxime@cerno.tech>
11 ---
12 drivers/gpu/drm/vc4/vc4_drv.c | 1 +
13 drivers/gpu/drm/vc4/vc4_drv.h | 3 +++
14 drivers/gpu/drm/vc4/vc4_kms.c | 32 +++++++++++++++++++++-----------
15 drivers/gpu/drm/vc4/vc4_plane.c | 5 +++++
16 4 files changed, 30 insertions(+), 11 deletions(-)
17
18 --- a/drivers/gpu/drm/vc4/vc4_drv.c
19 +++ b/drivers/gpu/drm/vc4/vc4_drv.c
20 @@ -369,6 +369,7 @@ static int vc4_platform_drm_remove(struc
21 }
22
23 static const struct of_device_id vc4_of_match[] = {
24 + { .compatible = "brcm,bcm2711-vc5", },
25 { .compatible = "brcm,bcm2835-vc4", },
26 { .compatible = "brcm,cygnus-vc4", },
27 {},
28 --- a/drivers/gpu/drm/vc4/vc4_drv.h
29 +++ b/drivers/gpu/drm/vc4/vc4_drv.h
30 @@ -205,6 +205,9 @@ struct vc4_dev {
31
32 int power_refcount;
33
34 + /* Set to true when the load tracker is supported. */
35 + bool load_tracker_available;
36 +
37 /* Set to true when the load tracker is active. */
38 bool load_tracker_enabled;
39
40 --- a/drivers/gpu/drm/vc4/vc4_kms.c
41 +++ b/drivers/gpu/drm/vc4/vc4_kms.c
42 @@ -421,6 +421,9 @@ static int vc4_load_tracker_atomic_check
43 struct drm_plane *plane;
44 int i;
45
46 + if (!vc4->load_tracker_available)
47 + return 0;
48 +
49 priv_state = drm_atomic_get_private_obj_state(state,
50 &vc4->load_tracker);
51 if (IS_ERR(priv_state))
52 @@ -520,10 +523,14 @@ int vc4_kms_load(struct drm_device *dev)
53 struct vc4_load_tracker_state *load_state;
54 int ret;
55
56 - /* Start with the load tracker enabled. Can be disabled through the
57 - * debugfs load_tracker file.
58 - */
59 - vc4->load_tracker_enabled = true;
60 + if (!of_device_is_compatible(dev->dev->of_node, "brcm,bcm2711-vc5")) {
61 + vc4->load_tracker_available = true;
62 +
63 + /* Start with the load tracker enabled. Can be
64 + * disabled through the debugfs load_tracker file.
65 + */
66 + vc4->load_tracker_enabled = true;
67 + }
68
69 sema_init(&vc4->async_modeset, 1);
70
71 @@ -560,14 +567,17 @@ int vc4_kms_load(struct drm_device *dev)
72 drm_atomic_private_obj_init(dev, &vc4->ctm_manager, &ctm_state->base,
73 &vc4_ctm_state_funcs);
74
75 - load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
76 - if (!load_state) {
77 - drm_atomic_private_obj_fini(&vc4->ctm_manager);
78 - return -ENOMEM;
79 - }
80 + if (vc4->load_tracker_available) {
81 + load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
82 + if (!load_state) {
83 + drm_atomic_private_obj_fini(&vc4->ctm_manager);
84 + return -ENOMEM;
85 + }
86
87 - drm_atomic_private_obj_init(dev, &vc4->load_tracker, &load_state->base,
88 - &vc4_load_tracker_state_funcs);
89 + drm_atomic_private_obj_init(dev, &vc4->load_tracker,
90 + &load_state->base,
91 + &vc4_load_tracker_state_funcs);
92 + }
93
94 drm_mode_config_reset(dev);
95
96 --- a/drivers/gpu/drm/vc4/vc4_plane.c
97 +++ b/drivers/gpu/drm/vc4/vc4_plane.c
98 @@ -500,6 +500,11 @@ static void vc4_plane_calc_load(struct d
99 struct vc4_plane_state *vc4_state;
100 struct drm_crtc_state *crtc_state;
101 unsigned int vscale_factor;
102 + struct vc4_dev *vc4;
103 +
104 + vc4 = to_vc4_dev(state->plane->dev);
105 + if (!vc4->load_tracker_available)
106 + return;
107
108 vc4_state = to_vc4_plane_state(state);
109 crtc_state = drm_atomic_get_existing_crtc_state(state->state,