projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
efifb: Add support for 64-bit frame buffer addresses
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
video
/
fbdev
/
efifb.c
diff --git
a/drivers/video/fbdev/efifb.c
b/drivers/video/fbdev/efifb.c
index 4bfff349b1fbb56f0b99e206f21fc2986ad4db0d..95d293b7445a83473bc2131cf657f5de14ef52b3 100644
(file)
--- a/
drivers/video/fbdev/efifb.c
+++ b/
drivers/video/fbdev/efifb.c
@@
-114,6
+114,20
@@
static int efifb_setup(char *options)
return 0;
}
return 0;
}
+static inline bool fb_base_is_valid(void)
+{
+ if (screen_info.lfb_base)
+ return true;
+
+ if (!(screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE))
+ return false;
+
+ if (screen_info.ext_lfb_base)
+ return true;
+
+ return false;
+}
+
static int efifb_probe(struct platform_device *dev)
{
struct fb_info *info;
static int efifb_probe(struct platform_device *dev)
{
struct fb_info *info;
@@
-141,7
+155,7
@@
static int efifb_probe(struct platform_device *dev)
screen_info.lfb_depth = 32;
if (!screen_info.pages)
screen_info.pages = 1;
screen_info.lfb_depth = 32;
if (!screen_info.pages)
screen_info.pages = 1;
- if (!
screen_info.lfb_base
) {
+ if (!
fb_base_is_valid()
) {
printk(KERN_DEBUG "efifb: invalid framebuffer address\n");
return -ENODEV;
}
printk(KERN_DEBUG "efifb: invalid framebuffer address\n");
return -ENODEV;
}
@@
-160,6
+174,14
@@
static int efifb_probe(struct platform_device *dev)
}
efifb_fix.smem_start = screen_info.lfb_base;
}
efifb_fix.smem_start = screen_info.lfb_base;
+
+ if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) {
+ u64 ext_lfb_base;
+
+ ext_lfb_base = (u64)(unsigned long)screen_info.ext_lfb_base << 32;
+ efifb_fix.smem_start |= ext_lfb_base;
+ }
+
efifb_defined.bits_per_pixel = screen_info.lfb_depth;
efifb_defined.xres = screen_info.lfb_width;
efifb_defined.yres = screen_info.lfb_height;
efifb_defined.bits_per_pixel = screen_info.lfb_depth;
efifb_defined.xres = screen_info.lfb_width;
efifb_defined.yres = screen_info.lfb_height;