Commit 4c482a62 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

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: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ic757070188157d9851f648acd074ca4943a14c39
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13955


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTom Nabarro <tom.nabarro@intel.com>
parent ee1ab6f6
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -663,30 +663,16 @@ vmd_create_new_bus(struct vmd_pci_bus *parent, struct vmd_pci_device *bridge, ui
	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
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;
	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) {
		bus = vmd->next_bus_number;
		vmd->next_bus_number++;
	}

	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)
 */
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 */
	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 (hotplug) {
				free(new_dev);
				continue;
			}

			slot_cap.as_uint32_t = 0;
			if (new_dev->pcie_cap != NULL) {
				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) {
				vmd_dev_free(new_dev);
				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);
			}

			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->express_cap_register.bit_field.device_type == SwitchUpstreamPort) {
					return dev_cnt;
@@ -1142,7 +1133,7 @@ vmd_scan_pcibus(struct vmd_pci_bus *bus)
	g_end_device_count = 0;
	TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq);
	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 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) {
		/* 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) {
			break;
		}
+1 −25
Original line number Diff line number Diff line
@@ -129,13 +129,9 @@ struct vmd_adapter {

	uint32_t next_bus_number : 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 scan_completed : 1;
	uint32_t rsv : 4;
	uint32_t rsv : 10;

	/* end devices attached to vmd adapters */
	struct vmd_pci_device *target[MAX_VMD_TARGET];
@@ -150,26 +146,6 @@ struct vmd_adapter {
	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);

#endif /* VMD_H */