On Dell systems with intel_iommu enabled, dcdbas platform driver's DMA calls fail with ENOMEM / "DMAR: Allocating domain for dcdbas failed". This is because the intel-iommu driver only supports PCI bus / devices, therefore it is not (yet) possible to properly allocate and attach iommu group/domain and attach devices with no pci parent devices. This workaround is forcing the intel_iommu implementation to use identity mapping for this device, using the DUMMY_DEVICE_DOMAIN_INFO constant value defined and used in intel-iommu.c. Signed-off-by: Szabolcs Fruhwald <sfruhwald@xxxxxxxxxx> --- drivers/platform/x86/dcdbas.c | 5 +++++ drivers/platform/x86/dcdbas.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/dcdbas.c b/drivers/platform/x86/dcdbas.c index 88bd7efafe14..a5d6bb1bc590 100644 --- a/drivers/platform/x86/dcdbas.c +++ b/drivers/platform/x86/dcdbas.c @@ -652,6 +652,11 @@ static int dcdbas_probe(struct platform_device *dev) dcdbas_pdev = dev; + /* Intel-IOMMU workaround: platform-bus unsupported, force ID-mapping */ + #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU) + dev->dev.archdata.iommu = INTEL_IOMMU_DUMMY_DOMAIN; + #endif + /* Check if ACPI WSMT table specifies protected SMI buffer address */ error = dcdbas_check_wsmt(); if (error < 0) diff --git a/drivers/platform/x86/dcdbas.h b/drivers/platform/x86/dcdbas.h index 52729a494b00..373eb277933a 100644 --- a/drivers/platform/x86/dcdbas.h +++ b/drivers/platform/x86/dcdbas.h @@ -54,6 +54,7 @@ #define SMI_CMD_MAGIC (0x534D4931) #define SMM_EPS_SIG "$SCB" +#define INTEL_IOMMU_DUMMY_DOMAIN ((void *)-1) #define DCDBAS_DEV_ATTR_RW(_name) \ DEVICE_ATTR(_name,0600,_name##_show,_name##_store); @@ -114,4 +115,3 @@ struct smm_eps_table { } __packed; #endif /* _DCDBAS_H_ */ - -- 2.20.1.321.g9e740568ce-goog