[PATCH] ps3: Preallocate bootmem memory for ps3fb
Preallocate bootmem memory for the PS3 frame buffer device, which needs a large block of physically-contiguous memory. The size of this memory block is configurable: - The config option CONFIG_FB_PS3_DEFAULT_SIZE_M allows to specify the default amount of memory (in MiB) allocated to the virtual frame buffer. - The early boot parameter `ps3fb=xxx' allows to override the default value. It will be rounded up to a multiple of 1 MiB, if needed. Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Cc: James Simmons <jsimmons@infradead.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
dcfe2666ff
commit
fbdb3e5be3
|
@ -24,6 +24,7 @@
|
|||
#include <linux/root_dev.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/firmware.h>
|
||||
|
@ -80,6 +81,46 @@ static void ps3_panic(char *str)
|
|||
for (;;) ;
|
||||
}
|
||||
|
||||
|
||||
static void prealloc(struct ps3_prealloc *p)
|
||||
{
|
||||
if (!p->size)
|
||||
return;
|
||||
|
||||
p->address = __alloc_bootmem(p->size, p->align, __pa(MAX_DMA_ADDRESS));
|
||||
if (!p->address) {
|
||||
printk(KERN_ERR "%s: Cannot allocate %s\n", __FUNCTION__,
|
||||
p->name);
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "%s: %lu bytes at %p\n", p->name, p->size,
|
||||
p->address);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FB_PS3
|
||||
struct ps3_prealloc ps3fb_videomemory = {
|
||||
.name = "ps3fb videomemory",
|
||||
.size = CONFIG_FB_PS3_DEFAULT_SIZE_M*1024*1024,
|
||||
.align = 1024*1024 /* the GPU requires 1 MiB alignment */
|
||||
};
|
||||
#define prealloc_ps3fb_videomemory() prealloc(&ps3fb_videomemory)
|
||||
|
||||
static int __init early_parse_ps3fb(char *p)
|
||||
{
|
||||
if (!p)
|
||||
return 1;
|
||||
|
||||
ps3fb_videomemory.size = _ALIGN_UP(memparse(p, &p),
|
||||
ps3fb_videomemory.align);
|
||||
return 0;
|
||||
}
|
||||
early_param("ps3fb", early_parse_ps3fb);
|
||||
#else
|
||||
#define prealloc_ps3fb_videomemory() do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
static void __init ps3_setup_arch(void)
|
||||
{
|
||||
union ps3_firmware_version v;
|
||||
|
@ -101,6 +142,7 @@ static void __init ps3_setup_arch(void)
|
|||
conswitchp = &dummy_con;
|
||||
#endif
|
||||
|
||||
prealloc_ps3fb_videomemory();
|
||||
ppc_md.power_save = ps3_power_save;
|
||||
|
||||
DBG(" <- %s:%d\n", __func__, __LINE__);
|
||||
|
|
|
@ -388,4 +388,13 @@ struct ps3_vuart_port_device {
|
|||
|
||||
int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
|
||||
|
||||
struct ps3_prealloc {
|
||||
const char *name;
|
||||
void *address;
|
||||
unsigned long size;
|
||||
unsigned long align;
|
||||
};
|
||||
|
||||
extern struct ps3_prealloc ps3fb_videomemory;
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue