1012771d8Swdenk 2012771d8Swdenk /* Linux driver for Disk-On-Chip 2000 */ 3012771d8Swdenk /* (c) 1999 Machine Vision Holdings, Inc. */ 4012771d8Swdenk /* Author: David Woodhouse <dwmw2@mvhi.com> */ 5012771d8Swdenk /* $Id: doc2000.h,v 1.15 2001/09/19 00:22:15 dwmw2 Exp $ */ 6012771d8Swdenk 7012771d8Swdenk #ifndef __MTD_DOC2000_H__ 8012771d8Swdenk #define __MTD_DOC2000_H__ 9012771d8Swdenk 10012771d8Swdenk struct DiskOnChip; 11012771d8Swdenk 12012771d8Swdenk #include <linux/mtd/nftl.h> 13012771d8Swdenk 14012771d8Swdenk #define DoC_Sig1 0 15012771d8Swdenk #define DoC_Sig2 1 16012771d8Swdenk 17012771d8Swdenk #define DoC_ChipID 0x1000 18012771d8Swdenk #define DoC_DOCStatus 0x1001 19012771d8Swdenk #define DoC_DOCControl 0x1002 20012771d8Swdenk #define DoC_FloorSelect 0x1003 21012771d8Swdenk #define DoC_CDSNControl 0x1004 22012771d8Swdenk #define DoC_CDSNDeviceSelect 0x1005 23012771d8Swdenk #define DoC_ECCConf 0x1006 24012771d8Swdenk #define DoC_2k_ECCStatus 0x1007 25012771d8Swdenk 26012771d8Swdenk #define DoC_CDSNSlowIO 0x100d 27012771d8Swdenk #define DoC_ECCSyndrome0 0x1010 28012771d8Swdenk #define DoC_ECCSyndrome1 0x1011 29012771d8Swdenk #define DoC_ECCSyndrome2 0x1012 30012771d8Swdenk #define DoC_ECCSyndrome3 0x1013 31012771d8Swdenk #define DoC_ECCSyndrome4 0x1014 32012771d8Swdenk #define DoC_ECCSyndrome5 0x1015 33012771d8Swdenk #define DoC_AliasResolution 0x101b 34012771d8Swdenk #define DoC_ConfigInput 0x101c 35012771d8Swdenk #define DoC_ReadPipeInit 0x101d 36012771d8Swdenk #define DoC_WritePipeTerm 0x101e 37012771d8Swdenk #define DoC_LastDataRead 0x101f 38012771d8Swdenk #define DoC_NOP 0x1020 39012771d8Swdenk 40012771d8Swdenk #define DoC_Mil_CDSN_IO 0x0800 41012771d8Swdenk #define DoC_2k_CDSN_IO 0x1800 42012771d8Swdenk 43012771d8Swdenk #define ReadDOC_(adr, reg) ((volatile unsigned char)(*(volatile __u8 *)(((unsigned long)adr)+((reg))))) 44012771d8Swdenk #define WriteDOC_(d, adr, reg) do{ *(volatile __u8 *)(((unsigned long)adr)+((reg))) = (__u8)d; eieio();} while(0) 45012771d8Swdenk 46012771d8Swdenk #define DOC_IOREMAP_LEN 0x4000 47012771d8Swdenk 48012771d8Swdenk /* These are provided to directly use the DoC_xxx defines */ 49012771d8Swdenk #define ReadDOC(adr, reg) ReadDOC_(adr,DoC_##reg) 50012771d8Swdenk #define WriteDOC(d, adr, reg) WriteDOC_(d,adr,DoC_##reg) 51012771d8Swdenk 52012771d8Swdenk #define DOC_MODE_RESET 0 53012771d8Swdenk #define DOC_MODE_NORMAL 1 54012771d8Swdenk #define DOC_MODE_RESERVED1 2 55012771d8Swdenk #define DOC_MODE_RESERVED2 3 56012771d8Swdenk 57012771d8Swdenk #define DOC_MODE_MDWREN 4 58012771d8Swdenk #define DOC_MODE_CLR_ERR 0x80 59012771d8Swdenk 60012771d8Swdenk #define DOC_ChipID_UNKNOWN 0x00 61012771d8Swdenk #define DOC_ChipID_Doc2k 0x20 62012771d8Swdenk #define DOC_ChipID_DocMil 0x30 63012771d8Swdenk 64012771d8Swdenk #define CDSN_CTRL_FR_B 0x80 65012771d8Swdenk #define CDSN_CTRL_ECC_IO 0x20 66012771d8Swdenk #define CDSN_CTRL_FLASH_IO 0x10 67012771d8Swdenk #define CDSN_CTRL_WP 0x08 68012771d8Swdenk #define CDSN_CTRL_ALE 0x04 69012771d8Swdenk #define CDSN_CTRL_CLE 0x02 70012771d8Swdenk #define CDSN_CTRL_CE 0x01 71012771d8Swdenk 72012771d8Swdenk #define DOC_ECC_RESET 0 73012771d8Swdenk #define DOC_ECC_ERROR 0x80 74012771d8Swdenk #define DOC_ECC_RW 0x20 75012771d8Swdenk #define DOC_ECC__EN 0x08 76012771d8Swdenk #define DOC_TOGGLE_BIT 0x04 77012771d8Swdenk #define DOC_ECC_RESV 0x02 78012771d8Swdenk #define DOC_ECC_IGNORE 0x01 79012771d8Swdenk 80012771d8Swdenk /* We have to also set the reserved bit 1 for enable */ 81012771d8Swdenk #define DOC_ECC_EN (DOC_ECC__EN | DOC_ECC_RESV) 82012771d8Swdenk #define DOC_ECC_DIS (DOC_ECC_RESV) 83012771d8Swdenk 84012771d8Swdenk #define MAX_FLOORS 4 85012771d8Swdenk #define MAX_CHIPS 4 86012771d8Swdenk 87012771d8Swdenk #define MAX_FLOORS_MIL 4 88012771d8Swdenk #define MAX_CHIPS_MIL 1 89012771d8Swdenk 90012771d8Swdenk #define ADDR_COLUMN 1 91012771d8Swdenk #define ADDR_PAGE 2 92012771d8Swdenk #define ADDR_COLUMN_PAGE 3 93012771d8Swdenk 94*2fc000d7SMarian Balakowicz struct Nand { 95*2fc000d7SMarian Balakowicz char floor, chip; 96*2fc000d7SMarian Balakowicz unsigned long curadr; 97*2fc000d7SMarian Balakowicz unsigned char curmode; 98*2fc000d7SMarian Balakowicz /* Also some erase/write/pipeline info when we get that far */ 99*2fc000d7SMarian Balakowicz }; 100*2fc000d7SMarian Balakowicz 101012771d8Swdenk struct DiskOnChip { 102012771d8Swdenk unsigned long physadr; 103012771d8Swdenk unsigned long virtadr; 104012771d8Swdenk unsigned long totlen; 105012771d8Swdenk char* name; 106012771d8Swdenk char ChipID; /* Type of DiskOnChip */ 107012771d8Swdenk int ioreg; 108012771d8Swdenk 109012771d8Swdenk char* chips_name; 110012771d8Swdenk unsigned long mfr; /* Flash IDs - only one type of flash per device */ 111012771d8Swdenk unsigned long id; 112012771d8Swdenk int chipshift; 113012771d8Swdenk char page256; 114012771d8Swdenk char pageadrlen; 115012771d8Swdenk unsigned long erasesize; 116012771d8Swdenk 117012771d8Swdenk int curfloor; 118012771d8Swdenk int curchip; 119012771d8Swdenk 120012771d8Swdenk int numchips; 121012771d8Swdenk struct Nand *chips; 122012771d8Swdenk 123012771d8Swdenk int nftl_found; 124012771d8Swdenk struct NFTLrecord nftl; 125012771d8Swdenk }; 126012771d8Swdenk 127012771d8Swdenk #define SECTORSIZE 512 128012771d8Swdenk 129012771d8Swdenk /* Return codes from doc_write(), doc_read(), and doc_erase(). 130012771d8Swdenk */ 131012771d8Swdenk #define DOC_OK 0 132012771d8Swdenk #define DOC_EIO 1 133012771d8Swdenk #define DOC_EINVAL 2 134012771d8Swdenk #define DOC_EECC 3 135012771d8Swdenk #define DOC_ETIMEOUT 4 136012771d8Swdenk 137012771d8Swdenk /* 138012771d8Swdenk * Function Prototypes 139012771d8Swdenk */ 140012771d8Swdenk int doc_decode_ecc(unsigned char sector[512], unsigned char ecc1[6]); 141012771d8Swdenk 142012771d8Swdenk int doc_rw(struct DiskOnChip* this, int cmd, loff_t from, size_t len, 143012771d8Swdenk size_t *retlen, u_char *buf); 144012771d8Swdenk int doc_read_ecc(struct DiskOnChip* this, loff_t from, size_t len, 145012771d8Swdenk size_t *retlen, u_char *buf, u_char *eccbuf); 146012771d8Swdenk int doc_write_ecc(struct DiskOnChip* this, loff_t to, size_t len, 147012771d8Swdenk size_t *retlen, const u_char *buf, u_char *eccbuf); 148012771d8Swdenk int doc_read_oob(struct DiskOnChip* this, loff_t ofs, size_t len, 149012771d8Swdenk size_t *retlen, u_char *buf); 150012771d8Swdenk int doc_write_oob(struct DiskOnChip* this, loff_t ofs, size_t len, 151012771d8Swdenk size_t *retlen, const u_char *buf); 152012771d8Swdenk int doc_erase (struct DiskOnChip* this, loff_t ofs, size_t len); 153012771d8Swdenk 154012771d8Swdenk void doc_probe(unsigned long physadr); 155012771d8Swdenk 156012771d8Swdenk void doc_print(struct DiskOnChip*); 157012771d8Swdenk 158*2fc000d7SMarian Balakowicz /* 159*2fc000d7SMarian Balakowicz * Standard NAND flash commands 160*2fc000d7SMarian Balakowicz */ 161*2fc000d7SMarian Balakowicz #define NAND_CMD_READ0 0 162*2fc000d7SMarian Balakowicz #define NAND_CMD_READ1 1 163*2fc000d7SMarian Balakowicz #define NAND_CMD_PAGEPROG 0x10 164*2fc000d7SMarian Balakowicz #define NAND_CMD_READOOB 0x50 165*2fc000d7SMarian Balakowicz #define NAND_CMD_ERASE1 0x60 166*2fc000d7SMarian Balakowicz #define NAND_CMD_STATUS 0x70 167*2fc000d7SMarian Balakowicz #define NAND_CMD_SEQIN 0x80 168*2fc000d7SMarian Balakowicz #define NAND_CMD_READID 0x90 169*2fc000d7SMarian Balakowicz #define NAND_CMD_ERASE2 0xd0 170*2fc000d7SMarian Balakowicz #define NAND_CMD_RESET 0xff 171*2fc000d7SMarian Balakowicz 172*2fc000d7SMarian Balakowicz /* 173*2fc000d7SMarian Balakowicz * NAND Flash Manufacturer ID Codes 174*2fc000d7SMarian Balakowicz */ 175*2fc000d7SMarian Balakowicz #define NAND_MFR_TOSHIBA 0x98 176*2fc000d7SMarian Balakowicz #define NAND_MFR_SAMSUNG 0xec 177*2fc000d7SMarian Balakowicz 178*2fc000d7SMarian Balakowicz /* 179*2fc000d7SMarian Balakowicz * NAND Flash Device ID Structure 180*2fc000d7SMarian Balakowicz * 181*2fc000d7SMarian Balakowicz * Structure overview: 182*2fc000d7SMarian Balakowicz * 183*2fc000d7SMarian Balakowicz * name - Complete name of device 184*2fc000d7SMarian Balakowicz * 185*2fc000d7SMarian Balakowicz * manufacture_id - manufacturer ID code of device. 186*2fc000d7SMarian Balakowicz * 187*2fc000d7SMarian Balakowicz * model_id - model ID code of device. 188*2fc000d7SMarian Balakowicz * 189*2fc000d7SMarian Balakowicz * chipshift - total number of address bits for the device which 190*2fc000d7SMarian Balakowicz * is used to calculate address offsets and the total 191*2fc000d7SMarian Balakowicz * number of bytes the device is capable of. 192*2fc000d7SMarian Balakowicz * 193*2fc000d7SMarian Balakowicz * page256 - denotes if flash device has 256 byte pages or not. 194*2fc000d7SMarian Balakowicz * 195*2fc000d7SMarian Balakowicz * pageadrlen - number of bytes minus one needed to hold the 196*2fc000d7SMarian Balakowicz * complete address into the flash array. Keep in 197*2fc000d7SMarian Balakowicz * mind that when a read or write is done to a 198*2fc000d7SMarian Balakowicz * specific address, the address is input serially 199*2fc000d7SMarian Balakowicz * 8 bits at a time. This structure member is used 200*2fc000d7SMarian Balakowicz * by the read/write routines as a loop index for 201*2fc000d7SMarian Balakowicz * shifting the address out 8 bits at a time. 202*2fc000d7SMarian Balakowicz * 203*2fc000d7SMarian Balakowicz * erasesize - size of an erase block in the flash device. 204*2fc000d7SMarian Balakowicz */ 205*2fc000d7SMarian Balakowicz struct nand_flash_dev { 206*2fc000d7SMarian Balakowicz char * name; 207*2fc000d7SMarian Balakowicz int manufacture_id; 208*2fc000d7SMarian Balakowicz int model_id; 209*2fc000d7SMarian Balakowicz int chipshift; 210*2fc000d7SMarian Balakowicz char page256; 211*2fc000d7SMarian Balakowicz char pageadrlen; 212*2fc000d7SMarian Balakowicz unsigned long erasesize; 213*2fc000d7SMarian Balakowicz int bus16; 214*2fc000d7SMarian Balakowicz }; 215*2fc000d7SMarian Balakowicz 216012771d8Swdenk #endif /* __MTD_DOC2000_H__ */ 217