[SPDK] Re: How to do mmio correctly when vfio-pci is used?

Harris, James R <james.r.harris at intel.com>
Newsgroups dev.linux.lists.spdk
Message-ID <[email protected]>
Hi Oscar,

Do you have an SPDK_PCI_DRIVER_REGISTER defined for your device?  This ensures the driver is properly registered with DPDK so that associated devices are configured correctly.  If not, lib/env_dpdk/ioat.c provides a suitable example.  This enables a unified mmio approach for SPDK.

-Jim


On 9/17/20, 12:17 AM, "oscar.huang(a)microchip.com" <oscar.huang(a)microchip.com> wrote:

    Hi, Gugus, 
    I have a simple SPDK application, which maps a device BAR, and write some data onto the device with spdk_mmio_write_8 function. The code flow is like this:
    ...
    spdk_pci_device_map_bar(dev, bir, &virBarAddr, &phys, &size);
    addrToWrite = virBarAddr + offset;   //offset is where I'd like to write data in the device memory
    spdk_mmio_write_8(addrToWrite,  data);
    ...

    The code has been working with uio_pci_generic. But recently when I switched to vfio-pci (iommu enabled), I got a segmentation fault the program was executing that spdk_mmio_write_8 function. 

    If I do the following, the program can run:

    ...
    spdk_pci_device_map_bar(dev, bir, &virBarAddr, &phys, &size);
    physAddr = phys +offset;
    int  fd = open("/dev/mem", O_RDWR | O_SYNC);
    void *map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, physAddr & ~MAP_MASK);
    addrToWrite = (uint64_t)map_base + (physAddr & MAP_MASK);
    spdk_mmio_write_8(addrToWrite, data);
    ...

    I don't understand why it is so. Basically I need a routine to map device physical address to process virtual address, and then call spdk_mmio_write_x functions. It looks like the virtual address from spdk_pci_device_map_bar cannot be used. I noticed the virtual address from spdk_pci_device_map_bar was 0x2010008000, but the one by mmap was 0x7ffff7fef000, very different. 

    Is there a unified mmio approach that works for both uio_pci_generic and vfio_pci?
    _______________________________________________
    SPDK mailing list -- spdk(a)lists.01.org
    To unsubscribe send an email to spdk-leave(a)lists.01.org
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.