- transition from "ioctl" interface

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
---
 .../gpu/drm/nouveau/include/nvif/driverif.h   |  34 +++++
 drivers/gpu/drm/nouveau/nvif/device.c         |  11 +-
 drivers/gpu/drm/nouveau/nvkm/device/user.c    | 135 ++++++++----------
 3 files changed, 106 insertions(+), 74 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvif/driverif.h 
b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
index 03c4803f6492..6152eabd4352 100644
--- a/drivers/gpu/drm/nouveau/include/nvif/driverif.h
+++ b/drivers/gpu/drm/nouveau/include/nvif/driverif.h
@@ -27,6 +27,40 @@ struct nvif_device_impl {
 
        struct nvif_mapinfo map;
 
+       enum {
+               NVIF_DEVICE_IGP = 0,
+               NVIF_DEVICE_PCI,
+               NVIF_DEVICE_AGP,
+               NVIF_DEVICE_PCIE,
+               NVIF_DEVICE_SOC,
+       } platform;
+
+       u16 chipset; /* from NV_PMC_BOOT_0 */
+       u8 revision; /* from NV_PMC_BOOT_0 */
+
+       enum {
+               NVIF_DEVICE_TNT = 1,
+               NVIF_DEVICE_CELSIUS,
+               NVIF_DEVICE_KELVIN,
+               NVIF_DEVICE_RANKINE,
+               NVIF_DEVICE_CURIE,
+               NVIF_DEVICE_TESLA,
+               NVIF_DEVICE_FERMI,
+               NVIF_DEVICE_KEPLER,
+               NVIF_DEVICE_MAXWELL,
+               NVIF_DEVICE_PASCAL,
+               NVIF_DEVICE_VOLTA,
+               NVIF_DEVICE_TURING,
+               NVIF_DEVICE_AMPERE,
+               NVIF_DEVICE_ADA,
+       } family;
+
+       char chip[16];
+       char name[64];
+
+       u64 ram_size;
+       u64 ram_user;
+
        struct {
                s32 oclass;
        } usermode;
diff --git a/drivers/gpu/drm/nouveau/nvif/device.c 
b/drivers/gpu/drm/nouveau/nvif/device.c
index a0bc047ae28d..7c28f9764936 100644
--- a/drivers/gpu/drm/nouveau/nvif/device.c
+++ b/drivers/gpu/drm/nouveau/nvif/device.c
@@ -81,9 +81,16 @@ nvif_device_ctor(struct nvif_client *client, const char 
*name, struct nvif_devic
        device->object.priv = device->priv; /*FIXME: used by nvxx_device() */
 
        if (ret == 0) {
+               /*FIXME: remove after moving users to device->impl */
                device->info.version = 0;
-               ret = nvif_object_mthd(&device->object, NV_DEVICE_V0_INFO,
-                                      &device->info, sizeof(device->info));
+               device->info.platform = device->impl->platform;
+               device->info.chipset = device->impl->chipset;
+               device->info.revision = device->impl->revision;
+               device->info.family = device->impl->family;
+               device->info.ram_size = device->impl->ram_size;
+               device->info.ram_user = device->impl->ram_user;
+               strscpy(device->info.chip, device->impl->chip, 
sizeof(device->info.chip));
+               strscpy(device->info.name, device->impl->name, 
sizeof(device->info.name));
        }
 
        return ret;
diff --git a/drivers/gpu/drm/nouveau/nvkm/device/user.c 
b/drivers/gpu/drm/nouveau/nvkm/device/user.c
index 229245b03719..589cb31853e6 100644
--- a/drivers/gpu/drm/nouveau/nvkm/device/user.c
+++ b/drivers/gpu/drm/nouveau/nvkm/device/user.c
@@ -80,10 +80,7 @@ nvkm_udevice_info(struct nvkm_udevice *udev, void *data, u32 
size)
 {
        struct nvkm_object *object = &udev->object;
        struct nvkm_device *device = udev->device;
-       struct nvkm_fb *fb = device->fb;
-       struct nvkm_instmem *imem = device->imem;
        union {
-               struct nv_device_info_v0 v0;
                struct nv_device_info_v1 v1;
        } *args = data;
        int ret = -ENOSYS, i;
@@ -98,78 +95,9 @@ nvkm_udevice_info(struct nvkm_udevice *udev, void *data, u32 
size)
                        return 0;
                }
                return -EINVAL;
-       } else
-       if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
-               nvif_ioctl(object, "device info vers %d\n", args->v0.version);
        } else
                return ret;
 
-       switch (device->chipset) {
-       case 0x01a:
-       case 0x01f:
-       case 0x04c:
-       case 0x04e:
-       case 0x063:
-       case 0x067:
-       case 0x068:
-       case 0x0aa:
-       case 0x0ac:
-       case 0x0af:
-               args->v0.platform = NV_DEVICE_INFO_V0_IGP;
-               break;
-       default:
-               switch (device->type) {
-               case NVKM_DEVICE_PCI:
-                       args->v0.platform = NV_DEVICE_INFO_V0_PCI;
-                       break;
-               case NVKM_DEVICE_AGP:
-                       args->v0.platform = NV_DEVICE_INFO_V0_AGP;
-                       break;
-               case NVKM_DEVICE_PCIE:
-                       args->v0.platform = NV_DEVICE_INFO_V0_PCIE;
-                       break;
-               case NVKM_DEVICE_TEGRA:
-                       args->v0.platform = NV_DEVICE_INFO_V0_SOC;
-                       break;
-               default:
-                       WARN_ON(1);
-                       break;
-               }
-               break;
-       }
-
-       switch (device->card_type) {
-       case NV_04: args->v0.family = NV_DEVICE_INFO_V0_TNT; break;
-       case NV_10:
-       case NV_11: args->v0.family = NV_DEVICE_INFO_V0_CELSIUS; break;
-       case NV_20: args->v0.family = NV_DEVICE_INFO_V0_KELVIN; break;
-       case NV_30: args->v0.family = NV_DEVICE_INFO_V0_RANKINE; break;
-       case NV_40: args->v0.family = NV_DEVICE_INFO_V0_CURIE; break;
-       case NV_50: args->v0.family = NV_DEVICE_INFO_V0_TESLA; break;
-       case NV_C0: args->v0.family = NV_DEVICE_INFO_V0_FERMI; break;
-       case NV_E0: args->v0.family = NV_DEVICE_INFO_V0_KEPLER; break;
-       case GM100: args->v0.family = NV_DEVICE_INFO_V0_MAXWELL; break;
-       case GP100: args->v0.family = NV_DEVICE_INFO_V0_PASCAL; break;
-       case GV100: args->v0.family = NV_DEVICE_INFO_V0_VOLTA; break;
-       case TU100: args->v0.family = NV_DEVICE_INFO_V0_TURING; break;
-       case GA100: args->v0.family = NV_DEVICE_INFO_V0_AMPERE; break;
-       case AD100: args->v0.family = NV_DEVICE_INFO_V0_ADA; break;
-       default:
-               args->v0.family = 0;
-               break;
-       }
-
-       args->v0.chipset  = device->chipset;
-       args->v0.revision = device->chiprev;
-       if (fb && fb->ram)
-               args->v0.ram_size = args->v0.ram_user = fb->ram->size;
-       else
-               args->v0.ram_size = args->v0.ram_user = 0;
-       if (imem && args->v0.ram_size > 0)
-               args->v0.ram_user = args->v0.ram_user - imem->reserved;
-
-       snprintf(args->v0.chip, sizeof(args->v0.chip), "%s", 
device->chip->name);
-       snprintf(args->v0.name, sizeof(args->v0.name), "%s", device->name);
        return 0;
 }
 
@@ -347,6 +275,69 @@ nvkm_udevice_new(struct nvkm_device *device,
        udev->impl.map.handle = device->func->resource_addr(device, 0);
        udev->impl.map.length = device->func->resource_size(device, 0);
 
+       switch (device->chipset) {
+       case 0x01a:
+       case 0x01f:
+       case 0x04c:
+       case 0x04e:
+       case 0x063:
+       case 0x067:
+       case 0x068:
+       case 0x0aa:
+       case 0x0ac:
+       case 0x0af:
+               udev->impl.platform = NVIF_DEVICE_IGP;
+               break;
+       default:
+               switch (device->type) {
+               case NVKM_DEVICE_PCI  : udev->impl.platform = NVIF_DEVICE_PCI; 
break;
+               case NVKM_DEVICE_AGP  : udev->impl.platform = NVIF_DEVICE_AGP; 
break;
+               case NVKM_DEVICE_PCIE : udev->impl.platform = NVIF_DEVICE_PCIE; 
break;
+               case NVKM_DEVICE_TEGRA: udev->impl.platform = NVIF_DEVICE_SOC; 
break;
+               default:
+                       WARN_ON(1);
+                       ret = -EINVAL;
+                       goto done;
+               }
+               break;
+       }
+
+       udev->impl.chipset  = device->chipset;
+       udev->impl.revision = device->chiprev;
+
+       switch (device->card_type) {
+       case NV_04: udev->impl.family = NVIF_DEVICE_TNT; break;
+       case NV_10:
+       case NV_11: udev->impl.family = NVIF_DEVICE_CELSIUS; break;
+       case NV_20: udev->impl.family = NVIF_DEVICE_KELVIN; break;
+       case NV_30: udev->impl.family = NVIF_DEVICE_RANKINE; break;
+       case NV_40: udev->impl.family = NVIF_DEVICE_CURIE; break;
+       case NV_50: udev->impl.family = NVIF_DEVICE_TESLA; break;
+       case NV_C0: udev->impl.family = NVIF_DEVICE_FERMI; break;
+       case NV_E0: udev->impl.family = NVIF_DEVICE_KEPLER; break;
+       case GM100: udev->impl.family = NVIF_DEVICE_MAXWELL; break;
+       case GP100: udev->impl.family = NVIF_DEVICE_PASCAL; break;
+       case GV100: udev->impl.family = NVIF_DEVICE_VOLTA; break;
+       case TU100: udev->impl.family = NVIF_DEVICE_TURING; break;
+       case GA100: udev->impl.family = NVIF_DEVICE_AMPERE; break;
+       case AD100: udev->impl.family = NVIF_DEVICE_ADA; break;
+       default:
+               WARN_ON(1);
+               ret = -EINVAL;
+               goto done;
+       }
+
+       snprintf(udev->impl.chip, sizeof(udev->impl.chip), "%s", 
device->chip->name);
+       snprintf(udev->impl.name, sizeof(udev->impl.name), "%s", device->name);
+
+       if (device->fb && device->fb->ram)
+               udev->impl.ram_size = udev->impl.ram_user = 
device->fb->ram->size;
+       else
+               udev->impl.ram_size = udev->impl.ram_user = 0;
+
+       if (device->imem && udev->impl.ram_size > 0)
+               udev->impl.ram_user = udev->impl.ram_user - 
device->imem->reserved;
+
        if (device->vfn) {
                udev->impl.usermode.oclass = device->vfn->user.base.oclass;
        }
-- 
2.41.0

Reply via email to