Annotation of sys/dev/flashvar.h, Revision 1.1
1.1 ! nbrk 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_ */
CVSweb