Search code examples
linuxlinux-kernellinux-device-driverpci-euserspace

PCIe Driver - How does user space access it?


I am writing a PCIe driver for Linux, currently without DMA, and need to know how to read and write to the PCIe device once it is enabled from user space.

In the driver I do the basics in probe():

pci_enable_device();
pci_request_regions();
pci_iomap();

But then how do I access this memory from user space to read and write? Do I add file operations to my PCIe driver? Does the memory from pci_iomap show up some place where the user space code can call:

open('mapped memory location');
mmap(...);

If so then what is the location?

Note: the PCIe device will not plugging into any Linux subsystems such as audio, Ethernet, etc.


Solution

  • You can register devices using functions like register_chrdev and device_create. Consider the kernel source for /dev/null and /dev/mem:

    static int __init chr_dev_init(void)
    {
        int minor;
    
        if (register_chrdev(MEM_MAJOR, "mem", &memory_fops))
            printk("unable to get major %d for memory devs\n", MEM_MAJOR);
    
        mem_class = class_create(THIS_MODULE, "mem");
        if (IS_ERR(mem_class))
            return PTR_ERR(mem_class);
    
        mem_class->devnode = mem_devnode;
        for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) {
            if (!devlist[minor].name)
                continue;
    
            /*
             * Create /dev/port?
             */
            if ((minor == DEVPORT_MINOR) && !arch_has_dev_port())
                continue;
    
            device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor),
                      NULL, devlist[minor].name);
        }
    
        return tty_init();
    }
    
    fs_initcall(chr_dev_init);