@@ -7,6 +7,7 @@ config DRM_NOUVEAU
depends on DRM_DISPLAY_HELPER
depends on PCI
depends on MMU
+ select AUXILIARY_BUS
select IOMMU_API
select FW_LOADER
select DRM_KMS_HELPER
@@ -5,6 +5,8 @@
#include <core/intr.h>
enum nvkm_subdev_type;
+#include <linux/auxiliary_bus.h>
+
enum nvkm_device_type {
NVKM_DEVICE_PCI,
NVKM_DEVICE_AGP,
@@ -78,6 +80,7 @@ struct nvkm_device {
bool legacy_done;
} intr;
+ struct auxiliary_device auxdev;
const struct nvif_driver_func *driver;
};
@@ -3029,6 +3029,9 @@ nvkm_device_del(struct nvkm_device **pdevice)
struct nvkm_device *device = *pdevice;
struct nvkm_subdev *subdev, *subtmp;
if (device) {
+ auxiliary_device_delete(&device->auxdev);
+ auxiliary_device_uninit(&device->auxdev);
+
nvkm_intr_dtor(device);
list_for_each_entry_safe_reverse(subdev, subtmp, &device->subdev, head)
@@ -3076,6 +3079,16 @@ nvkm_device_endianness(struct nvkm_device *device)
return true;
}
+static DEFINE_IDA(nvkm_device_id);
+
+static void
+nvkm_device_release(struct device *dev)
+{
+ struct nvkm_device *device = container_of(dev, typeof(*device), auxdev.dev);
+
+ ida_free(&nvkm_device_id, device->auxdev.id);
+}
+
int
nvkm_device_ctor(const struct nvkm_device_func *func,
const struct nvkm_device_quirk *quirk,
@@ -3335,5 +3348,25 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
iounmap(device->pri);
device->pri = NULL;
}
+
+ if (ret == 0) {
+ ret = ida_alloc(&nvkm_device_id, GFP_KERNEL);
+ if (ret < 0)
+ return ret;
+
+ device->auxdev.dev.parent = device->dev;
+ device->auxdev.dev.release = nvkm_device_release;
+ device->auxdev.name = "device";
+ device->auxdev.id = ret;
+
+ ret = auxiliary_device_init(&device->auxdev);
+ if (ret)
+ return ret;
+
+ ret = auxiliary_device_add(&device->auxdev);
+ if (ret)
+ auxiliary_device_uninit(&device->auxdev);
+ }
+
return ret;
}
This commit registers a device on the aux bus after core NVKM init has finished, which will be used by a later commit to have the DRM driver probe() against an aux device instead of a PCI or platform device (in the case of Tegra). Signed-off-by: Ben Skeggs <bskeggs@nvidia.com> --- drivers/gpu/drm/nouveau/Kconfig | 1 + .../drm/nouveau/include/nvkm/core/device.h | 3 ++ drivers/gpu/drm/nouveau/nvkm/device/base.c | 33 +++++++++++++++++++ 3 files changed, 37 insertions(+)