mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-26 07:21:37 +00:00
hv: pci: remove some unnecessary functions
We define some functions to read some fields of the CFG header registers. We could remove them since they're not necessary since calling pci_pdev_read_cfg is simple. Tracked-On: #4550 Signed-off-by: Li Fei1 <fei1.li@intel.com>
This commit is contained in:
parent
1672eca2b9
commit
c4b5af9663
@ -328,11 +328,13 @@ static bool is_hv_owned_pdev(union pci_bdf pbdf)
|
|||||||
return hidden;
|
return hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pci_init_pdev(union pci_bdf pbdf, uint32_t drhd_index)
|
static struct pci_pdev *pci_init_pdev(union pci_bdf pbdf, uint32_t drhd_index)
|
||||||
{
|
{
|
||||||
|
struct pci_pdev *pdev = NULL;
|
||||||
if (!is_hv_owned_pdev(pbdf)) {
|
if (!is_hv_owned_pdev(pbdf)) {
|
||||||
(void)init_pdev(pbdf.value, drhd_index);
|
pdev = init_pdev(pbdf.value, drhd_index);
|
||||||
}
|
}
|
||||||
|
return pdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -365,8 +367,8 @@ struct pci_bus_num_to_drhd_index_mapping {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static uint32_t pci_check_override_drhd_index(union pci_bdf pbdf,
|
static uint32_t pci_check_override_drhd_index(union pci_bdf pbdf,
|
||||||
const struct pci_bdf_mapping_group *const bdfs_from_drhds,
|
const struct pci_bdf_mapping_group *const bdfs_from_drhds,
|
||||||
uint32_t current_drhd_index)
|
uint32_t current_drhd_index)
|
||||||
{
|
{
|
||||||
uint16_t bdfi;
|
uint16_t bdfi;
|
||||||
uint32_t bdf_drhd_index = current_drhd_index;
|
uint32_t bdf_drhd_index = current_drhd_index;
|
||||||
@ -376,9 +378,9 @@ static uint32_t pci_check_override_drhd_index(union pci_bdf pbdf,
|
|||||||
/*
|
/*
|
||||||
* Override current_drhd_index
|
* Override current_drhd_index
|
||||||
*/
|
*/
|
||||||
bdf_drhd_index =
|
bdf_drhd_index =
|
||||||
bdfs_from_drhds->bdf_map[bdfi].dev_scope_drhd_index;
|
bdfs_from_drhds->bdf_map[bdfi].dev_scope_drhd_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bdf_drhd_index;
|
return bdf_drhd_index;
|
||||||
@ -391,14 +393,14 @@ static uint32_t pci_check_override_drhd_index(union pci_bdf pbdf,
|
|||||||
* configuration(acrn_vm_pci_dev_config), call init_one_dev_config or init_all_dev_config to do this.
|
* configuration(acrn_vm_pci_dev_config), call init_one_dev_config or init_all_dev_config to do this.
|
||||||
*/
|
*/
|
||||||
static void scan_pci_hierarchy(uint8_t bus, uint64_t buses_visited[BUSES_BITMAP_LEN],
|
static void scan_pci_hierarchy(uint8_t bus, uint64_t buses_visited[BUSES_BITMAP_LEN],
|
||||||
const struct pci_bdf_mapping_group *const bdfs_from_drhds, uint32_t drhd_index)
|
const struct pci_bdf_mapping_group *const bdfs_from_drhds, uint32_t drhd_index)
|
||||||
{
|
{
|
||||||
bool is_mfdev;
|
|
||||||
uint32_t vendor;
|
uint32_t vendor;
|
||||||
uint8_t hdr_type, dev, func;
|
uint8_t hdr_type, dev, func, func_max;
|
||||||
union pci_bdf pbdf;
|
union pci_bdf pbdf;
|
||||||
uint8_t current_bus_index;
|
uint8_t current_bus_index;
|
||||||
uint32_t current_drhd_index, bdf_drhd_index;
|
uint32_t current_drhd_index, bdf_drhd_index;
|
||||||
|
struct pci_pdev *pdev;
|
||||||
|
|
||||||
struct pci_bus_num_to_drhd_index_mapping bus_map[PCI_BUSMAX + 1U]; /* FIFO queue of buses to walk */
|
struct pci_bus_num_to_drhd_index_mapping bus_map[PCI_BUSMAX + 1U]; /* FIFO queue of buses to walk */
|
||||||
uint32_t s = 0U, e = 0U; /* start and end index into queue */
|
uint32_t s = 0U, e = 0U; /* start and end index into queue */
|
||||||
@ -417,27 +419,18 @@ static void scan_pci_hierarchy(uint8_t bus, uint64_t buses_visited[BUSES_BITMAP_
|
|||||||
pbdf.bits.b = current_bus_index;
|
pbdf.bits.b = current_bus_index;
|
||||||
for (dev = 0U; dev <= PCI_SLOTMAX; dev++) {
|
for (dev = 0U; dev <= PCI_SLOTMAX; dev++) {
|
||||||
pbdf.bits.d = dev;
|
pbdf.bits.d = dev;
|
||||||
is_mfdev = false;
|
pbdf.bits.f = 0U;
|
||||||
|
hdr_type = (uint8_t)pci_pdev_read_cfg(pbdf, PCIR_HDRTYPE, 1U);
|
||||||
|
|
||||||
for (func = 0U; func <= PCI_FUNCMAX; func++) {
|
/* Do not probe beyond function 0 if not a multi-function device
|
||||||
|
* unless device supports ARI or SR-IOV (PCIe spec r5.0 §7.5.1.1.9)
|
||||||
|
*/
|
||||||
|
func_max = is_pci_cfg_multifunction(hdr_type) ? PCI_FUNCMAX : 0U;
|
||||||
|
for (func = 0U; func <= func_max; func++) {
|
||||||
|
|
||||||
pbdf.bits.f = func;
|
pbdf.bits.f = func;
|
||||||
|
|
||||||
vendor = read_pci_pdev_cfg_vendor(pbdf);
|
vendor = pci_pdev_read_cfg(pbdf, PCIR_VENDOR, 2U);
|
||||||
hdr_type = read_pci_pdev_cfg_headertype(pbdf);
|
|
||||||
|
|
||||||
if (func == 0U) {
|
|
||||||
is_mfdev = is_pci_cfg_multifunction(hdr_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do not probe beyond function 0 if not a multi-function device
|
|
||||||
* TODO unless device supports ARI or SR-IOV
|
|
||||||
* (PCIe spec r5.0 §7.5.1.1.9)
|
|
||||||
*/
|
|
||||||
if (((func == 0U) && !is_pci_vendor_valid(vendor)) ||
|
|
||||||
((func > 0U) && (!is_mfdev))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_pci_vendor_valid(vendor)) {
|
if (!is_pci_vendor_valid(vendor)) {
|
||||||
continue;
|
continue;
|
||||||
@ -445,10 +438,11 @@ static void scan_pci_hierarchy(uint8_t bus, uint64_t buses_visited[BUSES_BITMAP_
|
|||||||
|
|
||||||
bdf_drhd_index = pci_check_override_drhd_index(pbdf, bdfs_from_drhds,
|
bdf_drhd_index = pci_check_override_drhd_index(pbdf, bdfs_from_drhds,
|
||||||
current_drhd_index);
|
current_drhd_index);
|
||||||
pci_init_pdev(pbdf, bdf_drhd_index);
|
pdev = pci_init_pdev(pbdf, bdf_drhd_index);
|
||||||
|
/* NOTE: This touch logic change: if a bridge own by HV as its children */
|
||||||
if (is_pci_cfg_bridge(hdr_type)) {
|
if ((pdev != NULL) && is_bridge(pdev)) {
|
||||||
bus_map[e].bus_under_scan = read_pci_pdev_cfg_secbus(pbdf);
|
bus_map[e].bus_under_scan =
|
||||||
|
(uint8_t)pci_pdev_read_cfg(pbdf, PCIR_SECBUS_1, 1U);
|
||||||
bus_map[e].bus_drhd_index = bdf_drhd_index;
|
bus_map[e].bus_drhd_index = bdf_drhd_index;
|
||||||
e = e + 1U;
|
e = e + 1U;
|
||||||
}
|
}
|
||||||
@ -569,7 +563,7 @@ static void init_all_dev_config(void)
|
|||||||
for (idx = 0U; idx < num_pci_pdev; idx++) {
|
for (idx = 0U; idx < num_pci_pdev; idx++) {
|
||||||
pdev = &pci_pdev_array[idx];
|
pdev = &pci_pdev_array[idx];
|
||||||
|
|
||||||
if (pdev->hdr_type == PCIM_HDRTYPE_BRIDGE) {
|
if (is_bridge(pdev)) {
|
||||||
config_pci_bridge(pdev);
|
config_pci_bridge(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,7 +623,7 @@ static inline uint32_t pci_pdev_get_nr_bars(uint8_t hdr_type)
|
|||||||
{
|
{
|
||||||
uint32_t nr_bars = 0U;
|
uint32_t nr_bars = 0U;
|
||||||
|
|
||||||
switch (hdr_type) {
|
switch (hdr_type & PCIM_HDRTYPE) {
|
||||||
case PCIM_HDRTYPE_NORMAL:
|
case PCIM_HDRTYPE_NORMAL:
|
||||||
nr_bars = PCI_STD_NUM_BARS;
|
nr_bars = PCI_STD_NUM_BARS;
|
||||||
break;
|
break;
|
||||||
@ -747,23 +741,23 @@ static void pci_enumerate_cap(struct pci_pdev *pdev)
|
|||||||
*/
|
*/
|
||||||
struct pci_pdev *init_pdev(uint16_t pbdf, uint32_t drhd_index)
|
struct pci_pdev *init_pdev(uint16_t pbdf, uint32_t drhd_index)
|
||||||
{
|
{
|
||||||
uint8_t hdr_type;
|
uint8_t hdr_type, hdr_layout;
|
||||||
union pci_bdf bdf;
|
union pci_bdf bdf;
|
||||||
struct pci_pdev *pdev = NULL;
|
struct pci_pdev *pdev = NULL;
|
||||||
|
|
||||||
if (num_pci_pdev < CONFIG_MAX_PCI_DEV_NUM) {
|
if (num_pci_pdev < CONFIG_MAX_PCI_DEV_NUM) {
|
||||||
bdf.value = pbdf;
|
bdf.value = pbdf;
|
||||||
hdr_type = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_HDRTYPE, 1U);
|
hdr_type = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_HDRTYPE, 1U);
|
||||||
hdr_type &= PCIM_HDRTYPE;
|
hdr_layout = (hdr_type & PCIM_HDRTYPE);
|
||||||
|
|
||||||
if ((hdr_type == PCIM_HDRTYPE_NORMAL) || (hdr_type == PCIM_HDRTYPE_BRIDGE)) {
|
if ((hdr_layout == PCIM_HDRTYPE_NORMAL) || (hdr_layout == PCIM_HDRTYPE_BRIDGE)) {
|
||||||
pdev = &pci_pdev_array[num_pci_pdev];
|
pdev = &pci_pdev_array[num_pci_pdev];
|
||||||
pdev->bdf.value = pbdf;
|
pdev->bdf.value = pbdf;
|
||||||
pdev->hdr_type = hdr_type;
|
pdev->hdr_type = hdr_type;
|
||||||
pdev->base_class = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_CLASS, 1U);
|
pdev->base_class = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_CLASS, 1U);
|
||||||
pdev->sub_class = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_SUBCLASS, 1U);
|
pdev->sub_class = (uint8_t)pci_pdev_read_cfg(bdf, PCIR_SUBCLASS, 1U);
|
||||||
pdev->nr_bars = pci_pdev_get_nr_bars(hdr_type);
|
pdev->nr_bars = pci_pdev_get_nr_bars(hdr_type);
|
||||||
if (hdr_type == PCIM_HDRTYPE_NORMAL) {
|
if (hdr_layout == PCIM_HDRTYPE_NORMAL) {
|
||||||
pdev_save_bar(pdev);
|
pdev_save_bar(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ static inline bool is_host_bridge(const struct pci_pdev *pdev)
|
|||||||
|
|
||||||
static inline bool is_bridge(const struct pci_pdev *pdev)
|
static inline bool is_bridge(const struct pci_pdev *pdev)
|
||||||
{
|
{
|
||||||
return pdev->hdr_type == PCIM_HDRTYPE_BRIDGE;
|
return ((pdev->hdr_type & PCIM_HDRTYPE) == PCIM_HDRTYPE_BRIDGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t pci_bar_offset(uint32_t idx)
|
static inline uint32_t pci_bar_offset(uint32_t idx)
|
||||||
@ -350,31 +350,11 @@ static inline bool is_pci_vendor_valid(uint32_t vendor_id)
|
|||||||
(vendor_id == 0xFFFF0000U) || (vendor_id == 0xFFFFU));
|
(vendor_id == 0xFFFF0000U) || (vendor_id == 0xFFFFU));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t read_pci_pdev_cfg_vendor(union pci_bdf pbdf)
|
|
||||||
{
|
|
||||||
return pci_pdev_read_cfg(pbdf, PCIR_VENDOR, 2U);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t read_pci_pdev_cfg_headertype(union pci_bdf pbdf)
|
|
||||||
{
|
|
||||||
return (uint8_t)pci_pdev_read_cfg(pbdf, PCIR_HDRTYPE, 1U);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t read_pci_pdev_cfg_secbus(union pci_bdf pbdf)
|
|
||||||
{
|
|
||||||
return (uint8_t)pci_pdev_read_cfg(pbdf, PCIR_SECBUS_1, 1U);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool is_pci_cfg_multifunction(uint8_t header_type)
|
static inline bool is_pci_cfg_multifunction(uint8_t header_type)
|
||||||
{
|
{
|
||||||
return ((header_type & PCIM_MFDEV) == PCIM_MFDEV);
|
return ((header_type & PCIM_MFDEV) == PCIM_MFDEV);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool is_pci_cfg_bridge(uint8_t header_type)
|
|
||||||
{
|
|
||||||
return ((header_type & PCIM_HDRTYPE) == PCIM_HDRTYPE_BRIDGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_plat_hidden_pdev(union pci_bdf bdf);
|
bool is_plat_hidden_pdev(union pci_bdf bdf);
|
||||||
bool pdev_need_bar_restore(const struct pci_pdev *pdev);
|
bool pdev_need_bar_restore(const struct pci_pdev *pdev);
|
||||||
void pdev_restore_bar(const struct pci_pdev *pdev);
|
void pdev_restore_bar(const struct pci_pdev *pdev);
|
||||||
|
Loading…
Reference in New Issue
Block a user