I reserved a block of memory for my driver in dts:
<pre>
reserved-memory {
#size-cells = <2>;
#address-cells = <2>;
ranges;
adc_reserved: ADC {
compatible = "shared-dma-pool";
reg = <0x5 0x0 0x0 0x100000>;
/* memory at pysical adress 0x500000000 actually exists and */
/* I need exactly this region */
};
};
...
my_device {
...
memory-region = <&adc_reserved>;
};
</pre>
Then in my driver I did the following:
/* Allocate memory */
dma_set_coherent_mask(dev, DMA_BIT_MASK(64));
dma_vaddr = dma_alloc_coherent(dev, dma_size, &dma_paddr, GFP_KERNEL);
dev_info(dev, "Allocated coherent memory, vaddr: 0x%0llX, paddr: 0x%0llX\n", (uint64_t)dma_vaddr, (uint64_t)dma_paddr);
In log I see this:
Allocated coherent memory, vaddr: 0xFFFFFF800CB00000, paddr: 0x500000000
Everething seems ok. Then I get page struct:
struct page* p = vmalloc_to_page(dma_vaddr);
and then segfault when I access any member of p:
Unable to handle kernel paging request at virtual address ffffffbf11800000
- Why I get segfault?
- How can I get valid pointer to page in my case?