weston: add force-on option for DRM
Add a new boolean output section key "force-on". When set to true, the output will be enabled regardless of connector status. This is the opposite of the mode=off setting. Forcing connectors on is useful in special circumstances: avoid output configuration changes due to hotplug e.g. with KVM switches, or hardware with unreliable connector status readout for example. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Ian Ray <ian.ray@ge.com>
This commit is contained in:
+20
-2
@@ -1594,6 +1594,22 @@ drm_head_prepare_enable(struct wet_compositor *wet,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
drm_head_should_force_enable(struct wet_compositor *wet,
|
||||||
|
struct weston_head *head)
|
||||||
|
{
|
||||||
|
const char *name = weston_head_get_name(head);
|
||||||
|
struct weston_config_section *section;
|
||||||
|
int force = 0;
|
||||||
|
|
||||||
|
section = drm_config_find_controlling_output_section(wet->config, name);
|
||||||
|
if (!section)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
weston_config_section_get_bool(section, "force-on", &force, 0);
|
||||||
|
return !!force;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drm_try_attach(struct weston_output *output,
|
drm_try_attach(struct weston_output *output,
|
||||||
struct wet_head_array *add,
|
struct wet_head_array *add,
|
||||||
@@ -1783,6 +1799,7 @@ drm_heads_changed(struct wl_listener *listener, void *arg)
|
|||||||
bool connected;
|
bool connected;
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool changed;
|
bool changed;
|
||||||
|
bool forced;
|
||||||
|
|
||||||
/* We need to collect all cloned heads into outputs before enabling the
|
/* We need to collect all cloned heads into outputs before enabling the
|
||||||
* output.
|
* output.
|
||||||
@@ -1791,10 +1808,11 @@ drm_heads_changed(struct wl_listener *listener, void *arg)
|
|||||||
connected = weston_head_is_connected(head);
|
connected = weston_head_is_connected(head);
|
||||||
enabled = weston_head_is_enabled(head);
|
enabled = weston_head_is_enabled(head);
|
||||||
changed = weston_head_is_device_changed(head);
|
changed = weston_head_is_device_changed(head);
|
||||||
|
forced = drm_head_should_force_enable(wet, head);
|
||||||
|
|
||||||
if (connected && !enabled) {
|
if ((connected || forced) && !enabled) {
|
||||||
drm_head_prepare_enable(wet, head);
|
drm_head_prepare_enable(wet, head);
|
||||||
} else if (!connected && enabled) {
|
} else if (!(connected || forced) && enabled) {
|
||||||
drm_head_disable(head);
|
drm_head_disable(head);
|
||||||
} else if (enabled && changed) {
|
} else if (enabled && changed) {
|
||||||
weston_log("Detected a monitor change on head '%s', "
|
weston_log("Detected a monitor change on head '%s', "
|
||||||
|
|||||||
@@ -95,6 +95,14 @@ NOTE: cms-colord plugin does not work correctly with this option. The plugin
|
|||||||
chooses an arbitrary monitor to load the color profile for, but the
|
chooses an arbitrary monitor to load the color profile for, but the
|
||||||
profile is applied equally to all cloned monitors regardless of their
|
profile is applied equally to all cloned monitors regardless of their
|
||||||
properties.
|
properties.
|
||||||
|
.TP
|
||||||
|
\fBforce-on\fR=\fItrue\fR
|
||||||
|
Force the output to be enabled even if the connector is disconnected.
|
||||||
|
Defaults to false. Note that
|
||||||
|
.BR mode=off " will override " force-on=true .
|
||||||
|
When a connector is disconnected, there is no EDID information to provide
|
||||||
|
a list of video modes. Therefore a forced output should also have a
|
||||||
|
detailed mode line specified.
|
||||||
.
|
.
|
||||||
.\" ***************************************************************
|
.\" ***************************************************************
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
|
|||||||
Reference in New Issue
Block a user