Unverified Commit f437bc1e authored by Maxime Ripard's avatar Maxime Ripard
Browse files

drm/vc4: drv: Support BCM2711



The BCM2711 has a reworked display pipeline, and the load tracker needs
some adjustment to operate properly. Let's add a compatible for BCM2711
and disable the load tracker until properly supported.

Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Tested-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Tested-by: default avatarHoegeun Kwon <hoegeun.kwon@samsung.com>
Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://patchwork.freedesktop.org/patch/msgid/beac4f9ef0261bca731a0402c8354e9af740519c.1599120059.git-series.maxime@cerno.tech
parent b5d1443a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -372,6 +372,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", },
	{},
+3 −0
Original line number Diff line number Diff line
@@ -200,6 +200,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;

+31 −13
Original line number Diff line number Diff line
@@ -536,6 +536,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,
						      &vc4->load_tracker);
	if (IS_ERR(priv_state))
@@ -683,12 +686,18 @@ int vc4_kms_load(struct drm_device *dev)
	struct vc4_dev *vc4 = to_vc4_dev(dev);
	struct vc4_ctm_state *ctm_state;
	struct vc4_load_tracker_state *load_state;
	bool is_vc5 = of_device_is_compatible(dev->dev->of_node,
					      "brcm,bcm2711-vc5");
	int ret;

	/* Start with the load tracker enabled. Can be disabled through the
	 * debugfs load_tracker file.
	if (!is_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(&vc4->async_modeset, 1);

@@ -702,8 +711,14 @@ int vc4_kms_load(struct drm_device *dev)
		return ret;
	}

	if (is_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 = &vc4_mode_funcs;
	dev->mode_config.preferred_depth = 24;
	dev->mode_config.async_page_flip = true;
@@ -718,14 +733,17 @@ int vc4_kms_load(struct drm_device *dev)
	drm_atomic_private_obj_init(dev, &vc4->ctm_manager, &ctm_state->base,
				    &vc4_ctm_state_funcs);

	if (vc4->load_tracker_available) {
		load_state = kzalloc(sizeof(*load_state), GFP_KERNEL);
		if (!load_state) {
			drm_atomic_private_obj_fini(&vc4->ctm_manager);
			return -ENOMEM;
		}

	drm_atomic_private_obj_init(dev, &vc4->load_tracker, &load_state->base,
		drm_atomic_private_obj_init(dev, &vc4->load_tracker,
					    &load_state->base,
					    &vc4_load_tracker_state_funcs);
	}

	drm_mode_config_reset(dev);

+5 −0
Original line number Diff line number Diff line
@@ -516,6 +516,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 = drm_atomic_get_existing_crtc_state(state->state,