|
@@ -82,6 +82,53 @@ enum drm_connector_status {
|
|
|
connector_status_unknown = 3,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * enum drm_connector_registration_status - userspace registration status for
|
|
|
+ * a &drm_connector
|
|
|
+ *
|
|
|
+ * This enum is used to track the status of initializing a connector and
|
|
|
+ * registering it with userspace, so that DRM can prevent bogus modesets on
|
|
|
+ * connectors that no longer exist.
|
|
|
+ */
|
|
|
+enum drm_connector_registration_state {
|
|
|
+ /**
|
|
|
+ * @DRM_CONNECTOR_INITIALIZING: The connector has just been created,
|
|
|
+ * but has yet to be exposed to userspace. There should be no
|
|
|
+ * additional restrictions to how the state of this connector may be
|
|
|
+ * modified.
|
|
|
+ */
|
|
|
+ DRM_CONNECTOR_INITIALIZING = 0,
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @DRM_CONNECTOR_REGISTERED: The connector has been fully initialized
|
|
|
+ * and registered with sysfs, as such it has been exposed to
|
|
|
+ * userspace. There should be no additional restrictions to how the
|
|
|
+ * state of this connector may be modified.
|
|
|
+ */
|
|
|
+ DRM_CONNECTOR_REGISTERED = 1,
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @DRM_CONNECTOR_UNREGISTERED: The connector has either been exposed
|
|
|
+ * to userspace and has since been unregistered and removed from
|
|
|
+ * userspace, or the connector was unregistered before it had a chance
|
|
|
+ * to be exposed to userspace (e.g. still in the
|
|
|
+ * @DRM_CONNECTOR_INITIALIZING state). When a connector is
|
|
|
+ * unregistered, there are additional restrictions to how its state
|
|
|
+ * may be modified:
|
|
|
+ *
|
|
|
+ * - An unregistered connector may only have its DPMS changed from
|
|
|
+ * On->Off. Once DPMS is changed to Off, it may not be switched back
|
|
|
+ * to On.
|
|
|
+ * - Modesets are not allowed on unregistered connectors, unless they
|
|
|
+ * would result in disabling its assigned CRTCs. This means
|
|
|
+ * disabling a CRTC on an unregistered connector is OK, but enabling
|
|
|
+ * one is not.
|
|
|
+ * - Removing a CRTC from an unregistered connector is OK, but new
|
|
|
+ * CRTCs may never be assigned to an unregistered connector.
|
|
|
+ */
|
|
|
+ DRM_CONNECTOR_UNREGISTERED = 2,
|
|
|
+};
|
|
|
+
|
|
|
enum subpixel_order {
|
|
|
SubPixelUnknown = 0,
|
|
|
SubPixelHorizontalRGB,
|
|
@@ -853,10 +900,12 @@ struct drm_connector {
|
|
|
bool ycbcr_420_allowed;
|
|
|
|
|
|
/**
|
|
|
- * @registered: Is this connector exposed (registered) with userspace?
|
|
|
+ * @registration_state: Is this connector initializing, exposed
|
|
|
+ * (registered) with userspace, or unregistered?
|
|
|
+ *
|
|
|
* Protected by @mutex.
|
|
|
*/
|
|
|
- bool registered;
|
|
|
+ enum drm_connector_registration_state registration_state;
|
|
|
|
|
|
/**
|
|
|
* @modes:
|
|
@@ -1166,6 +1215,24 @@ static inline void drm_connector_unreference(struct drm_connector *connector)
|
|
|
drm_connector_put(connector);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * drm_connector_is_unregistered - has the connector been unregistered from
|
|
|
+ * userspace?
|
|
|
+ * @connector: DRM connector
|
|
|
+ *
|
|
|
+ * Checks whether or not @connector has been unregistered from userspace.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * True if the connector was unregistered, false if the connector is
|
|
|
+ * registered or has not yet been registered with userspace.
|
|
|
+ */
|
|
|
+static inline bool
|
|
|
+drm_connector_is_unregistered(struct drm_connector *connector)
|
|
|
+{
|
|
|
+ return READ_ONCE(connector->registration_state) ==
|
|
|
+ DRM_CONNECTOR_UNREGISTERED;
|
|
|
+}
|
|
|
+
|
|
|
const char *drm_get_connector_status_name(enum drm_connector_status status);
|
|
|
const char *drm_get_subpixel_order_name(enum subpixel_order order);
|
|
|
const char *drm_get_dpms_name(int val);
|