summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Lane <iainl@gnome.org>2018-08-13 11:22:22 +0100
committerIain Lane <iainl@gnome.org>2018-08-17 17:56:06 +0100
commit20b61826d60f8b42c8e79d270fda8a28e6096a8c (patch)
tree04f7dcf09f0aa64195620af202d36d4948cd5012
parent731cffdd79267596acf33539266edb8af33fed80 (diff)
downloadmutter-wip/laney/drmmodegetresources-handle-failure-2.tar.gz
monitor-manager-kms: Check if GPUs can have outputswip/laney/drmmodegetresources-handle-failure-2
We need a way for mutter to exit if no available GPUs are going to work. For example if gdm starts gnome-shell and we're using a DRM driver that doesn't work with KMS then we should exit so that GDM can try with Xorg, rather than operating in headless mode. Related: https://gitlab.gnome.org/GNOME/mutter/issues/223
-rw-r--r--src/backends/native/meta-gpu-kms.c18
-rw-r--r--src/backends/native/meta-gpu-kms.h3
-rw-r--r--src/backends/native/meta-monitor-manager-kms.c11
3 files changed, 31 insertions, 1 deletions
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 9de9fc63e..26203fb60 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -812,6 +812,22 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
return TRUE;
}
+gboolean
+meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms,
+ GError **error)
+{
+ if (gpu_kms->n_connectors == 0)
+ {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_FAILED,
+ "GPU has 0 usable connectors, can't use it");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
MetaGpuKms *
meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
const char *kms_file_path,
@@ -840,6 +856,8 @@ meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
drmSetClientCap (gpu_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+ meta_gpu_kms_read_current (META_GPU (gpu_kms), NULL);
+
source = g_source_new (&kms_event_funcs, sizeof (MetaKmsSource));
kms_source = (MetaKmsSource *) source;
kms_source->fd_tag = g_source_add_unix_fd (source,
diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h
index ef1f17ce8..d15b9435c 100644
--- a/src/backends/native/meta-gpu-kms.h
+++ b/src/backends/native/meta-gpu-kms.h
@@ -53,6 +53,9 @@ gboolean meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
int y,
uint32_t fb_id);
+gboolean meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms,
+ GError **error);
+
gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
MetaCrtc *crtc);
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 6c7a87f01..df71d7e19 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -663,7 +663,8 @@ meta_monitor_manager_kms_initable_init (GInitable *initable,
primary_gpu_path,
error);
g_list_free_full (gpu_paths, g_free);
- if (!manager_kms->primary_gpu)
+ if (!manager_kms->primary_gpu ||
+ !meta_gpu_kms_can_have_outputs (manager_kms->primary_gpu, error))
return FALSE;
meta_monitor_manager_kms_connect_uevent_handler (manager_kms);
@@ -686,6 +687,14 @@ meta_monitor_manager_kms_initable_init (GInitable *initable,
continue;
}
+ if (!meta_gpu_kms_can_have_outputs (gpu_kms, &secondary_error))
+ {
+ g_warning ("Couldn't add secondary gpu '%s': %s",
+ gpu_path, secondary_error->message);
+ g_clear_object (&gpu_kms);
+ continue;
+ }
+
meta_monitor_manager_add_gpu (META_MONITOR_MANAGER (manager_kms),
META_GPU (gpu_kms));
}