- transition from "ioctl" interface Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> --- .../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