Commit 294b2a90 authored by Samuel Holland's avatar Samuel Holland Committed by Greg Kroah-Hartman

firmware: memconsole: Probe via coreboot bus

Remove the ad-hoc coreboot table search. Now the driver will only be
probed when the necessary coreboot table entry has already been found.
Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 570d30c2
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/device.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h>
#include "memconsole.h" #include "memconsole.h"
#include "coreboot_table.h" #include "coreboot_table.h"
...@@ -73,18 +73,19 @@ static ssize_t memconsole_coreboot_read(char *buf, loff_t pos, size_t count) ...@@ -73,18 +73,19 @@ static ssize_t memconsole_coreboot_read(char *buf, loff_t pos, size_t count)
return done; return done;
} }
static int memconsole_coreboot_init(phys_addr_t physaddr) static int memconsole_probe(struct coreboot_device *dev)
{ {
struct cbmem_cons __iomem *tmp_cbmc; struct cbmem_cons __iomem *tmp_cbmc;
tmp_cbmc = memremap(physaddr, sizeof(*tmp_cbmc), MEMREMAP_WB); tmp_cbmc = memremap(dev->cbmem_ref.cbmem_addr,
sizeof(*tmp_cbmc), MEMREMAP_WB);
if (!tmp_cbmc) if (!tmp_cbmc)
return -ENOMEM; return -ENOMEM;
/* Read size only once to prevent overrun attack through /dev/mem. */ /* Read size only once to prevent overrun attack through /dev/mem. */
cbmem_console_size = tmp_cbmc->size_dont_access_after_boot; cbmem_console_size = tmp_cbmc->size_dont_access_after_boot;
cbmem_console = memremap(physaddr, cbmem_console = memremap(dev->cbmem_ref.cbmem_addr,
cbmem_console_size + sizeof(*cbmem_console), cbmem_console_size + sizeof(*cbmem_console),
MEMREMAP_WB); MEMREMAP_WB);
memunmap(tmp_cbmc); memunmap(tmp_cbmc);
...@@ -93,26 +94,11 @@ static int memconsole_coreboot_init(phys_addr_t physaddr) ...@@ -93,26 +94,11 @@ static int memconsole_coreboot_init(phys_addr_t physaddr)
return -ENOMEM; return -ENOMEM;
memconsole_setup(memconsole_coreboot_read); memconsole_setup(memconsole_coreboot_read);
return 0;
}
static int memconsole_probe(struct platform_device *pdev)
{
int ret;
struct lb_cbmem_ref entry;
ret = coreboot_table_find(CB_TAG_CBMEM_CONSOLE, &entry, sizeof(entry));
if (ret)
return ret;
ret = memconsole_coreboot_init(entry.cbmem_addr);
if (ret)
return ret;
return memconsole_sysfs_init(); return memconsole_sysfs_init();
} }
static int memconsole_remove(struct platform_device *pdev) static int memconsole_remove(struct coreboot_device *dev)
{ {
memconsole_exit(); memconsole_exit();
...@@ -122,28 +108,27 @@ static int memconsole_remove(struct platform_device *pdev) ...@@ -122,28 +108,27 @@ static int memconsole_remove(struct platform_device *pdev)
return 0; return 0;
} }
static struct platform_driver memconsole_driver = { static struct coreboot_driver memconsole_driver = {
.probe = memconsole_probe, .probe = memconsole_probe,
.remove = memconsole_remove, .remove = memconsole_remove,
.driver = { .drv = {
.name = "memconsole", .name = "memconsole",
}, },
.tag = CB_TAG_CBMEM_CONSOLE,
}; };
static int __init platform_memconsole_init(void) static void coreboot_memconsole_exit(void)
{ {
struct platform_device *pdev; coreboot_driver_unregister(&memconsole_driver);
}
pdev = platform_device_register_simple("memconsole", -1, NULL, 0);
if (IS_ERR(pdev))
return PTR_ERR(pdev);
platform_driver_register(&memconsole_driver);
return 0; static int __init coreboot_memconsole_init(void)
{
return coreboot_driver_register(&memconsole_driver);
} }
module_init(platform_memconsole_init); module_exit(coreboot_memconsole_exit);
module_init(coreboot_memconsole_init);
MODULE_AUTHOR("Google, Inc."); MODULE_AUTHOR("Google, Inc.");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment