summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@canonical.com>2013-06-12 14:05:19 +0200
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>2013-06-12 14:07:36 +0200
commita299400b8404f935e5e2bc6a5b9c17821844bd0d (patch)
treef1b87c4dbcc4f1008ce168a2649ec3719471eb53
parenta62d5e60896166be88fcf3778921b8d10baec2c1 (diff)
modesetting: probe only succeeds if connectors are detected
This will prevent modesetting being used for outputless intel or nvidia cards. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
-rw-r--r--src/driver.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/driver.c b/src/driver.c
index c3d78be..cc526f6 100644
--- a/src/driver.c
+++ b/src/driver.c
@@ -201,12 +201,25 @@ static int open_hw(char *dev)
return fd;
}
+static int check_outputs(int fd)
+{
+ drmModeResPtr res = drmModeGetResources(fd);
+ int ret;
+
+ if (!res)
+ return FALSE;
+ ret = res->count_connectors > 0;
+ drmModeFreeResources(res);
+ return ret;
+}
+
static Bool probe_hw(char *dev)
{
int fd = open_hw(dev);
if (fd != -1) {
+ int ret = check_outputs(fd);
close(fd);
- return TRUE;
+ return ret;
}
return FALSE;
}
@@ -226,7 +239,7 @@ ms_DRICreatePCIBusID(const struct pci_device *dev)
static Bool probe_hw_pci(char *dev, struct pci_device *pdev)
{
- int fd = open_hw(dev);
+ int ret = FALSE, fd = open_hw(dev);
char *id, *devid;
drmSetVersion sv;
@@ -247,13 +260,12 @@ static Bool probe_hw_pci(char *dev, struct pci_device *pdev)
devid = ms_DRICreatePCIBusID(pdev);
close(fd);
- if (!id || !devid)
- return FALSE;
-
- if (!strcmp(id, devid))
- return TRUE;
+ if (id && devid && !strcmp(id, devid))
+ ret = check_outputs(fd);
- return FALSE;
+ free(id);
+ free(devid);
+ return ret;
}
static const OptionInfoRec *
AvailableOptions(int chipid, int busid)