summaryrefslogtreecommitdiff
path: root/internal.c
diff options
context:
space:
mode:
authorhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2009-05-16 01:23:55 +0000
committerhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2009-05-16 01:23:55 +0000
commit9442edc06e3bdfa80fd8acd948c62122c6a90559 (patch)
tree7e77126eedcc62dbf83c65cb365d597b7cbb1d03 /internal.c
parent85f5daae23bc62b8796c7e04b5975369c6d68064 (diff)
downloadflashrom-9442edc06e3bdfa80fd8acd948c62122c6a90559.tar.gz
Add generic 16 bit and 32 bit chip read/write emulation to the external
flasher infrastructure. The emulation works by splitting 32 bit accesses into 16 bit accesses and 16 bit accesses into to 8 bit accesses. That way, external flashers can mix and match the amount of emulation they need. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Uwe Hermann <uwe@hermann-uwe.de> git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@517 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'internal.c')
-rw-r--r--internal.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/internal.c b/internal.c
index bbbf58b..f10d0d5 100644
--- a/internal.c
+++ b/internal.c
@@ -168,3 +168,34 @@ uint32_t internal_chip_readl(const volatile void *addr)
return *(volatile uint32_t *) addr;
}
+/* Little-endian fallback for drivers not supporting 16 bit accesses */
+void fallback_chip_writew(uint16_t val, volatile void *addr)
+{
+ chip_writeb(val & 0xff, addr);
+ chip_writeb((val >> 8) & 0xff, addr + 1);
+}
+
+/* Little-endian fallback for drivers not supporting 16 bit accesses */
+uint16_t fallback_chip_readw(const volatile void *addr)
+{
+ uint16_t val;
+ val = chip_readb(addr);
+ val |= chip_readb(addr + 1) << 8;
+ return val;
+}
+
+/* Little-endian fallback for drivers not supporting 32 bit accesses */
+void fallback_chip_writel(uint32_t val, volatile void *addr)
+{
+ chip_writew(val & 0xffff, addr);
+ chip_writew((val >> 16) & 0xffff, addr + 2);
+}
+
+/* Little-endian fallback for drivers not supporting 32 bit accesses */
+uint32_t fallback_chip_readl(const volatile void *addr)
+{
+ uint32_t val;
+ val = chip_readw(addr);
+ val |= chip_readw(addr + 2) << 16;
+ return val;
+}