PCIe MSI-X 中断 设置 过程

2023-05-16

主机侧初始化

msi-map = <0x0 &its 0x0 0x1000>;

设备侧获取软件中断号

设备驱动调用如下函数获取软件中断号.因为是pci设备,所以不能从设备树中获取硬件中断号.
pci_enable_msix_range// range 指的是 其中的参数 minvec 到 maxvec
	申请软件中断号,申请好了,会填充entry 参数的 vector 成员 为软件中断号

驱动可能会调用如下函数来获取MSI/MSI-X软件中断号,最终都会调用到 __pci_enable_msix_range
	pci_alloc_irq_vectors
	pci_alloc_irq_vectors_affinity
	pci_enable_msix_range
	pci_enable_msi // 已经遗弃了
__pci_enable_msix_range->__pci_enable_msix->msix_capability_init->
pci_msi_setup_msi_irqs
	msi_domain_alloc_irqs
		ops->domain_alloc_irqs/__msi_domain_alloc_irqs
			
			//1. 申请 its 中的 中断号
			msi_domain_prepare_irqs
				ops->msi_prepare/its_pci_msi_prepare // irq-gic-v3-its-pci-msi.c
					info->scratchpad[0].ul = pci_msi_domain_get_msi_rid(domain, pdev); // get rid // compare with msi-map
					msi_info->ops->msi_prepare/its_msi_prepare // irq-gic-v3-its.c
						dev_id = info->scratchpad[0].ul
						its_dev = its_create_device(its, dev_id, nvec, true); // prepare for hwirq
							its_lpi_alloc(nvecs, &lpi_base, &nr_lpis);
					 		dev->event_map.lpi_base = lpi_base; // prepare for hwirq core
				 			dev->event_map.nr_lpis = nr_lpis;
				 			its_send_mapd(dev, 1); // create table ITT
				 	
			//2. 填充硬件中断号, 申请软件中断号,desc
			for_each_msi_entry(desc, dev)
				__irq_domain_alloc_irqs
					virq = irq_domain_alloc_descs // 申请软件中断号
					irq_domain_alloc_irqs_hierarchy
						domain->ops->alloc/its_irq_domain_alloc // irq-gic-v3-its.c
							its_alloc_device_irq
								idx = bitmap_find_free_region(...);
								*hwirq = dev->event_map.lpi_base + idx;
							for (i = 0; i < nr_irqs; i++) {
								its_irq_gic_domain_alloc(domain, virq + i, hwirq + i);
								irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i, &its_irq_chip, its_dev);
									irq_data->hwirq = hwirq; // 填充硬件中断号
							}

			//3. 将 一个个中断 对应的  <addr,value> 填充并 写入 内存
			for_each_msi_vector(desc, i, dev) 
				irq_domain_activate_irq
					__irq_domain_activate_irq
						domain->ops->activate/msi_domain_activate
							irq_chip_compose_msi_msg
								pos->chip->irq_compose_msi_msg /its_irq_compose_msi_msg // irq-gic-v3-its.c
							irq_chip_write_msi_msg(irq_data, msg)
								data->chip->irq_write_msi_msg /pci_msi_domain_write_msg // irq-gic-v3-its-pci-msi.c


irq-gic-v3-its.c 提供了
	1. static const struct irq_domain_ops its_domain_ops
	2. struct irq_chip its_irq_chip.its_irq_compose_msi_msg

	3. struct msi_domain_ops its_msi_domain_ops.msi_prepare

irq-gic-v3-its-pci-msi.c 提供了
	1. static struct msi_domain_ops its_pci_msi_ops.msi_prepare
	2. static struct irq_chip its_msi_irq_chip.irq_write_msi_msg


plic-sw 或者其msi节点需要提供irq-gic-v3-its.c 中的内容
	1. msi_prepare
	2.<addr,value>

plic-sw-pci-msi.c 需要提供 irq-gic-v3-its-pci-msi.c 的内容
	1. msi_prepare
	2. irq_write_msi_msg
设备访问 中断信息, 并发生中断的过程要不要 设置 inbound
cdns_pcie_host_bar_ib_config

Linux PCIe 启动流程

1. PCIe控制器初始化过程

0. 准备配置空间,做outbound配置
1. 枚举 pcie 设备
    2.1. 为设备准备内存
        读写BAR0,获取需求内存大小.
        写 BAR0 为 PCIe地址,做outbound设置(映射物理地址到pcie地址,并多给1KB) // 1KB足够中断用了
    2.2. 为设备准备中断
        从 设备配置空间 cap 0x11 中读取到他需要M(Table Size+1)个 msi-x 中断
        解析 pcie 节点的 msi-map,从 LPI 中获取对应的M个硬件中断号
        填充cap msi-x 的 Table offset/Table BIR ,offset 到 预留的1KB
        填充cap msi-x 的 PBA offset/PBA BIR ,offset 到 预留的1KB
2. 构造 pci_dev 结构体
    3.1 填充 pci_dev 结构体变量的 irq 成员
    3.2 填充 pci_dev 结构体变量的 mem 相关成员
    3.3 调用 pci_device_register  注册 pci_dev 结构体变量 到 pci总线 设备链表

2. PCIe设备初始化过程

1. 内存设置
    获取到设备内存并映射物理内存到虚拟地址
2. 中断设置
    1.地址值对设置
        构造M个 <addr,val> 对
        将 M个 <addr,val> 对 写入 内存.内存基址由 cap msi-x 的 Table offset/Table BIR 指定
        将<addr,val>中的地址做inbound设置,做 Bus Master Enable// 这样 PCIe设备才可能发出中断

    2. 申请软件中断号
        从bitmap 中获取 软件中断号,然后alloc irq_desc , 并填充 handler 进 irq_action 链表 

    3.MSI-X Enable 及 开启层层开关

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCIe MSI-X 中断 设置 过程 的相关文章

  • pcie标准_PCIe 5.0 标准

    PCIe规范由PCISIG组织进行发布的 xff0c PCISIG其英文全称为 xff1a Peripheral Component Interconnect Special Interest Group 外围部件互连专业组 xff0c 简
  • windows PCIe 工具: TeleScan

    TeleScan PE for Windows 用户可以通过TeleScan PE来扫描系统中的PCI PCIe设备 xff0c 并提供了读写其配置空间中的寄存器的功能 download Teledyne LeCroy PCI Expres
  • PCIe扫盲系列博文连载目录篇

    PCIe扫盲系列博文连载目录篇 xff08 第一阶段 xff09 Felix 电子技术应用 AET 中国科技核心期刊 最丰富的电子设计资源平台 chinaaet com 1 前言篇 xff1a PCIe扫盲 PCIe简介 xff1a htt
  • PCIe扫盲——PCIe简介

    转载地址 xff1a http blog chinaaet com justlxy p 5100053066 PCI Express是继ISA和PCI总线之后的第三代I O总线 xff0c 即3GIO 由Intel在2001年的IDF上提出
  • FPGA实现MPEG2视频压缩PCIe传输 提供软硬件工程源码和技术支持

    目录 1 前言2 MPEG2视频压缩实现3 我已有的FPGA图像视频编解码方案4 我已有的PCIE方案5 MPEG2视频压缩PCIE传输设计方案FPGA硬件设计软件设计 6 Vivado工程详解7 Linux下的XDMA驱动安装8 上板调试
  • LabVIEW FPGA PCIe开发讲解-实战篇:实验61:PCIe DMA+8位ADC(模拟数据采集卡)

    1 实验内容 现在很多电脑PC或者工控机主板上面都集成了PCIe插座 可以直接插入PCIe板卡 优点是卡槽标准 插拔简单 传输速度极快 对于高速采集测试测量领域 PCIe用途非常广泛 最大极限带宽可以到6 6GB s 这个速度可以直接用来做
  • 【PCIe】1: PCIe 硬件时序初始化过程

    目录 1 前言 2 PCIe理论带宽 3 PCIe连接器引脚定义 4 关键信号描述 4 1 PERST 4 2 REFCLK 和REFCLK 信号
  • #PCIE# PCIE基础知识篇(3)

    写在前面 本文章转载自老狼知乎 感谢分享 随着AMD新一代CPU的发布 PCIe 4 0 Gen4 也进入了人们的视线 然而Intel随后宣传PCIe 4 0对消费市场用处不大 AMD则反讽Intel吃不到葡萄说葡萄酸 正在吃瓜群众搬板凳看
  • PCIe中断之MSI和MSI-X的区别(详细)总结附图文快速掌握

    目录 一 整体介绍 二 MSI和MSI X对比 2 1 中断向量连续 2 2 映射区域区别 2 3 MSI X配置空间 2 3 1 MSI X Capbility介绍 2 3 2 Capbility ID介绍 2 3 3 Message C
  • PCIE专题学习——1.0

    PCIE基础概念 一 1 PCIe的概念 PCIe是一种全双工 差分 端对端 串行告诉接口协议 PCI是并行处理的机制 差分可以提高传输的稳定性 全双工意味着发送端在发送的同时 也可以接收 问题在于串行会比并行处理快吗 当然不一定 这和系统
  • 大带宽、高速率接口对比---USB、PCIE、SATA、HDMI和以太网等接口

    一 PCIE接口 二 USB接口 三 SATA接口 SATA 编码方式 原始频宽 传输速率 有效速率 排线最长长度 SATA1 0 SATA2 0 8bit 10bit 3Gb s 300MB s 275MB s 1M SATA3 0 8b
  • PCIe热插拔:通知试热插拔&暴力热插拔

    PCIE热插拔 某些特殊的应用场合可能要求PCIe设备能够以高可靠性持续不间断运行 为此 PCIe总线采用热插拔 Hot Plug 和热切换 Hot Swap 技术 来实现不关闭系统电源的情况下更换PCIe卡设备 热切换和热插拔的主要区别是
  • PCIe专题学习——2.4

    之前我们讲了对PCIe的一些基础概念做了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • 【PCIe】3: PCIe BDF(Bus,Device,Function)

    目录 1 概述 2 BUS 总线号 3 Device 设备号 4 Function 功能号 1 概述 PCIe总线中的每一个功能都有一个唯一的标识符与之对应 这个标识符就是BDF Bus Device Function
  • PCIe架构下memory空间、IO空间、PCIe配置空间简介

    转载自 PCIe架构下memory空间 IO空间 PCIe配置空间简介 1 4种空间迷魂阵 PCIe架构下定义了4种地址空间 Memory空间 IO空间 配置空间和message空间 我们先看一下PCIe spec关于这四种空间的定义 1
  • 基于Xilinx XDMA 的PCIE通信

    基于Xilinx XDMA 的PCIE通信 概述 想实现基于FPGA的PCIe通信 查阅互联网各种转载 基本都是对PCIe的描述 所以想写一下基于XDMA的PCIe通信的实现 PCIe结构仅做简单的描述 笔记 了解详细结构移至互联网 实践实
  • SATA M.2 NGFF PCIE AHCI NVME SSD固态硬盘的接口、总线和协议区分

    总线 协议 说接口之前先说总线 民用产品的硬盘总线多为 SATA 和 PCIe SATA 总线只能使用 AHCI 协议 NVME 对比 AHCI 的优势在于 低延时 低功耗 更适合固态硬盘 PCIe总线 可以使用 AHCI 也可以使用更高效
  • 确定哪些(如果有)PCI 设备插入主板 PCI(e) 插槽

    我正在用 C 编写一个程序来在许多 Windows XP 工作站上执行硬件审核 我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 而不是也使用 PCI 总线 内置于主板中 的板载设备 我可以使用各种 WMI 类成功列出使用所有 PCI
  • PCIe 总线上的写入是原子的吗?

    我是 PCIe 的新手 所以这可能是一个愚蠢的问题 这似乎是询问有关 PCIe 接口的相当基本的信息 但我无法找到答案 因此我猜测我缺少一些使答案显而易见的信息 我有一个系统 其中有一个 ARM 处理器 主机 通过 PCIe 设备 与 Xi
  • Linux 内核中的 DMA 映射和 DMA 引擎是什么?

    Linux 内核中的 DMA 映射和 DMA 引擎是什么 DMA映射API和DMA引擎API何时可以在Linux设备驱动程序中使用 任何真正的 Linux 设备驱动程序示例作为参考都会很棒 Linux 内核中的 DMA 映射和 DMA 引擎

随机推荐