summaryrefslogtreecommitdiffstats
path: root/drivers/firmware/google/memconsole-x86-legacy.c
diff options
context:
space:
mode:
authorJulius Werner2017-05-03 00:16:29 +0200
committerGreg Kroah-Hartman2017-05-18 16:59:06 +0200
commit7918cfc46cfad784b2aafdbbc690a96af0ae78d0 (patch)
treed775a893e4bc85b26b8df0f43570ccfa03c753e1 /drivers/firmware/google/memconsole-x86-legacy.c
parentuio/uio_pci_generic: don't fail probe if pdev->irq == NULL (diff)
downloadkernel-qcow2-linux-7918cfc46cfad784b2aafdbbc690a96af0ae78d0.tar.gz
kernel-qcow2-linux-7918cfc46cfad784b2aafdbbc690a96af0ae78d0.tar.xz
kernel-qcow2-linux-7918cfc46cfad784b2aafdbbc690a96af0ae78d0.zip
firmware: google: memconsole: Make memconsole interface more flexible
This patch redesigns the interface between the generic memconsole driver and its implementations to become more flexible than a flat memory buffer with unchanging bounds. This allows memconsoles like coreboot's to include lines that were added by runtime firmware after the driver was initialized. Since the console log size is thus no longer static, this means that the /sys/firmware/log file has to become unseekable. Signed-off-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/firmware/google/memconsole-x86-legacy.c')
-rw-r--r--drivers/firmware/google/memconsole-x86-legacy.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/firmware/google/memconsole-x86-legacy.c b/drivers/firmware/google/memconsole-x86-legacy.c
index 1f279ee883b9..8c1bf6dbdaa6 100644
--- a/drivers/firmware/google/memconsole-x86-legacy.c
+++ b/drivers/firmware/google/memconsole-x86-legacy.c
@@ -48,6 +48,15 @@ struct biosmemcon_ebda {
};
} __packed;
+static char *memconsole_baseaddr;
+static size_t memconsole_length;
+
+static ssize_t memconsole_read(char *buf, loff_t pos, size_t count)
+{
+ return memory_read_from_buffer(buf, count, &pos, memconsole_baseaddr,
+ memconsole_length);
+}
+
static void found_v1_header(struct biosmemcon_ebda *hdr)
{
pr_info("memconsole: BIOS console v1 EBDA structure found at %p\n",
@@ -56,7 +65,9 @@ static void found_v1_header(struct biosmemcon_ebda *hdr)
hdr->v1.buffer_addr, hdr->v1.start,
hdr->v1.end, hdr->v1.num_chars);
- memconsole_setup(phys_to_virt(hdr->v1.buffer_addr), hdr->v1.num_chars);
+ memconsole_baseaddr = phys_to_virt(hdr->v1.buffer_addr);
+ memconsole_length = hdr->v1.num_chars;
+ memconsole_setup(memconsole_read);
}
static void found_v2_header(struct biosmemcon_ebda *hdr)
@@ -67,8 +78,9 @@ static void found_v2_header(struct biosmemcon_ebda *hdr)
hdr->v2.buffer_addr, hdr->v2.start,
hdr->v2.end, hdr->v2.num_bytes);
- memconsole_setup(phys_to_virt(hdr->v2.buffer_addr + hdr->v2.start),
- hdr->v2.end - hdr->v2.start);
+ memconsole_baseaddr = phys_to_virt(hdr->v2.buffer_addr + hdr->v2.start);
+ memconsole_length = hdr->v2.end - hdr->v2.start;
+ memconsole_setup(memconsole_read);
}
/*