Module Name:    src
Committed By:   uebayasi
Date:           Wed Feb 24 01:19:37 UTC 2010

Modified Files:
        src/sys/dev [uebayasi-xip]: flash.c flashvar.h

Log Message:
Implement DIOCGPHYSADDR, a special block device ioctl for block devices that
can be directly memory-mapped.  When such a device is mounted, VFS checks
the backing store is XIP capable by querying this ioctl.

Add struct disk to struct flash_softc and let it do common bdev tasks.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/dev/flash.c src/sys/dev/flashvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/flash.c
diff -u src/sys/dev/flash.c:1.1.2.1 src/sys/dev/flash.c:1.1.2.2
--- src/sys/dev/flash.c:1.1.2.1	Fri Feb 12 01:36:02 2010
+++ src/sys/dev/flash.c	Wed Feb 24 01:19:37 2010
@@ -1,4 +1,4 @@
-/*	$Id: flash.c,v 1.1.2.1 2010/02/12 01:36:02 uebayasi Exp $	*/
+/*	$Id: flash.c,v 1.1.2.2 2010/02/24 01:19:37 uebayasi Exp $	*/
 
 /*-
  * Copyright (c) 2010 Tsubai Masanari.  All rights reserved.
@@ -26,6 +26,8 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "opt_xip.h"
+
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/conf.h>
@@ -44,7 +46,7 @@
 
 struct bdevsw flash_bdevsw = {
 	flash_open, flash_close, flash_strategy, flash_ioctl,
-	nodump, flash_size, D_DISK
+	nodump, flash_size, D_DISK | D_MPSAFE
 };
 
 struct cdevsw flash_cdevsw = {
@@ -56,10 +58,23 @@
 flash_open(dev_t dev, int flags, int fmt, struct lwp *l)
 {
 	struct flash_softc *sc = device_lookup_private(&flash_cd, minor(dev));
+	struct disk *dk = &sc->sc_dkdev;
 
 	if (sc == NULL)
 		return ENXIO;
 
+	mutex_enter(&dk->dk_openlock);
+	switch (fmt) {
+		case S_IFCHR:
+		dk->dk_copenmask |= pmask;
+		break;
+	case S_IFBLK:
+		dk->dk_bopenmask |= pmask;
+		break;
+	}
+	dk->dk_openmask = dk->dk_copenmask | dk->dk_bopenmask;
+	mutex_exit(&dk->dk_openlock);
+
 	return 0;
 }
 
@@ -74,11 +89,37 @@
 {
 	struct flash_softc *sc = device_lookup_private(&flash_cd, minor(dev));
 	struct flash_program *fp;
+	int error = 0;
 
 	if (sc == NULL)
 		return -1;
 
-	return EPASSTHROUGH;
+	switch (cmd) {
+#ifdef XIP
+	case DIOCGPHYSADDR:
+		if (sc->sc_addr == 0)
+			error = EINVAL;
+		else
+			*(paddr_t *)data = sc->sc_addr;
+		break;
+#endif
+
+	case DIOCGDINFO:
+		*(struct disklabel *)data = *sc->sc_dkdev.dk_label;
+		break;
+
+	case DIOCGPART:
+		((struct partinfo *)data)->disklab = sc->sc_dkdev.dk_label;
+		((struct partinfo *)data)->part =
+		    &sc->sc_dkdev.dk_label->d_partitions[part];
+		break;
+
+	default:
+		error = EINVAL;
+		break;
+	}
+
+	return error;
 }
 
 int
Index: src/sys/dev/flashvar.h
diff -u src/sys/dev/flashvar.h:1.1.2.1 src/sys/dev/flashvar.h:1.1.2.2
--- src/sys/dev/flashvar.h:1.1.2.1	Fri Feb 12 01:36:02 2010
+++ src/sys/dev/flashvar.h	Wed Feb 24 01:19:37 2010
@@ -1,4 +1,4 @@
-/*	$Id: flashvar.h,v 1.1.2.1 2010/02/12 01:36:02 uebayasi Exp $	*/
+/*	$Id: flashvar.h,v 1.1.2.2 2010/02/24 01:19:37 uebayasi Exp $	*/
 
 /*-
  * Copyright (c) 2010 Tsubai Masanari.  All rights reserved.
@@ -29,6 +29,8 @@
 #ifndef _DEV_FLASH_FLASHVAR_H_
 #define _DEV_FLASH_FLASHVAR_H_
 
+#include <sys/disk.h>
+
 struct flash_product {
 	u_char manuId;
 	u_char devId1, devId2, devId3;
@@ -38,6 +40,7 @@
 
 struct flash_softc {
 	struct device sc_dev;
+	struct disk sc_dkdev;
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_baseioh;
 	bus_space_handle_t sc_ioh;

Reply via email to