Lines Matching +full:mem +full:- +full:io

1 // SPDX-License-Identifier: GPL-2.0+
7 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
40 if (cur_func->irq[j] == 0xff) { in assign_alt_irq()
43 cur_func->irq[j] = SCSI_IRQ; in assign_alt_irq()
46 cur_func->irq[j] = LAN_IRQ; in assign_alt_irq()
49 cur_func->irq[j] = OTHER_IRQ; in assign_alt_irq()
59 * multi-functional
81 debug("inside configure_card, func->busno = %x\n", func->busno); in ibmphp_configure_card()
83 device = func->device; in ibmphp_configure_card()
87 * func->busno is correct, and func->device contains only device (at the 5 in ibmphp_configure_card()
94 ibmphp_pci_bus->number = cur_func->busno; in ibmphp_configure_card()
96 cur_func->function = function; in ibmphp_configure_card()
98 debug("inside the loop, cur_func->busno = %x, cur_func->device = %x, cur_func->function = %x\n", in ibmphp_configure_card()
99 cur_func->busno, cur_func->device, cur_func->function); in ibmphp_configure_card()
112 * |_=> 0 = single function device, 1 = multi-function device in ibmphp_configure_card()
123 "Please choose another device.\n", cur_func->device); in ibmphp_configure_card()
124 return -ENODEV; in ibmphp_configure_card()
127 cur_func->device); in ibmphp_configure_card()
128 return -ENODEV; in ibmphp_configure_card()
138 cur_func->device, cur_func->busno); in ibmphp_configure_card()
142 cur_func->next = NULL; in ibmphp_configure_card()
151 cur_func->device, cur_func->busno); in ibmphp_configure_card()
157 return -ENOMEM; in ibmphp_configure_card()
159 newfunc->busno = cur_func->busno; in ibmphp_configure_card()
160 newfunc->device = device; in ibmphp_configure_card()
161 cur_func->next = newfunc; in ibmphp_configure_card()
164 newfunc->irq[j] = cur_func->irq[j]; in ibmphp_configure_card()
169 …err("This %x is not PCI-to-PCI bridge, and as is not supported for hot-plugging. Please insert an… in ibmphp_configure_card()
170 cur_func->device); in ibmphp_configure_card()
171 return -ENODEV; in ibmphp_configure_card()
175 if (rc == -ENODEV) { in ibmphp_configure_card()
177 err("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device); in ibmphp_configure_card()
182 err("was not able to hot-add PPB properly.\n"); in ibmphp_configure_card()
183 func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */ in ibmphp_configure_card()
191 if (func->devices[i]) { in ibmphp_configure_card()
194 return -ENOMEM; in ibmphp_configure_card()
196 newfunc->busno = sec_number; in ibmphp_configure_card()
197 newfunc->device = (u8) i; in ibmphp_configure_card()
199 newfunc->irq[j] = cur_func->irq[j]; in ibmphp_configure_card()
202 for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next) ; in ibmphp_configure_card()
203 prev_func->next = newfunc; in ibmphp_configure_card()
205 cur_func->next = newfunc; in ibmphp_configure_card()
211 func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */ in ibmphp_configure_card()
221 return -ENOMEM; in ibmphp_configure_card()
223 newfunc->busno = cur_func->busno; in ibmphp_configure_card()
224 newfunc->device = device; in ibmphp_configure_card()
226 newfunc->irq[j] = cur_func->irq[j]; in ibmphp_configure_card()
227 for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next); in ibmphp_configure_card()
228 prev_func->next = newfunc; in ibmphp_configure_card()
235 …err("This %x is not PCI-to-PCI bridge, and as is not supported for hot-plugging. Please insert an… in ibmphp_configure_card()
236 cur_func->device); in ibmphp_configure_card()
237 return -ENODEV; in ibmphp_configure_card()
242 debug("cur_func->busno b4 configure_bridge is %x\n", cur_func->busno); in ibmphp_configure_card()
244 if (rc == -ENODEV) { in ibmphp_configure_card()
246 err("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device); in ibmphp_configure_card()
251 func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */ in ibmphp_configure_card()
252 err("was not able to hot-add PPB properly.\n"); in ibmphp_configure_card()
256 debug("cur_func->busno = %x, device = %x, function = %x\n", in ibmphp_configure_card()
257 cur_func->busno, device, function); in ibmphp_configure_card()
262 if (func->devices[i]) { in ibmphp_configure_card()
266 return -ENOMEM; in ibmphp_configure_card()
268 newfunc->busno = sec_number; in ibmphp_configure_card()
269 newfunc->device = (u8) i; in ibmphp_configure_card()
271 newfunc->irq[j] = cur_func->irq[j]; in ibmphp_configure_card()
274 for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next); in ibmphp_configure_card()
275 prev_func->next = newfunc; in ibmphp_configure_card()
277 cur_func->next = newfunc; in ibmphp_configure_card()
284 func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */ in ibmphp_configure_card()
296 return -ENXIO; in ibmphp_configure_card()
303 return -ENODEV; in ibmphp_configure_card()
310 if (cur_func->io[i]) { in ibmphp_configure_card()
311 ibmphp_remove_resource(cur_func->io[i]); in ibmphp_configure_card()
312 cur_func->io[i] = NULL; in ibmphp_configure_card()
313 } else if (cur_func->pfmem[i]) { in ibmphp_configure_card()
314 ibmphp_remove_resource(cur_func->pfmem[i]); in ibmphp_configure_card()
315 cur_func->pfmem[i] = NULL; in ibmphp_configure_card()
316 } else if (cur_func->mem[i]) { in ibmphp_configure_card()
317 ibmphp_remove_resource(cur_func->mem[i]); in ibmphp_configure_card()
318 cur_func->mem[i] = NULL; in ibmphp_configure_card()
344 struct resource_node *io[6]; in configure_device() local
345 struct resource_node *mem[6]; in configure_device() local
350 debug("%s - inside\n", __func__); in configure_device()
352 devfn = PCI_DEVFN(func->device, func->function); in configure_device()
353 ibmphp_pci_bus->number = func->busno; in configure_device()
361 pcibios_read_config_byte(cur_func->busno, cur_func->device, in configure_device()
363 if (tmp & 0x01) // IO in configure_device()
364 pcibios_write_config_dword(cur_func->busno, cur_func->device, in configure_device()
367 pcibios_write_config_dword(cur_func->busno, cur_func->device, in configure_device()
376 debug("Device %x BAR %d wants %x\n", func->device, count, bar[count]); in configure_device()
379 /* This is IO */ in configure_device()
380 debug("inside IO SPACE\n"); in configure_device()
385 debug("len[count] in IO %x, count %d\n", len[count], count); in configure_device()
387 io[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); in configure_device()
389 if (!io[count]) in configure_device()
390 return -ENOMEM; in configure_device()
392 io[count]->type = IO; in configure_device()
393 io[count]->busno = func->busno; in configure_device()
394 io[count]->devfunc = PCI_DEVFN(func->device, func->function); in configure_device()
395 io[count]->len = len[count]; in configure_device()
396 if (ibmphp_check_resource(io[count], 0) == 0) { in configure_device()
397 ibmphp_add_resource(io[count]); in configure_device()
398 func->io[count] = io[count]; in configure_device()
400 err("cannot allocate requested io for bus %x device %x function %x len %x\n", in configure_device()
401 func->busno, func->device, func->function, len[count]); in configure_device()
402 kfree(io[count]); in configure_device()
403 return -EIO; in configure_device()
405 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->io[count]->start); in configure_device()
408 debug("b4 writing, the IO address is %x\n", func->io[count]->start); in configure_device()
426 return -ENOMEM; in configure_device()
428 pfmem[count]->type = PFMEM; in configure_device()
429 pfmem[count]->busno = func->busno; in configure_device()
430 pfmem[count]->devfunc = PCI_DEVFN(func->device, in configure_device()
431 func->function); in configure_device()
432 pfmem[count]->len = len[count]; in configure_device()
433 pfmem[count]->fromMem = 0; in configure_device()
436 func->pfmem[count] = pfmem[count]; in configure_device()
441 return -ENOMEM; in configure_device()
443 mem_tmp->type = MEM; in configure_device()
444 mem_tmp->busno = pfmem[count]->busno; in configure_device()
445 mem_tmp->devfunc = pfmem[count]->devfunc; in configure_device()
446 mem_tmp->len = pfmem[count]->len; in configure_device()
447 debug("there's no pfmem... going into mem.\n"); in configure_device()
450 pfmem[count]->fromMem = 1; in configure_device()
451 pfmem[count]->rangeno = mem_tmp->rangeno; in configure_device()
452 pfmem[count]->start = mem_tmp->start; in configure_device()
453 pfmem[count]->end = mem_tmp->end; in configure_device()
455 func->pfmem[count] = pfmem[count]; in configure_device()
458 func->busno, func->device, len[count]); in configure_device()
461 return -EIO; in configure_device()
465 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->pfmem[count]->start); in configure_device()
468 debug("b4 writing, start address is %x\n", func->pfmem[count]->start); in configure_device()
474 debug("inside the mem 64 case, count %d\n", count); in configure_device()
481 debug("REGULAR MEM SPACE\n"); in configure_device()
486 debug("len[count] in Mem %x, count %d\n", len[count], count); in configure_device()
488 mem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL); in configure_device()
489 if (!mem[count]) in configure_device()
490 return -ENOMEM; in configure_device()
492 mem[count]->type = MEM; in configure_device()
493 mem[count]->busno = func->busno; in configure_device()
494 mem[count]->devfunc = PCI_DEVFN(func->device, in configure_device()
495 func->function); in configure_device()
496 mem[count]->len = len[count]; in configure_device()
497 if (ibmphp_check_resource(mem[count], 0) == 0) { in configure_device()
498 ibmphp_add_resource(mem[count]); in configure_device()
499 func->mem[count] = mem[count]; in configure_device()
501 err("cannot allocate requested mem for bus %x, device %x, len %x\n", in configure_device()
502 func->busno, func->device, len[count]); in configure_device()
503 kfree(mem[count]); in configure_device()
504 return -EIO; in configure_device()
506 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->mem[count]->start); in configure_device()
508 debug("b4 writing, start address is %x\n", func->mem[count]->start); in configure_device()
515 debug("inside mem 64 case, reg. mem, count %d\n", count); in configure_device()
521 } /* end of mem */ in configure_device()
524 func->bus = 0; /* To indicate that this is not a PPB */ in configure_device()
527 pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_LINE, func->irq[irq - 1]); in configure_device()
539 * This routine configures a PCI-2-PCI bridge and the functions behind it
559 struct resource_node *io = NULL; in configure_bridge() local
561 struct resource_node *mem = NULL; in configure_bridge() local
577 debug("%s - enter\n", __func__); in configure_bridge()
579 devfn = PCI_DEVFN(func->function, func->device); in configure_bridge()
580 ibmphp_pci_bus->number = func->busno; in configure_bridge()
586 pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_PRIMARY_BUS, func->busno); in configure_bridge()
594 sec_number = find_sec_number(func->busno, slotno); in configure_bridge()
597 return -EINVAL; in configure_bridge()
601 debug("AFTER FIND_SEC_NUMBER, func->busno IS %x\n", func->busno); in configure_bridge()
621 debug("func->busno is %x\n", func->busno); in configure_bridge()
626 !!!!!!!!!!!!!!!NEED TO ADD!!! FAST BACK-TO-BACK ENABLE!!!!!!!!!!!!!!!!!!!! in configure_bridge()
630 /* First we need to allocate mem/io for the bridge itself in case it needs it */ in configure_bridge()
645 /* This is IO */ in configure_bridge()
649 debug("len[count] in IO = %x\n", len[count]); in configure_bridge()
654 retval = -ENOMEM; in configure_bridge()
657 bus_io[count]->type = IO; in configure_bridge()
658 bus_io[count]->busno = func->busno; in configure_bridge()
659 bus_io[count]->devfunc = PCI_DEVFN(func->device, in configure_bridge()
660 func->function); in configure_bridge()
661 bus_io[count]->len = len[count]; in configure_bridge()
664 func->io[count] = bus_io[count]; in configure_bridge()
666 err("cannot allocate requested io for bus %x, device %x, len %x\n", in configure_bridge()
667 func->busno, func->device, len[count]); in configure_bridge()
669 return -EIO; in configure_bridge()
672 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->io[count]->start); in configure_bridge()
685 retval = -ENOMEM; in configure_bridge()
688 bus_pfmem[count]->type = PFMEM; in configure_bridge()
689 bus_pfmem[count]->busno = func->busno; in configure_bridge()
690 bus_pfmem[count]->devfunc = PCI_DEVFN(func->device, in configure_bridge()
691 func->function); in configure_bridge()
692 bus_pfmem[count]->len = len[count]; in configure_bridge()
693 bus_pfmem[count]->fromMem = 0; in configure_bridge()
696 func->pfmem[count] = bus_pfmem[count]; in configure_bridge()
700 retval = -ENOMEM; in configure_bridge()
703 mem_tmp->type = MEM; in configure_bridge()
704 mem_tmp->busno = bus_pfmem[count]->busno; in configure_bridge()
705 mem_tmp->devfunc = bus_pfmem[count]->devfunc; in configure_bridge()
706 mem_tmp->len = bus_pfmem[count]->len; in configure_bridge()
709 bus_pfmem[count]->fromMem = 1; in configure_bridge()
710 bus_pfmem[count]->rangeno = mem_tmp->rangeno; in configure_bridge()
712 func->pfmem[count] = bus_pfmem[count]; in configure_bridge()
715 func->busno, func->device, len[count]); in configure_bridge()
718 return -EIO; in configure_bridge()
722 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->pfmem[count]->start); in configure_bridge()
740 retval = -ENOMEM; in configure_bridge()
743 bus_mem[count]->type = MEM; in configure_bridge()
744 bus_mem[count]->busno = func->busno; in configure_bridge()
745 bus_mem[count]->devfunc = PCI_DEVFN(func->device, in configure_bridge()
746 func->function); in configure_bridge()
747 bus_mem[count]->len = len[count]; in configure_bridge()
750 func->mem[count] = bus_mem[count]; in configure_bridge()
752 err("cannot allocate requested mem for bus %x, device %x, len %x\n", in configure_bridge()
753 func->busno, func->device, len[count]); in configure_bridge()
755 return -EIO; in configure_bridge()
758 pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->mem[count]->start); in configure_bridge()
768 } /* end of mem */ in configure_bridge()
774 return -ENOMEM; in configure_bridge()
776 ibmphp_pci_bus->number = func->busno; in configure_bridge()
778 debug("amount_needed->not_correct = %x\n", amount_needed->not_correct); in configure_bridge()
779 debug("amount_needed->io = %x\n", amount_needed->io); in configure_bridge()
780 debug("amount_needed->mem = %x\n", amount_needed->mem); in configure_bridge()
781 debug("amount_needed->pfmem = %x\n", amount_needed->pfmem); in configure_bridge()
783 if (amount_needed->not_correct) { in configure_bridge()
789 func->io[count] = NULL; in configure_bridge()
792 func->pfmem[count] = NULL; in configure_bridge()
795 func->mem[count] = NULL; in configure_bridge()
799 return -ENODEV; in configure_bridge()
802 if (!amount_needed->io) { in configure_bridge()
803 debug("it doesn't want IO?\n"); in configure_bridge()
806 debug("it wants %x IO behind the bridge\n", amount_needed->io); in configure_bridge()
807 io = kzalloc(sizeof(*io), GFP_KERNEL); in configure_bridge()
809 if (!io) { in configure_bridge()
810 retval = -ENOMEM; in configure_bridge()
813 io->type = IO; in configure_bridge()
814 io->busno = func->busno; in configure_bridge()
815 io->devfunc = PCI_DEVFN(func->device, func->function); in configure_bridge()
816 io->len = amount_needed->io; in configure_bridge()
817 if (ibmphp_check_resource(io, 1) == 0) { in configure_bridge()
818 debug("were we able to add io\n"); in configure_bridge()
819 ibmphp_add_resource(io); in configure_bridge()
824 if (!amount_needed->mem) { in configure_bridge()
828 debug("it wants %x memory behind the bridge\n", amount_needed->mem); in configure_bridge()
829 mem = kzalloc(sizeof(*mem), GFP_KERNEL); in configure_bridge()
830 if (!mem) { in configure_bridge()
831 retval = -ENOMEM; in configure_bridge()
834 mem->type = MEM; in configure_bridge()
835 mem->busno = func->busno; in configure_bridge()
836 mem->devfunc = PCI_DEVFN(func->device, func->function); in configure_bridge()
837 mem->len = amount_needed->mem; in configure_bridge()
838 if (ibmphp_check_resource(mem, 1) == 0) { in configure_bridge()
839 ibmphp_add_resource(mem); in configure_bridge()
841 debug("were we able to add mem\n"); in configure_bridge()
845 if (!amount_needed->pfmem) { in configure_bridge()
846 debug("it doesn't want n.e.pfmem mem?\n"); in configure_bridge()
849 debug("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem); in configure_bridge()
852 retval = -ENOMEM; in configure_bridge()
855 pfmem->type = PFMEM; in configure_bridge()
856 pfmem->busno = func->busno; in configure_bridge()
857 pfmem->devfunc = PCI_DEVFN(func->device, func->function); in configure_bridge()
858 pfmem->len = amount_needed->pfmem; in configure_bridge()
859 pfmem->fromMem = 0; in configure_bridge()
866 retval = -ENOMEM; in configure_bridge()
869 mem_tmp->type = MEM; in configure_bridge()
870 mem_tmp->busno = pfmem->busno; in configure_bridge()
871 mem_tmp->devfunc = pfmem->devfunc; in configure_bridge()
872 mem_tmp->len = pfmem->len; in configure_bridge()
875 pfmem->fromMem = 1; in configure_bridge()
876 pfmem->rangeno = mem_tmp->rangeno; in configure_bridge()
896 retval = -ENOMEM; in configure_bridge()
899 bus->busno = sec_number; in configure_bridge()
901 rc = add_new_bus(bus, io, mem, pfmem, func->busno); in configure_bridge()
902 } else if (!(bus->rangeIO) && !(bus->rangeMem) && !(bus->rangePFMem)) in configure_bridge()
903 rc = add_new_bus(bus, io, mem, pfmem, 0xFF); in configure_bridge()
906 retval = -EIO; in configure_bridge()
910 if (rc == -ENOMEM) { in configure_bridge()
911 ibmphp_remove_bus(bus, func->busno); in configure_bridge()
922 debug("io 32\n"); in configure_bridge()
930 if (bus->noIORanges) { in configure_bridge()
931 pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_BASE, 0x00 | bus->rangeIO->start >> 8); in configure_bridge()
932 pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_LIMIT, 0x00 | bus->rangeIO->end >> 8); in configure_bridge()
950 if (bus->noMemRanges) { in configure_bridge()
951 …pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_BASE, 0x0000 | bus->rangeMem->start >>… in configure_bridge()
952 …pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_LIMIT, 0x0000 | bus->rangeMem->end >> … in configure_bridge()
965 if (bus->noPFMemRanges) { in configure_bridge()
966 …pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_BASE, 0x0000 | bus->rangePFMem->s… in configure_bridge()
967 …ite_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, 0x0000 | bus->rangePFMem->end >> 16); in configure_bridge()
989 pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_LINE, func->irq[irq - 1]); in configure_bridge()
999 if (amount_needed->devices[i]) { in configure_bridge()
1001 func->devices[i] = 1; in configure_bridge()
1004 func->bus = 1; /* For unconfiguring, to indicate it's PPB */ in configure_bridge()
1006 debug("func->busno b4 returning is %x\n", func->busno); in configure_bridge()
1007 debug("func->busno b4 returning in the other structure is %x\n", (*func_passed)->busno); in configure_bridge()
1013 retval = -EIO; in configure_bridge()
1021 if (io) in configure_bridge()
1022 ibmphp_remove_resource(io); in configure_bridge()
1023 if (mem) in configure_bridge()
1024 ibmphp_remove_resource(mem); in configure_bridge()
1028 func->io[i] = NULL; in configure_bridge()
1031 func->pfmem[i] = NULL; in configure_bridge()
1034 func->mem[i] = NULL; in configure_bridge()
1071 ibmphp_pci_bus->number = busno; in scan_behind_bridge()
1076 amount->devices[device] = 0; in scan_behind_bridge()
1091 err("embedded bridges not supported for hot-plugging.\n"); in scan_behind_bridge()
1092 amount->not_correct = 1; in scan_behind_bridge()
1099 amount->not_correct = 1; in scan_behind_bridge()
1103 amount->not_correct = 1; in scan_behind_bridge()
1107 amount->devices[device] = 1; in scan_behind_bridge()
1113 if (tmp & 0x01) // IO in scan_behind_bridge()
1131 /* This is IO */ in scan_behind_bridge()
1134 amount->io += len[count]; in scan_behind_bridge()
1141 amount->pfmem += len[count]; in scan_behind_bridge()
1150 amount->mem += len[count]; in scan_behind_bridge()
1163 amount->not_correct = 1; in scan_behind_bridge()
1165 amount->not_correct = 0; in scan_behind_bridge()
1166 if ((amount->io) && (amount->io < IOBRIDGE)) in scan_behind_bridge()
1167 amount->io = IOBRIDGE; in scan_behind_bridge()
1168 if ((amount->mem) && (amount->mem < MEMBRIDGE)) in scan_behind_bridge()
1169 amount->mem = MEMBRIDGE; in scan_behind_bridge()
1170 if ((amount->pfmem) && (amount->pfmem < MEMBRIDGE)) in scan_behind_bridge()
1171 amount->pfmem = MEMBRIDGE; in scan_behind_bridge()
1178 * our resource lists. The functions return either 0, -ENODEV, or -1 (general failure)
1195 struct resource_node *io; in unconfigure_boot_device() local
1196 struct resource_node *mem; in unconfigure_boot_device() local
1205 debug("%s - enter\n", __func__); in unconfigure_boot_device()
1210 return -EINVAL; in unconfigure_boot_device()
1214 ibmphp_pci_bus->number = busno; in unconfigure_boot_device()
1233 /* This is IO */ in unconfigure_boot_device()
1237 end_address = start_address + size - 1; in unconfigure_boot_device()
1238 if (ibmphp_find_resource(bus, start_address, &io, IO)) in unconfigure_boot_device()
1241 debug("io->start = %x\n", io->start); in unconfigure_boot_device()
1242 temp_end = io->end; in unconfigure_boot_device()
1243 start_address = io->end + 1; in unconfigure_boot_device()
1244 ibmphp_remove_resource(io); in unconfigure_boot_device()
1248 &io, IO)) in unconfigure_boot_device()
1251 debug("io->start = %x\n", io->start); in unconfigure_boot_device()
1252 temp_end = io->end; in unconfigure_boot_device()
1253 start_address = io->end + 1; in unconfigure_boot_device()
1254 ibmphp_remove_resource(io); in unconfigure_boot_device()
1267 return -EIO; in unconfigure_boot_device()
1270 debug("pfmem->start = %x\n", pfmem->start); in unconfigure_boot_device()
1276 debug("start address of mem is %x\n", start_address); in unconfigure_boot_device()
1279 if (ibmphp_find_resource(bus, start_address, &mem, MEM) < 0) { in unconfigure_boot_device()
1280 err("cannot find corresponding MEM resource to remove\n"); in unconfigure_boot_device()
1281 return -EIO; in unconfigure_boot_device()
1283 if (mem) { in unconfigure_boot_device()
1284 debug("mem->start = %x\n", mem->start); in unconfigure_boot_device()
1286 ibmphp_remove_resource(mem); in unconfigure_boot_device()
1293 } /* end of mem */ in unconfigure_boot_device()
1299 err("cannot find corresponding IO resource to remove\n"); in unconfigure_boot_device()
1300 return -EIO; in unconfigure_boot_device()
1309 struct resource_node *io = NULL; in unconfigure_boot_bridge() local
1310 struct resource_node *mem = NULL; in unconfigure_boot_bridge() local
1321 ibmphp_pci_bus->number = busno; in unconfigure_boot_bridge()
1325 debug("%s - busno = %x, primary_number = %x\n", __func__, busno, pri_number); in unconfigure_boot_bridge()
1333 return -EINVAL; in unconfigure_boot_bridge()
1341 return -ENODEV; in unconfigure_boot_bridge()
1347 return -EINVAL; in unconfigure_boot_bridge()
1349 debug("bus->busno is %x\n", bus->busno); in unconfigure_boot_bridge()
1366 /* This is IO */ in unconfigure_boot_bridge()
1368 if (ibmphp_find_resource(bus, start_address, &io, IO) < 0) { in unconfigure_boot_bridge()
1369 err("cannot find corresponding IO resource to remove\n"); in unconfigure_boot_bridge()
1370 return -EIO; in unconfigure_boot_bridge()
1372 if (io) in unconfigure_boot_bridge()
1373 debug("io->start = %x\n", io->start); in unconfigure_boot_bridge()
1375 ibmphp_remove_resource(io); in unconfigure_boot_bridge()
1385 return -EINVAL; in unconfigure_boot_bridge()
1388 debug("pfmem->start = %x\n", pfmem->start); in unconfigure_boot_bridge()
1395 if (ibmphp_find_resource(bus, start_address, &mem, MEM) < 0) { in unconfigure_boot_bridge()
1396 err("cannot find corresponding MEM resource to remove\n"); in unconfigure_boot_bridge()
1397 return -EINVAL; in unconfigure_boot_bridge()
1399 if (mem) { in unconfigure_boot_bridge()
1400 debug("mem->start = %x\n", mem->start); in unconfigure_boot_bridge()
1402 ibmphp_remove_resource(mem); in unconfigure_boot_bridge()
1409 } /* end of mem */ in unconfigure_boot_bridge()
1411 debug("%s - exiting, returning success\n", __func__); in unconfigure_boot_bridge()
1427 debug("%s - enter\n", __func__); in unconfigure_boot_card()
1429 device = slot_cur->device; in unconfigure_boot_card()
1430 busno = slot_cur->bus; in unconfigure_boot_card()
1436 ibmphp_pci_bus->number = busno; in unconfigure_boot_card()
1444 debug("%s - found correct device\n", __func__); in unconfigure_boot_card()
1448 * |_=> 0 = single function device, 1 = multi-function device in unconfigure_boot_card()
1458 return -ENODEV; in unconfigure_boot_card()
1461 return -ENODEV; in unconfigure_boot_card()
1485 …err("This device %x function %x is not PCI-to-PCI bridge, and is not supported for hot-removing. … in unconfigure_boot_card()
1486 return -ENODEV; in unconfigure_boot_card()
1490 err("was not able to hot-remove PPB properly.\n"); in unconfigure_boot_card()
1499 …err("This device %x function %x is not PCI-to-PCI bridge, and is not supported for hot-removing. … in unconfigure_boot_card()
1500 return -ENODEV; in unconfigure_boot_card()
1504 err("was not able to hot-remove PPB properly.\n"); in unconfigure_boot_card()
1510 return -1; in unconfigure_boot_card()
1517 return -1; in unconfigure_boot_card()
1529 * Returns: 0, -1, -ENODEV
1540 debug("%s - enter\n", __func__); in ibmphp_unconfigure_card()
1545 if ((rc == -ENODEV) || (rc == -EIO) || (rc == -EINVAL)) { in ibmphp_unconfigure_card()
1551 if (sl->func) { in ibmphp_unconfigure_card()
1552 cur_func = sl->func; in ibmphp_unconfigure_card()
1555 if (cur_func->bus) { in ibmphp_unconfigure_card()
1563 if (cur_func->io[i]) { in ibmphp_unconfigure_card()
1564 debug("io[%d] exists\n", i); in ibmphp_unconfigure_card()
1566 ibmphp_remove_resource(cur_func->io[i]); in ibmphp_unconfigure_card()
1567 cur_func->io[i] = NULL; in ibmphp_unconfigure_card()
1569 if (cur_func->mem[i]) { in ibmphp_unconfigure_card()
1570 debug("mem[%d] exists\n", i); in ibmphp_unconfigure_card()
1572 ibmphp_remove_resource(cur_func->mem[i]); in ibmphp_unconfigure_card()
1573 cur_func->mem[i] = NULL; in ibmphp_unconfigure_card()
1575 if (cur_func->pfmem[i]) { in ibmphp_unconfigure_card()
1578 ibmphp_remove_resource(cur_func->pfmem[i]); in ibmphp_unconfigure_card()
1579 cur_func->pfmem[i] = NULL; in ibmphp_unconfigure_card()
1583 temp_func = cur_func->next; in ibmphp_unconfigure_card()
1589 sl->func = NULL; in ibmphp_unconfigure_card()
1591 debug("%s - exit\n", __func__); in ibmphp_unconfigure_card()
1596 * add a new bus resulting from hot-plugging a PPB bridge with devices
1601 * 0, -1, error
1603 static int add_new_bus(struct bus_node *bus, struct resource_node *io, struct resource_node *mem, s… in add_new_bus() argument
1615 return -ENODEV; in add_new_bus()
1618 list_add(&bus->bus_list, &cur_bus->bus_list); in add_new_bus()
1620 if (io) { in add_new_bus()
1623 return -ENOMEM; in add_new_bus()
1625 io_range->start = io->start; in add_new_bus()
1626 io_range->end = io->end; in add_new_bus()
1627 io_range->rangeno = 1; in add_new_bus()
1628 bus->noIORanges = 1; in add_new_bus()
1629 bus->rangeIO = io_range; in add_new_bus()
1631 if (mem) { in add_new_bus()
1634 return -ENOMEM; in add_new_bus()
1636 mem_range->start = mem->start; in add_new_bus()
1637 mem_range->end = mem->end; in add_new_bus()
1638 mem_range->rangeno = 1; in add_new_bus()
1639 bus->noMemRanges = 1; in add_new_bus()
1640 bus->rangeMem = mem_range; in add_new_bus()
1645 return -ENOMEM; in add_new_bus()
1647 pfmem_range->start = pfmem->start; in add_new_bus()
1648 pfmem_range->end = pfmem->end; in add_new_bus()
1649 pfmem_range->rangeno = 1; in add_new_bus()
1650 bus->noPFMemRanges = 1; in add_new_bus()
1651 bus->rangePFMem = pfmem_range; in add_new_bus()
1673 max = bus->slot_max; in find_sec_number()
1674 min = bus->slot_min; in find_sec_number()
1679 busno = (u8) (slotno - (u8) min); in find_sec_number()
1686 if ((!bus_cur) || (!(bus_cur->rangeIO) && !(bus_cur->rangeMem) && !(bus_cur->rangePFMem))) in find_sec_number()