vmd: don't create new buses in hotplug
This doesn't work anyway and can cause creating duplicate bus objects if vmd_scan_single_bus() is called on a parent bus with previously allocated child buses. Also, while here, removed a few unused functions and flags in struct vmd_adapter. Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com> Change-Id: Ic757070188157d9851f648acd074ca4943a14c39 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13955 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tom Nabarro <tom.nabarro@intel.com>
This commit is contained in:
parent
ee1ab6f6be
commit
4c482a623b
@ -663,30 +663,16 @@ vmd_create_new_bus(struct vmd_pci_bus *parent, struct vmd_pci_device *bridge, ui
|
|||||||
return new_bus;
|
return new_bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Assigns a bus number from the list of available
|
|
||||||
* bus numbers. If the device is downstream of a hot plug port,
|
|
||||||
* assign the bus number from those assigned to the HP port. Otherwise,
|
|
||||||
* assign the next bus number from the vmd bus number list.
|
|
||||||
*/
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
vmd_get_next_bus_number(struct vmd_pci_device *dev, struct vmd_adapter *vmd)
|
vmd_get_next_bus_number(struct vmd_adapter *vmd)
|
||||||
{
|
{
|
||||||
uint8_t bus = 0xff;
|
uint8_t bus = 0xff;
|
||||||
struct vmd_pci_bus *hp_bus;
|
|
||||||
|
|
||||||
if (dev) {
|
|
||||||
hp_bus = vmd_is_dev_in_hotplug_path(dev);
|
|
||||||
if (hp_bus && hp_bus->self && hp_bus->self->hotplug_capable) {
|
|
||||||
return vmd_hp_get_next_bus_number(&hp_bus->self->hp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Device is not under a hot plug path. Return next global bus number */
|
|
||||||
if ((vmd->next_bus_number + 1) < vmd->max_pci_bus) {
|
if ((vmd->next_bus_number + 1) < vmd->max_pci_bus) {
|
||||||
bus = vmd->next_bus_number;
|
bus = vmd->next_bus_number;
|
||||||
vmd->next_bus_number++;
|
vmd->next_bus_number++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bus;
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,7 +937,7 @@ vmd_init_end_device(struct vmd_pci_device *dev)
|
|||||||
* Return count of how many devices found(type1 + type 0 header devices)
|
* Return count of how many devices found(type1 + type 0 header devices)
|
||||||
*/
|
*/
|
||||||
static uint8_t
|
static uint8_t
|
||||||
vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge)
|
vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge, bool hotplug)
|
||||||
{
|
{
|
||||||
/* assuming only single function devices are on the bus */
|
/* assuming only single function devices are on the bus */
|
||||||
struct vmd_pci_device *new_dev;
|
struct vmd_pci_device *new_dev;
|
||||||
@ -968,12 +954,17 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (new_dev->header->common.header_type & PCI_HEADER_TYPE_BRIDGE) {
|
if (new_dev->header->common.header_type & PCI_HEADER_TYPE_BRIDGE) {
|
||||||
|
if (hotplug) {
|
||||||
|
free(new_dev);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
slot_cap.as_uint32_t = 0;
|
slot_cap.as_uint32_t = 0;
|
||||||
if (new_dev->pcie_cap != NULL) {
|
if (new_dev->pcie_cap != NULL) {
|
||||||
slot_cap.as_uint32_t = new_dev->pcie_cap->slot_cap.as_uint32_t;
|
slot_cap.as_uint32_t = new_dev->pcie_cap->slot_cap.as_uint32_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_bus_num = vmd_get_next_bus_number(bus->vmd->is_hotplug_scan ? new_dev : NULL, bus->vmd);
|
new_bus_num = vmd_get_next_bus_number(bus->vmd);
|
||||||
if (new_bus_num == 0xff) {
|
if (new_bus_num == 0xff) {
|
||||||
vmd_dev_free(new_dev);
|
vmd_dev_free(new_dev);
|
||||||
return dev_cnt;
|
return dev_cnt;
|
||||||
@ -1015,7 +1006,7 @@ vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridg
|
|||||||
vmd_init_hotplug(new_dev, new_bus);
|
vmd_init_hotplug(new_dev, new_bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_cnt += vmd_scan_single_bus(new_bus, new_dev);
|
dev_cnt += vmd_scan_single_bus(new_bus, new_dev, hotplug);
|
||||||
if (new_dev->pcie_cap != NULL) {
|
if (new_dev->pcie_cap != NULL) {
|
||||||
if (new_dev->pcie_cap->express_cap_register.bit_field.device_type == SwitchUpstreamPort) {
|
if (new_dev->pcie_cap->express_cap_register.bit_field.device_type == SwitchUpstreamPort) {
|
||||||
return dev_cnt;
|
return dev_cnt;
|
||||||
@ -1142,7 +1133,7 @@ vmd_scan_pcibus(struct vmd_pci_bus *bus)
|
|||||||
g_end_device_count = 0;
|
g_end_device_count = 0;
|
||||||
TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq);
|
TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq);
|
||||||
bus->vmd->next_bus_number = bus->bus_number + 1;
|
bus->vmd->next_bus_number = bus->bus_number + 1;
|
||||||
dev_cnt = vmd_scan_single_bus(bus, NULL);
|
dev_cnt = vmd_scan_single_bus(bus, NULL, false);
|
||||||
|
|
||||||
SPDK_INFOLOG(vmd, "VMD scan found %u devices\n", dev_cnt);
|
SPDK_INFOLOG(vmd, "VMD scan found %u devices\n", dev_cnt);
|
||||||
SPDK_INFOLOG(vmd, "VMD scan found %u END DEVICES\n", g_end_device_count);
|
SPDK_INFOLOG(vmd, "VMD scan found %u END DEVICES\n", g_end_device_count);
|
||||||
@ -1355,7 +1346,7 @@ vmd_bus_handle_hotplug(struct vmd_pci_bus *bus)
|
|||||||
|
|
||||||
for (sleep_count = 0; sleep_count < 20; ++sleep_count) {
|
for (sleep_count = 0; sleep_count < 20; ++sleep_count) {
|
||||||
/* Scan until a new device is found */
|
/* Scan until a new device is found */
|
||||||
num_devices = vmd_scan_single_bus(bus, bus->self);
|
num_devices = vmd_scan_single_bus(bus, bus->self, true);
|
||||||
if (num_devices > 0) {
|
if (num_devices > 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -129,13 +129,9 @@ struct vmd_adapter {
|
|||||||
|
|
||||||
uint32_t next_bus_number : 10;
|
uint32_t next_bus_number : 10;
|
||||||
uint32_t max_pci_bus : 10;
|
uint32_t max_pci_bus : 10;
|
||||||
uint32_t is_hotplug_scan : 1;
|
|
||||||
uint32_t is_ready : 1;
|
|
||||||
uint32_t processing_hp : 1;
|
|
||||||
uint32_t max_payload_size: 3;
|
|
||||||
uint32_t root_port_updated : 1;
|
uint32_t root_port_updated : 1;
|
||||||
uint32_t scan_completed : 1;
|
uint32_t scan_completed : 1;
|
||||||
uint32_t rsv : 4;
|
uint32_t rsv : 10;
|
||||||
|
|
||||||
/* end devices attached to vmd adapters */
|
/* end devices attached to vmd adapters */
|
||||||
struct vmd_pci_device *target[MAX_VMD_TARGET];
|
struct vmd_pci_device *target[MAX_VMD_TARGET];
|
||||||
@ -150,26 +146,6 @@ struct vmd_adapter {
|
|||||||
struct event_fifo *hp_queue;
|
struct event_fifo *hp_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TODO: Temporary stubs for Hot Plug interface */
|
|
||||||
static inline struct vmd_pci_bus *
|
|
||||||
vmd_is_dev_in_hotplug_path(struct vmd_pci_device *dev)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
vmd_hp_enable_hotplug(struct vmd_hot_plug *hp)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint8_t
|
|
||||||
vmd_hp_get_next_bus_number(struct vmd_hot_plug *hp)
|
|
||||||
{
|
|
||||||
assert(false);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct vmd_pci_device *vmd_find_device(const struct spdk_pci_addr *addr);
|
struct vmd_pci_device *vmd_find_device(const struct spdk_pci_addr *addr);
|
||||||
|
|
||||||
#endif /* VMD_H */
|
#endif /* VMD_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user