Commit 4a283339 authored by David S. Miller's avatar David S. Miller

[SPARC64]: Initialize MDESC earlier and use lmb_alloc()

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ad072004
/* mdesc.c: Sun4V machine description handling. /* mdesc.c: Sun4V machine description handling.
* *
* Copyright (C) 2007 David S. Miller <davem@davemloft.net> * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net>
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/bootmem.h> #include <linux/lmb.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -84,24 +84,28 @@ static void mdesc_handle_init(struct mdesc_handle *hp, ...@@ -84,24 +84,28 @@ static void mdesc_handle_init(struct mdesc_handle *hp,
hp->handle_size = handle_size; hp->handle_size = handle_size;
} }
static struct mdesc_handle * __init mdesc_bootmem_alloc(unsigned int mdesc_size) static struct mdesc_handle * __init mdesc_lmb_alloc(unsigned int mdesc_size)
{ {
struct mdesc_handle *hp;
unsigned int handle_size, alloc_size; unsigned int handle_size, alloc_size;
struct mdesc_handle *hp;
unsigned long paddr;
handle_size = (sizeof(struct mdesc_handle) - handle_size = (sizeof(struct mdesc_handle) -
sizeof(struct mdesc_hdr) + sizeof(struct mdesc_hdr) +
mdesc_size); mdesc_size);
alloc_size = PAGE_ALIGN(handle_size); alloc_size = PAGE_ALIGN(handle_size);
hp = __alloc_bootmem(alloc_size, PAGE_SIZE, 0UL); paddr = lmb_alloc(alloc_size, PAGE_SIZE);
if (hp)
mdesc_handle_init(hp, handle_size, hp);
hp = NULL;
if (paddr) {
hp = __va(paddr);
mdesc_handle_init(hp, handle_size, hp);
}
return hp; return hp;
} }
static void mdesc_bootmem_free(struct mdesc_handle *hp) static void mdesc_lmb_free(struct mdesc_handle *hp)
{ {
unsigned int alloc_size, handle_size = hp->handle_size; unsigned int alloc_size, handle_size = hp->handle_size;
unsigned long start, end; unsigned long start, end;
...@@ -124,9 +128,9 @@ static void mdesc_bootmem_free(struct mdesc_handle *hp) ...@@ -124,9 +128,9 @@ static void mdesc_bootmem_free(struct mdesc_handle *hp)
} }
} }
static struct mdesc_mem_ops bootmem_mdesc_ops = { static struct mdesc_mem_ops lmb_mdesc_ops = {
.alloc = mdesc_bootmem_alloc, .alloc = mdesc_lmb_alloc,
.free = mdesc_bootmem_free, .free = mdesc_lmb_free,
}; };
static struct mdesc_handle *mdesc_kmalloc(unsigned int mdesc_size) static struct mdesc_handle *mdesc_kmalloc(unsigned int mdesc_size)
...@@ -888,7 +892,7 @@ void __init sun4v_mdesc_init(void) ...@@ -888,7 +892,7 @@ void __init sun4v_mdesc_init(void)
printk("MDESC: Size is %lu bytes.\n", len); printk("MDESC: Size is %lu bytes.\n", len);
hp = mdesc_alloc(len, &bootmem_mdesc_ops); hp = mdesc_alloc(len, &lmb_mdesc_ops);
if (hp == NULL) { if (hp == NULL) {
prom_printf("MDESC: alloc of %lu bytes failed.\n", len); prom_printf("MDESC: alloc of %lu bytes failed.\n", len);
prom_halt(); prom_halt();
......
...@@ -1216,6 +1216,9 @@ void __init paging_init(void) ...@@ -1216,6 +1216,9 @@ void __init paging_init(void)
prom_build_devicetree(); prom_build_devicetree();
if (tlb_type == hypervisor)
sun4v_mdesc_init();
/* Setup bootmem... */ /* Setup bootmem... */
pages_avail = 0; pages_avail = 0;
last_valid_pfn = end_pfn = bootmem_init(&pages_avail, phys_base); last_valid_pfn = end_pfn = bootmem_init(&pages_avail, phys_base);
...@@ -1224,9 +1227,6 @@ void __init paging_init(void) ...@@ -1224,9 +1227,6 @@ void __init paging_init(void)
kernel_physical_mapping_init(); kernel_physical_mapping_init();
if (tlb_type == hypervisor)
sun4v_mdesc_init();
{ {
unsigned long zones_size[MAX_NR_ZONES]; unsigned long zones_size[MAX_NR_ZONES];
unsigned long zholes_size[MAX_NR_ZONES]; unsigned long zholes_size[MAX_NR_ZONES];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment