|
@@ -299,9 +299,23 @@ static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
|
|
|
/* Function to enable the hardware */
|
|
|
static void iommu_enable(struct amd_iommu *iommu)
|
|
|
{
|
|
|
- printk(KERN_INFO "AMD-Vi: Enabling IOMMU at %s cap 0x%hx\n",
|
|
|
+ static const char * const feat_str[] = {
|
|
|
+ "PreF", "PPR", "X2APIC", "NX", "GT", "[5]",
|
|
|
+ "IA", "GA", "HE", "PC", NULL
|
|
|
+ };
|
|
|
+ int i;
|
|
|
+
|
|
|
+ printk(KERN_INFO "AMD-Vi: Enabling IOMMU at %s cap 0x%hx",
|
|
|
dev_name(&iommu->dev->dev), iommu->cap_ptr);
|
|
|
|
|
|
+ if (iommu->cap & (1 << IOMMU_CAP_EFR)) {
|
|
|
+ printk(KERN_CONT " extended features: ");
|
|
|
+ for (i = 0; feat_str[i]; ++i)
|
|
|
+ if (iommu_feature(iommu, (1ULL << i)))
|
|
|
+ printk(KERN_CONT " %s", feat_str[i]);
|
|
|
+ }
|
|
|
+ printk(KERN_CONT "\n");
|
|
|
+
|
|
|
iommu_feature_enable(iommu, CONTROL_IOMMU_EN);
|
|
|
}
|
|
|
|
|
@@ -657,7 +671,7 @@ static void __init set_device_exclusion_range(u16 devid, struct ivmd_header *m)
|
|
|
static void __init init_iommu_from_pci(struct amd_iommu *iommu)
|
|
|
{
|
|
|
int cap_ptr = iommu->cap_ptr;
|
|
|
- u32 range, misc;
|
|
|
+ u32 range, misc, low, high;
|
|
|
int i, j;
|
|
|
|
|
|
pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET,
|
|
@@ -673,6 +687,12 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu)
|
|
|
MMIO_GET_LD(range));
|
|
|
iommu->evt_msi_num = MMIO_MSI_NUM(misc);
|
|
|
|
|
|
+ /* read extended feature bits */
|
|
|
+ low = readl(iommu->mmio_base + MMIO_EXT_FEATURES);
|
|
|
+ high = readl(iommu->mmio_base + MMIO_EXT_FEATURES + 4);
|
|
|
+
|
|
|
+ iommu->features = ((u64)high << 32) | low;
|
|
|
+
|
|
|
if (!is_rd890_iommu(iommu->dev))
|
|
|
return;
|
|
|
|