1 /* $OpenBSD: flashvar.h,v 1.2 2007/06/20 18:15:46 deraadt Exp $ */
2
3 /*
4 * Copyright (c) 2005 Uwe Stuehler <uwe@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #ifndef _FLASHVAR_H_
20 #define _FLASHVAR_H_
21
22 #ifdef _KERNEL
23
24 /* Flash controller descriptor structure */
25 struct flash_ctl_tag {
26 u_int8_t (*reg8_read)(void *, int);
27 int (*regx_read_page)(void *, caddr_t, caddr_t);
28 void (*reg8_write)(void *, int, u_int8_t);
29 int (*regx_write_page)(void *, caddr_t, caddr_t);
30 void (*default_disklabel)(void *, dev_t, struct disklabel *);
31 int (*safe_strategy)(void *, struct buf *);
32 };
33
34 /*
35 * Pseudo-registers for a fictitious flash controller
36 *
37 * Note that logical levels are assumed for CE and WP bits.
38 * Signals corresponding to these bits are usually negated.
39 */
40 #define FLASH_REG_DATA 0x00
41 #define FLASH_REG_COL 0x01
42 #define FLASH_REG_ROW 0x02
43 #define FLASH_REG_CMD 0x03
44 #define FLASH_REG_ALE 0x04
45 #define FLASH_REG_CLE 0x05
46 #define FLASH_REG_CE 0x06
47 #define FLASH_REG_WP 0x07
48 #define FLASH_REG_READY 0x0f
49
50 /* Flash device descriptor structure */
51 struct flashdev {
52 u_int16_t id;
53 const char *longname;
54 u_long pagesize; /* bytes per page */
55 u_long oobsize; /* OOB bytes per page */
56 u_long blkpages; /* pages per erasable block */
57 u_long capacity; /* pages per device */
58 };
59
60 #define FLASH_DEVICE(v,d) ((FLASH_VENDOR_##v << 8) | (d))
61
62 /* Flash device vendors */
63 #define FLASH_VENDOR_SAMSUNG 0xec
64
65 /* Flash devices */
66 #define FLASH_DEVICE_SAMSUNG_K9F2808U0C FLASH_DEVICE(SAMSUNG, 0x73)
67 #define FLASH_DEVICE_SAMSUNG_K9F1G08U0A FLASH_DEVICE(SAMSUNG, 0xf1)
68
69 /* Maximum sizes for all devices */
70 #define FLASH_MAXPAGESIZE 2048
71 #define FLASH_MAXOOBSIZE 64
72
73 /*
74 * Should-be private softc structure for the generic flash driver.
75 */
76 struct flash_softc {
77 struct device sc_dev;
78 /* Disk device information */
79 struct disk sc_dk;
80 struct buf sc_q;
81 struct buf *sc_bp;
82 int sc_flags;
83 /* Flash controller tag */
84 struct flash_ctl_tag *sc_tag;
85 void *sc_cookie;
86 /* Flash device characteristics */
87 const struct flashdev *sc_flashdev;
88 int sc_maxwaitready;
89 int sc_maxwaitcomplete;
90 };
91
92 /* Values for sc_flags */
93 #define FDK_LOADED 0x00000001
94 #define FDK_SAFE 0x00000002
95
96 /*
97 * Similar to vnd(4) devices there are two kinds of flash devices.
98 * Both device kinds share the same disklabel.
99 *
100 * ``Safe'' devices have bit 11 set in the minor number and use the
101 * out-of-band page data to implement wear-leveling and transparent
102 * management of bad block information. Block erasing and rewriting
103 * is also handled transparently; arbitrary pages can be modified.
104 *
105 * ``Unsafe'' devices provide raw access to the flash pages. Access
106 * to OOB page data is possible via ioctl()s only with these devices.
107 * Erasing the containing flash block may be necessary before a page
108 * can be writting successfully, but the block erase command is only
109 * provided as an ioctl().
110 */
111 #define flashsafe(x) (minor(x) & 0x800)
112 #define flashunit(x) DISKUNIT(makedev(major(x), minor(x) & 0x7ff))
113 #define flashpart(x) DISKPART(makedev(major(x), minor(x) & 0x7ff))
114 #define flashlabeldev(x) (MAKEDISKDEV(major(x), flashunit(x), RAW_PART)\
115 |flashsafe(x))
116
117 void flashattach(struct flash_softc *, struct flash_ctl_tag *, void *);
118 int flashdetach(struct device *, int);
119 int flashactivate(struct device *, enum devact);
120
121 u_int8_t flash_reg8_read(struct flash_softc *, int);
122 void flash_reg8_read_page(struct flash_softc *, caddr_t, caddr_t);
123 void flash_reg8_write(struct flash_softc *, int, u_int8_t);
124 void flash_reg8_write_page(struct flash_softc *, caddr_t, caddr_t);
125 void flash_chip_enable(struct flash_softc *);
126 void flash_chip_disable(struct flash_softc *);
127 int flash_chip_reset(struct flash_softc *);
128 int flash_chip_identify(struct flash_softc *, u_int8_t *, u_int8_t *);
129 int flash_chip_erase_block(struct flash_softc *, long);
130 int flash_chip_read_block(struct flash_softc *, long, caddr_t);
131 int flash_chip_read_page(struct flash_softc *, long, caddr_t, caddr_t);
132 int flash_chip_read_oob(struct flash_softc *, long, caddr_t);
133 int flash_chip_write_block(struct flash_softc *, long, caddr_t, caddr_t);
134 int flash_chip_write_page(struct flash_softc *, long, caddr_t, caddr_t);
135 int flash_chip_verify_block(struct flash_softc *, long, caddr_t, caddr_t);
136 int flash_chip_verify_page(struct flash_softc *, long, caddr_t, caddr_t);
137
138 #endif /* _KERNEL */
139
140 /* XXX: define ioctl commands for OOB page data access and block erase. */
141
142 #endif /* _FLASHVAR_H_ */