1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-07-02 14:33:18 +02:00

Add external flasher support

- Read/write accesses through function pointers
- Command line parameter for internal/external flasher
- Board and chipset setup moved to internal init function
- Shutdown stuff moved to internal shutdown function

As a side benefit, this will allow us to undo chipset write enable
during shutdown.

Tested by Uwe on real hardware.

Corresponding to flashrom svn r476.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
This commit is contained in:
Carl-Daniel Hailfinger
2009-05-08 17:43:22 +00:00
parent f160a12938
commit 702218d030
4 changed files with 231 additions and 89 deletions

58
flash.h
View File

@ -76,34 +76,64 @@
#endif
#endif
static inline void chip_writeb(uint8_t b, volatile void *addr)
extern int programmer;
#define PROGRAMMER_INTERNAL 0x00
struct programmer_entry {
const char *vendor;
const char *name;
int (*init) (void);
int (*shutdown) (void);
void (*chip_writeb) (uint8_t val, volatile void *addr);
void (*chip_writew) (uint16_t val, volatile void *addr);
void (*chip_writel) (uint32_t val, volatile void *addr);
uint8_t (*chip_readb) (const volatile void *addr);
uint16_t (*chip_readw) (const volatile void *addr);
uint32_t (*chip_readl) (const volatile void *addr);
};
extern const struct programmer_entry programmer_table[];
static inline int programmer_init(void)
{
*(volatile uint8_t *) addr = b;
return programmer_table[programmer].init();
}
static inline void chip_writew(uint16_t b, volatile void *addr)
static inline int programmer_shutdown(void)
{
*(volatile uint16_t *) addr = b;
return programmer_table[programmer].shutdown();
}
static inline void chip_writel(uint32_t b, volatile void *addr)
static inline void chip_writeb(uint8_t val, volatile void *addr)
{
*(volatile uint32_t *) addr = b;
programmer_table[programmer].chip_writeb(val, addr);
}
static inline void chip_writew(uint16_t val, volatile void *addr)
{
programmer_table[programmer].chip_writew(val, addr);
}
static inline void chip_writel(uint32_t val, volatile void *addr)
{
programmer_table[programmer].chip_writel(val, addr);
}
static inline uint8_t chip_readb(const volatile void *addr)
{
return *(volatile uint8_t *) addr;
return programmer_table[programmer].chip_readb(addr);
}
static inline uint16_t chip_readw(const volatile void *addr)
{
return *(volatile uint16_t *) addr;
return programmer_table[programmer].chip_readw(addr);
}
static inline uint32_t chip_readl(const volatile void *addr)
{
return *(volatile uint32_t *) addr;
return programmer_table[programmer].chip_readl(addr);
}
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
@ -535,6 +565,16 @@ extern void *spibar;
void *physmap(const char *descr, unsigned long phys_addr, size_t len);
void physunmap(void *virt_addr, size_t len);
/* internal.c */
int internal_init(void);
int internal_shutdown(void);
void internal_chip_writeb(uint8_t val, volatile void *addr);
void internal_chip_writew(uint16_t val, volatile void *addr);
void internal_chip_writel(uint32_t val, volatile void *addr);
uint8_t internal_chip_readb(const volatile void *addr);
uint16_t internal_chip_readw(const volatile void *addr);
uint32_t internal_chip_readl(const volatile void *addr);
/* flashrom.c */
extern int verbose;
#define printf_debug(x...) { if (verbose) printf(x); }