mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-20 12:42:54 +00:00
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:
parent
0b7bcd6408
commit
ea131eea41
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user