#pragma once // Kernel mappings that are neither the direct map nor plain device registers. // Both take one 1 GB slot of the device window ioremap() hands out, so each is // limited to a gigabyte and meant to be called a handful of times at boot. // Program this CPU's PAT so that a mapping can ask for write-combining. Every // CPU runs it before it touches a write-combined mapping -- the PAT is per // processor, and one left at its reset value reads the same bits as // write-back, which on device memory the MTRRs then turn back into uncached. void pat_init(void); // Device memory, write-combined: stores are gathered into bursts rather than // sent one at a time, and reads are as slow as uncached. For a framebuffer, // never for registers. Returns 0 if there is no window left. void *ioremap_wc(uint64 pa, uint64 size); // `size` bytes of ordinary RAM, contiguous in the kernel's address space and // not physically: kalloc() pages behind a page table of their own. Zeroed. // For buffers too big for the DMA arena that no device reads. Never freed. void *vmap_alloc(uint64 size);