Subject: Re: MTD devices in NetBSD
To: Garrett D'Amore <garrett_damore@tadpole.com>
From: Christos Zoulas <christos@zoulas.com>
List: tech-kern
Date: 03/22/2006 08:57:06
On Mar 21, 11:36pm, garrett_damore@tadpole.com ("Garrett D'Amore") wrote:
-- Subject: MTD devices in NetBSD
| Okay, I'm ready to start getting *serious* about supporting MTD (flash!)
| devices in NetBSD.
|
| I've been doing a lot of research. I want to sum it up here, along
| with my thoughts. I'm *particularly* interested in what core@ has to
| say, so that perhaps we can move to actually implementing something
| "real". I am aware that others are starting to work on this problem,
| but I think there is a lack of hard technical direction, and I think it
| is important to get the "framework" right:
|
| MTD devices differ from regular "block" devices in some important aspects:
|
| 1. you have to erase a block before you write it (read-modify-write
| cycle)
| 2. They need wear-leveling (writes "wear" the bits out) to prolong
| device life
| 3. Many NOR devices can map directly into system memory while in read
| mode
| 4. Generally NAND devices cannot do this, and usually need special
| handling
| 5. You may have to to do bad block management (some block devices
| have to do this)
| 6. Generally, most filesystems designed for use with block devices
| won't work so well
| 7. Some devices support "execute in place", while some do not
| 8. CompactFlash doesn't count, because it looks like an IDE disk. :-)
|
|
| Now, here's the Linux approach (as I understand it) to this problem,
| which I think is generally right, though certain bits of their
| implementation may or may not be suboptimal:
|
| 1. There is a general MTD framework. Think of this as a block-device
| like framework, except with different operations.
| 2. Each flash device driver implements operations to hook into the
| MTD framework
| 3. The MTD framework exports "block" and "character" emulations for
| stuff that needs it.
| 4. The best way to use MTD devices is with a filesystem like JFFSv2,
| that avoids the translation layers and accesses the "raw" MTD
| operations.
|
|
| Now, here's what I'm thinking:
|
| 1. Start with a definition of what ops an MTD must export, probably
| following Linux in this regard
| 2. Implement MI NOR flash driver using "CFI" (Common Flash Interface,
| found on many NOR ports)
| 3. Implement bus-specific stuff for one or more platforms.
| 4. Implement MTD stuff as an "mtdbus" for lack of a better abstraction
| 5. Implement "mtd" (block/char compat) driver on top of mtdbus
| 6. Eventually, look at a rewrite of JFFS2 or YAFFS.
|
|
| I'm willing to take on points 1 thru 4 at least, and possibly also 5,
| because more or less I need this in order to complete work I'm already
| obligated to perform. However, I don't want to bikeshed on this, so I
| need to get approval on the technical direction fairly quickly.
|
| The resulting driver tree would look like (using alchemy as an example)
|
| mainbus -> aubus -> cfiflash (via cfiflash_arbus.c) -> mtdbus -> mtd
| (and maybe ffs mounted on top of mtd)
|
|
| Given this, it would then be possible for someone else to write a JFFS2,
| or drivers for NAND flash, or e.g. attachment drivers for other kinds of
| flash devices.
|
| What do people think? And more importantly, what does core@ think?
|
| (And I'm especially interested in ideas from folks with experience with
| MTD devices, either under Linux or under either OS'. I confess I've not
| looked into OpenBSD or FreeBSD yet, but I'm planning on doing that
| tomorrow.)
|
I am not an expert but all this sounds very reasonable to me.
christos