This patch removes the SPARC32-specific map_pages() function from the IOMMU driver, plus switches obp_dumb_memalloc() over to use OFMEM. OFMEM property generation is enabled for the /memory and /virtual-memory nodes, and any remaining traces of the old memory variables are removed.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@siriusit.co.uk --- openbios-devel/arch/sparc32/lib.c | 69 +++++++++------------------ openbios-devel/drivers/iommu.c | 2 +- openbios-devel/include/libopenbios/ofmem.h | 1 - 3 files changed, 24 insertions(+), 48 deletions(-)
diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c index 74ac5e7..6b51f1c 100644 --- a/openbios-devel/arch/sparc32/lib.c +++ b/openbios-devel/arch/sparc32/lib.c @@ -53,8 +53,6 @@ struct mem { char *curp; };
-static struct mem cmem; /* Current memory, virtual */ -static struct mem cio; /* Current I/O space */ struct mem cdvmem; /* Current device virtual memory space */
unsigned int va_shift; @@ -190,7 +188,7 @@ find_pte(unsigned long va, int alloc) return pa2va(pa); }
-void +static void map_pages(phys_addr_t phys, unsigned long virt, unsigned long size, unsigned long mode) { @@ -353,29 +351,19 @@ void ofmem_arch_early_map_pages(phys_addr_t phys, ucell virt, ucell size, ucell
char *obp_dumb_memalloc(char *va, unsigned int size) { - size = (size + 7) & ~7; - // XXX should use normal memory alloc - totavail[0].num_bytes -= size; - DPRINTF("obp_dumb_memalloc va 0x%p size %x at 0x%x\n", va, size, - totavail[0].num_bytes); - - // If va is null, the allocator is supposed to pick a "suitable" address. - // (See OpenSolaric prom_alloc.c) There's not any real guidance as - // to what might be "suitable". So we mimic the behavior of a Sun boot - // ROM. - - if (va == NULL) { - va = (char *)(totmap[0].start_adr - size); - totmap[0].start_adr -= size; - totmap[0].num_bytes += size; - DPRINTF("obp_dumb_memalloc req null -> 0x%p\n", va); - } + phys_addr_t phys; + ucell virt; + + /* Claim physical memory */ + phys = ofmem_claim_phys(-1, size, CONFIG_OFMEM_MALLOC_ALIGN); + + /* Claim virtual memory */ + virt = ofmem_claim_virt(pointer2cell(va), size, 0);
- map_pages(totavail[0].num_bytes, (unsigned long)va, size, ofmem_arch_default_translation_mode(totavail[0].num_bytes)); + /* Map the memory */ + ofmem_map(phys, virt, size, ofmem_arch_default_translation_mode(phys));
- update_memory_properties(); - - return va; + return cell2pointer(virt); }
void obp_dumb_memfree(__attribute__((unused))char *va, @@ -387,6 +375,9 @@ void obp_dumb_memfree(__attribute__((unused))char *va, void ob_init_mmu(void) { + ucell *reg; + ofmem_t *ofmem; + init_romvec_mem();
/* Find the phandles for the /memory and /virtual-memory nodes */ @@ -400,30 +391,19 @@ ob_init_mmu(void) POP(); s_phandle_mmu = POP();
- /* Setup /memory:reg (totphys) property */ - push_str("/memory"); - fword("find-device"); - PUSH(pointer2cell(mem_reg)); - PUSH(3 * sizeof(ucell)); - push_str("reg"); - PUSH_ph(s_phandle_memory); - fword("encode-property"); + ofmem_register(s_phandle_memory, s_phandle_mmu);
- /* Setup /virtual-memory:avail (totmap) property */ - push_str("/virtual-memory"); - fword("find-device"); - PUSH(pointer2cell(virt_avail)); - PUSH(3 * sizeof(ucell)); - push_str("available"); - PUSH_ph(s_phandle_mmu); - fword("encode-property"); + /* Setup /memory:reg (totphys) property */ + ofmem = ofmem_arch_get_private(); + reg = malloc(3 * sizeof(ucell)); + ofmem_arch_encode_physaddr(reg, 0); /* physical base */ + reg[2] = (ucell)ofmem_arch_get_phys_top(); /* size */
- /* Setup /memory:avail (totavail) property */ push_str("/memory"); fword("find-device"); - PUSH(pointer2cell(mem_avail)); + PUSH(pointer2cell(reg)); PUSH(3 * sizeof(ucell)); - push_str("available"); + push_str("reg"); PUSH_ph(s_phandle_memory); fword("encode-property");
@@ -443,9 +423,6 @@ init_mmu_swift(void) unsigned int addr, i; unsigned long pa, va; int size; - - mem_init(&cmem, (char *) &_vmem, (char *)&_evmem); - mem_init(&cio, (char *)&_end, (char *)&_iomem);
ofmem_posix_memalign((void *)&context_table, NCTX_SWIFT * sizeof(int), NCTX_SWIFT * sizeof(int)); diff --git a/openbios-devel/drivers/iommu.c b/openbios-devel/drivers/iommu.c index 7d34f81..28f3b57 100644 --- a/openbios-devel/drivers/iommu.c +++ b/openbios-devel/drivers/iommu.c @@ -68,7 +68,7 @@ dvma_alloc(int size, unsigned int *pphys) */ mva = (unsigned int) va; mpa = (unsigned int) pa; - map_pages(mpa, mva, npages * PAGE_SIZE, ofmem_arch_io_translation_mode(mpa)); + ofmem_arch_early_map_pages(mpa, mva, npages * PAGE_SIZE, ofmem_arch_io_translation_mode(mpa));
/* * Map into IOMMU page table. diff --git a/openbios-devel/include/libopenbios/ofmem.h b/openbios-devel/include/libopenbios/ofmem.h index 4588a5e..5d7bfeb 100644 --- a/openbios-devel/include/libopenbios/ofmem.h +++ b/openbios-devel/include/libopenbios/ofmem.h @@ -135,7 +135,6 @@ extern struct mem cdvmem;
void mem_init(struct mem *t, char *begin, char *limit); void *mem_alloc(struct mem *t, int size, int align); -void map_pages(phys_addr_t phys, unsigned long virt, unsigned long size, unsigned long mode); #endif
#ifdef PAGE_SHIFT