#include <core/client.h>
 #include <core/handle.h>
 #include <core/option.h>
+#include <nvif/unpack.h>
 #include <nvif/class.h>
 
 #include <nvif/unpack.h>
        return 0;
 }
 
+static int
+nouveau_client_devlist(struct nouveau_object *object, void *data, u32 size)
+{
+       union {
+               struct nv_client_devlist_v0 v0;
+       } *args = data;
+       int ret;
+
+       nv_ioctl(object, "client devlist size %d\n", size);
+       if (nvif_unpack(args->v0, 0, 0, true)) {
+               nv_ioctl(object, "client devlist vers %d count %d\n",
+                        args->v0.version, args->v0.count);
+               if (size == sizeof(args->v0.device[0]) * args->v0.count) {
+                       ret = nouveau_device_list(args->v0.device,
+                                                 args->v0.count);
+                       if (ret >= 0) {
+                               args->v0.count = ret;
+                               ret = 0;
+                       }
+               } else {
+                       ret = -EINVAL;
+               }
+       }
+
+       return ret;
+}
+
+static int
+nouveau_client_mthd(struct nouveau_object *object, u32 mthd,
+                   void *data, u32 size)
+{
+       switch (mthd) {
+       case NV_CLIENT_DEVLIST:
+               return nouveau_client_devlist(object, data, size);
+       default:
+               break;
+       }
+       return -EINVAL;
+}
+
 static void
 nouveau_client_dtor(struct nouveau_object *object)
 {
 nouveau_client_oclass = {
        .ofuncs = &(struct nouveau_ofuncs) {
                .dtor = nouveau_client_dtor,
+               .mthd = nouveau_client_mthd,
        },
 };
 
 
        return match;
 }
 
+int
+nouveau_device_list(u64 *name, int size)
+{
+       struct nouveau_device *device;
+       int nr = 0;
+       mutex_lock(&nv_devices_mutex);
+       list_for_each_entry(device, &nv_devices, head) {
+               if (nr++ < size)
+                       name[nr - 1] = device->handle;
+       }
+       mutex_unlock(&nv_devices_mutex);
+       return nr;
+}
+
 /******************************************************************************
  * nouveau_devobj (0x0080): class implementation
  *****************************************************************************/
 
 #define NV_DEVICE                                                    0x00000080
 
 
+/*******************************************************************************
+ * client
+ ******************************************************************************/
+
+#define NV_CLIENT_DEVLIST                                                  0x00
+
+struct nv_client_devlist_v0 {
+       __u8  version;
+       __u8  count;
+       __u8  pad02[6];
+       __u64 device[];
+};
+
+
 /*******************************************************************************
  * device
  ******************************************************************************/