@@ -1123,6 +1123,10 @@ int drm_atomic_connector_set_property(struct drm_connector *connector,
*/
if (state->link_status != DRM_LINK_STATUS_GOOD)
state->link_status = val;
+ } else if (property == config->aspect_ratio_property) {
+ state->picture_aspect_ratio = val;
+ } else if (property == config->scaling_mode_property) {
+ state->scaling_mode = val;
} else if (connector->funcs->atomic_set_property) {
return connector->funcs->atomic_set_property(connector,
state, property, val);
@@ -1199,6 +1203,10 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
*val = state->tv.hue;
} else if (property == config->link_status_property) {
*val = state->link_status;
+ } else if (property == config->aspect_ratio_property) {
+ *val = state->picture_aspect_ratio;
+ } else if (property == config->scaling_mode_property) {
+ *val = state->scaling_mode;
} else if (connector->funcs->atomic_get_property) {
return connector->funcs->atomic_get_property(connector,
state, property, val);
@@ -4902,6 +4902,7 @@ intel_dp_set_property(struct drm_connector *connector,
return 0;
}
intel_connector->panel.fitting_mode = val;
+ connector->state->scaling_mode = val;
goto done;
}
@@ -5192,6 +5193,7 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
connector->dev->mode_config.scaling_mode_property,
DRM_MODE_SCALE_ASPECT);
intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
+ connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
}
}
@@ -1616,6 +1616,7 @@ static int intel_dsi_set_property(struct drm_connector *connector,
return 0;
intel_connector->panel.fitting_mode = val;
+ connector->state->scaling_mode = val;
}
crtc = connector->state->crtc;
@@ -1682,6 +1683,7 @@ static void intel_dsi_add_properties(struct intel_connector *connector)
dev->mode_config.scaling_mode_property,
DRM_MODE_SCALE_ASPECT);
connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
+ connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT;
}
}
@@ -1662,6 +1662,7 @@ intel_hdmi_set_property(struct drm_connector *connector,
default:
return -EINVAL;
}
+ connector->state->picture_aspect_ratio = val;
goto done;
}
@@ -618,6 +618,7 @@ static int intel_lvds_set_property(struct drm_connector *connector,
return 0;
}
intel_connector->panel.fitting_mode = value;
+ connector->state->scaling_mode = value;
crtc = intel_attached_encoder(connector)->base.crtc;
if (crtc && crtc->state->enable) {
@@ -1087,6 +1088,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
drm_object_attach_property(&connector->base,
dev->mode_config.scaling_mode_property,
DRM_MODE_SCALE_ASPECT);
+ connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
intel_lvds_pps_get_hw_state(dev_priv, &lvds_encoder->init_pps);
@@ -132,5 +132,7 @@ intel_attach_aspect_ratio_property(struct drm_connector *connector)
if (!drm_mode_create_aspect_ratio_property(connector->dev))
drm_object_attach_property(&connector->base,
connector->dev->mode_config.aspect_ratio_property,
- DRM_MODE_PICTURE_ASPECT_NONE);
+ 0);
+
+ connector->state->picture_aspect_ratio = DRM_MODE_PICTURE_ASPECT_NONE;
}
@@ -2080,6 +2080,7 @@ intel_sdvo_set_property(struct drm_connector *connector,
default:
return -EINVAL;
}
+ connector->state->picture_aspect_ratio = val;
goto done;
}
@@ -25,6 +25,7 @@
#include <linux/list.h>
#include <linux/ctype.h>
+#include <linux/hdmi.h>
#include <drm/drm_mode_object.h>
#include <uapi/drm/drm_mode.h>
@@ -326,6 +327,21 @@ struct drm_connector_state {
struct drm_atomic_state *state;
struct drm_tv_connector_state tv;
+
+ /**
+ * @picture_aspect_ratio: Connector property to control the
+ * HDMI infoframe aspect ratio setting.
+ *
+ * The DRM_MODE_PICTURE_ASPECT_\* values much match the
+ * values for &enum hdmi_picture_aspect
+ */
+ enum hdmi_picture_aspect picture_aspect_ratio;
+
+ /**
+ * @scaling_mode: Connector property to control the
+ * upscaling, mostly used for built-in panels.
+ */
+ unsigned int scaling_mode;
};
/**