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"); 138