Please ignore this v3 series. This series is incorrectly configured with base branch, so wrong patches are sent. I did stop it as long as I found the problem, but still lots of patches were sent already. Will repost later. Sorry for the noise! On Mon, Nov 14, 2016 at 05:18:56PM -0500, Peter Xu wrote: > This is v3 of vt-d unit test series. > > Patch "libcflat: add IS_ALIGNED() macro, and page sizes" is picked up > by Drew in the ARM GIC framework series, so please feel free to drop > it when needed. > > Online repo: > > https://github.com/xzpeter/kvm-unit-tests.git iommu-ut-v3 > > Please review. Thanks, > > v3: > - is_power_of_2(): remove outer "()" [Drew] > - fix indent for vtd_root_table() [Drew] > - pci_find_dev(): keep {} to avoid touching more codes [Drew] > - pci_scan_bars(): check whether bar is 64bits [Drew] > - pci_enable_defaults(): make it return nothing [Drew] > - fix strnang blanks in lib/x86/intel-iommu.h [Drew] > - pci_setup_msi(): fix correct assert() inside [Drew] > - squash patches: 03+17 08+09 10+11 12+14 [Drew] > - remove all "()" for raw defines (numbers) in macros [Drew] > > v2: > - move cpu_relax patch to the beginning, and use them in all places > [Drew] > - replace all corresponding 256 into PCI_DEVFN_MAX, as well for > PCI_BAR_NUM [Drew] > - adding is_power_of_2() to replace ONE_BIT_ONLY() [Drew] > - add SZ_64K macro [Drew] > - declare pci_config_write[wb] in lib/asm-generic/pci-host-bridge.h [Alex] > - edu_reg_read/write() add "l" in func name [Drew] > - drop pci_set_master(), instead, provide pci_cmd_set_clr() [Drew] > - change return code into bool (always) for functions that apply > [Drew] > - keep old pci_find_dev() interface [Drew/Alex] > - use __raw_{read|write}*() for both vt-d and edu register read/writes > [Alex] > - remove pci_ prefix for all pci_dev fields [Drew] > - replace 0xff in cap_handlers[0xff] into (PCI_CAP_ID_MAX + 1) [Drew] > - make x86/unittest.cfg simpler by using q35 directly with eim=off > [Drew] > > RFC -> v1: > - when init edu device fail, report_skip() rather than return error > [Radim] > - use asserts rather than "static bool inited" to avoid multiple init > of components (affects patch 1/2) [Drew] > - moving the first two patches out of the series [Drew] > - int vtd_init(), do not setup_idt() since smp_init() did it [Drew] > - when edu do not have MSI enabled, skip interrupt test [Radim] > - rename vtd_reg_*() into vtd_{read|write}[lq](), and move them to > header file [Drew] > - use PAGE_MASK when able [Drew] > - use "&" instead of "|" in intel-iommu init test (three places) > [Drew] > - use "vtd_init()" in unit test [Drew] > - mention that where intel-iommu.h comes from [Drew] > - re-written vtd_gcmd_or(), make it also work on even hardware [Drew] > - remove most of the oneline wrapper for VT-d registers, instead, use > vtd_{read|write}* with register names [Drew] > - remove useless BDF helpers [Drew] > - move edu device macros into header file [Drew] > - make edu_check_alive static inline [Drew] > - remove all useless wrappers in pci-edu.c [Drew] > - remove pci_dma_dir_t and all its users, instead, use "bool > from_device" [Drew] > - not use typedef for structs, to follow Linux/kvm-unit-tests coding > style [Drew] > - let pci_dev_init() clean and simple, then provide > pci_enable_defaults() for more complicated things [Drew] > - add one more patch to add intel-iommu test into x86/unittest [Radim] > - use 0x60 intr request instead of factorial to trigger edu device > interrupt [Drew] > - ...and some other changes I just forgot to note down... > > Currently only a very small test scope is covered: > > * VT-d init > * DMAR: 4 bytes copy > * IR: MSI > > However this series could be a base point to add more test cases for > VT-d. The problem is, there are many IOMMU error conditions which are > very hard to be triggered in a real guest (IOMMU has merely no > interface for guest user, and it's totally running in the background). > This piece of work can be a start point if we want to do more > complicated things and play around with Intel IOMMU devices (also for > IOMMU regression tests). > > Please review. Thanks, > > ================= > > To run the test: > > ./x86/run ./x86/intel-iommu.flat \ > -M q35,kernel-irqchip=split -global ioapic.version=0x20 \ > -device intel-iommu,intremap=on -device edu > > Sample output: > > pxdev:kvm-unit-tests [new-iommu-ut]# ./iommu_run.sh > /root/git/qemu/bin/x86_64-softmmu/qemu-system-x86_64 -enable-kvm -device pc-testdev -device isa-debug-exit,iobase=0xf4,iosize=0x4 -vnc none -serial stdio > +-device pci-testdev -kernel ./x86/intel-iommu.flat -M q35,kernel-irqchip=split -global ioapic.version=0x20 -device intel-iommu,intremap=on -device edu > enabling apic > paging enabled > cr0 = 80010011 > cr3 = 7fff000 > cr4 = 20 > VT-d version: 0x10 > cap: 0x0012008c22260206 > ecap: 0x0000000000f00f1a > PASS: init status check > PASS: fault status check > PASS: QI enablement > DMAR table address: 0x0000000007ff9000 > PASS: DMAR table setup > IR table address: 0x0000000007ff8000 > PASS: IR table setup > PASS: DMAR enablement > PASS: IR enablement > PASS: DMAR support 39 bits address width > PASS: DMAR support huge pages > PCI: init dev 0x0020 BAR 0 [MEM] addr 0xfea00000 > PCI detected cap 0x5 > Detected MSI for device 0x20 offset 0x40 > allocated vt-d root entry for PCI bus 0 > allocated vt-d context entry for devfn 0x20 > map 4K page IOVA 0x0 to 0x7ff7000 (sid=0x0020) > edu device DMA start TO addr 0x0 size 0x4 off 0x0 > edu device DMA start FROM addr 0x4 size 0x4 off 0x0 > PASS: DMAR 4B memcpy test > INTR: setup IRTE index 0 > MSI: dev 0x20 init 64bit address: addr=0xfee00010, data=0x0 > PASS: EDU factorial INTR test > > Alexander Gordeev (12): > pci: Fix coding style in generic PCI files > pci: x86: Rename pci_config_read() to pci_config_readl() > pci: Add 'extern' to public function declarations > pci: x86: Add remaining PCI configuration space accessors > pci: Factor out pci_bar_get() > pci: Rework pci_bar_addr() > pci: Add pci_bar_set_addr() > pci: Add pci_dev_exists() > pci: Add pci_print() > pci: Add generic ECAM host support > pci: Add pci-testdev PCI bus test device > arm/arm64: pci: Add pci-testdev PCI device operation test > > Peter Xu (13): > x86/asm: add cpu_relax() > libcflat: introduce is_power_of_2() > x86: intel-iommu: add vt-d init test > libcflat: add IS_ALIGNED() macro, and page sizes > libcflat: moving MIN/MAX here > vm/page: provide PGDIR_OFFSET() macro > pci: introduce struct pci_dev > pci: provide pci_scan_bars() > pci: provide pci_enable_defaults() > pci: edu: introduce pci-edu helpers > x86: intel-iommu: add dmar test > pci: add msi support for 32/64bit address > x86: intel-iommu: add IR MSI test > > arm/Makefile.common | 6 +- > arm/pci-test.c | 27 ++++ > arm/run | 7 +- > arm/unittests.cfg | 4 + > lib/alloc.c | 3 - > lib/arm/asm/pci.h | 1 + > lib/arm64/asm/pci.h | 1 + > lib/asm-generic/pci-host-bridge.h | 28 ++++ > lib/libcflat.h | 14 ++ > lib/pci-edu.c | 73 +++++++++ > lib/pci-edu.h | 83 ++++++++++ > lib/pci-host-generic.c | 321 +++++++++++++++++++++++++++++++++++++ > lib/pci-host-generic.h | 46 ++++++ > lib/pci-testdev.c | 194 ++++++++++++++++++++++ > lib/pci.c | 327 +++++++++++++++++++++++++++++++++++--- > lib/pci.h | 66 +++++++- > lib/x86/asm/barrier.h | 11 ++ > lib/x86/asm/page.h | 3 + > lib/x86/asm/pci.h | 46 +++++- > lib/x86/intel-iommu.c | 313 ++++++++++++++++++++++++++++++++++++ > lib/x86/intel-iommu.h | 142 +++++++++++++++++ > lib/x86/vm.c | 4 +- > x86/Makefile.common | 1 + > x86/Makefile.x86_64 | 2 + > x86/intel-iommu.c | 120 ++++++++++++++ > x86/unittests.cfg | 7 + > x86/vmexit.c | 27 ++-- > 27 files changed, 1826 insertions(+), 51 deletions(-) > create mode 100644 arm/pci-test.c > create mode 100644 lib/arm/asm/pci.h > create mode 100644 lib/arm64/asm/pci.h > create mode 100644 lib/asm-generic/pci-host-bridge.h > create mode 100644 lib/pci-edu.c > create mode 100644 lib/pci-edu.h > create mode 100644 lib/pci-host-generic.c > create mode 100644 lib/pci-host-generic.h > create mode 100644 lib/pci-testdev.c > create mode 100644 lib/x86/intel-iommu.c > create mode 100644 lib/x86/intel-iommu.h > create mode 100644 x86/intel-iommu.c > > -- > 2.7.4 > -- peterx -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html