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

Reply via email to