Load MSI pages through bus_dma(9). Our interrupt controllers for MSIs
authorpatrick <patrick@openbsd.org>
Mon, 22 Mar 2021 20:30:21 +0000 (20:30 +0000)
committerpatrick <patrick@openbsd.org>
Mon, 22 Mar 2021 20:30:21 +0000 (20:30 +0000)
commitcc0ede0677b0110958241fb25b9e05031b91a387
treeea0431d24975ef39e1ad1296e3bf5f3c730eac89
parent29ec4e842245b88de2748ddfc7b42ea6b1b956a7
Load MSI pages through bus_dma(9).  Our interrupt controllers for MSIs
typically pass the physical address, however retrieved, to our PCIe
controller code.  This physical address can in practise be directly
given to the PCIe, but it is not a given that the CPU and the PCIe
controller are able to use the same physical addresses.

This is even more obvious with an smmu(4) inbetween, which can change
the world view by introducing I/O virtual addresses.  Hence for this
it is indeed necessary to map those pages, which thanks to integration
with bus_dma(9) works easily.

For this we remember the PCI devices' DMA tag in the interrupt handle
during the MSI map, so that we can use the smmu(4)-hooked DMA tag to
load the physical address.

While some systems might prefer to implement "trapping" pages for MSIs,
to make sure devices cannot trigger other devices' interrupts, we only
make sure the whole page is mapped.

Having the IOMMU create a mapping for each MSI is a bit wasteful, but
for now it's the simplest way to implement it.

Discussed with and ok kettenis@
sys/arch/arm64/dev/acpipci.c
sys/arch/arm64/dev/pci_machdep.c
sys/arch/arm64/dev/pciecam.c
sys/arch/arm64/include/pci_machdep.h
sys/dev/fdt/dwpcie.c