void pci_bridge_device::device_start() { pci_device::device_start(); for(auto & elem : sub_devices) elem = nullptr; for (device_t &d : bus_root()->subdevices()) { const char *t = d.tag(); int l = strlen(t); if(l <= 4 || t[l-5] != ':' || t[l-2] != '.') continue; int id = strtol(t+l-4, nullptr, 16); int fct = t[l-1] - '0'; sub_devices[(id << 3) | fct] = downcast<pci_device *>(&d); } mapper_cb cf_cb(&pci_bridge_device::regenerate_config_mapping, this); for(int i=0; i<32*8; i++) if(sub_devices[i]) { if((i & 7) && sub_devices[i & ~7]) sub_devices[i & ~7]->set_multifunction_device(true); all_devices.push_back(sub_devices[i]); if(sub_devices[i] != this) { sub_devices[i]->remap_config_cb = cf_cb; sub_devices[i]->set_remap_cb(remap_cb); pci_bridge_device *bridge = dynamic_cast<pci_bridge_device *>(sub_devices[i]); if(bridge) all_bridges.push_back(bridge); } } }
void pci_bridge_device::device_start() { pci_device::device_start(); for(int i=0; i<32*8; i++) sub_devices[i] = NULL; for(device_t *d = bus_root()->first_subdevice(); d != NULL; d = d->next()) { const char *t = d->tag(); int l = strlen(t); if(l <= 4 || t[l-5] != ':' || t[l-2] != '.') continue; int id = strtol(t+l-4, 0, 16); int fct = t[l-1] - '0'; sub_devices[(id << 3) | fct] = downcast<pci_device *>(d); } mapper_cb cf_cb(FUNC(pci_bridge_device::regenerate_config_mapping), this); for(int i=0; i<32*8; i++) if(sub_devices[i]) { if((i & 7) && sub_devices[i & ~7]) sub_devices[i & ~7]->set_multifunction_device(true); all_devices.push_back(sub_devices[i]); if(sub_devices[i] != this) { sub_devices[i]->remap_config_cb = cf_cb; sub_devices[i]->set_remap_cb(remap_cb); pci_bridge_device *bridge = dynamic_cast<pci_bridge_device *>(sub_devices[i]); if(bridge) all_bridges.push_back(bridge); } } }