forked from Minki/linux
7f9b474c92
The promise of pretty boot splashes from firmware via BGRT was at best only that; a promise. The kernel diligently checks to make sure the BGRT data firmware gives it is valid, and dutifully warns the user when it isn't. However, it does so via the pr_err log level which seems unnecessary. The user cannot do anything about this and there really isn't an error on the part of Linux to correct. This lowers the log level by using pr_notice instead. Users will no longer have their boot process uglified by the kernel reminding us that firmware can and often is broken when the 'quiet' kernel parameter is specified. Ironic, considering BGRT is supposed to make boot pretty to begin with. Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org> Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk> Reviewed-by: Josh Triplett <josh@joshtriplett.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Môshe van der Sterre <me@moshe.nl> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-efi@vger.kernel.org Link: http://lkml.kernel.org/r/1462303781-8686-4-git-send-email-matt@codeblueprint.co.uk Signed-off-by: Ingo Molnar <mingo@kernel.org>
103 lines
2.5 KiB
C
103 lines
2.5 KiB
C
/*
|
|
* Copyright 2012 Intel Corporation
|
|
* Author: Josh Triplett <josh@joshtriplett.org>
|
|
*
|
|
* Based on the bgrt driver:
|
|
* Copyright 2012 Red Hat, Inc <mjg@redhat.com>
|
|
* Author: Matthew Garrett
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/efi.h>
|
|
#include <linux/efi-bgrt.h>
|
|
|
|
struct acpi_table_bgrt *bgrt_tab;
|
|
void *__initdata bgrt_image;
|
|
size_t __initdata bgrt_image_size;
|
|
|
|
struct bmp_header {
|
|
u16 id;
|
|
u32 size;
|
|
} __packed;
|
|
|
|
void __init efi_bgrt_init(void)
|
|
{
|
|
acpi_status status;
|
|
void *image;
|
|
struct bmp_header bmp_header;
|
|
|
|
if (acpi_disabled)
|
|
return;
|
|
|
|
status = acpi_get_table("BGRT", 0,
|
|
(struct acpi_table_header **)&bgrt_tab);
|
|
if (ACPI_FAILURE(status))
|
|
return;
|
|
|
|
if (bgrt_tab->header.length < sizeof(*bgrt_tab)) {
|
|
pr_notice("Ignoring BGRT: invalid length %u (expected %zu)\n",
|
|
bgrt_tab->header.length, sizeof(*bgrt_tab));
|
|
return;
|
|
}
|
|
if (bgrt_tab->version != 1) {
|
|
pr_notice("Ignoring BGRT: invalid version %u (expected 1)\n",
|
|
bgrt_tab->version);
|
|
return;
|
|
}
|
|
if (bgrt_tab->status & 0xfe) {
|
|
pr_notice("Ignoring BGRT: reserved status bits are non-zero %u\n",
|
|
bgrt_tab->status);
|
|
return;
|
|
}
|
|
if (bgrt_tab->image_type != 0) {
|
|
pr_notice("Ignoring BGRT: invalid image type %u (expected 0)\n",
|
|
bgrt_tab->image_type);
|
|
return;
|
|
}
|
|
if (!bgrt_tab->image_address) {
|
|
pr_notice("Ignoring BGRT: null image address\n");
|
|
return;
|
|
}
|
|
|
|
image = memremap(bgrt_tab->image_address, sizeof(bmp_header), MEMREMAP_WB);
|
|
if (!image) {
|
|
pr_notice("Ignoring BGRT: failed to map image header memory\n");
|
|
return;
|
|
}
|
|
|
|
memcpy(&bmp_header, image, sizeof(bmp_header));
|
|
memunmap(image);
|
|
if (bmp_header.id != 0x4d42) {
|
|
pr_notice("Ignoring BGRT: Incorrect BMP magic number 0x%x (expected 0x4d42)\n",
|
|
bmp_header.id);
|
|
return;
|
|
}
|
|
bgrt_image_size = bmp_header.size;
|
|
|
|
bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL | __GFP_NOWARN);
|
|
if (!bgrt_image) {
|
|
pr_notice("Ignoring BGRT: failed to allocate memory for image (wanted %zu bytes)\n",
|
|
bgrt_image_size);
|
|
return;
|
|
}
|
|
|
|
image = memremap(bgrt_tab->image_address, bmp_header.size, MEMREMAP_WB);
|
|
if (!image) {
|
|
pr_notice("Ignoring BGRT: failed to map image memory\n");
|
|
kfree(bgrt_image);
|
|
bgrt_image = NULL;
|
|
return;
|
|
}
|
|
|
|
memcpy(bgrt_image, image, bgrt_image_size);
|
|
memunmap(image);
|
|
}
|