pci

PCIe interrupt routing

血红的双手。 提交于 2019-12-24 13:38:23
问题 I am currently implementing a PCIE endpoint device in xilinx PFGA, and have some problem regards to the interrupt. when the driver init, it map the interrupt to IRQ 32 [ 1078.938669] alloc irq_desc for 32 on node -1 [ 1078.938670] alloc kstat_irqs on node -1 [ 1078.938675] pci 0000:06:00.0: PCI INT A -> GSI 32 (level, low) -> IRQ 32 However, when the interrupt fires, [ 1134.850064] irq 16: nobody cared (try booting with the "irqpoll" option) [ 1134.850067] Pid: 0, comm: swapper Tainted: P 2.6

PCI总线 DMA burst 基本概念

拥有回忆 提交于 2019-12-24 06:39:35
转载地址: http://blog.csdn.net/sunjiajiang/article/details/7945057 DMA和burst不是一个概念。 DMA传送不经过CPU的控制,假如硬盘的数据不能经过DMA控制器读到内存,那么每完成一次将硬盘的数据读出来,再存放到内存的操作,都要通过CPU运行几条读写指令来完成,这时CPU就做不了别的事了,如果有DMA控制器,则这个过程不需要CPU的参与,只需要占用总线就可以了。CPU还可以去完成别的运算。 Burst操作还是要通过CPU的参与的,与单独的一次读写操作相比,burst只需要提供一个其实地址就行了,以后的地址依次加1,而非burst操作每次都要给出地址,以及需要中间的一些应答、等待状态等等。如果是对地址连续的读取,burst效率高得多,但如果地址是跳跃的,则无法采用burst操作 一般芯片的dma有基本功能。 1、普通的内存、外设间互传数据,一次性的。 PCI设备DMA控制器,设置好后DMA 控制器的寄存器,PCI设备就会通过PCI总线向其他设备发送信号。 2、支持链表的,美其名曰“scatter”,内核有struct scatter可以参考。 说一下注意点: dma有burst、burst size、transfer的概念: burst: dma实际上是一次一次的申请总线,把要传的数据总量分成一个一个小的数据块

How existing kernel driver should be initialized as PCI memory-mapped?

做~自己de王妃 提交于 2019-12-23 06:04:30
问题 Existing kernel drivers such as xilinx have specific way to be registered (as tty device), if they are mapped directly to cpu memory map as done here with device tree: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842249/Uartlite+Driver But in other cases, there is a PCIe device (like FPGA which has the xilinx uart IPs) which is connected to and the cpu. How should we make the uart get registered when using PCIe device ? The device tree I try to register into PCIe is uartlite driver

How existing kernel driver should be initialized as PCI memory-mapped?

允我心安 提交于 2019-12-23 06:03:32
问题 Existing kernel drivers such as xilinx have specific way to be registered (as tty device), if they are mapped directly to cpu memory map as done here with device tree: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842249/Uartlite+Driver But in other cases, there is a PCIe device (like FPGA which has the xilinx uart IPs) which is connected to and the cpu. How should we make the uart get registered when using PCIe device ? The device tree I try to register into PCIe is uartlite driver

How do cdev and its associated file operation work?

梦想与她 提交于 2019-12-23 02:39:27
问题 Actually working on a PCI driver. I have two PCIe cards with same device ID and vendor ID. So to make a difference, I assign these two cards with two different MINOR numbers. //request for device numbers error = alloc_chrdev_region(&devt, 0, cards_found, DEVICE_NAME); if (error == 0) { major = MAJOR(devt); printk(KERN_INFO "(drv_init): MAJOR number is %d\n", major); printk(KERN_INFO "(drv_init): MINOR number range from 0 to %d\n", cards_found-1); cdevs = cdev_alloc(); cdevs->owner = THIS

PCIe总线(协议简述)

五迷三道 提交于 2019-12-22 01:01:14
1. PCIe基础知识 PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。 与大多数总线一样,PCIe总线也包括电气属性和协议组成两部分。完整地了解PCIe是相对复杂的,所以从应用角度来讲,我先从基本的协议入手,对PCIe有个初步的认识。拓展学习可以参考官方协议规范文档《PCI Express Base Specification》。 PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。 在 发送端 ,应用程序(设备核A)在事务层形成事务层包(TLP——Transaction Layer Package),储存在发送缓冲器里,等待推向下层。在数据链路层,在TLP 包上再串接一些附加信息,这些信息是对方接收TLP 包时进行错误检查要用到的,形成数据链路层包(DLLP——Data Link Layer Package);在 物理层 ,对DLLP 包进行编码,占用链路中的可用通道,从发送器发送出去。 在接收端,实际上是发送端的“逆”过程。如果说发送端是在不断组包,那么接收端就是不断的拆包,最后提取出有用的数据信息供B设备的应用程序使用。

Linux驱动学习--初识PCI驱动(一)

流过昼夜 提交于 2019-12-20 16:33:14
写在前面的话: 感觉好久没有来写了,今天就来看看Linux下PCI驱动的一个基本编写规范。 一,我们来看看PCI是什么。 PCI---Peripheral Component Interconnect,外围设备互联总线。 是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如 EISA )的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准。 不知道大家对总线的概念是什么,按我的通俗理解,总线就是一条国道,将许多的设备连接起来。当然,这是一种十分宽泛的理解。好,今天我们的重点并不是总线,而是在Linux驱动程序中的编写。 对于驱动的编写来讲,现今的内核已经为我们实现了很多,而我们所需要的做的,就是将一个实际的设备和内核进行连接,就好像是一座桥。 不管如何,我们还是要来看PCI的一点基本知识。 1.与CPU等的交互: 从上图,我们可以看出 PCI 将计算机系统中的总线子系统 与存储子系统完全地分开, CPU 通过一块称为 PCI 桥( PCI-Bridge )的设备来完成同总线子系统的交互。 2.自此,我们应该可以大概有了点印象,PCI总线大概是处于何种位置,当然,上面的图只是一个很简略的图,但是我们只有有一种感性的认知即可。那么,在逻辑上,PCI总线又会在哪里呢?我想这对于我们变成更是重要的吧,请看下图: 上 图是一个典型的基于PCI总线的计算机系统逻辑示意图

How to match OpenCL devices with a specific GPU given PCI vendor, device and bus IDs in a multi-GPU system?

一笑奈何 提交于 2019-12-20 10:43:21
问题 I would like to be able to match OpenCL devices with GPUs in the system on multi-GPU systems identified by PCI IDs. For example, if I have a system with multiple GPUs, possibly from different vendors, I can list the devices by enumerating the PCI bus. This gives me PCI vendor, device and bus IDs. If I choose one of these (GPU) PCI devices to use for OpenCL computation based on some selection criteria, how do I match it to the OpenCL device? I can enumerate GPU devices in OpenCL using

Writing an ALSA Driver

痞子三分冷 提交于 2019-12-20 00:23:02
前言 本文档介绍了如何编写 ALSA(高级Linux声音体系结构) 驱动程序。该文档主要关注PCI声卡。对于其他设备类型,API也可能不同。但是,至少ALSA内核API是一致的,因此编写它们仍然会有所帮助。 本文档面向已经具备足够的C语言技能并且具有基本的Linux内核编程知识的人员。本文档没有解释Linux内核编码的一般主题,也没有介绍底层驱动程序的实现细节。它仅描述了在ALSA上编写PCI声音驱动程序的标准方法。 如果您已经熟悉了较旧的ALSA ver.0.5.x API,则可以检查ALSA 0.5.x树中的驱动程序,例如 sound/pci/es1938.c 或 sound/pci/maestro3.c ,它们也具有几乎相同的代码库,因此可以比较它们之间的差异。 该文档仍是草案版本。任何反馈和更正,请! 文件树结构 一般 来源: CSDN 作者: 慢慢的燃烧 链接: https://blog.csdn.net/u010164190/article/details/103620976

KVM设备透传与重定向

依然范特西╮ 提交于 2019-12-18 20:50:41
1.1 设备透传与重定向 在私有云桌面中,设备的透传(passthrough)与重定向(redirection)一直以来都是作为基本功能出现的。两者的在使用上的区别是前者一般将主机上的设备直接传递给在其中运行的虚拟机,后者则是将客户端的设备通过网络传递给其正在连接的虚拟机,相同点是当传递至虚拟机或虚拟机归还设备时,这对于主机来说是个设备热插拔操作。 1.1.1 PCI/PCI-E设备 在QEMU中,PCI/PCI-E设备目前仅支持透传(某些商业软件可对PCI/PCI-E设备进行重定向),且需要在主机BIOS设置中CPU打开Intel VT-d/选项(AMD CPU与之对应的是AMD Vi),可透传的设备包括显卡、声卡、HBA卡、网卡、USB控制器等,其中某些设备需要额外设置(比如IOMMU)才可进行透传。 使用libvirt透传PCI/PCI-E设备时需要知道要透传设备的总线地址,以在域定义中指定要透传的设备。一般落实到QEMU中有这些为透传准备的设备模型,包括pci-assgn、vfio-pci、vfio-vga等。 以透传主机网卡为例: [root@node1 ~]# lspci 00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge ... 02:05.0 Ethernet