Я добавляю поддержку IOMMU в мой драйвер linux и замечаю, что группы IOMMU назначаются устройству во время загрузки:
[0.942274] iommu: Добавление устройства 0000: 03: 00.0 в группу 28
Хотя, когда я пытаюсь iommu_attach_device()
внутри драйвера, он терпит неудачу.Я обнаружил, что происходит сбой, когда он вызывает iommu_group_get()
для моего устройства.
Как получить назначенную группу для моего устройства и использовать ее в своем драйвере?
Я использую универсальное ядро Ubuntu 4.15.0-45.
Редактировать:
iommu_group_get()
завершается ошибкой, если struct device
поле iommu_group
не инициализировано.Кроме того, я вручную загружаю драйвер после загрузки.
Edit2: Я вижу устройство, добавленное в группу 28 в выводе dmesg.У меня есть следующая последовательность в моей процедуре проверки драйвера, которую я получил, ссылаясь на существующие источники драйверов ядра:
if iommu_present()
iommu_domain_alloc(&pci_bus_type)
iommu_set_fault_handler()
group = iommu_group_get();
// added group check since iommu_attach_device is failing
// group is NULL, was expecting group_28
iommu_attach_device()
init_iova_domain()
У меня есть вызовы IOCTL для закрепления виртуального адреса пространства пользователя (get_user_pages_fast
) и выполнения iommu_map
.Допустимо ли это для включения DMA на устройстве с использованием области пользовательского пространства?