Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+17 −32
Original line number Diff line number Diff line
@@ -15,9 +15,9 @@
 * GNU General Public License for more details.
 */

#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include "memconsole.h"
#include "coreboot_table.h"
@@ -73,18 +73,19 @@ static ssize_t memconsole_coreboot_read(char *buf, loff_t pos, size_t count)
	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;

	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)
		return -ENOMEM;

	/* Read size only once to prevent overrun attack through /dev/mem. */
	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),
				 MEMREMAP_WB);
	memunmap(tmp_cbmc);
@@ -93,26 +94,11 @@ static int memconsole_coreboot_init(phys_addr_t physaddr)
		return -ENOMEM;

	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();
}

static int memconsole_remove(struct platform_device *pdev)
static int memconsole_remove(struct coreboot_device *dev)
{
	memconsole_exit();

@@ -122,28 +108,27 @@ static int memconsole_remove(struct platform_device *pdev)
	return 0;
}

static struct platform_driver memconsole_driver = {
static struct coreboot_driver memconsole_driver = {
	.probe = memconsole_probe,
	.remove = memconsole_remove,
	.driver = {
	.drv = {
		.name = "memconsole",
	},
	.tag = CB_TAG_CBMEM_CONSOLE,
};

static int __init platform_memconsole_init(void)
static void coreboot_memconsole_exit(void)
{
	struct platform_device *pdev;

	pdev = platform_device_register_simple("memconsole", -1, NULL, 0);
	if (IS_ERR(pdev))
		return PTR_ERR(pdev);

	platform_driver_register(&memconsole_driver);
	coreboot_driver_unregister(&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_LICENSE("GPL");