aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/google/memconsole-coreboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/google/memconsole-coreboot.c')
-rw-r--r--drivers/firmware/google/memconsole-coreboot.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/drivers/firmware/google/memconsole-coreboot.c b/drivers/firmware/google/memconsole-coreboot.c
index 52738887735c..b29e10757bfb 100644
--- a/drivers/firmware/google/memconsole-coreboot.c
+++ b/drivers/firmware/google/memconsole-coreboot.c
@@ -15,9 +15,9 @@
15 * GNU General Public License for more details. 15 * GNU General Public License for more details.
16 */ 16 */
17 17
18#include <linux/device.h>
18#include <linux/kernel.h> 19#include <linux/kernel.h>
19#include <linux/module.h> 20#include <linux/module.h>
20#include <linux/platform_device.h>
21 21
22#include "memconsole.h" 22#include "memconsole.h"
23#include "coreboot_table.h" 23#include "coreboot_table.h"
@@ -73,18 +73,19 @@ static ssize_t memconsole_coreboot_read(char *buf, loff_t pos, size_t count)
73 return done; 73 return done;
74} 74}
75 75
76static int memconsole_coreboot_init(phys_addr_t physaddr) 76static int memconsole_probe(struct coreboot_device *dev)
77{ 77{
78 struct cbmem_cons __iomem *tmp_cbmc; 78 struct cbmem_cons __iomem *tmp_cbmc;
79 79
80 tmp_cbmc = memremap(physaddr, sizeof(*tmp_cbmc), MEMREMAP_WB); 80 tmp_cbmc = memremap(dev->cbmem_ref.cbmem_addr,
81 sizeof(*tmp_cbmc), MEMREMAP_WB);
81 82
82 if (!tmp_cbmc) 83 if (!tmp_cbmc)
83 return -ENOMEM; 84 return -ENOMEM;
84 85
85 /* Read size only once to prevent overrun attack through /dev/mem. */ 86 /* Read size only once to prevent overrun attack through /dev/mem. */
86 cbmem_console_size = tmp_cbmc->size_dont_access_after_boot; 87 cbmem_console_size = tmp_cbmc->size_dont_access_after_boot;
87 cbmem_console = memremap(physaddr, 88 cbmem_console = memremap(dev->cbmem_ref.cbmem_addr,
88 cbmem_console_size + sizeof(*cbmem_console), 89 cbmem_console_size + sizeof(*cbmem_console),
89 MEMREMAP_WB); 90 MEMREMAP_WB);
90 memunmap(tmp_cbmc); 91 memunmap(tmp_cbmc);
@@ -93,26 +94,11 @@ static int memconsole_coreboot_init(phys_addr_t physaddr)
93 return -ENOMEM; 94 return -ENOMEM;
94 95
95 memconsole_setup(memconsole_coreboot_read); 96 memconsole_setup(memconsole_coreboot_read);
96 return 0;
97}
98
99static int memconsole_probe(struct platform_device *pdev)
100{
101 int ret;
102 struct lb_cbmem_ref entry;
103
104 ret = coreboot_table_find(CB_TAG_CBMEM_CONSOLE, &entry, sizeof(entry));
105 if (ret)
106 return ret;
107
108 ret = memconsole_coreboot_init(entry.cbmem_addr);
109 if (ret)
110 return ret;
111 97
112 return memconsole_sysfs_init(); 98 return memconsole_sysfs_init();
113} 99}
114 100
115static int memconsole_remove(struct platform_device *pdev) 101static int memconsole_remove(struct coreboot_device *dev)
116{ 102{
117 memconsole_exit(); 103 memconsole_exit();
118 104
@@ -122,28 +108,27 @@ static int memconsole_remove(struct platform_device *pdev)
122 return 0; 108 return 0;
123} 109}
124 110
125static struct platform_driver memconsole_driver = { 111static struct coreboot_driver memconsole_driver = {
126 .probe = memconsole_probe, 112 .probe = memconsole_probe,
127 .remove = memconsole_remove, 113 .remove = memconsole_remove,
128 .driver = { 114 .drv = {
129 .name = "memconsole", 115 .name = "memconsole",
130 }, 116 },
117 .tag = CB_TAG_CBMEM_CONSOLE,
131}; 118};
132 119
133static int __init platform_memconsole_init(void) 120static void coreboot_memconsole_exit(void)
134{ 121{
135 struct platform_device *pdev; 122 coreboot_driver_unregister(&memconsole_driver);
136 123}
137 pdev = platform_device_register_simple("memconsole", -1, NULL, 0);
138 if (IS_ERR(pdev))
139 return PTR_ERR(pdev);
140
141 platform_driver_register(&memconsole_driver);
142 124
143 return 0; 125static int __init coreboot_memconsole_init(void)
126{
127 return coreboot_driver_register(&memconsole_driver);
144} 128}
145 129
146module_init(platform_memconsole_init); 130module_exit(coreboot_memconsole_exit);
131module_init(coreboot_memconsole_init);
147 132
148MODULE_AUTHOR("Google, Inc."); 133MODULE_AUTHOR("Google, Inc.");
149MODULE_LICENSE("GPL"); 134MODULE_LICENSE("GPL");