PCIE初始化流程

前言

简单梳理Linux-2-6.23内核,Freescale MPC8548平台初始化及扫描基本流程。 Linux-2-6.23内核,Freescale MPC8548平台PCIE扫描 1.创建控制器host

1
2
3
4
mpc85xx_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
3
pcibios_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
5
pci_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
10
pcibios_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

-------------The End-------------
🙈坚持原创技术分享,感谢支持🙈
0%