Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93ca7e00 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter
Browse files

drm/i915: Use the per-plane rotation property



On certain platforms not all planes support the same set of
rotations/reflections, so let's use the per-plane property
for this.

This is already a problem on SKL when we use the legay cursor plane
as it only supports 0|180 whereas the universal planes support
0|90|180|270, and it will be a problem on CHV soon.

v2: Use drm_plane_create_rotation_property() helper
v3: Drop the BIT(), use INTEL_GEN()

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> (v1)
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1474907460-10717-12-git-send-email-ville.syrjala@linux.intel.com
parent 0da88db1
Loading
Loading
Loading
Loading
+21 −31
Original line number Diff line number Diff line
@@ -14886,6 +14886,7 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
	struct intel_plane *primary = NULL;
	struct intel_plane_state *state = NULL;
	const uint32_t *intel_primary_formats;
	unsigned int supported_rotations;
	unsigned int num_formats;
	int ret;

@@ -14958,8 +14959,21 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
	if (ret)
		goto fail;

	if (INTEL_INFO(dev)->gen >= 4)
		intel_create_rotation_property(dev, primary);
	if (INTEL_GEN(dev) >= 9) {
		supported_rotations =
			DRM_ROTATE_0 | DRM_ROTATE_90 |
			DRM_ROTATE_180 | DRM_ROTATE_270;
	} else if (INTEL_GEN(dev) >= 4) {
		supported_rotations =
			DRM_ROTATE_0 | DRM_ROTATE_180;
	} else {
		supported_rotations = DRM_ROTATE_0;
	}

	if (INTEL_GEN(dev) >= 4)
		drm_plane_create_rotation_property(&primary->base,
						   DRM_ROTATE_0,
						   supported_rotations);

	drm_plane_helper_add(&primary->base, &intel_plane_helper_funcs);

@@ -14972,24 +14986,6 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
	return NULL;
}

void intel_create_rotation_property(struct drm_device *dev, struct intel_plane *plane)
{
	if (!dev->mode_config.rotation_property) {
		unsigned long flags = DRM_ROTATE_0 |
			DRM_ROTATE_180;

		if (INTEL_INFO(dev)->gen >= 9)
			flags |= DRM_ROTATE_90 | DRM_ROTATE_270;

		dev->mode_config.rotation_property =
			drm_mode_create_rotation_property(dev, flags);
	}
	if (dev->mode_config.rotation_property)
		drm_object_attach_property(&plane->base.base,
				dev->mode_config.rotation_property,
				plane->base.state->rotation);
}

static int
intel_check_cursor_plane(struct drm_plane *plane,
			 struct intel_crtc_state *crtc_state,
@@ -15116,17 +15112,11 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
	if (ret)
		goto fail;

	if (INTEL_INFO(dev)->gen >= 4) {
		if (!dev->mode_config.rotation_property)
			dev->mode_config.rotation_property =
				drm_mode_create_rotation_property(dev,
	if (INTEL_GEN(dev) >= 4)
		drm_plane_create_rotation_property(&cursor->base,
						   DRM_ROTATE_0,
						   DRM_ROTATE_0 |
						   DRM_ROTATE_180);
		if (dev->mode_config.rotation_property)
			drm_object_attach_property(&cursor->base.base,
				dev->mode_config.rotation_property,
				state->base.rotation);
	}

	if (INTEL_INFO(dev)->gen >=9)
		state->scaler_id = -1;
+0 −3
Original line number Diff line number Diff line
@@ -1284,9 +1284,6 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
unsigned int intel_tile_height(const struct drm_i915_private *dev_priv,
			       uint64_t fb_modifier, unsigned int cpp);

void intel_create_rotation_property(struct drm_device *dev,
					struct intel_plane *plane);

void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
				    enum pipe pipe);

+13 −1
Original line number Diff line number Diff line
@@ -1044,6 +1044,7 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
	struct intel_plane_state *state = NULL;
	unsigned long possible_crtcs;
	const uint32_t *plane_formats;
	unsigned int supported_rotations;
	int num_plane_formats;
	int ret;

@@ -1119,6 +1120,15 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
		goto fail;
	}

	if (INTEL_GEN(dev) >= 9) {
		supported_rotations =
			DRM_ROTATE_0 | DRM_ROTATE_90 |
			DRM_ROTATE_180 | DRM_ROTATE_270;
	} else {
		supported_rotations =
			DRM_ROTATE_0 | DRM_ROTATE_180;
	}

	intel_plane->pipe = pipe;
	intel_plane->plane = plane;
	intel_plane->frontbuffer_bit = INTEL_FRONTBUFFER_SPRITE(pipe, plane);
@@ -1141,7 +1151,9 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
	if (ret)
		goto fail;

	intel_create_rotation_property(dev, intel_plane);
	drm_plane_create_rotation_property(&intel_plane->base,
					   DRM_ROTATE_0,
					   supported_rotations);

	drm_plane_helper_add(&intel_plane->base, &intel_plane_helper_funcs);