HV: add DRHD index to pci_pdev

We add new member pci_pdev.drhd_idx associating the DRHD
(IOMMU) with this pdev, and a method to convert a pbdf of a device to
this index by searching the pdev list.

Partial patch: drhd_index initialization handled in subsequent patch.

Tracked-On: #4134
Signed-off-by: Alexander Merritt <alex.merritt@intel.com>
Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
Alexander Merritt 2019-10-31 23:58:27 -07:00 committed by wenlingz
parent 0b7bcd6408
commit ea131eea41
3 changed files with 38 additions and 0 deletions

View File

@ -45,6 +45,29 @@ static struct pci_pdev pci_pdev_array[CONFIG_MAX_PCI_DEV_NUM];
static void init_pdev(uint16_t pbdf); 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) static uint32_t pci_pdev_calc_address(union pci_bdf bdf, uint32_t offset)
{ {

View File

@ -10,6 +10,8 @@
#include <pci.h> #include <pci.h>
#include <platform_acpi_info.h> #include <platform_acpi_info.h>
#define INVALID_DRHD_INDEX 0xFFFFFFFFU
/* /*
* Intel IOMMU register specification per version 1.0 public spec. * Intel IOMMU register specification per version 1.0 public spec.
*/ */

View File

@ -165,6 +165,9 @@ struct pci_msix_cap {
}; };
struct pci_pdev { 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. */ /* The bar info of the physical PCI device. */
uint32_t nr_bars; /* 6 for normal device, 2 for bridge, 1 for cardbus */ uint32_t nr_bars; /* 6 for normal device, 2 for bridge, 1 for cardbus */
@ -236,6 +239,16 @@ void enable_disable_pci_intx(union pci_bdf bdf, bool enable);
void init_pci_pdev_list(void); 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) static inline bool is_pci_vendor_valid(uint32_t vendor_id)
{ {
return !((vendor_id == 0xFFFFFFFFU) || (vendor_id == 0U) || return !((vendor_id == 0xFFFFFFFFU) || (vendor_id == 0U) ||