Skip to content
Snippets Groups Projects
Select Git revision
  • 570d30c2823fd4a29c220961885529bc36d27d24
  • master default
  • android-container
  • nanopc-t4
  • for-kernelci
  • WIP-syscall
  • v4.16-rc5
  • v4.16-rc4
  • v4.16-rc3
  • v4.16-rc2
  • v4.16-rc1
  • v4.15
  • v4.15-rc9
  • v4.15-rc8
  • v4.15-rc7
  • v4.15-rc6
  • v4.15-rc5
  • v4.15-rc4
  • v4.15-rc3
  • v4.15-rc2
  • v4.15-rc1
  • v4.14
  • v4.14-rc8
  • v4.14-rc7
  • v4.14-rc6
  • v4.14-rc5
26 results

coreboot_table-acpi.c

Blame
  • coreboot_table-acpi.c 2.16 KiB
    /*
     * coreboot_table-acpi.c
     *
     * Using ACPI to locate Coreboot table and provide coreboot table access.
     *
     * Copyright 2017 Google Inc.
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License v2.0 as published by
     * the Free Software Foundation.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     */
    
    #include <linux/acpi.h>
    #include <linux/device.h>
    #include <linux/err.h>
    #include <linux/init.h>
    #include <linux/io.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/platform_device.h>
    
    #include "coreboot_table.h"
    
    static int coreboot_table_acpi_probe(struct platform_device *pdev)
    {
    	phys_addr_t phyaddr;
    	resource_size_t len;
    	struct coreboot_table_header __iomem *header = NULL;
    	struct resource *res;
    	void __iomem *ptr = NULL;
    
    	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    	if (!res)
    		return -EINVAL;
    
    	len = resource_size(res);
    	if (!res->start || !len)
    		return -EINVAL;
    
    	phyaddr = res->start;
    	header = ioremap_cache(phyaddr, sizeof(*header));
    	if (header == NULL)
    		return -ENOMEM;
    
    	ptr = ioremap_cache(phyaddr,
    			    header->header_bytes + header->table_bytes);
    	iounmap(header);
    	if (!ptr)
    		return -ENOMEM;
    
    	return coreboot_table_init(&pdev->dev, ptr);
    }
    
    static int coreboot_table_acpi_remove(struct platform_device *pdev)
    {
    	return coreboot_table_exit();
    }
    
    static const struct acpi_device_id cros_coreboot_acpi_match[] = {
    	{ "GOOGCB00", 0 },
    	{ "BOOT0000", 0 },
    	{ }
    };
    MODULE_DEVICE_TABLE(acpi, cros_coreboot_acpi_match);
    
    static struct platform_driver coreboot_table_acpi_driver = {
    	.probe = coreboot_table_acpi_probe,
    	.remove = coreboot_table_acpi_remove,
    	.driver = {
    		.name = "coreboot_table_acpi",
    		.acpi_match_table = ACPI_PTR(cros_coreboot_acpi_match),
    	},
    };
    
    static int __init coreboot_table_acpi_init(void)
    {
    	return platform_driver_register(&coreboot_table_acpi_driver);
    }
    
    module_init(coreboot_table_acpi_init);
    
    MODULE_AUTHOR("Google, Inc.");
    MODULE_LICENSE("GPL");