|
@@ -1060,6 +1060,11 @@ static const char *sunxi_get_mon_desc(enum sunxi_monitor monitor)
|
|
|
return NULL; /* never reached */
|
|
|
}
|
|
|
|
|
|
+ulong board_get_usable_ram_top(ulong total_size)
|
|
|
+{
|
|
|
+ return gd->ram_top - CONFIG_SUNXI_MAX_FB_SIZE;
|
|
|
+}
|
|
|
+
|
|
|
void *video_hw_init(void)
|
|
|
{
|
|
|
static GraphicDevice *graphic_device = &sunxi_display.graphic_device;
|
|
@@ -1076,7 +1081,7 @@ void *video_hw_init(void)
|
|
|
memset(&sunxi_display, 0, sizeof(struct sunxi_display));
|
|
|
|
|
|
printf("Reserved %dkB of RAM for Framebuffer.\n",
|
|
|
- CONFIG_SUNXI_FB_SIZE >> 10);
|
|
|
+ CONFIG_SUNXI_MAX_FB_SIZE >> 10);
|
|
|
gd->fb_base = gd->ram_top;
|
|
|
|
|
|
video_get_ctfb_res_modes(RES_MODE_1024x768, 24, &mode,
|
|
@@ -1194,6 +1199,7 @@ int sunxi_simplefb_setup(void *blob)
|
|
|
{
|
|
|
static GraphicDevice *graphic_device = &sunxi_display.graphic_device;
|
|
|
int offset, ret;
|
|
|
+ u64 start, size;
|
|
|
const char *pipeline = NULL;
|
|
|
|
|
|
#ifdef CONFIG_MACH_SUN4I
|
|
@@ -1237,6 +1243,20 @@ int sunxi_simplefb_setup(void *blob)
|
|
|
return 0; /* Keep older kernels working */
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Do not report the framebuffer as free RAM to the OS, note we cannot
|
|
|
+ * use fdt_add_mem_rsv() here, because then it is still seen as RAM,
|
|
|
+ * and e.g. Linux refuses to iomap RAM on ARM, see:
|
|
|
+ * linux/arch/arm/mm/ioremap.c around line 301.
|
|
|
+ */
|
|
|
+ start = gd->bd->bi_dram[0].start;
|
|
|
+ size = gd->bd->bi_dram[0].size - CONFIG_SUNXI_MAX_FB_SIZE;
|
|
|
+ ret = fdt_fixup_memory_banks(blob, &start, &size, 1);
|
|
|
+ if (ret) {
|
|
|
+ eprintf("Cannot setup simplefb: Error reserving memory\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
ret = fdt_setup_simplefb_node(blob, offset, gd->fb_base,
|
|
|
graphic_device->winSizeX, graphic_device->winSizeY,
|
|
|
graphic_device->winSizeX * graphic_device->gdfBytesPP,
|