PCIE-MIS/MSIX中断
+ -

PCIE-MSI中断LINUX应用-gdma_app.c

2025-07-16 0 0
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include "gdma_app.h"
#include <sys/ioctl.h>
#include <poll.h>

#define GDMA_TEST_DEV_NAME    "gdma_test"


int main(int argc, char **argv)
{
    int fd;
    int ret;
    int cmd_in;
    unsigned int tdq_id;
    unsigned int tde_ctl;
    unsigned int dwVal;
    unsigned int en;
    unsigned int size;
    unsigned long src, dst;


    ///< open device
    fd = open("/dev/gdma_test", O_RDWR);
    if (fd < 0)
    {
        printf("can't open /dev/gdma_test!\n");
        exit(1);
    }
    printf("open /dev/gdma_test = %d!\n", fd);

    printf("1  -- submit 1 normal TDE\n");
    printf("2  -- submit 1 ctrl TDE\n");
    printf("3  -- configure 1 HW TDE\n");
    printf("83 -- configure n HW TDEs\n");
    printf("4  -- submit tdq tail\n");

    printf("10 -- start/stop timer\n");
    printf("11 -- modify timer type\n");
    printf("12 -- modify timer ms\n");
    printf("20 -- modify TDQ size\n");
    printf("21 -- modify TCQ size\n");
    printf("22 -- TDQ Clear\n");
    printf("23 -- TDQ Abort\n");
    printf("24 -- TDQ Reset\n");
    printf("25 -- TCQ Reset\n");

    printf("30 -- modify Test mem Src\n");
    printf("31 -- modify Test mem Des\n");
    printf("-----------------------\n");


    ///< input dst_ntid and request size, request mapping address
    while (1) {
        //msleep(20);
        printf("cmd > ");
        scanf("%d", &cmd_in);                     ///< 端口号输入  


        switch(cmd_in)
        {
        case 1:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            if (tdq_id <= 3)
                ioctl(fd, GDMA_TEST_IOC_SUBMIT, &tdq_id); 
        break;
        case 2:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            printf("TDE ctl \n");
            printf("0-normal; 2-MSI; 4-ro; 8-drop\n > ");
            scanf("%x", &tde_ctl);

            dwVal = (tdq_id<<16) | tde_ctl;
            ioctl(fd, GDMA_TEST_IOC_SUBMIT_CTL, &dwVal); 

        break;

        case 3:
        {
            gdma_user_tde_s tde;

            printf("TDQ > ");
            scanf("%x", &tde.tdq_id);
            printf("pos(hex) >");
            scanf("%lx", &tde.pos);
            printf("len(hex) >");
            scanf("%x", &tde.len);
            printf("ctl(18:drop,17:ro,16:int_en) >");
            scanf("%x", &tde.ctrl.uint);         

            ioctl(fd, GDMA_TEST_IOC_TDE_HW, &tde); 
        }
        break;

        case 4:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            if (tdq_id <= 3)
                ioctl(fd, GDMA_TEST_IOC_SUBMIT_TAIL, &tdq_id); 

            printf("Then clear\n");
            //ioctl(fd, GDMA_TEST_IOC_TDQ_CLEAR, &tdq_id); 
            ioctl(fd, GDMA_TEST_IOC_TDQ_ABORT, &tdq_id); 


        break;



        case 83:
        {
            gdma_user_tde_s tde;
            unsigned int num, i;
            unsigned long pos;

            printf("TDQ > ");
            scanf("%x", &tde.tdq_id);
            printf("pos(hex) >");
            scanf("%lx", &pos);
            printf("len(hex) >");
            scanf("%x", &tde.len);
            printf("ctl(18:drop,17:ro,16:int_en) >");
            scanf("%x", &tde.ctrl.uint); 

            printf("num(hex) >");
            scanf("%x", &num);

            for (i = 0; i < num; i++){
                tde.pos = pos + i * tde.len;
                ioctl(fd, GDMA_TEST_IOC_TDE_HW, &tde); 
            }

        }
        break;

        case 10:
            printf("Timer Enable > ");
            scanf("%x", &dwVal);
            ioctl(fd, GDMA_TEST_IOC_START_TIMER, &dwVal); 
        break;     
        case 11:
            printf("Timer type  \n");
            printf("0-normal; 1-drop; 2-msi; > ");
            scanf("%x", &dwVal);
            ioctl(fd, GDMA_TEST_IOC_TIMER_TYPE, &dwVal); 
        break; 
        case 12:
            printf("Timer ms >");
            scanf("%d", &dwVal);
            ioctl(fd, GDMA_TEST_IOC_TIMER_MS, &dwVal); 
        break; 

        case 20:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            printf("size >");
            scanf("%x", &size);
            printf("en >");
            scanf("%x", &en);
            if((tdq_id > 3) || (size > 7) || (en > 1))
            {
                printf("tdq info err\n");
            }
            else{
                dwVal = (tdq_id<<16) | (en<<8) | (size);
                ioctl(fd, GDMA_TEST_IOC_TDQ_INFO, &dwVal); 
            }


        break; 
        case 21:
            printf("TCQ size > ");
            scanf("%x", &dwVal);
            if (size > 0xF){
                printf("tcq size error\n");
            }
            else
                ioctl(fd, GDMA_TEST_IOC_TCQ_SIZE, &dwVal); 
        break;

        case 22:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            if (tdq_id <= 3)
                ioctl(fd, GDMA_TEST_IOC_TDQ_CLEAR, &tdq_id); 
        break;

        case 23:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            if (tdq_id <= 3)
                ioctl(fd, GDMA_TEST_IOC_TDQ_ABORT, &tdq_id); 
        break;

        case 24:
            printf("TDQ > ");
            scanf("%x", &tdq_id);
            if (tdq_id <= 3)
                ioctl(fd, GDMA_TEST_IOC_TDQ_RESET, &tdq_id); 
        break;
        case 25:
            ioctl(fd, GDMA_TEST_IOC_TCQ_RESET, &tdq_id); 
        break;

        case 30:
            printf("Src > ");
            scanf("%lx", &src);
            printf("mem src:0x%lx\n", src);
            ioctl(fd, GDMA_TEST_IOC_TEST_SRC, &src); 
        break;

        case 31:
            printf("Dst > ");
            scanf("%lx", &dst);
            ioctl(fd, GDMA_TEST_IOC_TEST_DST, &dst); 
        break;

        default:
        goto END;
        break;
        }


    }
END:
    close(fd);
    printf("close /dev/gdma!\n");
    return 0;
}

0 篇笔记 写笔记

PCIE MSI-X
MSI-XCA 结构MSI-X和MSI最大的不同是messagedata、message address和status字段没有存放在设备的配置空间中,而是使用MSI-XTable structure和MSI-X PBA structure来存放这些字段。MSI-X Table structur......
PCIe 中断机制介绍(MSI
前面的文章中介绍过,MSI本质上是一种Memory Write,和PCIe总线中的Message概念半毛钱关系都没有。并且,MSI的Data Payload也是固定的,始终为1DW。由于MSI也是从PCI总线继承而来的,因此MSI相关的寄存器也存在于配置空间中的PCI兼容部分(前256个字节)。如......
PCIe 中断机制介绍(MSI-X)
PCI总线自3.0版本开始支持MSI-X机制,对MSI做出了一些升级和改进,以克服MSI机制的三个主要的缺陷:随着系统的发展,对于特定的大型应用,32个中断向量不够用了(参考前一篇文章);只有一个目标地址使得多核CPU情况下的,静态中断分配变得困难。如果能够使每个向量对应不同的唯一的地址,便会灵......
PCIE-MSI中断LINUX驱动-imt_driv.h
#ifndef __IMT_TEST__H__ #define __IMT_TEST__H__#include #include #include "linux/pci.h"#incl......
PCIE-MSI中断LINUX驱动-imt_driv.c
#include #include #include #include #include
all: make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules#make -C $(KDIR) M=$(PWD) modulesclean: make -C /lib/modules/$(shell una......
#include #include #include ///<支持的ioctrl 命令#define GDMA_TEST_IOC_SUBMIT _IOW('p', ......
#include #include #include #include #include "gdma_app.h"#include <......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!