[OpenBIOS] [commit] r981 - in trunk/openbios-devel: arch/ppc/qemu arch/sparc64 include/libopenbios libopenbios
repository service
svn at openbios.org
Sun Dec 12 14:12:21 CET 2010
Author: afaerber
Date: Sun Dec 12 14:12:20 2010
New Revision: 981
URL: http://tracker.coreboot.org/trac/openbios/changeset/981
Log:
ofmem: Use phys_addr_t for physical addresses
Based on Mark's previous work, let ofmem handle addresses wider than one cell.
This is based on the assumption that sizeof(phys_addr_t) >= sizeof(ucell).
Affected are in particular sparc32 (36 bits) and ppc64 (64 bits).
As a consequence, some range_t related code shared with virtual/effective
addresses needed to be migrated, too. Since both address types are unsigned
this should be okay.
v4:
* Coding style fixes and comments, as suggested by Mark.
v3:
* Rebased: Prefer FMT_plx for trace output.
* Convert some more places to phys_addr_t to avoid breakage on ppc64.
* Add helpers ofmem_arch_{get_physaddr_cellsize,encode_physaddr}(),
requested by Mark.
v2:
* Use FMT_physaddr_t in ofmem trace code. (by Mark)
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
Signed-off-by: Andreas Färber <andreas.faerber at web.de>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
Modified:
trunk/openbios-devel/arch/ppc/qemu/ofmem.c
trunk/openbios-devel/arch/sparc64/lib.c
trunk/openbios-devel/arch/sparc64/ofmem_sparc64.c
trunk/openbios-devel/include/libopenbios/ofmem.h
trunk/openbios-devel/libopenbios/ofmem_common.c
Modified: trunk/openbios-devel/arch/ppc/qemu/ofmem.c
==============================================================================
--- trunk/openbios-devel/arch/ppc/qemu/ofmem.c Sun Dec 5 15:16:13 2010 (r980)
+++ trunk/openbios-devel/arch/ppc/qemu/ofmem.c Sun Dec 12 14:12:20 2010 (r981)
@@ -120,7 +120,7 @@
/* kill page mappings in provided range */
}
-void ofmem_arch_early_map_pages(ucell phys, ucell virt, ucell size, ucell mode)
+void ofmem_arch_early_map_pages(phys_addr_t phys, ucell virt, ucell size, ucell mode)
{
/* none yet */
}
@@ -131,10 +131,29 @@
return NULL;
}
+int ofmem_arch_get_physaddr_cellsize(void)
+{
+#ifdef CONFIG_PPC64
+ return 2;
+#else
+ return 1;
+#endif
+}
+
+int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value)
+{
+ int n = 0;
+#ifdef CONFIG_PPC64
+ p[n++] = value >> 32;
+#endif
+ p[n++] = value;
+ return n;
+}
+
/* Return size of a single MMU package translation property entry in cells */
int ofmem_arch_get_translation_entry_size(void)
{
- return 4;
+ return 3 + ofmem_arch_get_physaddr_cellsize();
}
/* Generate translation property entry for PPC.
@@ -149,10 +168,12 @@
*/
void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t)
{
- transentry[0] = t->virt;
- transentry[1] = t->size;
- transentry[2] = t->phys;
- transentry[3] = t->mode;
+ int i = 0;
+
+ transentry[i++] = t->virt;
+ transentry[i++] = t->size;
+ i += ofmem_arch_encode_physaddr(&transentry[i], t->phys);
+ transentry[i++] = t->mode;
}
/************************************************************************/
@@ -182,7 +203,7 @@
/* misc */
/************************************************************************/
-ucell ofmem_arch_default_translation_mode(ucell phys)
+ucell ofmem_arch_default_translation_mode(phys_addr_t phys)
{
/* XXX: Guard bit not set as it should! */
if (phys < IO_BASE)
@@ -195,10 +216,10 @@
/* page fault handler */
/************************************************************************/
-static ucell
+static phys_addr_t
ea_to_phys(ucell ea, ucell *mode)
{
- ucell phys;
+ phys_addr_t phys;
if (ea >= OF_CODE_START) {
/* ROM into RAM */
@@ -221,7 +242,7 @@
}
static void
-hash_page_64(ucell ea, ucell phys, ucell mode)
+hash_page_64(ucell ea, phys_addr_t phys, ucell mode)
{
static int next_grab_slot = 0;
uint64_t vsid_mask, page_mask, pgidx, hash;
@@ -270,7 +291,7 @@
.h = 0,
.v = 1,
- .rpn = (phys & ~0xfff) >> 12,
+ .rpn = (phys & ~0xfffUL) >> 12,
.r = mode & (1 << 8) ? 1 : 0,
.c = mode & (1 << 7) ? 1 : 0,
.w = mode & (1 << 6) ? 1 : 0,
@@ -287,7 +308,7 @@
}
static void
-hash_page_32(ucell ea, ucell phys, ucell mode)
+hash_page_32(ucell ea, phys_addr_t phys, ucell mode)
{
#ifndef __powerpc64__
static int next_grab_slot = 0;
@@ -341,7 +362,7 @@
}
/* XXX Remove these ugly constructs when legacy 64-bit support is dropped. */
-static void hash_page(unsigned long ea, unsigned long phys, ucell mode)
+static void hash_page(unsigned long ea, phys_addr_t phys, ucell mode)
{
if (is_ppc64())
hash_page_64(ea, phys, mode);
@@ -354,7 +375,7 @@
{
unsigned long dar, dsisr;
ucell mode;
- ucell phys;
+ phys_addr_t phys;
asm volatile("mfdar %0" : "=r" (dar) : );
asm volatile("mfdsisr %0" : "=r" (dsisr) : );
@@ -368,7 +389,7 @@
{
unsigned long nip, srr1;
ucell mode;
- ucell phys;
+ phys_addr_t phys;
asm volatile("mfsrr0 %0" : "=r" (nip) : );
asm volatile("mfsrr1 %0" : "=r" (srr1) : );
Modified: trunk/openbios-devel/arch/sparc64/lib.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/lib.c Sun Dec 5 15:16:13 2010 (r980)
+++ trunk/openbios-devel/arch/sparc64/lib.c Sun Dec 12 14:12:20 2010 (r981)
@@ -120,7 +120,8 @@
static void
mmu_translate(void)
{
- ucell virt, phys, mode;
+ ucell virt, mode;
+ phys_addr_t phys;
virt = POP();
@@ -352,7 +353,7 @@
}
static void
-map_pages(unsigned long phys, unsigned long virt,
+map_pages(phys_addr_t phys, unsigned long virt,
unsigned long size, unsigned long mode)
{
unsigned long tte_data, currsize;
@@ -393,7 +394,7 @@
}
}
-void ofmem_map_pages(ucell phys, ucell virt, ucell size, ucell mode)
+void ofmem_map_pages(phys_addr_t phys, ucell virt, ucell size, ucell mode)
{
return map_pages(phys, virt, size, mode);
}
@@ -405,7 +406,8 @@
static void
mmu_map(void)
{
- ucell virt, size, mode, phys;
+ ucell virt, size, mode;
+ phys_addr_t phys;
mode = POP();
size = POP();
@@ -453,7 +455,7 @@
unmap_pages(virt, size);
}
-void ofmem_arch_early_map_pages(ucell phys, ucell virt, ucell size, ucell mode)
+void ofmem_arch_early_map_pages(phys_addr_t phys, ucell virt, ucell size, ucell mode)
{
if (mode & SPITFIRE_TTE_LOCKED) {
// install locked tlb entries now
@@ -514,7 +516,8 @@
static void
mem_claim( void )
{
- ucell phys=-1UL, size, align;
+ ucell size, align;
+ phys_addr_t phys=-1UL;
align = POP();
size = POP();
@@ -534,7 +537,8 @@
static void
mem_release( void )
{
- ucell phys, size;
+ phys_addr_t phys;
+ ucell size;
size = POP();
phys = POP();
@@ -548,7 +552,8 @@
static void
mem_retain ( void )
{
- ucell phys=-1UL, size, align;
+ ucell size, align;
+ phys_addr_t phys=-1UL;
align = POP();
size = POP();
Modified: trunk/openbios-devel/arch/sparc64/ofmem_sparc64.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/ofmem_sparc64.c Sun Dec 5 15:16:13 2010 (r980)
+++ trunk/openbios-devel/arch/sparc64/ofmem_sparc64.c Sun Dec 12 14:12:20 2010 (r981)
@@ -95,7 +95,18 @@
/* misc */
/************************************************************************/
-ucell ofmem_arch_default_translation_mode( ucell phys )
+int ofmem_arch_get_physaddr_cellsize(void)
+{
+ return 1;
+}
+
+int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value)
+{
+ p[0] = value;
+ return 1;
+}
+
+ucell ofmem_arch_default_translation_mode( phys_addr_t phys )
{
/* Writable, cacheable */
/* not privileged and not locked */
@@ -109,7 +120,7 @@
/* init / cleanup */
/************************************************************************/
-static int remap_page_range( ucell phys, ucell virt, ucell size, ucell mode )
+static int remap_page_range( phys_addr_t phys, ucell virt, ucell size, ucell mode )
{
ofmem_claim_phys(phys, size, 0);
ofmem_claim_virt(virt, size, 0);
Modified: trunk/openbios-devel/include/libopenbios/ofmem.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/ofmem.h Sun Dec 5 15:16:13 2010 (r980)
+++ trunk/openbios-devel/include/libopenbios/ofmem.h Sun Dec 12 14:12:20 2010 (r981)
@@ -26,7 +26,7 @@
typedef struct mem_range {
struct mem_range *next;
- ucell start;
+ phys_addr_t start; /* sizeof(phys) >= sizeof(virt), e.g SPARC32 */
ucell size;
} range_t;
@@ -34,7 +34,7 @@
struct trans *next;
ucell virt; /* chain is sorted by virt */
ucell size;
- ucell phys;
+ phys_addr_t phys;
ucell mode;
} translation_t;
@@ -63,14 +63,16 @@
extern ucell ofmem_arch_get_heap_top(void);
extern ucell ofmem_arch_get_virt_top(void);
extern retain_t* ofmem_arch_get_retained(void);
+extern int ofmem_arch_get_physaddr_cellsize(void);
+extern int ofmem_arch_encode_physaddr(ucell *p, phys_addr_t value);
extern int ofmem_arch_get_translation_entry_size(void);
extern void ofmem_arch_create_translation_entry(ucell *transentry, translation_t *t);
-extern ucell ofmem_arch_default_translation_mode( ucell phys );
-extern void ofmem_arch_early_map_pages(ucell phys, ucell virt, ucell size,
+extern ucell ofmem_arch_default_translation_mode( phys_addr_t phys );
+extern void ofmem_arch_early_map_pages(phys_addr_t phys, ucell virt, ucell size,
ucell mode);
extern void ofmem_arch_unmap_pages(ucell virt, ucell size);
/* sparc64 uses this method */
-extern int ofmem_map_page_range( ucell phys, ucell virt, ucell size,
+extern int ofmem_map_page_range( phys_addr_t phys, ucell virt, ucell size,
ucell mode );
/* malloc interface */
@@ -93,18 +95,18 @@
extern void ofmem_register( phandle_t ph_memory, phandle_t ph_mmu );
extern ucell ofmem_claim( ucell addr, ucell size, ucell align );
-extern ucell ofmem_claim_phys( ucell mphys, ucell size, ucell align );
+extern phys_addr_t ofmem_claim_phys( phys_addr_t mphys, ucell size, ucell align );
extern ucell ofmem_claim_virt( ucell mvirt, ucell size, ucell align );
-extern ucell ofmem_retain( ucell phys, ucell size, ucell align );
+extern phys_addr_t ofmem_retain( phys_addr_t phys, ucell size, ucell align );
-extern int ofmem_map( ucell phys, ucell virt, ucell size, ucell mode );
+extern int ofmem_map( phys_addr_t phys, ucell virt, ucell size, ucell mode );
extern int ofmem_unmap( ucell virt, ucell size );
extern void ofmem_release( ucell virt, ucell size );
-extern void ofmem_release_phys( ucell phys, ucell size );
+extern void ofmem_release_phys( phys_addr_t phys, ucell size );
extern void ofmem_release_virt( ucell virt, ucell size );
-extern ucell ofmem_translate( ucell virt, ucell *ret_mode );
+extern phys_addr_t ofmem_translate( ucell virt, ucell *ret_mode );
#ifdef CONFIG_PPC
#define PAGE_SHIFT 12
Modified: trunk/openbios-devel/libopenbios/ofmem_common.c
==============================================================================
--- trunk/openbios-devel/libopenbios/ofmem_common.c Sun Dec 5 15:16:13 2010 (r980)
+++ trunk/openbios-devel/libopenbios/ofmem_common.c Sun Dec 12 14:12:20 2010 (r981)
@@ -49,7 +49,7 @@
{
printk("--- Range %s ---\n", str );
for( ; r; r=r->next )
- printk("%08lx - %08lx\n", r->start, r->start + r->size -1 );
+ printk(FMT_plx " - " FMT_plx "\n", r->start, r->start + r->size - 1);
printk("\n");
}
@@ -72,7 +72,7 @@
printk("--- Translations ---\n");
for( ; t; t=t->next )
- printk("%08lx -> %08lx [size %lx]\n", t->virt, t->phys, t->size );
+ printk("%08lx -> " FMT_plx " [size %lx]\n", t->virt, t->phys, t->size);
printk("\n");
}
#endif
@@ -246,8 +246,8 @@
{
range_t *r;
int ncells, prop_used, prop_size;
-
- ucell start, size, *prop;
+ phys_addr_t start;
+ ucell size, *prop;
if (s_phandle_memory == 0)
return;
@@ -256,8 +256,10 @@
for( r = range, ncells = 0; r ; r=r->next, ncells++ ) {
}
- /* inverse of phys_range list could take 2 more cells for the tail */
- prop_used = (ncells+1) * sizeof(ucell) * 2;
+ /* inverse of phys_range list could take 2 or more additional cells for the tail
+ For /memory, physical addresses may be wider than one ucell. */
+ prop_used = (ncells + 1) * sizeof(ucell) *
+ (((ph == s_phandle_memory) ? ofmem_arch_get_physaddr_cellsize() : 1) + 1);
if (prop_used > *mem_prop_size) {
@@ -291,7 +293,13 @@
size = r->start - start;
if (size) {
- prop[ncells++] = start;
+ if (ph == s_phandle_memory) {
+ /* physical address for /memory */
+ ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
+ } else {
+ /* virtual address for MMU */
+ prop[ncells++] = start;
+ }
prop[ncells++] = size;
}
start = r->start + r->size;
@@ -299,7 +307,13 @@
/* tail */
if (start < top_address) {
- prop[ncells++] = start;
+ if (ph == s_phandle_memory) {
+ /* physical address for /memory */
+ ncells += ofmem_arch_encode_physaddr(&prop[ncells], start);
+ } else {
+ /* virtual address for MMU */
+ prop[ncells++] = start;
+ }
prop[ncells++] = top_address - start;
}
@@ -323,7 +337,7 @@
/* client interface */
/************************************************************************/
-static int is_free( ucell ea, ucell size, range_t *r )
+static int is_free( phys_addr_t ea, ucell size, range_t *r )
{
if( size == 0 )
return 1;
@@ -336,7 +350,7 @@
return 1;
}
-static void add_entry_( ucell ea, ucell size, range_t **r )
+static void add_entry_( phys_addr_t ea, ucell size, range_t **r )
{
range_t *nr;
@@ -350,7 +364,7 @@
*r = nr;
}
-static int add_entry( ucell ea, ucell size, range_t **r )
+static int add_entry( phys_addr_t ea, ucell size, range_t **r )
{
if( !is_free( ea, size, *r ) ) {
OFMEM_TRACE("add_entry: range not free!\n");
@@ -380,7 +394,7 @@
}
}
-static void fill_range( ucell ea, ucell size, range_t **rr )
+static void fill_range( phys_addr_t ea, ucell size, range_t **rr )
{
add_entry_( ea, size, rr );
join_ranges( rr );
@@ -388,9 +402,9 @@
#endif
static ucell find_area( ucell align, ucell size, range_t *r,
- ucell min, ucell max, int reverse )
+ phys_addr_t min, phys_addr_t max, int reverse )
{
- ucell base = min;
+ phys_addr_t base = min;
range_t *r2;
if( (align & (align-1)) ) {
@@ -438,7 +452,7 @@
return -1;
}
-static ucell ofmem_claim_phys_( ucell phys, ucell size, ucell align,
+static phys_addr_t ofmem_claim_phys_( phys_addr_t phys, ucell size, ucell align,
ucell min, ucell max, int reverse )
{
ofmem_t *ofmem = ofmem_arch_get_private();
@@ -463,9 +477,9 @@
}
/* if align != 0, phys is ignored. Returns -1 on error */
-ucell ofmem_claim_phys( ucell phys, ucell size, ucell align )
+phys_addr_t ofmem_claim_phys( phys_addr_t phys, ucell size, ucell align )
{
- OFMEM_TRACE("ofmem_claim phys=" FMT_ucellx " size=" FMT_ucellx
+ OFMEM_TRACE("ofmem_claim phys=" FMT_plx " size=" FMT_ucellx
" align=" FMT_ucellx "\n",
phys, size, align);
@@ -506,12 +520,12 @@
}
/* if align != 0, phys is ignored. Returns -1 on error */
-ucell ofmem_retain( ucell phys, ucell size, ucell align )
+phys_addr_t ofmem_retain( phys_addr_t phys, ucell size, ucell align )
{
retain_t *retained = ofmem_arch_get_retained();
- ucell retain_phys;
+ phys_addr_t retain_phys;
- OFMEM_TRACE("ofmem_retain phys=" FMT_ucellx " size=" FMT_ucellx
+ OFMEM_TRACE("ofmem_retain phys=" FMT_plx " size=" FMT_ucellx
" align=" FMT_ucellx "\n",
phys, size, align);
@@ -530,7 +544,8 @@
ucell ofmem_claim( ucell addr, ucell size, ucell align )
{
ofmem_t *ofmem = ofmem_arch_get_private();
- ucell virt, phys;
+ ucell virt;
+ phys_addr_t phys;
ucell offs = addr & 0xfff;
OFMEM_TRACE("ofmem_claim " FMT_ucellx " " FMT_ucellx " " FMT_ucellx "\n", addr, size, align );
@@ -595,13 +610,13 @@
}
}
-int ofmem_map_page_range( ucell phys, ucell virt, ucell size, ucell mode )
+int ofmem_map_page_range( phys_addr_t phys, ucell virt, ucell size, ucell mode )
{
ofmem_t *ofmem = ofmem_arch_get_private();
translation_t *t, **tt;
OFMEM_TRACE("ofmem_map_page_range " FMT_ucellx
- " -> " FMT_ucellx " " FMT_ucellx " mode " FMT_ucellx "\n",
+ " -> " FMT_plx " " FMT_ucellx " mode " FMT_ucellx "\n",
virt, phys, size, mode );
split_trans( virt );
@@ -677,7 +692,7 @@
*plinkentry = t->next;
OFMEM_TRACE("unmap_page_range found "
- FMT_ucellx " -> " FMT_ucellx " " FMT_ucellx
+ FMT_ucellx " -> " FMT_plx " " FMT_ucellx
" mode " FMT_ucellx "\n",
t->virt, t->phys, t->size, t->mode );
@@ -693,7 +708,7 @@
return 0;
}
-int ofmem_map( ucell phys, ucell virt, ucell size, ucell mode )
+int ofmem_map( phys_addr_t phys, ucell virt, ucell size, ucell mode )
{
/* printk("+ofmem_map: %08lX --> %08lX (size %08lX, mode 0x%02X)\n",
virt, phys, size, mode ); */
@@ -701,7 +716,7 @@
if( (phys & 0xfff) || (virt & 0xfff) || (size & 0xfff) ) {
OFMEM_TRACE("ofmem_map: Bad parameters ("
- FMT_ucellX " " FMT_ucellX " " FMT_ucellX ")\n",
+ FMT_plx " " FMT_ucellX " " FMT_ucellX ")\n",
phys, virt, size );
phys &= ~0xfff;
@@ -751,7 +766,7 @@
}
/* virtual -> physical. */
-ucell ofmem_translate( ucell virt, ucell *mode )
+phys_addr_t ofmem_translate( ucell virt, ucell *mode )
{
ofmem_t *ofmem = ofmem_arch_get_private();
translation_t *t;
@@ -776,9 +791,9 @@
}
/* release memory allocated by ofmem_claim_phys */
-void ofmem_release_phys( ucell phys, ucell size )
+void ofmem_release_phys( phys_addr_t phys, ucell size )
{
- OFMEM_TRACE("ofmem_release_phys addr=" FMT_ucellx " size=" FMT_ucellx "\n",
+ OFMEM_TRACE("ofmem_release_phys addr=" FMT_plx " size=" FMT_ucellx "\n",
phys, size);
ofmem_t *ofmem = ofmem_arch_get_private();
@@ -802,8 +817,8 @@
__func__, virt, size);
ucell mode;
- ucell phys = ofmem_translate(virt, &mode);
- if (phys == (ucell)-1) {
+ phys_addr_t phys = ofmem_translate(virt, &mode);
+ if (phys == (phys_addr_t)-1) {
OFMEM_TRACE("%s: no mapping\n", __func__);
return;
}
More information about the OpenBIOS
mailing list