summaryrefslogtreecommitdiff
path: root/drivers/video/simplefb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/simplefb.c')
-rw-r--r--drivers/video/simplefb.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb.c
index 8d0772d4e51..631ae00b1e1 100644
--- a/drivers/video/simplefb.c
+++ b/drivers/video/simplefb.c
@@ -9,6 +9,8 @@
#include <log.h>
#include <video.h>
#include <asm/global_data.h>
+#include <asm/system.h>
+#include <linux/sizes.h>
static int simple_video_probe(struct udevice *dev)
{
@@ -20,8 +22,14 @@ static int simple_video_probe(struct udevice *dev)
fdt_addr_t base;
fdt_size_t size;
u32 width, height, stride, rot;
+ struct ofnode_phandle_args args;
+
+ ret = dev_read_phandle_with_args(dev, "memory-region", NULL, 0, 0, &args);
+ if (ret)
+ base = dev_read_addr_size(dev, &size);
+ else
+ base = ofnode_get_addr_size(args.node, "reg", &size);
- base = dev_read_addr_size(dev, &size);
if (base == FDT_ADDR_T_NONE) {
debug("%s: Failed to decode memory region\n", __func__);
return -EINVAL;
@@ -37,6 +45,13 @@ static int simple_video_probe(struct udevice *dev)
plat->base = base;
plat->size = size;
+#ifdef CONFIG_ARM64
+ /* The framebuffer buffer might not be mapped on some devices */
+ if (plat->base % SZ_4K)
+ log_warning("Framebuffer base %lx is not 4k aligned!\n", plat->base);
+ mmu_map_region((phys_addr_t)plat->base, (phys_addr_t)ALIGN(plat->size, SZ_4K), false);
+#endif
+
video_set_flush_dcache(dev, true);
debug("%s: Query resolution...\n", __func__);