Commit 4e996697 authored by Simona Vetter's avatar Simona Vetter
Browse files

Merge tag 'drm-misc-next-2024-08-09' of...

Merge tag 'drm-misc-next-2024-08-09' of https://gitlab.freedesktop.org/drm/misc/kernel

 into drm-next

drm-misc-next for v6.12:

UAPI Changes:

- remove Power Saving Policy property

Core Changes:

- update connector documentation

CI:
- add tests for mediatek, meson, rockchip

Driver Changes:

amdgpu:
- revert support for Power Saving Policy property

bridge:
- lt9611uxc: require DRM_BRIDGE_ATTACH_NO_CONNECTOR

mgag200:
- transparently support BMC outputs

omapdrm:
- use common helper for_each_endpoint_of_node()

panel:
- panel-edp: fix name for HKC MB116AN01

vkms:
- clean up endianess warnings

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20240809071241.GA222501@localhost.localdomain
parents 91dae758 219b45d0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1761,6 +1761,7 @@ L: dri-devel@lists.freedesktop.org
S:	Supported
T:	git https://gitlab.freedesktop.org/drm/misc/kernel.git
F:	Documentation/gpu/panfrost.rst
F:	drivers/gpu/drm/ci/xfails/panfrost*
F:	drivers/gpu/drm/panfrost/
F:	include/uapi/drm/panfrost_drm.h
@@ -10971,6 +10972,7 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
F:	Documentation/devicetree/bindings/gpu/img,powervr-rogue.yaml
F:	Documentation/devicetree/bindings/gpu/img,powervr-sgx.yaml
F:	Documentation/gpu/imagination/
F:	drivers/gpu/drm/ci/xfails/powervr*
F:	drivers/gpu/drm/imagination/
F:	include/uapi/drm/pvr_drm.h
+0 −4
Original line number Diff line number Diff line
@@ -1407,10 +1407,6 @@ int amdgpu_display_modeset_create_props(struct amdgpu_device *adev)
					 "dither",
					 amdgpu_dither_enum_list, sz);

	if (adev->dc_enabled)
		drm_mode_create_power_saving_policy_property(adev_to_drm(adev),
							     DRM_MODE_POWER_SAVING_POLICY_ALL);

	return 0;
}

+5 −47
Original line number Diff line number Diff line
@@ -6725,14 +6725,6 @@ int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
	} else if (property == adev->mode_info.underscan_property) {
		dm_new_state->underscan_enable = val;
		ret = 0;
	} else if (property == dev->mode_config.power_saving_policy) {
		dm_new_state->abm_forbidden = val & DRM_MODE_REQUIRE_COLOR_ACCURACY;
		dm_new_state->abm_level = (dm_new_state->abm_forbidden ||
					   !dm_old_state->abm_level) ?
						ABM_LEVEL_IMMEDIATE_DISABLE :
						dm_old_state->abm_level;
		dm_new_state->psr_forbidden = val & DRM_MODE_REQUIRE_LOW_LATENCY;
		ret = 0;
	}

	return ret;
@@ -6775,13 +6767,6 @@ int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
	} else if (property == adev->mode_info.underscan_property) {
		*val = dm_state->underscan_enable;
		ret = 0;
	} else if (property == dev->mode_config.power_saving_policy) {
		*val = 0;
		if (dm_state->psr_forbidden)
			*val |= DRM_MODE_REQUIRE_LOW_LATENCY;
		if (dm_state->abm_forbidden)
			*val |= DRM_MODE_REQUIRE_COLOR_ACCURACY;
		ret = 0;
	}

	return ret;
@@ -6808,9 +6793,6 @@ static ssize_t panel_power_savings_show(struct device *device,
	u8 val;

	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
	if (to_dm_connector_state(connector->state)->abm_forbidden)
		val = 0;
	else
	val = to_dm_connector_state(connector->state)->abm_level ==
		ABM_LEVEL_IMMEDIATE_DISABLE ? 0 :
		to_dm_connector_state(connector->state)->abm_level;
@@ -6837,16 +6819,10 @@ static ssize_t panel_power_savings_store(struct device *device,
		return -EINVAL;

	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
	if (to_dm_connector_state(connector->state)->abm_forbidden)
		ret = -EBUSY;
	else
	to_dm_connector_state(connector->state)->abm_level = val ?:
		ABM_LEVEL_IMMEDIATE_DISABLE;
	drm_modeset_unlock(&dev->mode_config.connection_mutex);

	if (ret)
		return ret;

	drm_kms_helper_hotplug_event(dev);

	return count;
@@ -8040,14 +8016,6 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
	aconnector->base.state->max_bpc = 16;
	aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;

	if (connector_type == DRM_MODE_CONNECTOR_eDP &&
	    (dc_is_dmcu_initialized(adev->dm.dc) ||
	     adev->dm.dc->ctx->dmub_srv)) {
		drm_object_attach_property(&aconnector->base.base,
					   dm->ddev->mode_config.power_saving_policy,
					   0);
	}

	if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
		/* Content Type is currently only implemented for HDMI. */
		drm_connector_attach_content_type_property(&aconnector->base);
@@ -9748,7 +9716,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
	for_each_oldnew_connector_in_state(state, connector, old_con_state, new_con_state, i) {
		struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
		struct dm_connector_state *dm_old_con_state = to_dm_connector_state(old_con_state);
		struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
		struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
		struct dc_surface_update *dummy_updates;
		struct dc_stream_update stream_update;
@@ -9802,15 +9769,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
			stream_update.hdr_static_metadata = &hdr_packet;
		}

		aconnector->disallow_edp_enter_psr = dm_new_con_state->psr_forbidden;

		/* immediately disable PSR if disallowed */
		if (aconnector->disallow_edp_enter_psr) {
			mutex_lock(&dm->dc_lock);
			amdgpu_dm_psr_disable(dm_new_crtc_state->stream);
			mutex_unlock(&dm->dc_lock);
		}

		status = dc_stream_get_status(dm_new_crtc_state->stream);

		if (WARN_ON(!status))
+0 −2
Original line number Diff line number Diff line
@@ -915,8 +915,6 @@ struct dm_connector_state {
	bool underscan_enable;
	bool freesync_capable;
	bool update_hdcp;
	bool abm_forbidden;
	bool psr_forbidden;
	uint8_t abm_level;
	int vcpi_slots;
	uint64_t pbn;
+12 −91
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <drm/drm_bridge.h>
#include <drm/drm_edid.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_of.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>

@@ -34,7 +35,7 @@
struct lt9611uxc {
	struct device *dev;
	struct drm_bridge bridge;
	struct drm_connector connector;
	struct drm_bridge *next_bridge;

	struct regmap *regmap;
	/* Protects all accesses to registers by stopping the on-chip MCU */
@@ -120,11 +121,6 @@ static struct lt9611uxc *bridge_to_lt9611uxc(struct drm_bridge *bridge)
	return container_of(bridge, struct lt9611uxc, bridge);
}

static struct lt9611uxc *connector_to_lt9611uxc(struct drm_connector *connector)
{
	return container_of(connector, struct lt9611uxc, connector);
}

static void lt9611uxc_lock(struct lt9611uxc *lt9611uxc)
{
	mutex_lock(&lt9611uxc->ocm_lock);
@@ -171,11 +167,6 @@ static void lt9611uxc_hpd_work(struct work_struct *work)
	struct lt9611uxc *lt9611uxc = container_of(work, struct lt9611uxc, work);
	bool connected;

	if (lt9611uxc->connector.dev) {
		if (lt9611uxc->connector.dev->mode_config.funcs)
			drm_kms_helper_hotplug_event(lt9611uxc->connector.dev);
	} else {

	mutex_lock(&lt9611uxc->ocm_lock);
	connected = lt9611uxc->hdmi_connected;
	mutex_unlock(&lt9611uxc->ocm_lock);
@@ -185,7 +176,6 @@ static void lt9611uxc_hpd_work(struct work_struct *work)
			      connector_status_connected :
			      connector_status_disconnected);
}
}

static void lt9611uxc_reset(struct lt9611uxc *lt9611uxc)
{
@@ -289,82 +279,13 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,
	return dsi;
}

static int lt9611uxc_connector_get_modes(struct drm_connector *connector)
{
	struct lt9611uxc *lt9611uxc = connector_to_lt9611uxc(connector);
	const struct drm_edid *drm_edid;
	int count;

	drm_edid = drm_bridge_edid_read(&lt9611uxc->bridge, connector);
	drm_edid_connector_update(connector, drm_edid);
	count = drm_edid_connector_add_modes(connector);
	drm_edid_free(drm_edid);

	return count;
}

static enum drm_connector_status lt9611uxc_connector_detect(struct drm_connector *connector,
							    bool force)
{
	struct lt9611uxc *lt9611uxc = connector_to_lt9611uxc(connector);

	return lt9611uxc->bridge.funcs->detect(&lt9611uxc->bridge);
}

static enum drm_mode_status lt9611uxc_connector_mode_valid(struct drm_connector *connector,
							   struct drm_display_mode *mode)
{
	struct lt9611uxc_mode *lt9611uxc_mode = lt9611uxc_find_mode(mode);

	return lt9611uxc_mode ? MODE_OK : MODE_BAD;
}

static const struct drm_connector_helper_funcs lt9611uxc_bridge_connector_helper_funcs = {
	.get_modes = lt9611uxc_connector_get_modes,
	.mode_valid = lt9611uxc_connector_mode_valid,
};

static const struct drm_connector_funcs lt9611uxc_bridge_connector_funcs = {
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = lt9611uxc_connector_detect,
	.destroy = drm_connector_cleanup,
	.reset = drm_atomic_helper_connector_reset,
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};

static int lt9611uxc_connector_init(struct drm_bridge *bridge, struct lt9611uxc *lt9611uxc)
{
	int ret;

	lt9611uxc->connector.polled = DRM_CONNECTOR_POLL_HPD;

	drm_connector_helper_add(&lt9611uxc->connector,
				 &lt9611uxc_bridge_connector_helper_funcs);
	ret = drm_connector_init(bridge->dev, &lt9611uxc->connector,
				 &lt9611uxc_bridge_connector_funcs,
				 DRM_MODE_CONNECTOR_HDMIA);
	if (ret) {
		DRM_ERROR("Failed to initialize connector with drm\n");
		return ret;
	}

	return drm_connector_attach_encoder(&lt9611uxc->connector, bridge->encoder);
}

static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,
				   enum drm_bridge_attach_flags flags)
{
	struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
	int ret;

	if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
		ret = lt9611uxc_connector_init(bridge, lt9611uxc);
		if (ret < 0)
			return ret;
	}

	return 0;
	return drm_bridge_attach(bridge->encoder, lt9611uxc->next_bridge,
				 bridge, flags);
}

static enum drm_mode_status
@@ -525,7 +446,7 @@ static int lt9611uxc_parse_dt(struct device *dev,

	lt9611uxc->dsi1_node = of_graph_get_remote_node(dev->of_node, 1, -1);

	return 0;
	return drm_of_find_panel_or_bridge(dev->of_node, 2, -1, NULL, &lt9611uxc->next_bridge);
}

static int lt9611uxc_gpio_init(struct lt9611uxc *lt9611uxc)
Loading