前言
简单梳理Linux-2-6.23内核,Freescale MPC8548平台初始化及扫描基本流程。 Linux-2-6.23内核,Freescale MPC8548平台PCIE扫描 1.创建控制器host 1
2
3
4mpc85xx_cds_setup_arch -- Mpc85xx_cds.c (arch\powerpc\platforms\85xx)
fsl_add_bridge -- Fsl_pci.c (arch\powerpc\sysdev)
pcibios_alloc_controller -- Pci-common.c (arch\powerpc\kernel)
pci_setup_pci_controller -- Pci-common.c (arch\powerpc\kernel)
2.创建总线bus 1
2
3pcibios_init -- Pci_32.c (arch\powerpc\kernel)
pci_scan_bus_parented -- Probe.c (drivers\pci)
pci_create_bus -- Probe.c (drivers\pci)
3.深度扫描设备节点 1
2
3
4
5pci_scan_child_bus -- Probe.c (drivers\pci)
pci_scan_slot -- Probe.c (drivers\pci)
pci_scan_single_device -- Probe.c (drivers\pci)
pci_scan_device -- Probe.c (drivers\pci)
alloc_pci_dev -- Probe.c (drivers\pci) -> 创建pcie设备节点
4.扫描结束创建irq映射关系 1
2
3
4
5
6
7
8
9
10pcibios_fixup_bus -- Pci_32.c (arch\powerpc\kernel)
pci_read_irq_line -- Pci-common.c (arch\powerpc\kernel) 12528 2015-12-21
of_irq_map_pci -- Pci-common.c (arch\powerpc\kernel) -> 从设备树获取irq信息
pci_device_to_OF_node -- Pci_32.c (arch\powerpc\kernel)
pci_busdev_to_OF_node -- Pci_32.c (arch\powerpc\kernel)
irq_create_of_mapping -- Irq.c (arch\powerpc\kernel) -> 创建虚拟irq 即 virq
/* If host has no translation, then we assume interrupt line */
if (host->ops->xlate == NULL)
hwirq = intspec[0];
virq = irq_create_mapping(host, hwirq)
至此将硬件irq和虚拟irq关联 设备在创建驱动时,注册对应该设备的virq