iommu: add essential functionality
authorAditya Basu <mitthu@google.com>
Sat, 17 Aug 2019 01:16:51 +0000 (21:16 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Aug 2019 16:39:09 +0000 (12:39 -0400)
commit33f5b5ea25d3034479eef509ad08e999dcd86369
treee697d5e84c91220176746d5eb321c60594491e71
parent971b09996f47beae2eb6d4a95c7134c6a6768c41
iommu: add essential functionality

* Files
    * power: enable/disable at runtime
    * attach: attach pci device to pid
    * detach: write the pci device to detach from process (verify valid
      pid is writing to it for security?)
    * mappings: prints current pid <=> device(s) mappings
    * info: print driver info and all live register values

* Assert capabilities and set iommu->supported
    * Assert super pages
    * Assert pass-through capable (in context entries)
    * Assert 4-level paging
    * Assert unique rba

* A struct iommu is declared for each IOMMU on the system.
* Default DID=1 because DID=0 is reserved if caching mode is set
  in IOMMU capabilities. Due to this disallow pid=1 from attaching any
  devices.

* Paging structures and helpers
    * Construct the root table (bus) and context table (dev + func)
    * Mark all PCI devices as pass through in context table. This allows
      devices to continue to address host physical memory.
    * IOMMU is turned on by default with no actual translation (pass
      through mode).

* acpi.c: hook in to initialize all discovered IOMMUs
    * Embed struct iommu in struct Drhd
    * Print the addr of iommu struct associated with the DRHD. This is
      shown in #acpi/pretty.
    * Initialize the iommu during DMAR initialization
    * Add helper iommu_supported()
    * Add helper iommu_initialize_global() and iommu_initialize() for
    calling from acpi.c

* pci.c: Associate struct pci_device with struct iommu
    * Add proc_owner field to struct pci_device
    * Iterate over all PCI devices and assign the correct IOMMU. For now
      we assign the default IOMMU to all PCI device. So PCI devices
      under scoped IOMMUs (if reported by DRHD) will not work correctly.

Signed-off-by: Aditya Basu <mitthu@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/intel-iommu.h
kern/arch/x86/pci.c
kern/arch/x86/pci.h
kern/drivers/dev/Kbuild
kern/drivers/dev/acpi.c
kern/drivers/dev/iommu.c [new file with mode: 0644]
kern/include/acpi.h
kern/include/env.h
kern/src/process.c