brintos

brintos / linux-shallow public Read only

0
0
Text · 3.2 KiB · f37c0ef Raw
139 lines · c
1// SPDX-License-Identifier: GPL-2.02// 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 12static const struct dmi_system_id chromeos_pstore_dmi_table[] __initconst = {13	{14		/*15		 * Today all Chromebooks/boxes ship with Google_* as version and16		 * coreboot as bios vendor. No other systems with this17		 * 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};47MODULE_DEVICE_TABLE(dmi, chromeos_pstore_dmi_table);48 49/*50 * On x86 chromebooks/boxes, the firmware will keep the legacy VGA memory51 * range untouched across reboots, so we use that to store our pstore52 * contents for panic logs, etc.53 */54static 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	.pmsg_size	= 0x20000,61	.max_reason	= KMSG_DUMP_OOPS,62};63 64static struct platform_device chromeos_ramoops = {65	.name = "ramoops",66	.dev = {67		.platform_data = &chromeos_ramoops_data,68	},69};70 71#ifdef CONFIG_ACPI72static const struct acpi_device_id cros_ramoops_acpi_match[] = {73	{ "GOOG9999", 0 },74	{ }75};76MODULE_DEVICE_TABLE(acpi, cros_ramoops_acpi_match);77 78static struct platform_driver chromeos_ramoops_acpi = {79	.driver		= {80		.name	= "chromeos_pstore",81		.acpi_match_table = ACPI_PTR(cros_ramoops_acpi_match),82	},83};84 85static int __init chromeos_probe_acpi(struct platform_device *pdev)86{87	struct resource *res;88	resource_size_t len;89 90	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);91	if (!res)92		return -ENOMEM;93 94	len = resource_size(res);95	if (!res->start || !len)96		return -ENOMEM;97 98	pr_info("chromeos ramoops using acpi device.\n");99 100	chromeos_ramoops_data.mem_size = len;101	chromeos_ramoops_data.mem_address = res->start;102 103	return 0;104}105 106static bool __init chromeos_check_acpi(void)107{108	if (!platform_driver_probe(&chromeos_ramoops_acpi, chromeos_probe_acpi))109		return true;110	return false;111}112#else113static inline bool chromeos_check_acpi(void) { return false; }114#endif115 116static int __init chromeos_pstore_init(void)117{118	bool acpi_dev_found;119 120	/* First check ACPI for non-hardcoded values from firmware. */121	acpi_dev_found = chromeos_check_acpi();122 123	if (acpi_dev_found || dmi_check_system(chromeos_pstore_dmi_table))124		return platform_device_register(&chromeos_ramoops);125 126	return -ENODEV;127}128 129static void __exit chromeos_pstore_exit(void)130{131	platform_device_unregister(&chromeos_ramoops);132}133 134module_init(chromeos_pstore_init);135module_exit(chromeos_pstore_exit);136 137MODULE_DESCRIPTION("ChromeOS pstore module");138MODULE_LICENSE("GPL v2");139