arandomuser
arandomuser

Reputation: 571

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.

Upvotes: 4

Views: 7551

Answers (1)

pah
pah

Reputation: 4778

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.

Upvotes: 3

Related Questions