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;