xf86drm: Add drmDevice support for virtio_gpu

The GPU almost exclusively lives on the PCI bus, so we expose it as a
normal PCI one.

This allows all existing drmDevice users to work without any changes.

One could wonder why a separate typeset is not introduced, alike say
host1x. Unlike host1x the PCI/platform distinction for virtio provides
no extra information. Plus if needed we can add the separate set at a
later stage.

Here are a few 'features' that virtio seems to be missing:
 - provides extra information on top the plaform devices
 - supports a range of GPU devices
 - is considered hardware description (DT)

Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Tested-by: Robert Foss <robert.foss@collabora.com>
Reviewed-by: Robert Foss <robert.foss@collabora.com>
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
main
Emil Velikov 2018-05-15 17:37:49 +01:00 committed by Emil Velikov
parent a02900133b
commit 3988580e4c
1 changed files with 12 additions and 1 deletions

View File

@ -2954,6 +2954,9 @@ sysfs_uevent_get(const char *path, const char *fmt, ...)
} }
#endif #endif
/* Little white lie to avoid major rework of the existing code */
#define DRM_BUS_VIRTIO 0x10
static int drmParseSubsystemType(int maj, int min) static int drmParseSubsystemType(int maj, int min)
{ {
#ifdef __linux__ #ifdef __linux__
@ -2983,6 +2986,9 @@ static int drmParseSubsystemType(int maj, int min)
if (strncmp(name, "/host1x", 7) == 0) if (strncmp(name, "/host1x", 7) == 0)
return DRM_BUS_HOST1X; return DRM_BUS_HOST1X;
if (strncmp(name, "/virtio", 7) == 0)
return DRM_BUS_VIRTIO;
return -EINVAL; return -EINVAL;
#elif defined(__OpenBSD__) #elif defined(__OpenBSD__)
return DRM_BUS_PCI; return DRM_BUS_PCI;
@ -2995,12 +3001,16 @@ static int drmParseSubsystemType(int maj, int min)
static char * static char *
get_real_pci_path(int maj, int min, char *real_path) get_real_pci_path(int maj, int min, char *real_path)
{ {
char path[PATH_MAX + 1]; char path[PATH_MAX + 1], *term;
snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min); snprintf(path, sizeof(path), "/sys/dev/char/%d:%d/device", maj, min);
if (!realpath(path, real_path)) if (!realpath(path, real_path))
return NULL; return NULL;
term = strrchr(real_path, '/');
if (term && strncmp(term, "/virtio", 7) == 0)
*term = 0;
return real_path; return real_path;
} }
@ -3724,6 +3734,7 @@ process_device(drmDevicePtr *device, const char *d_name,
switch (subsystem_type) { switch (subsystem_type) {
case DRM_BUS_PCI: case DRM_BUS_PCI:
case DRM_BUS_VIRTIO:
return drmProcessPciDevice(device, node, node_type, maj, min, return drmProcessPciDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags); fetch_deviceinfo, flags);
case DRM_BUS_USB: case DRM_BUS_USB: