diff mbox

[libdrm,06/10] xf86drm: Add drmDevice support for virtio_gpu

Message ID 20180625173626.8046-6-emil.l.velikov@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Emil Velikov June 25, 2018, 5:36 p.m. UTC
From: Emil Velikov <emil.velikov@collabora.com>

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

This allows any 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 needed we can add the separate set at a later
stage.

Here are a couple of '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>
---
 xf86drm.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

Comments

Robert Foss June 28, 2018, 4:08 p.m. UTC | #1
Feel free to add my r-b to this patch.

On 2018-06-25 19:36, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov@collabora.com>
> 
> The GPU almost exclusively lives on the PCI bus, so we expose it as a
> normal PCI one.
> 
> This allows any 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 needed we can add the separate set at a later
> stage.
> 
> Here are a couple of '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>
> ---
>   xf86drm.c | 13 ++++++++++++-
>   1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/xf86drm.c b/xf86drm.c
> index 8ccd528f..b847ea26 100644
> --- a/xf86drm.c
> +++ b/xf86drm.c
> @@ -2954,6 +2954,9 @@ sysfs_uevent_get(const char *path, const char *fmt, ...)
>   }
>   #endif
>   
> +/* Little white lie to avoid major rework of the existing code */
> +#define DRM_BUS_VIRTIO 0x10
> +
>   static int drmParseSubsystemType(int maj, int min)
>   {
>   #ifdef __linux__
> @@ -2983,6 +2986,9 @@ static int drmParseSubsystemType(int maj, int min)
>       if (strncmp(name, "/host1x", 7) == 0)
>           return DRM_BUS_HOST1X;
>   
> +    if (strncmp(name, "/virtio", 7) == 0)
> +        return DRM_BUS_VIRTIO;
> +
>       return -EINVAL;
>   #elif defined(__OpenBSD__)
>       return DRM_BUS_PCI;
> @@ -2996,7 +3002,7 @@ static char *
>   get_real_pci_path(int maj, int min)
>   {
>       char path[PATH_MAX + 1];
> -    char *real_path = malloc(PATH_MAX);
> +    char *term, *real_path = malloc(PATH_MAX);
>   
>       if (!real_path)
>           return NULL;
> @@ -3007,6 +3013,10 @@ get_real_pci_path(int maj, int min)
>           return NULL;
>       }
>   
> +    term = strrchr(real_path, '/');
> +    if (term && strncmp(term, "/virtio", 7) == 0)
> +        *term = 0;
> +
>       return real_path;
>   }
>   
> @@ -3744,6 +3754,7 @@ process_device(drmDevicePtr *device, const char *d_name,
>   
>       switch (subsystem_type) {
>       case DRM_BUS_PCI:
> +    case DRM_BUS_VIRTIO:
>           return drmProcessPciDevice(device, node, node_type, maj, min,
>                                      fetch_deviceinfo, flags);
>       case DRM_BUS_USB:
>
diff mbox

Patch

diff --git a/xf86drm.c b/xf86drm.c
index 8ccd528f..b847ea26 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -2954,6 +2954,9 @@  sysfs_uevent_get(const char *path, const char *fmt, ...)
 }
 #endif
 
+/* Little white lie to avoid major rework of the existing code */
+#define DRM_BUS_VIRTIO 0x10
+
 static int drmParseSubsystemType(int maj, int min)
 {
 #ifdef __linux__
@@ -2983,6 +2986,9 @@  static int drmParseSubsystemType(int maj, int min)
     if (strncmp(name, "/host1x", 7) == 0)
         return DRM_BUS_HOST1X;
 
+    if (strncmp(name, "/virtio", 7) == 0)
+        return DRM_BUS_VIRTIO;
+
     return -EINVAL;
 #elif defined(__OpenBSD__)
     return DRM_BUS_PCI;
@@ -2996,7 +3002,7 @@  static char *
 get_real_pci_path(int maj, int min)
 {
     char path[PATH_MAX + 1];
-    char *real_path = malloc(PATH_MAX);
+    char *term, *real_path = malloc(PATH_MAX);
 
     if (!real_path)
         return NULL;
@@ -3007,6 +3013,10 @@  get_real_pci_path(int maj, int min)
         return NULL;
     }
 
+    term = strrchr(real_path, '/');
+    if (term && strncmp(term, "/virtio", 7) == 0)
+        *term = 0;
+
     return real_path;
 }
 
@@ -3744,6 +3754,7 @@  process_device(drmDevicePtr *device, const char *d_name,
 
     switch (subsystem_type) {
     case DRM_BUS_PCI:
+    case DRM_BUS_VIRTIO:
         return drmProcessPciDevice(device, node, node_type, maj, min,
                                    fetch_deviceinfo, flags);
     case DRM_BUS_USB: