|
|
1.1 ! root 1: /* ! 2: * <ofmem_sparc32.c> ! 3: * ! 4: * OF Memory manager ! 5: * ! 6: * Copyright (C) 1999-2004 Samuel Rydh ([email protected]) ! 7: * Copyright (C) 2004 Stefan Reinauer ! 8: * ! 9: * This program is free software; you can redistribute it and/or ! 10: * modify it under the terms of the GNU General Public License ! 11: * as published by the Free Software Foundation ! 12: * ! 13: */ ! 14: ! 15: #include "config.h" ! 16: #include "libopenbios/bindings.h" ! 17: #include "libc/string.h" ! 18: #include "libopenbios/ofmem.h" ! 19: #include "asm/asi.h" ! 20: #include "pgtsrmmu.h" ! 21: ! 22: #define OF_MALLOC_BASE ((char*)OFMEM + ALIGN_SIZE(sizeof(ofmem_t), 8)) ! 23: ! 24: #define MEMSIZE (384 * 1024) ! 25: static union { ! 26: char memory[MEMSIZE]; ! 27: ofmem_t ofmem; ! 28: } s_ofmem_data; ! 29: ! 30: #define OFMEM (&s_ofmem_data.ofmem) ! 31: #define TOP_OF_RAM (s_ofmem_data.memory + MEMSIZE) ! 32: ! 33: translation_t **g_ofmem_translations = &s_ofmem_data.ofmem.trans; ! 34: ! 35: extern uint32_t qemu_mem_size; ! 36: ! 37: static inline size_t ALIGN_SIZE(size_t x, size_t a) ! 38: { ! 39: return (x + a - 1) & ~(a-1); ! 40: } ! 41: ! 42: static ucell get_heap_top( void ) ! 43: { ! 44: return (ucell)TOP_OF_RAM; ! 45: } ! 46: ! 47: ofmem_t* ofmem_arch_get_private(void) ! 48: { ! 49: return OFMEM; ! 50: } ! 51: ! 52: void* ofmem_arch_get_malloc_base(void) ! 53: { ! 54: return OF_MALLOC_BASE; ! 55: } ! 56: ! 57: ucell ofmem_arch_get_heap_top(void) ! 58: { ! 59: return get_heap_top(); ! 60: } ! 61: ! 62: ucell ofmem_arch_get_virt_top(void) ! 63: { ! 64: return (ucell)TOP_OF_RAM; ! 65: } ! 66: ! 67: phys_addr_t ofmem_arch_get_phys_top(void) ! 68: { ! 69: ofmem_t *ofmem = ofmem_arch_get_private(); ! 70: ! 71: return (uintptr_t)ofmem->ramsize - 0x1000000; ! 72: } ! 73: ! 74: ucell ofmem_arch_get_iomem_base(void) ! 75: { ! 76: return pointer2cell(&_end); ! 77: } ! 78: ! 79: ucell ofmem_arch_get_iomem_top(void) ! 80: { ! 81: return pointer2cell(&_iomem); ! 82: } ! 83: ! 84: retain_t *ofmem_arch_get_retained(void) ! 85: { ! 86: /* Not used */ ! 87: return 0; ! 88: } ! 89: ! 90: int ofmem_arch_get_physaddr_cellsize(void) ! 91: { ! 92: return 2; ! 93: } ! 94: ! 95: int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value) ! 96: { ! 97: int n = 0; ! 98: ! 99: p[n++] = value >> 32; ! 100: p[n++] = value; ! 101: ! 102: return n; ! 103: } ! 104: ! 105: int ofmem_arch_get_translation_entry_size(void) ! 106: { ! 107: /* Return size of a single MMU package translation property entry in cells */ ! 108: return 3; ! 109: } ! 110: ! 111: void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t) ! 112: { ! 113: /* Generate translation property entry for SPARC. While there is no ! 114: formal documentation for this, both Linux kernel and OpenSolaris sources ! 115: expect a translation property entry to have the following layout: ! 116: ! 117: virtual address ! 118: length ! 119: mode ! 120: */ ! 121: ! 122: transentry[0] = t->virt; ! 123: transentry[1] = t->size; ! 124: transentry[2] = t->mode; ! 125: } ! 126: ! 127: /* Return the size of a memory available entry given the phandle in cells */ ! 128: int ofmem_arch_get_available_entry_size(phandle_t ph) ! 129: { ! 130: return 1 + ofmem_arch_get_physaddr_cellsize(); ! 131: } ! 132: ! 133: /* Generate memory available property entry for Sparc32 */ ! 134: void ofmem_arch_create_available_entry(phandle_t ph, ucell *availentry, phys_addr_t start, ucell size) ! 135: { ! 136: int i = 0; ! 137: ! 138: i += ofmem_arch_encode_physaddr(availentry, start); ! 139: availentry[i] = size; ! 140: } ! 141: ! 142: /************************************************************************/ ! 143: /* misc */ ! 144: /************************************************************************/ ! 145: ! 146: ucell ofmem_arch_default_translation_mode( phys_addr_t phys ) ! 147: { ! 148: return SRMMU_REF | SRMMU_CACHE | SRMMU_PRIV; ! 149: } ! 150: ! 151: ucell ofmem_arch_io_translation_mode( phys_addr_t phys ) ! 152: { ! 153: return SRMMU_REF | SRMMU_PRIV; ! 154: } ! 155: ! 156: /************************************************************************/ ! 157: /* init / cleanup */ ! 158: /************************************************************************/ ! 159: ! 160: void ofmem_init( void ) ! 161: { ! 162: memset(&s_ofmem_data, 0, sizeof(s_ofmem_data)); ! 163: s_ofmem_data.ofmem.ramsize = qemu_mem_size; ! 164: ! 165: /* Claim reserved physical addresses at top of RAM */ ! 166: ofmem_claim_phys(ofmem_arch_get_phys_top(), s_ofmem_data.ofmem.ramsize - ofmem_arch_get_phys_top(), 0); ! 167: ! 168: /* Claim OpenBIOS reserved space */ ! 169: ofmem_claim_virt(0xffd00000, 0x300000, 0); ! 170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.