[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] amd iommu: Advertise iommu extended feature bits to xen.
# HG changeset patch # User Wei Wang <wei.wang2@xxxxxxx> # Date 1321968342 0 # Node ID 883f1c35810e9bb2a84e27d0370e007e16fcb7e3 # Parent fe80909663c1b1765d9b3407b8dcea88bc318d53 amd iommu: Advertise iommu extended feature bits to xen. Signed-off-by: Wei Wang <wei.wang2@xxxxxxx> Committed-by: Keir Fraser <keir@xxxxxxx> --- diff -r fe80909663c1 -r 883f1c35810e xen/drivers/passthrough/amd/iommu_detect.c --- a/xen/drivers/passthrough/amd/iommu_detect.c Tue Nov 22 13:00:21 2011 +0000 +++ b/xen/drivers/passthrough/amd/iommu_detect.c Tue Nov 22 13:25:42 2011 +0000 @@ -62,6 +62,47 @@ return 0; } +void __init get_iommu_features(struct amd_iommu *iommu) +{ + u32 low, high; + int i = 0 ; + char * feature_str[] = { + "- Prefetch Pages Command", + "- Peripheral Page Service Request", + "- X2APIC Supported", + "- NX bit Supported", + "- Guest Translation", + "- Reserved bit [5]", + "- Invalidate All Command", + "- Guest APIC supported", + "- Hardware Error Registers", + "- Performance Counters", + NULL + }; + + ASSERT( iommu->mmio_base ); + + if ( !iommu_has_cap(iommu, PCI_CAP_EFRSUP_SHIFT) ) + { + iommu->features = 0; + return; + } + + low = readl(iommu->mmio_base + IOMMU_EXT_FEATURE_MMIO_OFFSET); + high = readl(iommu->mmio_base + IOMMU_EXT_FEATURE_MMIO_OFFSET + 4); + + iommu->features = ((u64)high << 32) | low; + + printk("AMD-Vi: IOMMU Extended Features:\n"); + + while ( feature_str[i] ) + { + if ( iommu_has_feature(iommu, i) ) + printk( " %s\n", feature_str[i]); + i++; + } +} + int __init amd_iommu_detect_one_acpi(void *ivhd) { struct amd_iommu *iommu; diff -r fe80909663c1 -r 883f1c35810e xen/drivers/passthrough/amd/iommu_init.c --- a/xen/drivers/passthrough/amd/iommu_init.c Tue Nov 22 13:00:21 2011 +0000 +++ b/xen/drivers/passthrough/amd/iommu_init.c Tue Nov 22 13:25:42 2011 +0000 @@ -684,6 +684,8 @@ iommu->dev_table.entries = device_table.entries; iommu->dev_table.buffer = device_table.buffer; + get_iommu_features(iommu); + enable_iommu(iommu); printk("AMD-Vi: IOMMU %d Enabled.\n", nr_amd_iommus ); nr_amd_iommus++; diff -r fe80909663c1 -r 883f1c35810e xen/include/asm-x86/amd-iommu.h --- a/xen/include/asm-x86/amd-iommu.h Tue Nov 22 13:00:21 2011 +0000 +++ b/xen/include/asm-x86/amd-iommu.h Tue Nov 22 13:25:42 2011 +0000 @@ -54,6 +54,7 @@ iommu_cap_t cap; u8 ht_flags; + u64 features; void *mmio_base; unsigned long mmio_base_phys; diff -r fe80909663c1 -r 883f1c35810e xen/include/asm-x86/hvm/svm/amd-iommu-defs.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h Tue Nov 22 13:00:21 2011 +0000 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h Tue Nov 22 13:25:42 2011 +0000 @@ -54,6 +54,7 @@ #define PCI_CAP_HT_TUNNEL_SHIFT 25 #define PCI_CAP_NP_CACHE_MASK 0x04000000 #define PCI_CAP_NP_CACHE_SHIFT 26 +#define PCI_CAP_EFRSUP_SHIFT 27 #define PCI_CAP_RESET_MASK 0x80000000 #define PCI_CAP_RESET_SHIFT 31 @@ -327,6 +328,26 @@ #define IOMMU_EXCLUSION_LIMIT_HIGH_MASK 0xFFFFFFFF #define IOMMU_EXCLUSION_LIMIT_HIGH_SHIFT 0 +/* Extended Feature Register*/ +#define IOMMU_EXT_FEATURE_MMIO_OFFSET 0x30 +#define IOMMU_EXT_FEATURE_PREFSUP_SHIFT 0x0 +#define IOMMU_EXT_FEATURE_PPRSUP_SHIFT 0x1 +#define IOMMU_EXT_FEATURE_XTSUP_SHIFT 0x2 +#define IOMMU_EXT_FEATURE_NXSUP_SHIFT 0x3 +#define IOMMU_EXT_FEATURE_GTSUP_SHIFT 0x4 +#define IOMMU_EXT_FEATURE_IASUP_SHIFT 0x6 +#define IOMMU_EXT_FEATURE_GASUP_SHIFT 0x7 +#define IOMMU_EXT_FEATURE_HESUP_SHIFT 0x8 +#define IOMMU_EXT_FEATURE_PCSUP_SHIFT 0x9 +#define IOMMU_EXT_FEATURE_HATS_SHIFT 0x10 +#define IOMMU_EXT_FEATURE_HATS_MASK 0x00000C00 +#define IOMMU_EXT_FEATURE_GATS_SHIFT 0x12 +#define IOMMU_EXT_FEATURE_GATS_MASK 0x00003000 +#define IOMMU_EXT_FEATURE_GLXSUP 0x14 + +#define IOMMU_EXT_FEATURE_PASMAX_SHIFT 0x0 +#define IOMMU_EXT_FEATURE_PASMAX_MASK 0x0000001F + /* Status Register*/ #define IOMMU_STATUS_MMIO_OFFSET 0x2020 #define IOMMU_STATUS_EVENT_OVERFLOW_MASK 0x00000001 diff -r fe80909663c1 -r 883f1c35810e xen/include/asm-x86/hvm/svm/amd-iommu-proto.h --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Tue Nov 22 13:00:21 2011 +0000 +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h Tue Nov 22 13:25:42 2011 +0000 @@ -43,6 +43,7 @@ int amd_iommu_get_ivrs_dev_entries(void); int amd_iommu_detect_one_acpi(void *ivhd); int amd_iommu_detect_acpi(void); +void get_iommu_features(struct amd_iommu *iommu); /* amd-iommu-init functions */ int amd_iommu_init(void); @@ -183,8 +184,14 @@ static inline int iommu_has_cap(struct amd_iommu *iommu, uint32_t bit) { - u32 mask = 1U << bit; - return iommu->cap.header & mask; + return !!(iommu->cap.header & (1u << bit)); +} + +static inline int iommu_has_feature(struct amd_iommu *iommu, uint32_t bit) +{ + if ( !iommu_has_cap(iommu, PCI_CAP_EFRSUP_SHIFT) ) + return 0; + return !!(iommu->features & (1U << bit)); } #endif /* _ASM_X86_64_AMD_IOMMU_PROTO_H */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |