dm: fix: TSN in multi-hostbridge could crash

fix bug: if PTM-CAP device, like TSN in multi-hostbridge could cause
acrn-dm crash.

original PTM PCI code has not handled multi-hostbridge case, and just
handled hostbridge (00:00.0) case.

this patch calls PCI access API to handle PTM-CAP device/bridge
(root port) structure, to avoid scan PCI hierarchical.

Tracked-On: #7045
Acked-by: Wang, Yu1 <yu1.wang@intel.com>
Reviewed-by: Fei Li <fei1.li@intel.com>
Signed-off-by: Minggui Cao <minggui.cao@intel.com>
This commit is contained in:
Minggui Cao
2022-01-15 10:57:17 +08:00
committed by acrnsi-robot
parent 5d54b0d110
commit 483b7b1280
4 changed files with 12 additions and 267 deletions

View File

@@ -11,32 +11,10 @@
#include <stdbool.h>
#include "pciaccess.h"
struct pci_device_info {
bool is_bridge;
int primary_bus;
int secondary_bus;
int subordinate_bus;
uint16_t bdf;
struct pci_device_info *parent; /* pointer to its parent bridge */
struct pci_device_info *clist; /* children list */
/* cache of all pci devices
* FIXME: remove PCI_DEVICE_Q. To cleanup pci device cache:
* remove children, then remove parents
*/
TAILQ_ENTRY(pci_device_info) PCI_DEVICE_Q;
};
int pci_find_cap(struct pci_device *pdev, const int cap_id);
int pci_find_ext_cap(struct pci_device *pdev, int cap_id);
int pci_get_pcie_type(struct pci_device *dev);
bool is_root_port(struct pci_device *pdev);
bool is_bridge(struct pci_device *pdev);
int get_device_count_on_bus(int bus);
int get_device_count_on_bridge(const struct pci_device_info *bridge_info);
int scan_pci(void);
struct pci_device * pci_find_root_port(const struct pci_device *pdev);
void clean_pci_cache(void);
bool is_mfdev(struct pci_device *pdev);
#endif