root/drivers/platform/chrome/chromeos_pstore.c

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

DEFINITIONS

This source file includes following definitions.
  1. chromeos_probe_acpi
  2. chromeos_check_acpi
  3. chromeos_check_acpi
  4. chromeos_pstore_init
  5. chromeos_pstore_exit

   1 // SPDX-License-Identifier: GPL-2.0
   2 // Driver to instantiate Chromebook ramoops device.
   3 //
   4 // Copyright (C) 2013 Google, Inc.
   5 
   6 #include <linux/acpi.h>
   7 #include <linux/dmi.h>
   8 #include <linux/module.h>
   9 #include <linux/platform_device.h>
  10 #include <linux/pstore_ram.h>
  11 
  12 static const struct dmi_system_id chromeos_pstore_dmi_table[] __initconst = {
  13         {
  14                 /*
  15                  * Today all Chromebooks/boxes ship with Google_* as version and
  16                  * coreboot as bios vendor. No other systems with this
  17                  * combination are known to date.
  18                  */
  19                 .matches = {
  20                         DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
  21                         DMI_MATCH(DMI_BIOS_VERSION, "Google_"),
  22                 },
  23         },
  24         {
  25                 /* x86-alex, the first Samsung Chromebook. */
  26                 .matches = {
  27                         DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
  28                         DMI_MATCH(DMI_PRODUCT_NAME, "Alex"),
  29                 },
  30         },
  31         {
  32                 /* x86-mario, the Cr-48 pilot device from Google. */
  33                 .matches = {
  34                         DMI_MATCH(DMI_SYS_VENDOR, "IEC"),
  35                         DMI_MATCH(DMI_PRODUCT_NAME, "Mario"),
  36                 },
  37         },
  38         {
  39                 /* x86-zgb, the first Acer Chromebook. */
  40                 .matches = {
  41                         DMI_MATCH(DMI_SYS_VENDOR, "ACER"),
  42                         DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"),
  43                 },
  44         },
  45         { }
  46 };
  47 MODULE_DEVICE_TABLE(dmi, chromeos_pstore_dmi_table);
  48 
  49 /*
  50  * On x86 chromebooks/boxes, the firmware will keep the legacy VGA memory
  51  * range untouched across reboots, so we use that to store our pstore
  52  * contents for panic logs, etc.
  53  */
  54 static struct ramoops_platform_data chromeos_ramoops_data = {
  55         .mem_size       = 0x100000,
  56         .mem_address    = 0xf00000,
  57         .record_size    = 0x40000,
  58         .console_size   = 0x20000,
  59         .ftrace_size    = 0x20000,
  60         .dump_oops      = 1,
  61 };
  62 
  63 static struct platform_device chromeos_ramoops = {
  64         .name = "ramoops",
  65         .dev = {
  66                 .platform_data = &chromeos_ramoops_data,
  67         },
  68 };
  69 
  70 #ifdef CONFIG_ACPI
  71 static const struct acpi_device_id cros_ramoops_acpi_match[] = {
  72         { "GOOG9999", 0 },
  73         { }
  74 };
  75 MODULE_DEVICE_TABLE(acpi, cros_ramoops_acpi_match);
  76 
  77 static struct platform_driver chromeos_ramoops_acpi = {
  78         .driver         = {
  79                 .name   = "chromeos_pstore",
  80                 .acpi_match_table = ACPI_PTR(cros_ramoops_acpi_match),
  81         },
  82 };
  83 
  84 static int __init chromeos_probe_acpi(struct platform_device *pdev)
  85 {
  86         struct resource *res;
  87         resource_size_t len;
  88 
  89         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  90         if (!res)
  91                 return -ENOMEM;
  92 
  93         len = resource_size(res);
  94         if (!res->start || !len)
  95                 return -ENOMEM;
  96 
  97         pr_info("chromeos ramoops using acpi device.\n");
  98 
  99         chromeos_ramoops_data.mem_size = len;
 100         chromeos_ramoops_data.mem_address = res->start;
 101 
 102         return 0;
 103 }
 104 
 105 static bool __init chromeos_check_acpi(void)
 106 {
 107         if (!platform_driver_probe(&chromeos_ramoops_acpi, chromeos_probe_acpi))
 108                 return true;
 109         return false;
 110 }
 111 #else
 112 static inline bool chromeos_check_acpi(void) { return false; }
 113 #endif
 114 
 115 static int __init chromeos_pstore_init(void)
 116 {
 117         bool acpi_dev_found;
 118 
 119         /* First check ACPI for non-hardcoded values from firmware. */
 120         acpi_dev_found = chromeos_check_acpi();
 121 
 122         if (acpi_dev_found || dmi_check_system(chromeos_pstore_dmi_table))
 123                 return platform_device_register(&chromeos_ramoops);
 124 
 125         return -ENODEV;
 126 }
 127 
 128 static void __exit chromeos_pstore_exit(void)
 129 {
 130         platform_device_unregister(&chromeos_ramoops);
 131 }
 132 
 133 module_init(chromeos_pstore_init);
 134 module_exit(chromeos_pstore_exit);
 135 
 136 MODULE_DESCRIPTION("ChromeOS pstore module");
 137 MODULE_LICENSE("GPL v2");

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