flash.h 8.27 KB
Newer Older
1 2 3 4 5
/*
 * flash.h: flash programming utility - central include file
 *
 * Copyright 2000 Silicon Integrated System Corporation
 * Copyright 2000 Ronald G. Minnich <rminnich@gmail.com>
6
 * Copyright 2005-2007 coresystems GmbH <stepan@coresystems.de>
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * 
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

Ronald G. Minnich's avatar
Ronald G. Minnich committed
24 25 26
#ifndef __FLASH_H__
#define __FLASH_H__ 1

27
#if defined(__GLIBC__)
28
#include <sys/io.h>
29
#endif
30
#include <unistd.h>
31
#include <stdint.h>
32
#include <stdio.h>
33 34

struct flashchip {
35
	char *name;
36 37 38 39 40 41
	int manufacture_id;
	int model_id;

	int total_size;
	int page_size;

Uwe Hermann's avatar
Uwe Hermann committed
42 43 44 45
	int (*probe) (struct flashchip *flash);
	int (*erase) (struct flashchip *flash);
	int (*write) (struct flashchip *flash, uint8_t *buf);
	int (*read) (struct flashchip *flash, uint8_t *buf);
Ronald G. Minnich's avatar
Ronald G. Minnich committed
46

47 48 49 50 51
	/* some flash devices have an additional
	 * register space
	 */
	volatile uint8_t *virtual_memory;
	volatile uint8_t *virtual_registers;
52 53
};

54 55
extern struct flashchip flashchips[];

56 57 58 59 60 61
/* Please keep this list sorted alphabetically by manufacturer. The first
 * entry of each section should be the manufacturer ID, followed by the
 * list of devices from that manufacturer (sorted by device IDs).
 */

#define AMD_ID			0x01	/* AMD */
Uwe Hermann's avatar
Uwe Hermann committed
62 63 64
#define AM_29F040B		0xA4
#define AM_29F016D		0xAD

65
#define ASD_ID			0x25	/* ASD */
Uwe Hermann's avatar
Uwe Hermann committed
66 67
#define ASD_AE49F2008		0x52

68 69
#define ATMEL_ID		0x1F	/* Atmel */
#define AT_29C040A		0xA4
70
#define AT_29C020		0xDA
Uwe Hermann's avatar
Uwe Hermann committed
71

72
#define MX_ID			0xC2	/* Macronix (MX) */
Uwe Hermann's avatar
Uwe Hermann committed
73 74
#define MX_29F002		0xB0

75
#define SHARP_ID		0xB0	/* Sharp */
Uwe Hermann's avatar
Uwe Hermann committed
76 77
#define SHARP_LHF00L04		0xCF

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
#define SST_ID			0xBF	/* SST */
#define SST_29EE020A		0x10
#define SST_28SF040		0x04
#define SST_39SF010		0xB5
#define SST_39SF020		0xB6
#define SST_39SF040		0xB7
#define SST_39VF020		0xD6
#define SST_49LF040B		0x50
#define SST_49LF040		0x51
#define SST_49LF020A		0x52
#define SST_49LF080A		0x5B
#define SST_49LF002A		0x57
#define SST_49LF003A		0x1B
#define SST_49LF004A		0x60
#define SST_49LF008A		0x5A
#define SST_49LF004C		0x54
#define SST_49LF008C		0x59
#define SST_49LF016C		0x5C
#define SST_49LF160C		0x4C

#define PMC_ID			0x9D	/* PMC */
#define PMC_49FL002		0x6D
#define PMC_49FL004		0x6E

#define WINBOND_ID		0xDA	/* Winbond */
#define W_29C011		0xC1
#define W_29C020C		0x45
105
#define W_39V040FA		0x34
106 107 108 109 110 111 112 113
#define W_39V040A		0x3D
#define W_39V040B		0x54
#define W_39V080A		0xD0
#define W_49F002U		0x0B
#define W_49V002A		0xB0
#define W_49V002FA		0x32

#define ST_ID			0x20	/* ST */
114 115 116 117
#define ST_M50FLW040A		0x08
#define ST_M50FLW040B		0x28
#define ST_M50FLW080A		0x80
#define ST_M50FLW080B		0x81
118
#define ST_M50FW040		0x2C
119 120 121
#define ST_M50FW080		0x2D
#define ST_M50FW016		0x2E
#define ST_M50LPW116		0x30
122 123
#define ST_M29F002B		0x34
#define ST_M29F002T		0xB0	/* M29F002T / M29F002NT */
Uwe Hermann's avatar
Uwe Hermann committed
124
#define ST_M29F400BT		0xD5
125
#define ST_M29F040B		0xE2
126
#define ST_M29W010B		0x23
127
#define ST_M29W040B		0xE3
Uwe Hermann's avatar
Uwe Hermann committed
128

129 130
#define EMST_ID			0x8c	/* EMST / EFST */
#define EMST_F49B002UA		0x00
Uwe Hermann's avatar
Uwe Hermann committed
131

132
#define MSYSTEMS_ID		0x156f	/* M-Systems */
Uwe Hermann's avatar
Uwe Hermann committed
133 134 135 136
#define MSYSTEMS_MD2200		0xdb	/* ? */
#define MSYSTEMS_MD2800		0x30	/* hmm -- both 0x30 */
#define MSYSTEMS_MD2802		0x30	/* hmm -- both 0x30 */

137 138 139 140 141
#define SYNCMOS_ID		0x40	/* SyncMOS */
#define S29C51001T		0x01
#define S29C51002T		0x02
#define S29C51004T		0x03
#define S29C31004T		0x63
142

143 144
/* function prototypes from udelay.h */

Stefan Reinauer's avatar
Stefan Reinauer committed
145 146
void myusec_delay(int time);
void myusec_calibrate_delay();
147 148

/* pci handling for board/chipset_enable */
149
struct pci_access *pacc;	/* For board and chipset_enable */
Stefan Reinauer's avatar
Stefan Reinauer committed
150
struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device);
151 152
struct pci_dev *pci_card_find(uint16_t vendor, uint16_t device,
			      uint16_t card_vendor, uint16_t card_device);
153

154 155
int board_flash_enable(char *vendor, char *part);	/* board_enable.c */
int chipset_flash_enable(void);	/* chipset_enable.c */
156 157 158 159 160 161 162 163 164

/* physical memory mapping device */

#if defined (__sun) && (defined(__i386) || defined(__amd64))
#  define MEM_DEV "/dev/xsvc"
#else
#  define MEM_DEV "/dev/mem"
#endif

Stefan Reinauer's avatar
Stefan Reinauer committed
165 166
extern int fd_mem;

167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
/* debug.c */
extern int verbose;
#define printf_debug(x...) { if (verbose) printf(x); }

/* flashrom.c */
int map_flash_registers(struct flashchip *flash);

/* layout.c */
int show_id(uint8_t *bios, int size);
int read_romlayout(char *name);
int find_romentry(char *name);
int handle_romentries(uint8_t *buffer, uint8_t *content);

/* lbtable.c */
int linuxbios_init(void);
extern char *lb_part, *lb_vendor;

/* 82802ab.c */
extern int probe_82802ab(struct flashchip *flash);
extern int erase_82802ab(struct flashchip *flash);
extern int write_82802ab(struct flashchip *flash, uint8_t *buf);

/* am29f040b.c */
extern int probe_29f040b(struct flashchip *flash);
extern int erase_29f040b(struct flashchip *flash);
extern int write_29f040b(struct flashchip *flash, uint8_t *buf);

/* jedec.c */
extern void toggle_ready_jedec(volatile uint8_t *dst);
extern void data_polling_jedec(volatile uint8_t *dst, uint8_t data);
extern void unprotect_jedec(volatile uint8_t *bios);
extern void protect_jedec(volatile uint8_t *bios);
int write_byte_program_jedec(volatile uint8_t *bios, uint8_t *src,
			     volatile uint8_t *dst);
extern int probe_jedec(struct flashchip *flash);
extern int erase_chip_jedec(struct flashchip *flash);
extern int write_jedec(struct flashchip *flash, uint8_t *buf);
extern int erase_sector_jedec(volatile uint8_t *bios, unsigned int page);
extern int erase_block_jedec(volatile uint8_t *bios, unsigned int page);
extern int write_sector_jedec(volatile uint8_t *bios, uint8_t *src,
			      volatile uint8_t *dst, unsigned int page_size);

/* m29f400bt.c */
extern int probe_m29f400bt(struct flashchip *flash);
extern int erase_m29f400bt(struct flashchip *flash);
extern int block_erase_m29f400bt(volatile uint8_t *bios,
				 volatile uint8_t *dst);
extern int write_m29f400bt(struct flashchip *flash, uint8_t *buf);
extern int write_linuxbios_m29f400bt(struct flashchip *flash, uint8_t *buf);
extern void toggle_ready_m29f400bt(volatile uint8_t *dst);
extern void data_polling_m29f400bt(volatile uint8_t *dst, uint8_t data);
extern void protect_m29f400bt(volatile uint8_t *bios);
extern void write_page_m29f400bt(volatile uint8_t *bios, uint8_t *src,
				 volatile uint8_t *dst, int page_size);

/* mx29f002.c */
extern int probe_29f002(struct flashchip *flash);
extern int erase_29f002(struct flashchip *flash);
extern int write_29f002(struct flashchip *flash, uint8_t *buf);

/* pm49fl004.c */
extern int probe_49fl004(struct flashchip *flash);
extern int erase_49fl004(struct flashchip *flash);
extern int write_49fl004(struct flashchip *flash, uint8_t *buf);

/* sharplhf00l04.c */
extern int probe_lhf00l04(struct flashchip *flash);
extern int erase_lhf00l04(struct flashchip *flash);
extern int write_lhf00l04(struct flashchip *flash, uint8_t *buf);
extern void toggle_ready_lhf00l04(volatile uint8_t *dst);
extern void data_polling_lhf00l04(volatile uint8_t *dst, uint8_t data);
extern void protect_lhf00l04(volatile uint8_t *bios);

/* sst28sf040.c */
extern int probe_28sf040(struct flashchip *flash);
extern int erase_28sf040(struct flashchip *flash);
extern int write_28sf040(struct flashchip *flash, uint8_t *buf);

/* sst39sf020.c */
extern int probe_39sf020(struct flashchip *flash);
extern int write_39sf020(struct flashchip *flash, uint8_t *buf);

/* sst49lf040.c */
extern int erase_49lf040(struct flashchip *flash);
extern int write_49lf040(struct flashchip *flash, uint8_t *buf);

/* sst49lfxxxc.c */
extern int probe_49lfxxxc(struct flashchip *flash);
extern int erase_49lfxxxc(struct flashchip *flash);
extern int write_49lfxxxc(struct flashchip *flash, uint8_t *buf);

/* sst_fwhub.c */
extern int probe_sst_fwhub(struct flashchip *flash);
extern int erase_sst_fwhub(struct flashchip *flash);
extern int write_sst_fwhub(struct flashchip *flash, uint8_t *buf);

/* w49f002u.c */
extern int write_49f002(struct flashchip *flash, uint8_t *buf);
265

266
#endif				/* !__FLASH_H__ */