root/drivers/firmware/efi/efi-bgrt.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. efi_bgrt_init

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright 2012 Intel Corporation
   4  * Author: Josh Triplett <josh@joshtriplett.org>
   5  *
   6  * Based on the bgrt driver:
   7  * Copyright 2012 Red Hat, Inc <mjg@redhat.com>
   8  * Author: Matthew Garrett
   9  */
  10 
  11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12 
  13 #include <linux/kernel.h>
  14 #include <linux/init.h>
  15 #include <linux/acpi.h>
  16 #include <linux/efi.h>
  17 #include <linux/efi-bgrt.h>
  18 
  19 struct acpi_table_bgrt bgrt_tab;
  20 size_t bgrt_image_size;
  21 
  22 struct bmp_header {
  23         u16 id;
  24         u32 size;
  25 } __packed;
  26 
  27 void __init efi_bgrt_init(struct acpi_table_header *table)
  28 {
  29         void *image;
  30         struct bmp_header bmp_header;
  31         struct acpi_table_bgrt *bgrt = &bgrt_tab;
  32 
  33         if (acpi_disabled)
  34                 return;
  35 
  36         if (!efi_enabled(EFI_MEMMAP))
  37                 return;
  38 
  39         if (table->length < sizeof(bgrt_tab)) {
  40                 pr_notice("Ignoring BGRT: invalid length %u (expected %zu)\n",
  41                        table->length, sizeof(bgrt_tab));
  42                 return;
  43         }
  44         *bgrt = *(struct acpi_table_bgrt *)table;
  45         if (bgrt->version != 1) {
  46                 pr_notice("Ignoring BGRT: invalid version %u (expected 1)\n",
  47                        bgrt->version);
  48                 goto out;
  49         }
  50         if (bgrt->image_type != 0) {
  51                 pr_notice("Ignoring BGRT: invalid image type %u (expected 0)\n",
  52                        bgrt->image_type);
  53                 goto out;
  54         }
  55         if (!bgrt->image_address) {
  56                 pr_notice("Ignoring BGRT: null image address\n");
  57                 goto out;
  58         }
  59 
  60         if (efi_mem_type(bgrt->image_address) != EFI_BOOT_SERVICES_DATA) {
  61                 pr_notice("Ignoring BGRT: invalid image address\n");
  62                 goto out;
  63         }
  64         image = early_memremap(bgrt->image_address, sizeof(bmp_header));
  65         if (!image) {
  66                 pr_notice("Ignoring BGRT: failed to map image header memory\n");
  67                 goto out;
  68         }
  69 
  70         memcpy(&bmp_header, image, sizeof(bmp_header));
  71         early_memunmap(image, sizeof(bmp_header));
  72         if (bmp_header.id != 0x4d42) {
  73                 pr_notice("Ignoring BGRT: Incorrect BMP magic number 0x%x (expected 0x4d42)\n",
  74                         bmp_header.id);
  75                 goto out;
  76         }
  77         bgrt_image_size = bmp_header.size;
  78         efi_mem_reserve(bgrt->image_address, bgrt_image_size);
  79 
  80         return;
  81 out:
  82         memset(bgrt, 0, sizeof(bgrt_tab));
  83 }

/* [<][>][^][v][top][bottom][index][help] */