Author: stefanct
Date: Tue Jun 30 01:24:23 2015
New Revision: 1895
URL: http://flashrom.org/trac/flashrom/changeset/1895

Log:
serprog: Fix FWH/LPC by implementing serprog_map.

The serprog protocol does only transmit 24 bit-wide address and ignores the
top 8 bit. This is fine as long as the underlying hardware ignores the latter
anyway (which is the case for parallel chips that even lack the respective 
pins).
FWH/LPC chips, however, operate on a full 32-bit (LPC) or 28-bit (FWH) address
space and would fail with the fallback mapping to NULL.

Signed-off-by: Urja Rannikko <[email protected]>
Acked-by: Stefan Tauner <[email protected]>

Modified:
   trunk/flashrom.c
   trunk/programmer.h
   trunk/serprog.c

Modified: trunk/flashrom.c
==============================================================================
--- trunk/flashrom.c    Sun Jun 28 15:31:19 2015        (r1894)
+++ trunk/flashrom.c    Tue Jun 30 01:24:23 2015        (r1895)
@@ -212,7 +212,7 @@
                                        /* FIXME */
                .devs.note              = "All programmer devices speaking the 
serprog protocol\n",
                .init                   = serprog_init,
-               .map_flash_region       = fallback_map,
+               .map_flash_region       = serprog_map,
                .unmap_flash_region     = fallback_unmap,
                .delay                  = serprog_delay,
        },

Modified: trunk/programmer.h
==============================================================================
--- trunk/programmer.h  Sun Jun 28 15:31:19 2015        (r1894)
+++ trunk/programmer.h  Tue Jun 30 01:24:23 2015        (r1895)
@@ -706,6 +706,7 @@
 #if CONFIG_SERPROG == 1
 int serprog_init(void);
 void serprog_delay(unsigned int usecs);
+void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len);
 #endif
 
 /* serial.c */

Modified: trunk/serprog.c
==============================================================================
--- trunk/serprog.c     Sun Jun 28 15:31:19 2015        (r1894)
+++ trunk/serprog.c     Tue Jun 30 01:24:23 2015        (r1895)
@@ -943,3 +943,19 @@
        }
        return 0;
 }
+
+void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len)
+{
+       /* Serprog transmits 24 bits only and assumes the underlying 
implementation handles any remaining bits
+        * correctly (usually setting them to one either in software (for 
FWH/LPC) or relying on the fact that
+        * the hardware observes a subset of the address bits only). Combined 
with the standard mapping of
+        * flashrom this creates a 16 MB-wide window just below the 4 GB 
boundary where serprog can operate (as
+        * needed for non-SPI chips). Below we make sure that the requested 
range is within this window. */
+       if ((phys_addr & 0xFF000000) == 0xFF000000) {
+               return (void*)phys_addr;
+       } else {
+               msg_pwarn(MSGHEADER "requested mapping %s is incompatible: 
0x%zx bytes at 0x%0*" PRIxPTR ".\n",
+                         descr, len, PRIxPTR_WIDTH, phys_addr);
+               return NULL;
+       }
+}

_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to