diff --git a/hypervisor/hw/pci.c b/hypervisor/hw/pci.c index 94b3bb3e5..e76800fa6 100644 --- a/hypervisor/hw/pci.c +++ b/hypervisor/hw/pci.c @@ -45,6 +45,29 @@ static struct pci_pdev pci_pdev_array[CONFIG_MAX_PCI_DEV_NUM]; static void init_pdev(uint16_t pbdf); +/* @brief: Find the DRHD index corresponding to a PCI device + * Runs through the pci_pdev_array and returns the value in drhd_idx + * member from pdev strucutre that matches matches B:D.F + * + * @pbdf[in] B:D.F of a PCI device + * + * @return if there is a matching pbdf in pci_pdev_array, pdev->drhd_idx, else INVALID_DRHD_INDEX + */ + +uint32_t pci_lookup_drhd_for_pbdf(uint16_t pbdf) +{ + uint32_t drhd_index = INVALID_DRHD_INDEX; + uint32_t index; + + for (index = 0U; index < num_pci_pdev; index++) { + if (pci_pdev_array[index].bdf.value == pbdf) { + drhd_index = pci_pdev_array[index].drhd_index; + break; + } + } + + return drhd_index; +} static uint32_t pci_pdev_calc_address(union pci_bdf bdf, uint32_t offset) { diff --git a/hypervisor/include/arch/x86/vtd.h b/hypervisor/include/arch/x86/vtd.h index ea2c14625..50dd97724 100644 --- a/hypervisor/include/arch/x86/vtd.h +++ b/hypervisor/include/arch/x86/vtd.h @@ -10,6 +10,8 @@ #include #include +#define INVALID_DRHD_INDEX 0xFFFFFFFFU + /* * Intel IOMMU register specification per version 1.0 public spec. */ diff --git a/hypervisor/include/hw/pci.h b/hypervisor/include/hw/pci.h index 101f14c6f..ed3050b71 100644 --- a/hypervisor/include/hw/pci.h +++ b/hypervisor/include/hw/pci.h @@ -205,6 +205,9 @@ struct pci_msix_cap { }; struct pci_pdev { + /* IOMMU responsible for DMA and Interrupt Remapping for this device */ + uint32_t drhd_index; + /* The bar info of the physical PCI device. */ uint32_t nr_bars; /* 6 for normal device, 2 for bridge, 1 for cardbus */ @@ -285,6 +288,16 @@ void enable_disable_pci_intx(union pci_bdf bdf, bool enable); void init_pci_pdev_list(void); +/* @brief: Find the DRHD index corresponding to a PCI device + * Runs through the pci_pdev_array and returns the value in drhd_idx + * member from pdev strucutre that matches matches B:D.F + * + * @pbdf[in] B:D.F of a PCI device + * + * @return if there is a matching pbdf in pci_pdev_array, pdev->drhd_idx, else -1U + */ +uint32_t pci_lookup_drhd_for_pbdf(uint16_t pbdf); + static inline bool is_pci_vendor_valid(uint32_t vendor_id) { return !((vendor_id == 0xFFFFFFFFU) || (vendor_id == 0U) ||