Search code examples
linuxcachinglinux-kernelzynq

how to avoid caching when using mmap()


I'm writing a driver in petalinux for a device in my FPGA and I have implemented the mmap function in order to control the device in the user space. My problem is that, also if I'm using

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

in the mmap function and MAP_SHARED flag in the user application, it seems that the cache is enabled.

The test I did is to write a value (say 5) to a specific register of my mmaped device that actually stores only the least significant bit of the data coming from the AXI bus. If I read immediately after the write operation, I expect to read 1 (this happened when using a bare metal application on Microblaze), instead I read 5. However, the value is correctly wrote in the register, because what has to happen....happens.

Thanks in advance.


Solution

  • Based on what was discussed in the question comments, the address pointer being assigned here:

    address = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    

    wasn't declared with the type qualifier volatile, allowing the compiler to preform assumptions over it, leading to potential compile time optimizations over the read/write operations.