Lines Matching defs:bus
39 vmd_is_valid_cfg_addr(struct vmd_pci_bus *bus, uint64_t addr)
41 return addr >= (uint64_t)bus->vmd->cfg_vaddr &&
42 addr < bus->vmd->cfgbar_size + (uint64_t)bus->vmd->cfg_vaddr;
243 struct vmd_pci_bus *bus;
251 bus = dev->bus_object;
253 bus = dev->parent;
256 bridge = bus->self;
260 if (dev->bus->vmd->scan_completed) {
264 while (bus && bus->self != NULL) {
265 bridge = bus->self;
278 bus = bus->parent;
285 struct vmd_pci_bus *bus = dev->parent;
290 if (bus->self->hotplug_capable) {
291 return vmd_hotplug_allocate_base_addr(&bus->self->hp, size);
293 return (uint64_t)bus->self->header->one.mem_base << 16;
309 if (dev && dev->bus) {
310 vmd = dev->bus->vmd;
366 /* Enable device MEM and bus mastering */
471 struct vmd_adapter *vmd_adapter = dev->bus->vmd;
532 vmd_init_hotplug(struct vmd_pci_device *dev, struct vmd_pci_bus *bus)
534 struct vmd_adapter *vmd = bus->vmd;
543 bus->self->header->one.mem_base = BRIDGE_BASEREG(hp->bar.start);
544 bus->self->header->one.mem_limit =
545 bus->self->header->one.mem_base + BRIDGE_BASEREG(hp->bar.size - 1);
547 hp->bar.start = (uint64_t)bus->self->header->one.mem_base << 16;
566 bus->self->header->one.mem_base, bus->self->header->one.mem_limit);
570 vmd_bus_device_present(struct vmd_pci_bus *bus, uint32_t devfn)
574 header = (volatile struct pci_header *)(bus->vmd->cfg_vaddr +
575 CONFIG_OFFSET_ADDR(bus->config_bus_number, devfn, 0, 0));
576 if (!vmd_is_valid_cfg_addr(bus, (uint64_t)header)) {
588 vmd_alloc_dev(struct vmd_pci_bus *bus, uint32_t devfn)
596 TAILQ_FOREACH(dev, &bus->dev_list, tailq) {
602 if (!vmd_bus_device_present(bus, devfn)) {
606 header = (struct pci_header * volatile)(bus->vmd->cfg_vaddr +
607 CONFIG_OFFSET_ADDR(bus->config_bus_number, devfn, 0, 0));
620 dev->bus = bus;
621 dev->parent = bus;
630 if (!dev->bus->vmd->scan_completed) {
661 bridge->pci.addr.bus = new_bus->bus_number;
672 uint8_t bus = 0xff;
675 bus = vmd->next_bus_number;
679 return bus;
687 if (dev && dev->bus && dev->bus->vmd &&
688 ((dev->bus->vmd->next_bus_number + RESERVED_HOTPLUG_BUSES) < dev->bus->vmd->max_pci_bus)) {
690 dev->bus->vmd->next_bus_number += RESERVED_HOTPLUG_BUSES;
750 /* Update the subordinate bus of all bridges above this bridge */
835 struct vmd_pci_device *bus_device = dev->bus->self;
838 /* Release the hotplug region if the device is under hotplug-capable bus */
854 struct vmd_pci_bus *bus = vmd_device->bus;
857 TAILQ_REMOVE(&bus->dev_list, vmd_device, tailq);
865 dev->pci.addr.domain = dev->bus->vmd->domain;
866 dev->pci.addr.bus = dev->bus->bus_number;
869 dev->pci.numa_id = spdk_pci_device_get_numa_id(dev->bus->vmd->pci);
886 struct vmd_pci_bus *bus = dev->bus;
897 vmd_setup_msix(dev, &bus->vmd->msix_table[0]);
903 dev->pci.parent = dev->bus->vmd->pci;
913 vmd = bus->vmd;
918 /* Attach the device to the current bus and assign base addresses */
919 TAILQ_INSERT_TAIL(&bus->dev_list, dev, tailq);
926 * Scans a single bus for all devices attached and return a count of
928 * function devices. Hence a bus(bridge) will not have multi function with both type
931 * The other option for implementing this function is the bus is an int and
933 * sub/pri/sec bus. The input becomes PciPort, bus number and parent_bridge.
935 * The bus number is scanned and if a device is found, based on the header_type, create
938 * If a PciBridge, assign bus numbers and rescan new bus. The currently PciBridge being
939 * scanned becomes the passed in parent_bridge with the new bus number.
946 vmd_scan_single_bus(struct vmd_pci_bus *bus, struct vmd_pci_device *parent_bridge, bool hotplug)
948 /* assuming only single function devices are on the bus */
957 new_dev = vmd_alloc_dev(bus, device_number);
973 new_bus_num = vmd_get_next_bus_number(bus->vmd);
978 new_bus = vmd_create_new_bus(bus, new_dev, new_bus_num);
983 new_bus->primary_bus = bus->secondary_bus;
993 /* Hot inserted SSDs can be assigned port bus of sub-ordinate + 1 */
1005 TAILQ_INSERT_TAIL(&bus->vmd->bus_list, new_bus, tailq);
1052 dev->pci.addr.bus, dev->pci.addr.dev, dev->pci.addr.func);
1054 if (!(dev->header_type & PCI_HEADER_TYPE_BRIDGE) && dev->bus) {
1104 vmd_reset_root_ports(struct vmd_pci_bus *bus)
1114 * having the same secondary/subordinate bus configuration, which, of course, isn't correct.
1118 if (!vmd_bus_device_present(bus, devfn)) {
1122 header = (volatile void *)(bus->vmd->cfg_vaddr +
1123 CONFIG_OFFSET_ADDR(bus->config_bus_number, devfn, 0, 0));
1131 vmd_scan_pcibus(struct vmd_pci_bus *bus)
1137 vmd_reset_root_ports(bus);
1140 TAILQ_INSERT_TAIL(&bus->vmd->bus_list, bus, tailq);
1141 bus->vmd->next_bus_number = bus->bus_number + 1;
1142 dev_cnt = vmd_scan_single_bus(bus, NULL, false);
1148 bus->vmd->pci->addr.domain, bus->vmd->pci->addr.bus,
1149 bus->vmd->pci->addr.dev, bus->vmd->pci->addr.func);
1151 TAILQ_FOREACH(bus_entry, &bus->vmd->bus_list, tailq) {
1266 struct vmd_pci_bus *bus;
1271 TAILQ_FOREACH(bus, &g_vmd_container.vmd[i].bus_list, tailq) {
1272 if (bus->self) {
1273 if (spdk_pci_addr_compare(&bus->self->pci.addr, addr) == 0) {
1274 return bus->self;
1278 TAILQ_FOREACH(dev, &bus->dev_list, tailq) {
1298 cmd_reg |= 0x6; /* PCI bus master/memory enable. */
1307 vmd->domain = (pci_dev->addr.bus << 16) | (pci_dev->addr.dev << 8) | pci_dev->addr.func;
1331 struct vmd_pci_bus *bus;
1341 TAILQ_FOREACH(bus, &g_vmd_container.vmd[i].bus_list, tailq) {
1342 TAILQ_FOREACH(dev, &bus->dev_list, tailq) {
1357 vmd_clear_hotplug_status(struct vmd_pci_bus *bus)
1359 struct vmd_pci_device *device = bus->self;
1372 vmd_bus_handle_hotplug(struct vmd_pci_bus *bus)
1378 num_devices = vmd_scan_single_bus(bus, bus->self, true);
1403 vmd_bus_handle_hotremove(struct vmd_pci_bus *bus)
1407 TAILQ_FOREACH_SAFE(device, &bus->dev_list, tailq, tmpdev) {
1408 if (!vmd_bus_device_present(bus, device->devfn)) {
1417 struct vmd_pci_bus *bus;
1423 TAILQ_FOREACH(bus, &g_vmd_container.vmd[i].bus_list, tailq) {
1424 device = bus->self;
1434 SPDK_INFOLOG(vmd, "Device hotplug detected on bus "
1435 "%"PRIu32"\n", bus->bus_number);
1436 vmd_bus_handle_hotplug(bus);
1438 SPDK_INFOLOG(vmd, "Device hotremove detected on bus "
1439 "%"PRIu32"\n", bus->bus_number);
1440 vmd_bus_handle_hotremove(bus);
1443 vmd_clear_hotplug_status(bus);
1470 struct vmd_pci_bus *bus;
1475 TAILQ_FOREACH(bus, &g_vmd_container.vmd[i].bus_list, tailq) {
1476 rc += vmd_scan_single_bus(bus, bus->self, true);
1486 struct vmd_pci_bus *bus;
1503 TAILQ_FOREACH(bus, &vmd->bus_list, tailq) {
1504 if (bus->bus_number != addr->bus) {
1508 dev = vmd_alloc_dev(bus, addr->dev);