[Solved/Patch Question] Weird 5200/mtd-ram problem
Jon Smirl
jonsmirl at gmail.com
Thu May 28 13:10:23 EST 2009
On Wed, May 27, 2009 at 3:54 PM, Albrecht Dreß <albrecht.dress at 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 at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
>
--
Jon Smirl
jonsmirl at gmail.com
More information about the Linuxppc-dev
mailing list