mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-27 06:39:51 +00:00
3a5584e0df
Adds latest 6.6 patches from the Raspberry Pi repository. These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.6.y/ With the following command: git format-patch -N v6.6.67..HEAD (HEAD -> 811ff707533bcd67cdcd368bbd46223082009b12) Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> (cherry picked from commit 692205305db14deeff1a2dc4a6d7f87e19fc418b)
165 lines
5.7 KiB
Diff
165 lines
5.7 KiB
Diff
From 8fec3ff870499256f2c18fe7983f6ed3fea4faaf Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Tue, 22 Oct 2024 17:22:40 +0100
|
|
Subject: [PATCH] drm: Add a rotation parameter to connectors.
|
|
|
|
Some connectors, particularly writeback, can implement flip
|
|
or transpose operations as writing back to memory.
|
|
|
|
Add a connector rotation property to control this.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
drivers/gpu/drm/drm_atomic_uapi.c | 4 +++
|
|
drivers/gpu/drm/drm_blend.c | 50 ++++++++++++++++++++++++-------
|
|
include/drm/drm_blend.h | 5 ++++
|
|
include/drm/drm_connector.h | 11 +++++++
|
|
4 files changed, 60 insertions(+), 10 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/drm_atomic_uapi.c
|
|
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
|
|
@@ -811,6 +811,8 @@ static int drm_atomic_connector_set_prop
|
|
state->max_requested_bpc = val;
|
|
} else if (property == connector->privacy_screen_sw_state_property) {
|
|
state->privacy_screen_sw_state = val;
|
|
+ } else if (property == connector->rotation_property) {
|
|
+ state->rotation = val;
|
|
} else if (connector->funcs->atomic_set_property) {
|
|
return connector->funcs->atomic_set_property(connector,
|
|
state, property, val);
|
|
@@ -900,6 +902,8 @@ drm_atomic_connector_get_property(struct
|
|
*val = state->max_requested_bpc;
|
|
} else if (property == connector->privacy_screen_sw_state_property) {
|
|
*val = state->privacy_screen_sw_state;
|
|
+ } else if (property == connector->rotation_property) {
|
|
+ *val = state->rotation;
|
|
} else if (connector->funcs->atomic_get_property) {
|
|
return connector->funcs->atomic_get_property(connector,
|
|
state, property, val);
|
|
--- a/drivers/gpu/drm/drm_blend.c
|
|
+++ b/drivers/gpu/drm/drm_blend.c
|
|
@@ -235,6 +235,16 @@ int drm_plane_create_alpha_property(stru
|
|
}
|
|
EXPORT_SYMBOL(drm_plane_create_alpha_property);
|
|
|
|
+static const struct drm_prop_enum_list drm_rotate_props[] = {
|
|
+ { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" },
|
|
+ { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" },
|
|
+ { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" },
|
|
+ { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" },
|
|
+ { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" },
|
|
+ { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" },
|
|
+ { __builtin_ffs(DRM_MODE_TRANSPOSE) - 1, "transpose" },
|
|
+};
|
|
+
|
|
/**
|
|
* drm_plane_create_rotation_property - create a new rotation property
|
|
* @plane: drm plane
|
|
@@ -275,15 +285,6 @@ int drm_plane_create_rotation_property(s
|
|
unsigned int rotation,
|
|
unsigned int supported_rotations)
|
|
{
|
|
- static const struct drm_prop_enum_list props[] = {
|
|
- { __builtin_ffs(DRM_MODE_ROTATE_0) - 1, "rotate-0" },
|
|
- { __builtin_ffs(DRM_MODE_ROTATE_90) - 1, "rotate-90" },
|
|
- { __builtin_ffs(DRM_MODE_ROTATE_180) - 1, "rotate-180" },
|
|
- { __builtin_ffs(DRM_MODE_ROTATE_270) - 1, "rotate-270" },
|
|
- { __builtin_ffs(DRM_MODE_REFLECT_X) - 1, "reflect-x" },
|
|
- { __builtin_ffs(DRM_MODE_REFLECT_Y) - 1, "reflect-y" },
|
|
- { __builtin_ffs(DRM_MODE_TRANSPOSE) - 1, "transpose" },
|
|
- };
|
|
struct drm_property *prop;
|
|
|
|
WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) == 0);
|
|
@@ -291,7 +292,8 @@ int drm_plane_create_rotation_property(s
|
|
WARN_ON(rotation & ~supported_rotations);
|
|
|
|
prop = drm_property_create_bitmask(plane->dev, 0, "rotation",
|
|
- props, ARRAY_SIZE(props),
|
|
+ drm_rotate_props,
|
|
+ ARRAY_SIZE(drm_rotate_props),
|
|
supported_rotations);
|
|
if (!prop)
|
|
return -ENOMEM;
|
|
@@ -307,6 +309,34 @@ int drm_plane_create_rotation_property(s
|
|
}
|
|
EXPORT_SYMBOL(drm_plane_create_rotation_property);
|
|
|
|
+int drm_connector_create_rotation_property(struct drm_connector *conn,
|
|
+ unsigned int rotation,
|
|
+ unsigned int supported_rotations)
|
|
+{
|
|
+ struct drm_property *prop;
|
|
+
|
|
+ WARN_ON((supported_rotations & DRM_MODE_ROTATE_MASK) == 0);
|
|
+ WARN_ON(!is_power_of_2(rotation & DRM_MODE_ROTATE_MASK));
|
|
+ WARN_ON(rotation & ~supported_rotations);
|
|
+
|
|
+ prop = drm_property_create_bitmask(conn->dev, 0, "rotation",
|
|
+ drm_rotate_props,
|
|
+ ARRAY_SIZE(drm_rotate_props),
|
|
+ supported_rotations);
|
|
+ if (!prop)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ drm_object_attach_property(&conn->base, prop, rotation);
|
|
+
|
|
+ if (conn->state)
|
|
+ conn->state->rotation = rotation;
|
|
+
|
|
+ conn->rotation_property = prop;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+EXPORT_SYMBOL(drm_connector_create_rotation_property);
|
|
+
|
|
/**
|
|
* drm_rotation_simplify() - Try to simplify the rotation
|
|
* @rotation: Rotation to be simplified
|
|
--- a/include/drm/drm_blend.h
|
|
+++ b/include/drm/drm_blend.h
|
|
@@ -34,6 +34,7 @@
|
|
struct drm_device;
|
|
struct drm_atomic_state;
|
|
struct drm_plane;
|
|
+struct drm_connector;
|
|
|
|
static inline bool drm_rotation_90_or_270(unsigned int rotation)
|
|
{
|
|
@@ -58,4 +59,8 @@ int drm_atomic_normalize_zpos(struct drm
|
|
struct drm_atomic_state *state);
|
|
int drm_plane_create_blend_mode_property(struct drm_plane *plane,
|
|
unsigned int supported_modes);
|
|
+
|
|
+int drm_connector_create_rotation_property(struct drm_connector *conn,
|
|
+ unsigned int rotation,
|
|
+ unsigned int supported_rotations);
|
|
#endif
|
|
--- a/include/drm/drm_connector.h
|
|
+++ b/include/drm/drm_connector.h
|
|
@@ -1029,6 +1029,11 @@ struct drm_connector_state {
|
|
* DRM blob property for HDR output metadata
|
|
*/
|
|
struct drm_property_blob *hdr_output_metadata;
|
|
+
|
|
+ /**
|
|
+ * @rotation: Connector property to rotate the maximum output image.
|
|
+ */
|
|
+ u32 rotation;
|
|
};
|
|
|
|
/**
|
|
@@ -1696,6 +1701,12 @@ struct drm_connector {
|
|
*/
|
|
struct drm_property *privacy_screen_hw_state_property;
|
|
|
|
+ /**
|
|
+ * @rotation_property: Optional DRM property controlling rotation of the
|
|
+ * output.
|
|
+ */
|
|
+ struct drm_property *rotation_property;
|
|
+
|
|
#define DRM_CONNECTOR_POLL_HPD (1 << 0)
|
|
#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
|
|
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
|