From: Hans de Goede <hidden> Date: 2018-06-18 15:14:01
bgrt_image_size is necessary to (optionally) show the boot graphics from
the efifb code. The efifb driver is a platform driver, using a normal
driver probe() driver callback. So even though it is always builtin it
cannot reference __initdata.
Acked-by: Ard Biesheuvel <redacted>
Signed-off-by: Hans de Goede <redacted>
---
drivers/firmware/efi/efi-bgrt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Hans de Goede <hidden> Date: 2018-06-18 15:14:02
On systems where fbcon is configured for deferred console takeover, the
intend is for the framebuffer to show the boot graphics (e.g a vendor
logo) until some message (e.g. an error) is printed or a graphical
session takes over.
Some firmware relies on the OS to show the boot graphics.
This patch adds support to efifb to show the boot graphics and
automatically enables this when fbcon is configured for deferred
console takeover.
Signed-off-by: Hans de Goede <redacted>
---
Changes in v2:
-Simplify the comment about acpi_bgrt.status
-Clear the parts of the screen which don't contain the logo to black
(memset to 0), rather then leaving them as is
---
drivers/video/fbdev/efifb.c | 140 ++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
@@ -9,16 +9,39 @@#include<linux/kernel.h>#include<linux/efi.h>+#include<linux/efi-bgrt.h>#include<linux/errno.h>#include<linux/fb.h>#include<linux/pci.h>#include<linux/platform_device.h>+#include<linux/printk.h>#include<linux/screen_info.h>#include<video/vga.h>#include<asm/efi.h>#include<drm/drm_utils.h> /* For drm_get_panel_orientation_quirk */#include<drm/drm_connector.h> /* For DRM_MODE_PANEL_ORIENTATION_* */+structbmp_file_header{+u16id;+u32file_size;+u32reserved;+u32bitmap_offset;+}__packed;++structbmp_dib_header{+u32dib_header_size;+s32width;+s32height;+u16planes;+u16bpp;+u32compression;+u32bitmap_size;+u32horz_resolution;+u32vert_resolution;+u32colors_used;+u32colors_important;+}__packed;+staticboolrequest_mem_succeeded=false;staticboolnowc=false;
@@ -66,6 +89,121 @@ static int efifb_setcolreg(unsigned regno, unsigned red, unsigned green,return0;}+/*+*Iffbcondefferedconsoletakeoverisconfigured,theintentisforthe+*framebuffertoshowthebootgraphics(e.g.vendorlogo)untilthereissome+*(error)messagetodisplay.Butthebootgraphicsmayhavebeendestroyedby+*e.g.optionROMoutput,detectthisandrestorethebootgraphics.+*/+#if defined CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER && \+definedCONFIG_ACPI_BGRT+staticvoidefifb_copy_bmp(u8*src,u32*dst,intwidth,structscreen_info*si)+{+u8r,g,b;++while(width--){+b=*src++;+g=*src++;+r=*src++;+*dst++=(r<<si->red_pos)|+(g<<si->green_pos)|+(b<<si->blue_pos);+}+}++staticvoidefifb_show_boot_graphics(structfb_info*info)+{+u32bmp_width,bmp_height,bmp_pitch,screen_pitch,dst_x,y,src_y;+structscreen_info*si=&screen_info;+structbmp_file_header*file_header;+structbmp_dib_header*dib_header;+void*bgrt_image=NULL;+u8*dst=info->screen_base;++if(!bgrt_tab.image_address){+pr_info("efifb: No BGRT, not showing boot graphics\n");+return;+}++/* Avoid flashing the logo if we're going to print std probe messages */+if(console_loglevel>CONSOLE_LOGLEVEL_QUIET)+return;++/* bgrt_tab.status is unreliable, so we don't check it */++if(si->lfb_depth!=32){+pr_info("efifb: not 32 bits, not showing boot graphics\n");+return;+}++bgrt_image=memremap(bgrt_tab.image_address,bgrt_image_size,+MEMREMAP_WB);+if(!bgrt_image){+pr_warn("efifb: Ignoring BGRT: failed to map image memory\n");+return;+}++if(bgrt_image_size<(sizeof(*file_header)+sizeof(*dib_header)))+gotoerror;++file_header=bgrt_image;+if(file_header->id!=0x4d42||file_header->reserved!=0)+gotoerror;++dib_header=bgrt_image+sizeof(*file_header);+if(dib_header->dib_header_size!=40||dib_header->width<0||+dib_header->planes!=1||dib_header->bpp!=24||+dib_header->compression!=0)+gotoerror;++bmp_width=dib_header->width;+bmp_height=abs(dib_header->height);+bmp_pitch=round_up(3*bmp_width,4);+screen_pitch=si->lfb_linelength;++if((file_header->bitmap_offset+bmp_pitch*bmp_height)>+bgrt_image_size)+gotoerror;++if((bgrt_tab.image_offset_x+bmp_width)>si->lfb_width||+(bgrt_tab.image_offset_y+bmp_height)>si->lfb_height)+gotoerror;++pr_info("efifb: showing boot graphics\n");++for(y=0;y<si->lfb_height;y++,dst+=si->lfb_linelength){+/* Only background? */+if(y<bgrt_tab.image_offset_y||+y>=(bgrt_tab.image_offset_y+bmp_height)){+memset(dst,0,4*si->lfb_width);+continue;+}++src_y=y-bgrt_tab.image_offset_y;+/* Positive header height means upside down row order */+if(dib_header->height>0)+src_y=(bmp_height-1)-src_y;++memset(dst,0,bgrt_tab.image_offset_x*4);+dst_x=bgrt_tab.image_offset_x;+efifb_copy_bmp(bgrt_image+file_header->bitmap_offset++src_y*bmp_pitch,+(u32*)dst+dst_x,bmp_width,si);+dst_x+=bmp_width;+memset((u32*)dst+dst_x,0,(si->lfb_width-dst_x)*4);+}++memunmap(bgrt_image);+return;++error:+memunmap(bgrt_image);+pr_warn("efifb: Ignoring BGRT: unexpected or invalid BMP data\n");+}+#else+staticinlinevoidefifb_show_boot_graphics(structfb_info*info){}+#endif+staticvoidefifb_destroy(structfb_info*info){if(info->screen_base)
@@ -283,6 +421,8 @@ static int efifb_probe(struct platform_device *dev)gotoerr_release_fb;}+efifb_show_boot_graphics(info);+pr_info("efifb: framebuffer at 0x%lx, using %dk, total %dk\n",efifb_fix.smem_start,size_remap/1024,size_total/1024);pr_info("efifb: mode is %dx%dx%d, linelength=%d, pages=%d\n",
From: Hans de Goede <hidden> Date: 2018-07-02 11:26:06
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
Regards,
Hans
On 18-06-18 17:13, Hans de Goede wrote:
quoted hunk
bgrt_image_size is necessary to (optionally) show the boot graphics from
the efifb code. The efifb driver is a platform driver, using a normal
driver probe() driver callback. So even though it is always builtin it
cannot reference __initdata.
Acked-by: Ard Biesheuvel <redacted>
Signed-off-by: Hans de Goede <redacted>
---
drivers/firmware/efi/efi-bgrt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
On 2 July 2018 at 13:26, Hans de Goede [off-list ref] wrote:
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
... or I could take everything through the efi tree instead, as
already discussed between Bartlomiej and me in the context of another
patch series that touches both the fbdev and efi trees.
Bartlomiej, that would require your ack on patch
[PATCH v2 2/2] efifb: Copy the ACPI BGRT boot graphics to the framebuffer
https://marc.info/?l=linux-fbdev&m2933484616993&w=2
so if you're ok with that, I will queue both of these for v4.19
On 18-06-18 17:13, Hans de Goede wrote:
quoted
bgrt_image_size is necessary to (optionally) show the boot graphics from
the efifb code. The efifb driver is a platform driver, using a normal
driver probe() driver callback. So even though it is always builtin it
cannot reference __initdata.
Acked-by: Ard Biesheuvel <redacted>
Signed-off-by: Hans de Goede <redacted>
---
drivers/firmware/efi/efi-bgrt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/firmware/efi/efi-bgrt.c
b/drivers/firmware/efi/efi-bgrt.c
index 50793fda7819..b22ccfb0c991 100644
On Monday, July 02, 2018 01:46:09 PM Ard Biesheuvel wrote:
On 2 July 2018 at 13:26, Hans de Goede [off-list ref] wrote:
quoted
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
... or I could take everything through the efi tree instead, as
already discussed between Bartlomiej and me in the context of another
patch series that touches both the fbdev and efi trees.
Bartlomiej, that would require your ack on patch
[PATCH v2 2/2] efifb: Copy the ACPI BGRT boot graphics to the framebuffer
https://marc.info/?l=linux-fbdev&m2933484616993&w=2
so if you're ok with that, I will queue both of these for v4.19
I would really prefer to merge this patchset through fbdev tree
as efi tree doesn't have fbcon deferred console takeover patches
(which are required by efifb changes under discussion).
quoted
On 18-06-18 17:13, Hans de Goede wrote:
quoted
bgrt_image_size is necessary to (optionally) show the boot graphics from
the efifb code. The efifb driver is a platform driver, using a normal
driver probe() driver callback. So even though it is always builtin it
cannot reference __initdata.
Acked-by: Ard Biesheuvel <redacted>
Signed-off-by: Hans de Goede <redacted>
---
drivers/firmware/efi/efi-bgrt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/firmware/efi/efi-bgrt.c
b/drivers/firmware/efi/efi-bgrt.c
index 50793fda7819..b22ccfb0c991 100644
On 2 July 2018 at 13:57, Bartlomiej Zolnierkiewicz
[off-list ref] wrote:
On Monday, July 02, 2018 01:46:09 PM Ard Biesheuvel wrote:
quoted
On 2 July 2018 at 13:26, Hans de Goede [off-list ref] wrote:
quoted
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
... or I could take everything through the efi tree instead, as
already discussed between Bartlomiej and me in the context of another
patch series that touches both the fbdev and efi trees.
Bartlomiej, that would require your ack on patch
[PATCH v2 2/2] efifb: Copy the ACPI BGRT boot graphics to the framebuffer
https://marc.info/?l=linux-fbdev&m2933484616993&w=2
so if you're ok with that, I will queue both of these for v4.19
I would really prefer to merge this patchset through fbdev tree
as efi tree doesn't have fbcon deferred console takeover patches
(which are required by efifb changes under discussion).
Ah ok, I didn't realise that. I don't think there will be any
conflicts, since the efifb changes in the efi tree and these changes
operate on different parts of the file. But let's double check before
taking stuff into -next.
(efi/next is not pulled into -next directly, but via the tip:efi tree,
and I haven't sent a pull request yet for v4.19)
quoted
quoted
On 18-06-18 17:13, Hans de Goede wrote:
quoted
bgrt_image_size is necessary to (optionally) show the boot graphics from
the efifb code. The efifb driver is a platform driver, using a normal
driver probe() driver callback. So even though it is always builtin it
cannot reference __initdata.
Acked-by: Ard Biesheuvel <redacted>
Signed-off-by: Hans de Goede <redacted>
---
drivers/firmware/efi/efi-bgrt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/firmware/efi/efi-bgrt.c
b/drivers/firmware/efi/efi-bgrt.c
index 50793fda7819..b22ccfb0c991 100644
Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics
--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
On Monday, July 02, 2018 02:02:47 PM Ard Biesheuvel wrote:
On 2 July 2018 at 13:57, Bartlomiej Zolnierkiewicz
[off-list ref] wrote:
quoted
On Monday, July 02, 2018 01:46:09 PM Ard Biesheuvel wrote:
quoted
On 2 July 2018 at 13:26, Hans de Goede [off-list ref] wrote:
quoted
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
... or I could take everything through the efi tree instead, as
already discussed between Bartlomiej and me in the context of another
patch series that touches both the fbdev and efi trees.
Bartlomiej, that would require your ack on patch
[PATCH v2 2/2] efifb: Copy the ACPI BGRT boot graphics to the framebuffer
https://marc.info/?l=linux-fbdev&m2933484616993&w=2
so if you're ok with that, I will queue both of these for v4.19
I would really prefer to merge this patchset through fbdev tree
as efi tree doesn't have fbcon deferred console takeover patches
(which are required by efifb changes under discussion).
Ah ok, I didn't realise that. I don't think there will be any
conflicts, since the efifb changes in the efi tree and these changes
operate on different parts of the file. But let's double check before
taking stuff into -next.
(efi/next is not pulled into -next directly, but via the tip:efi tree,
and I haven't sent a pull request yet for v4.19)
I've verified this with -next from today and it auto-merged fine (for
testing purposes I've applied both patches to -next and then pulled in
efi/next from efi.git tree).
I've applied both patches to fbdev-for-next (I hope it is fine with you).
Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics
On 3 July 2018 at 17:24, Bartlomiej Zolnierkiewicz
[off-list ref] wrote:
On Monday, July 02, 2018 02:02:47 PM Ard Biesheuvel wrote:
quoted
On 2 July 2018 at 13:57, Bartlomiej Zolnierkiewicz
[off-list ref] wrote:
quoted
On Monday, July 02, 2018 01:46:09 PM Ard Biesheuvel wrote:
quoted
On 2 July 2018 at 13:26, Hans de Goede [off-list ref] wrote:
quoted
Bartlomiej,
Now that the fbcon deferred console takeover patches have been
merged I believe this series can be merged too ?
Note the first patch has an ack from Ard for merging the
1 line efi change through the fbdev tree.
... or I could take everything through the efi tree instead, as
already discussed between Bartlomiej and me in the context of another
patch series that touches both the fbdev and efi trees.
Bartlomiej, that would require your ack on patch
[PATCH v2 2/2] efifb: Copy the ACPI BGRT boot graphics to the framebuffer
https://marc.info/?l=linux-fbdev&m2933484616993&w=2
so if you're ok with that, I will queue both of these for v4.19
I would really prefer to merge this patchset through fbdev tree
as efi tree doesn't have fbcon deferred console takeover patches
(which are required by efifb changes under discussion).
Ah ok, I didn't realise that. I don't think there will be any
conflicts, since the efifb changes in the efi tree and these changes
operate on different parts of the file. But let's double check before
taking stuff into -next.
(efi/next is not pulled into -next directly, but via the tip:efi tree,
and I haven't sent a pull request yet for v4.19)
I've verified this with -next from today and it auto-merged fine (for
testing purposes I've applied both patches to -next and then pulled in
efi/next from efi.git tree).
I've applied both patches to fbdev-for-next (I hope it is fine with you).