I’m using Intel Galileo board and
/Board_Support_Package_Sources_for_Intel_Quark_v1.0.0
(Yes, I know there is a newer version.)
I'm trying to overlay some kernel dynamically allocated memory with eSRAM (in a kernel module), but a simple the call to intel_qrk_esram_map_range() fails. Has anyone tried this? Anything obvious I miss? If nothing comes up I'll probably dig deeper later today...
The failure details:
// get contigues pages for the overlay of entire ESRAM
pages_addr = __get_free_pages(GFP_KERNEL, 7);
DEB("Allocated: pages_addr=0x%08x (vaddr=%p)\n", pages_addr, __va(pages_addr));
if (pages_addr == 0) {
KERR("Failed to __get_free_pages()\n");
goto Failure;
}
// setup esram overlay
//res = intel_qrk_esram_map_range(__va(pages_addr), 1 << 7, "esram_umap");
res = intel_qrk_esram_map_range(__va(pages_addr), 0x1000, "esram_umap");
if (res) {
KERR("Failed to intel_qrk_esram_map_range(): %d\n", res);
goto Failure;
}
with –EINVAL result, dmesg output:
[ 582.982418] ESRAM_UMAP Quark eSRAM userspace support driver.
[ 582.989049] ESRAM_UMAP DEB: Allocated: pages_addr=0xcea00000 (vaddr=8ea00000)
[ 582.989097] ESRAM_UMAP Failed to intel_qrk_esram_map_range(): -22
But there is some side-effect of the call in /sys/devices/platform/intel-qrk-esram.0/stats:
root@clanton:~# diff esram-stats-{before,after}
--- esram-stats-before
+++ esram-stats-after
@@ -7,9 +7,9 @@
esram-ctrl.pages : 128
esram-ctrl.dram-flush-priorityi : 2
esram-block : 0x00000000
-free page : 128
-used page : 0
+free page : 127
+used page : 1
refresh : 0ms
page enable retries : 0
page disable retries : 0
-ecc next page : 127
+ecc next page : 126
And:
root@clanton:~# cat /sys/devices/platform/intel-qrk-esram.0/map
esram_umap
Page virt 0x8ea00000 phys 0xcea00000
Refcount 1
I’ve skimmed through the source in intel_qrk_esram.c but no quick conclusion…