Re: [PATCH v3 012/105] drm/vc4: drv: Support BCM2711

2020-05-27 Thread Eric Anholt
On Wed, May 27, 2020 at 8:49 AM Maxime Ripard  wrote:
>
> The BCM2711 has a reworked display pipeline, and the load tracker needs
> some adjustement to operate properly. Let's add a compatible for BCM2711
> and disable the load tracker until properly supported.
>
> Signed-off-by: Maxime Ripard 
> ---
>  drivers/gpu/drm/vc4/vc4_drv.c   |  1 +-
>  drivers/gpu/drm/vc4/vc4_drv.h   |  3 ++-
>  drivers/gpu/drm/vc4/vc4_kms.c   | 42 +++---
>  drivers/gpu/drm/vc4/vc4_plane.c |  5 -
>  4 files changed, 38 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
> index 76f93b662766..d7f554a6f0ed 100644
> --- a/drivers/gpu/drm/vc4/vc4_drv.c
> +++ b/drivers/gpu/drm/vc4/vc4_drv.c
> @@ -364,6 +364,7 @@ static int vc4_platform_drm_remove(struct platform_device 
> *pdev)
>  }
>
>  static const struct of_device_id vc4_of_match[] = {
> +   { .compatible = "brcm,bcm2711-vc5", },
> { .compatible = "brcm,bcm2835-vc4", },
> { .compatible = "brcm,cygnus-vc4", },
> {},

Patch 6 Acked-by: Eric Anholt 
Patch 7-11 Reviewed-by: Eric Anholt 

This one to start probing needs to move later in the series once the
vc5 support is actually present in the driver.


[PATCH v3 012/105] drm/vc4: drv: Support BCM2711

2020-05-27 Thread Maxime Ripard
The BCM2711 has a reworked display pipeline, and the load tracker needs
some adjustement to operate properly. Let's add a compatible for BCM2711
and disable the load tracker until properly supported.

Signed-off-by: Maxime Ripard 
---
 drivers/gpu/drm/vc4/vc4_drv.c   |  1 +-
 drivers/gpu/drm/vc4/vc4_drv.h   |  3 ++-
 drivers/gpu/drm/vc4/vc4_kms.c   | 42 +++---
 drivers/gpu/drm/vc4/vc4_plane.c |  5 -
 4 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 76f93b662766..d7f554a6f0ed 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -364,6 +364,7 @@ static int vc4_platform_drm_remove(struct platform_device 
*pdev)
 }
 
 static const struct of_device_id vc4_of_match[] = {
+   { .compatible = "brcm,bcm2711-vc5", },
{ .compatible = "brcm,bcm2835-vc4", },
{ .compatible = "brcm,cygnus-vc4", },
{},
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index 6f50a91e3933..649bf47c80e5 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -201,6 +201,9 @@ struct vc4_dev {
 
int power_refcount;
 
+   /* Set to true when the load tracker is supported. */
+   bool load_tracker_available;
+
/* Set to true when the load tracker is active. */
bool load_tracker_enabled;
 
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
index 78d4fb0499e3..9417e45d981f 100644
--- a/drivers/gpu/drm/vc4/vc4_kms.c
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
@@ -415,6 +415,9 @@ static int vc4_load_tracker_atomic_check(struct 
drm_atomic_state *state)
struct drm_plane *plane;
int i;
 
+   if (!vc4->load_tracker_available)
+   return 0;
+
priv_state = drm_atomic_get_private_obj_state(state,
  >load_tracker);
if (IS_ERR(priv_state))
@@ -514,10 +517,14 @@ int vc4_kms_load(struct drm_device *dev)
struct vc4_load_tracker_state *load_state;
int ret;
 
-   /* Start with the load tracker enabled. Can be disabled through the
-* debugfs load_tracker file.
-*/
-   vc4->load_tracker_enabled = true;
+   if (!of_device_is_compatible(dev->dev->of_node, "brcm,bcm2711-vc5")) {
+   vc4->load_tracker_available = true;
+
+   /* Start with the load tracker enabled. Can be
+* disabled through the debugfs load_tracker file.
+*/
+   vc4->load_tracker_enabled = true;
+   }
 
sema_init(>async_modeset, 1);
 
@@ -531,8 +538,14 @@ int vc4_kms_load(struct drm_device *dev)
return ret;
}
 
-   dev->mode_config.max_width = 2048;
-   dev->mode_config.max_height = 2048;
+   if (!of_device_is_compatible(dev->dev->of_node, "brcm,bcm2711-vc5")) {
+   dev->mode_config.max_width = 7680;
+   dev->mode_config.max_height = 7680;
+   } else {
+   dev->mode_config.max_width = 2048;
+   dev->mode_config.max_height = 2048;
+   }
+
dev->mode_config.funcs = _mode_funcs;
dev->mode_config.preferred_depth = 24;
dev->mode_config.async_page_flip = true;
@@ -547,14 +560,17 @@ int vc4_kms_load(struct drm_device *dev)
drm_atomic_private_obj_init(dev, >ctm_manager, _state->base,
_ctm_state_funcs);
 
-   load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
-   if (!load_state) {
-   drm_atomic_private_obj_fini(>ctm_manager);
-   return -ENOMEM;
-   }
+   if (vc4->load_tracker_available) {
+   load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
+   if (!load_state) {
+   drm_atomic_private_obj_fini(>ctm_manager);
+   return -ENOMEM;
+   }
 
-   drm_atomic_private_obj_init(dev, >load_tracker, _state->base,
-   _load_tracker_state_funcs);
+   drm_atomic_private_obj_init(dev, >load_tracker,
+   _state->base,
+   _load_tracker_state_funcs);
+   }
 
drm_mode_config_reset(dev);
 
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
index 91e408f7a56e..57a73a2e2e5c 100644
--- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -492,6 +492,11 @@ static void vc4_plane_calc_load(struct drm_plane_state 
*state)
struct vc4_plane_state *vc4_state;
struct drm_crtc_state *crtc_state;
unsigned int vscale_factor;
+   struct vc4_dev *vc4;
+
+   vc4 = to_vc4_dev(state->plane->dev);
+   if (!vc4->load_tracker_available)
+   return;
 
vc4_state = to_vc4_plane_state(state);
crtc_state =