Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
efi-bgrt.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Intel Corporation
3  * Author: Josh Triplett <[email protected]>
4  *
5  * Based on the bgrt driver:
6  * Copyright 2012 Red Hat, Inc <[email protected]>
7  * Author: Matthew Garrett
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 #include <linux/kernel.h>
14 #include <linux/acpi.h>
15 #include <linux/efi.h>
16 #include <linux/efi-bgrt.h>
17 
19 void *bgrt_image;
21 
22 struct bmp_header {
25 } __packed;
26 
27 void efi_bgrt_init(void)
28 {
30  void __iomem *image;
31  bool ioremapped = false;
32  struct bmp_header bmp_header;
33 
34  if (acpi_disabled)
35  return;
36 
37  status = acpi_get_table("BGRT", 0,
38  (struct acpi_table_header **)&bgrt_tab);
39  if (ACPI_FAILURE(status))
40  return;
41 
42  if (bgrt_tab->version != 1)
43  return;
44  if (bgrt_tab->image_type != 0 || !bgrt_tab->image_address)
45  return;
46 
47  image = efi_lookup_mapped_addr(bgrt_tab->image_address);
48  if (!image) {
49  image = ioremap(bgrt_tab->image_address, sizeof(bmp_header));
50  ioremapped = true;
51  if (!image)
52  return;
53  }
54 
55  memcpy_fromio(&bmp_header, image, sizeof(bmp_header));
56  if (ioremapped)
57  iounmap(image);
58  bgrt_image_size = bmp_header.size;
59 
61  if (!bgrt_image)
62  return;
63 
64  if (ioremapped) {
65  image = ioremap(bgrt_tab->image_address, bmp_header.size);
66  if (!image) {
68  bgrt_image = NULL;
69  return;
70  }
71  }
72 
74  if (ioremapped)
75  iounmap(image);
76 }