drivers/pci/hotplug/ibmphp_pci.c
Source file repositories/reference/linux-study-clean/drivers/pci/hotplug/ibmphp_pci.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pci/hotplug/ibmphp_pci.c- Extension
.c- Size
- 55284 bytes
- Lines
- 1690
- Domain
- Representative Device Path
- Bucket
- PCIe NVMe Storage Path
- Inferred role
- Representative Device Path: implementation source
- Status
- source implementation candidate
Why This File Exists
Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/slab.hlinux/pci.hlinux/list.hibmphp.h
Detected Declarations
function assign_alt_irqfunction addedfunction configure_devicefunction configure_bridgefunction unconfigure_boot_devicefunction unconfigure_boot_bridgefunction unconfigure_boot_cardfunction cardfunction add_new_busfunction find_sec_number
Annotated Snippet
if (cur_func->irq[j] == 0xff) {
switch (class_code) {
case PCI_BASE_CLASS_STORAGE:
cur_func->irq[j] = SCSI_IRQ;
break;
case PCI_BASE_CLASS_NETWORK:
cur_func->irq[j] = LAN_IRQ;
break;
default:
cur_func->irq[j] = OTHER_IRQ;
break;
}
}
}
}
/*
* Configures the device to be added (will allocate needed resources if it
* can), the device can be a bridge or a regular pci device, can also be
* multi-functional
*
* Input: function to be added
*
* TO DO: The error case with Multifunction device or multi function bridge,
* if there is an error, will need to go through all previous functions and
* unconfigure....or can add some code into unconfigure_card....
*/
int ibmphp_configure_card(struct pci_func *func, u8 slotno)
{
u16 vendor_id;
u32 class;
u8 class_code;
u8 hdr_type, device, sec_number;
u8 function;
struct pci_func *newfunc; /* for multi devices */
struct pci_func *cur_func, *prev_func;
int rc, i, j;
int cleanup_count;
u8 flag;
u8 valid_device = 0x00; /* to see if we are able to read from card any device info at all */
debug("inside configure_card, func->busno = %x\n", func->busno);
device = func->device;
cur_func = func;
/* We only get bus and device from IRQ routing table. So at this point,
* func->busno is correct, and func->device contains only device (at the 5
* highest bits)
*/
/* For every function on the card */
for (function = 0x00; function < 0x08; function++) {
unsigned int devfn = PCI_DEVFN(device, function);
ibmphp_pci_bus->number = cur_func->busno;
cur_func->function = function;
debug("inside the loop, cur_func->busno = %x, cur_func->device = %x, cur_func->function = %x\n",
cur_func->busno, cur_func->device, cur_func->function);
pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_VENDOR_ID, &vendor_id);
debug("vendor_id is %x\n", vendor_id);
if (vendor_id != PCI_VENDOR_ID_NOTVALID) {
/* found correct device!!! */
debug("found valid device, vendor_id = %x\n", vendor_id);
++valid_device;
/* header: x x x x x x x x
* | |___________|=> 1=PPB bridge, 0=normal device, 2=CardBus Bridge
* |_=> 0 = single function device, 1 = multi-function device
*/
pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_HEADER_TYPE, &hdr_type);
pci_bus_read_config_dword(ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
class_code = class >> 24;
debug("hrd_type = %x, class = %x, class_code %x\n", hdr_type, class, class_code);
class >>= 8; /* to take revision out, class = class.subclass.prog i/f */
if (class == PCI_CLASS_NOT_DEFINED_VGA) {
err("The device %x is VGA compatible and as is not supported for hot plugging. "
"Please choose another device.\n", cur_func->device);
return -ENODEV;
} else if (class == PCI_CLASS_DISPLAY_VGA) {
err("The device %x is not supported for hot plugging. Please choose another device.\n",
cur_func->device);
return -ENODEV;
}
Annotation
- Immediate include surface: `linux/module.h`, `linux/slab.h`, `linux/pci.h`, `linux/list.h`, `ibmphp.h`.
- Detected declarations: `function assign_alt_irq`, `function added`, `function configure_device`, `function configure_bridge`, `function unconfigure_boot_device`, `function unconfigure_boot_bridge`, `function unconfigure_boot_card`, `function card`, `function add_new_bus`, `function find_sec_number`.
- Atlas domain: Representative Device Path / PCIe NVMe Storage Path.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.