PERFORCE change 175448 for review

Rafal Jaworowski raj at FreeBSD.org
Sun Mar 7 15:28:17 UTC 2010


http://p4web.freebsd.org/chv.cgi?CH=175448

Change 175448 by raj at raj_nand on 2010/03/07 15:27:19

	Initial import of the NAND Flash framework.
	
	This provides a set of KOBJ interfaces inside the kernel, which allow
	for uniform and flexible management of the NAND devices:
	
	- NAND Flash Controller (NFC) layer, into which back-end drivers for
	  individual controllers plug in (implementing low-level routines
	  specific to a given NAND controller)
	
	- Generic (common) NAND layer which provides means to perform
	  operations on the flash devices in an abstract way (read, program,
	  erase, get status etc.).
	
	- NAND character device, which exports chip device as a standard
	  character devices and allows to read/write directly to a device, as
	  well as perform other specific operations by using ioctl.
	
	- GEOM NAND class for basic access through GEOM.
	
	Obtained from:	Juniper Networks, Semihalf

Affected files ...

.. //depot/projects/nand2/etc/mtree/BSD.include.dist#2 edit
.. //depot/projects/nand2/include/Makefile#2 edit
.. //depot/projects/nand2/sys/dev/nand/nand.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nand.h#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_bbt.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_cdev.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_cdev.h#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_ecc_pos.h#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_geom.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_id.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nand_if.m#1 add
.. //depot/projects/nand2/sys/dev/nand/nandbus.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nandbus.h#1 add
.. //depot/projects/nand2/sys/dev/nand/nfc_generic.c#1 add
.. //depot/projects/nand2/sys/dev/nand/nfc_if.m#1 add
.. //depot/projects/nand2/sys/geom/geom_dev.c#2 edit
.. //depot/projects/nand2/sys/geom/geom_disk.c#2 edit
.. //depot/projects/nand2/sys/geom/geom_disk.h#2 edit
.. //depot/projects/nand2/sys/geom/geom_nand.c#1 add
.. //depot/projects/nand2/sys/geom/geom_nand.h#1 add
.. //depot/projects/nand2/sys/sys/bio.h#2 edit
.. //depot/projects/nand2/sys/sys/disk.h#2 edit

Differences ...

==== //depot/projects/nand2/etc/mtree/BSD.include.dist#2 (text+ko) ====

@@ -110,6 +110,8 @@
             mpilib
             ..
         ..
+        nand
+        ..
         ofw
         ..
         pbio

==== //depot/projects/nand2/include/Makefile#2 (text+ko) ====

@@ -40,7 +40,7 @@
 
 LSUBDIRS=	cam/ata cam/scsi \
 	dev/acpica dev/an dev/bktr dev/firewire dev/hwpmc \
-	dev/ic dev/iicbus ${_dev_ieee488} dev/lmc dev/mfi dev/ofw \
+	dev/ic dev/iicbus ${_dev_ieee488} dev/lmc dev/mfi dev/nand dev/ofw \
 	dev/pbio ${_dev_powermac_nvram} dev/ppbus dev/smbus \
 	dev/speaker dev/usb dev/utopia dev/vkbd dev/wi \
 	fs/devfs fs/fdescfs fs/fifofs fs/msdosfs fs/nfs fs/ntfs fs/nullfs \
@@ -150,7 +150,7 @@
 	done
 .endif
 .endfor
-.for i in ${LDIRS} ${LSUBDIRS:Ndev/acpica:Ndev/bktr} ${LSUBSUBDIRS}
+.for i in ${LDIRS} ${LSUBDIRS:Ndev/acpica:Ndev/bktr:Ndev/nand} ${LSUBSUBDIRS}
 	cd ${.CURDIR}/../sys; \
 	${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 $i/*.h \
 	    ${DESTDIR}${INCLUDEDIR}/$i
@@ -161,6 +161,11 @@
 	cd ${.CURDIR}/../sys/dev/bktr; \
 	${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 ioctl_*.h \
 	    ${DESTDIR}${INCLUDEDIR}/dev/bktr
+	cd ${.CURDIR}/../sys/dev/nand; \
+	${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 nandsim.h \
+	    ${DESTDIR}${INCLUDEDIR}/dev/nand; \
+	${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 nand_cdev.h \
+	    ${DESTDIR}${INCLUDEDIR}/dev/nand
 	cd ${.CURDIR}/../sys/contrib/altq/altq; \
 	${INSTALL} -C -o ${BINOWN} -g ${BINGRP} -m 444 *.h \
 	    ${DESTDIR}${INCLUDEDIR}/altq
@@ -215,7 +220,7 @@
 		ln -fs ../../../sys/$i/$$h ${DESTDIR}${INCLUDEDIR}/$i; \
 	done
 .endfor
-.for i in ${LSUBDIRS:Ndev/acpica:Ndev/bktr}
+.for i in ${LSUBDIRS:Ndev/acpica:Ndev/bktr:Ndev/nand}
 	cd ${.CURDIR}/../sys/$i; \
 	for h in *.h; do \
 		ln -fs ../../../../sys/$i/$$h ${DESTDIR}${INCLUDEDIR}/$i; \
@@ -231,6 +236,11 @@
 		ln -fs ../../../../sys/dev/bktr/$$h \
 		    ${DESTDIR}${INCLUDEDIR}/dev/bktr; \
 	done
+	cd ${.CURDIR}/../sys/dev/nand; \
+	for h in nandsim.h nand_cdev.h; do \
+		ln -fs ../../../../sys/dev/nand/$$h \
+		    ${DESTDIR}${INCLUDEDIR}/dev/nand; \
+	done
 .for i in ${LSUBSUBDIRS}
 	cd ${.CURDIR}/../sys/$i; \
 	for h in *.h; do \

==== //depot/projects/nand2/sys/geom/geom_dev.c#2 (text+ko) ====

@@ -267,6 +267,16 @@
 		if (error == 0 && *(u_int *)data == 0)
 			error = ENOENT;
 		break;
+	case DIOCNOOBSIZE:
+		error = g_io_getattr("NAND::oobsize", cp, &i, data);
+		if (error == 0 && *(u_int *)data == 0)
+			error = ENOENT;
+		break;
+	case DIOCNPGSIZE:
+		error = g_io_getattr("NAND::pagesize", cp, &i, data);
+		if (error == 0 && *(u_int *)data == 0)
+			error = ENOENT;
+		break;
 	case DIOCGFRONTSTUFF:
 		error = g_io_getattr("GEOM::frontstuff", cp, &i, data);
 		break;

==== //depot/projects/nand2/sys/geom/geom_disk.c#2 (text+ko) ====

@@ -301,6 +301,10 @@
 			break;
 		else if (g_handleattr_int(bp, "GEOM::fwheads", dp->d_fwheads))
 			break;
+		else if (g_handleattr_int(bp, "NAND::oobsize", dp->n_oobsize))
+			break;
+		else if (g_handleattr_int(bp, "NAND::pagesize", dp->n_pagesize))
+			break;
 		else if (g_handleattr_off_t(bp, "GEOM::frontstuff", 0))
 			break;
 		else if (g_handleattr_str(bp, "GEOM::ident", dp->d_ident))

==== //depot/projects/nand2/sys/geom/geom_disk.h#2 (text+ko) ====

@@ -84,6 +84,8 @@
 	u_int			d_maxsize;
 	u_int			d_stripeoffset;
 	u_int			d_stripesize;
+	u_int			n_oobsize;
+	u_int			n_pagesize;
 	char			d_ident[DISK_IDENT_SIZE];
 
 	/* Fields private to the driver */

==== //depot/projects/nand2/sys/sys/bio.h#2 (text+ko) ====

@@ -64,6 +64,7 @@
 
 typedef void bio_task_t(void *);
 
+
 /*
  * The bio structure describes an I/O operation in the kernel.
  */
@@ -73,7 +74,10 @@
 	uint8_t	bio_cflags;		/* Private use by the consumer. */
 	uint8_t	bio_pflags;		/* Private use by the provider. */
 	struct cdev *bio_dev;		/* Device to do I/O on. */
-	struct disk *bio_disk;		/* Valid below geom_disk.c only */
+	union {
+		struct disk *bio_disk;		/* Valid below geom_disk.c only */
+		struct gnand *bio_nand;		/* Valid below geom_disk.c only */
+	} bio_source;
 	off_t	bio_offset;		/* Offset into file. */
 	long	bio_bcount;		/* Valid bytes in buffer. */
 	caddr_t	bio_data;		/* Memory, superblocks, indirect etc. */
@@ -111,6 +115,24 @@
 	daddr_t bio_pblkno;               /* physical block number */
 };
 
+#define	bio_disk		bio_source.bio_disk
+#define	bio_nand		bio_source.bio_nand
+
+/* bio_cmd */
+#define BIO_READ	0x01
+#define BIO_WRITE	0x02
+#define BIO_DELETE	0x04
+#define BIO_GETATTR	0x08
+#define BIO_FLUSH	0x10
+#define BIO_CMD0	0x20	/* Available for local hacks */
+#define BIO_CMD1	0x40	/* Available for local hacks */
+#define BIO_CMD2	0x80	/* Available for local hacks */
+
+/* bio_flags */
+#define BIO_ERROR	0x01
+#define BIO_DONE	0x02
+#define BIO_ONQUEUE	0x04
+
 struct uio;
 struct devstat;
 

==== //depot/projects/nand2/sys/sys/disk.h#2 (text+ko) ====

@@ -116,4 +116,7 @@
 	 * This should be a multiple of the sectorsize.
 	 */
 
+#define DIOCNOOBSIZE	_IOR('d', 141, u_int)	/* Get oob size */
+#define DIOCNPGSIZE	_IOR('d', 142, u_int)	/* Get page size */
+
 #endif /* _SYS_DISK_H_ */


More information about the p4-projects mailing list