On Wed, May 27, 2009 at 3:54 PM, Albrecht Dreß <albrecht.dr...@arcor.de> wrote: > Hi all: > > Am 25.05.09 23:47 schrieb(en) Wolfram Sang: >>> >>> A word or long copy of 0x0055aaff with U-Boot works fine, but a byte copy >>> filled the whole ram with 0x0000aaaa.  The reason is apparently that the >>> chip is attached to the local bus in 16-bit mode, which is incompatible with >>> byte accesses.  However, the Local Bus doesn't provide "low byte" or "high >>> byte" indicators in non-muxed mode.  How is this supposed to work then? >> >> Hmm, as I feared... we were bitten by this, too: >> >> http://thread.gmane.org/gmane.linux.drivers.mtd/21521 >> >> There is no generic solution yet :( > > At least for my case, I could completely (afaict) solve the problem, i.e. I > can now access the 16-bit nv ram as mtd char and block device, the latter > with jffs2.  I would like to submit a patch, but I actually don't know > exactly how... > > The solution itself is quite simple: add a new method which works like > memcpy_toio, but respects the fact that no single bytes may be written > (reading through memcpy_fromio works painlessly).  I think this function > should go into arch/powerpc/kernel/io.c, depending upon CONFIG_PPC_MPC52xx, > and the prototype into arch/powerpc/include/asm/io.h, right? > > The harder part is to actually call this function properly.  I now call it > in include/linux/mtd/map.h, function inline_map_copy_to(), if > CONFIG_PPC_MPC52xx is defined and if map->bankwidth is 2.  However, is it > acceptable to have a processor-type dependency in a top-level include file? >  Or what would be the proper way to implement it?
This is an old jffs2 patch that was addressing this same problem. diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c index 272872d..c982adc 100644 --- a/fs/jffs2/scan.c +++ b/fs/jffs2/scan.c @@ -16,6 +16,7 @@ #include <linux/pagemap.h> #include <linux/crc32.h> #include <linux/compiler.h> +#include <asm/io.h> #include "nodelist.h" #include "summary.h" #include "debug.h" @@ -505,7 +506,7 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo sumptr = kmalloc(sumlen, GFP_KERNEL); if (!sumptr) return -ENOMEM; - memcpy(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len); + memcpy_fromio(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len); } if (buf_len < sumlen) { /* Need to read more so that the entire summary node is present */ @@ -1035,7 +1036,7 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo if (!fd) { return -ENOMEM; } - memcpy(&fd->name, rd->name, checkedlen); + memcpy_fromio(&fd->name, rd->name, checkedlen); fd->name[checkedlen] = 0; crc = crc32(0, fd->name, rd->nsize); > > Thanks, Albrecht. > > _______________________________________________ > Linuxppc-dev mailing list > Linuxppc-dev@ozlabs.org > https://ozlabs.org/mailman/listinfo/linuxppc-dev > -- Jon Smirl jonsm...@gmail.com _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev