* [U-Boot] MMC and buffer alignment question
@ 2014-03-19 14:16 Markus Niebel
2014-03-19 14:22 ` Eric Nelson
0 siblings, 1 reply; 6+ messages in thread
From: Markus Niebel @ 2014-03-19 14:16 UTC (permalink / raw)
To: u-boot
Hello Pantelis,
short question to the usage of the mmc command (and also the mmc driver API): is it intended that mmc read / write may fail when the supplied address in RAM is not aligned?
ARMV7 will give output like this:
U-Boot > mmc read 12000002 44 44
MMC read: dev # 0, block # 68, count 68 ... INFO: 24994 of 25000 loops left to DAT0 timeout
ERROR: v7_dcache_inval_range - start address is not aligned - 0x12000002
ERROR: v7_dcache_inval_range - stop address is not aligned - 0x12008802
68 blocks read: OK
On my platform (i.MX6 / Cortex A9) the alignment needed is 32 Byte.
Special commands inside the mmc drivers and in env_mmc implement the alignment magic. Shouldn't the mmc do the magic (and if neccesarry provide help using temp buffers if needed) so that all users outside can read / write without caring for special cases?
Markus
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] MMC and buffer alignment question
2014-03-19 14:16 [U-Boot] MMC and buffer alignment question Markus Niebel
@ 2014-03-19 14:22 ` Eric Nelson
2014-03-19 14:44 ` Wolfgang Denk
0 siblings, 1 reply; 6+ messages in thread
From: Eric Nelson @ 2014-03-19 14:22 UTC (permalink / raw)
To: u-boot
Hi Markus,
On 03/19/2014 07:16 AM, Markus Niebel wrote:
> Hello Pantelis,
>
> short question to the usage of the mmc command (and also the mmc
> driver API): is it intended that mmc read / write may fail when the
> supplied address in RAM is not aligned?
>
If not intended, it is known.
> ARMV7 will give output like this:
>
> U-Boot > mmc read 12000002 44 44
>
Why would you want to do this?
> MMC read: dev # 0, block # 68, count 68 ... INFO: 24994 of 25000 loops left to DAT0 timeout
> ERROR: v7_dcache_inval_range - start address is not aligned - 0x12000002
> ERROR: v7_dcache_inval_range - stop address is not aligned - 0x12008802
> 68 blocks read: OK
>
> On my platform (i.MX6 / Cortex A9) the alignment needed is 32 Byte.
>
> Special commands inside the mmc drivers and in env_mmc implement the
> alignment magic. Shouldn't the mmc do the magic (and if neccesarry
> provide help using temp buffers if needed) so that all users outside can
> read / write without caring for special cases?
>
Is there a use case here? There are plenty of memory addresses that
won't work with commands like "mmc read".
Is it worth **any** code to try and catch them?
Please advise,
Eric
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] MMC and buffer alignment question
2014-03-19 14:22 ` Eric Nelson
@ 2014-03-19 14:44 ` Wolfgang Denk
2014-03-19 17:40 ` Markus Niebel
0 siblings, 1 reply; 6+ messages in thread
From: Wolfgang Denk @ 2014-03-19 14:44 UTC (permalink / raw)
To: u-boot
Dear Eric Nelson,
In message <5329A80B.9020908@boundarydevices.com> you wrote:
>
> > short question to the usage of the mmc command (and also the mmc
> > driver API): is it intended that mmc read / write may fail when the
> > supplied address in RAM is not aligned?
>
> If not intended, it is known.
I consider this a known bug.
> > ARMV7 will give output like this:
> >
> > U-Boot > mmc read 12000002 44 44
> >
> Why would you want to do this?
For example, BMP images require loading on a +2 aligned address due to
their stupid header format. I ran into this before myself: it is
impossible to match both the alignment reuqirements of the bmp command
and the mmc read command at the same time. One must manually copy the
memory ragen again. This is a plain, stupid bug.
> > Special commands inside the mmc drivers and in env_mmc implement the
> > alignment magic. Shouldn't the mmc do the magic (and if neccesarry
> > provide help using temp buffers if needed) so that all users outside can
> > read / write without caring for special cases?
>
> Is there a use case here? There are plenty of memory addresses that
> won't work with commands like "mmc read".
"mmc read" and "mmc write" are operations that work on character
buffers, like all other file IO ops. These should not require any
specific alignment.
> Is it worth **any** code to try and catch them?
Definitely yes.
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Real computer scientists despise the idea of actual hardware. Hard-
ware has limitations, software doesn't. It's a real shame that Turing
machines are so poor at I/O.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] MMC and buffer alignment question
2014-03-19 14:44 ` Wolfgang Denk
@ 2014-03-19 17:40 ` Markus Niebel
2014-03-19 18:18 ` Eric Nelson
0 siblings, 1 reply; 6+ messages in thread
From: Markus Niebel @ 2014-03-19 17:40 UTC (permalink / raw)
To: u-boot
Am 19.03.2014 15:44, wrote Wolfgang Denk:
> Dear Eric Nelson,
>
> In message <5329A80B.9020908@boundarydevices.com> you wrote:
>>
>>> short question to the usage of the mmc command (and also the mmc
>>> driver API): is it intended that mmc read / write may fail when the
>>> supplied address in RAM is not aligned?
>>
>> If not intended, it is known.
>
> I consider this a known bug.
>
>>> ARMV7 will give output like this:
>>>
>>> U-Boot > mmc read 12000002 44 44
>>>
>> Why would you want to do this?
>
> For example, BMP images require loading on a +2 aligned address due to
> their stupid header format. I ran into this before myself: it is
> impossible to match both the alignment reuqirements of the bmp command
> and the mmc read command at the same time. One must manually copy the
> memory ragen again. This is a plain, stupid bug.
>
Exactly here it popped up ...
>>> Special commands inside the mmc drivers and in env_mmc implement the
>>> alignment magic. Shouldn't the mmc do the magic (and if neccesarry
>>> provide help using temp buffers if needed) so that all users outside can
>>> read / write without caring for special cases?
>>
>> Is there a use case here? There are plenty of memory addresses that
>> won't work with commands like "mmc read".
>
env_mmc needs to care for cache aligned buffers - This was fixed some time ago
for the redundant env case
> "mmc read" and "mmc write" are operations that work on character
> buffers, like all other file IO ops. These should not require any
> specific alignment.
>
>> Is it worth **any** code to try and catch them?
>
> Definitely yes.
>
So just as an idea - we could use a bounce buffer for mmc_bwrite / mmc_bread for the
unaligned case. Is definitely slow but should work.
> Best regards,
>
> Wolfgang Denk
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] MMC and buffer alignment question
2014-03-19 17:40 ` Markus Niebel
@ 2014-03-19 18:18 ` Eric Nelson
2014-03-19 19:17 ` Wolfgang Denk
0 siblings, 1 reply; 6+ messages in thread
From: Eric Nelson @ 2014-03-19 18:18 UTC (permalink / raw)
To: u-boot
Hi Markus and Wolfgang,
On 03/19/2014 10:40 AM, Markus Niebel wrote:
> Am 19.03.2014 15:44, wrote Wolfgang Denk:
>> Dear Eric Nelson,
>>
>> In message <5329A80B.9020908@boundarydevices.com> you wrote:
>>>
>>>> short question to the usage of the mmc command (and also the mmc
>>>> driver API): is it intended that mmc read / write may fail when the
>>>> supplied address in RAM is not aligned?
>>>
>>> If not intended, it is known.
>>
>> I consider this a known bug.
>>
>>>> ARMV7 will give output like this:
>>>>
>>>> U-Boot > mmc read 12000002 44 44
>>>>
>>> Why would you want to do this?
>>
>> For example, BMP images require loading on a +2 aligned address due to
>> their stupid header format. I ran into this before myself: it is
>> impossible to match both the alignment reuqirements of the bmp command
>> and the mmc read command at the same time. One must manually copy the
>> memory ragen again. This is a plain, stupid bug.
>>
>
> Exactly here it popped up ...
>
It seems to me that if you're resorting to using un-formatted
storage space to store a broken data structure (the BMP header),
you could just write it at an offset +2.
The BMP support is pretty difficult to use anyway (only supports
BMPV3 headers), so asking the user to know about the offset doesn't
seem onerous.
Also note that the patch I submitted recently handles the case
for gzipped files for those using cfb_console.
>>>> Special commands inside the mmc drivers and in env_mmc implement the
>>>> alignment magic. Shouldn't the mmc do the magic (and if neccesarry
>>>> provide help using temp buffers if needed) so that all users outside can
>>>> read / write without caring for special cases?
>>>
>>> Is there a use case here? There are plenty of memory addresses that
>>> won't work with commands like "mmc read".
>>
>
> env_mmc needs to care for cache aligned buffers - This was fixed some time ago
> for the redundant env case
>
>> "mmc read" and "mmc write" are operations that work on character
>> buffers, like all other file IO ops. These should not require any
>> specific alignment.
>>
>>> Is it worth **any** code to try and catch them?
>>
>> Definitely yes.
>>
IMHO, this seems like overkill. Should we also prevent over-writing
the stack or heap?
>
> So just as an idea - we could use a bounce buffer for mmc_bwrite / mmc_bread for the
> unaligned case. Is definitely slow but should work.
>
Note that "sata read/write" and "usb read/write" have the same issues.
Regards,
Eric
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] MMC and buffer alignment question
2014-03-19 18:18 ` Eric Nelson
@ 2014-03-19 19:17 ` Wolfgang Denk
0 siblings, 0 replies; 6+ messages in thread
From: Wolfgang Denk @ 2014-03-19 19:17 UTC (permalink / raw)
To: u-boot
Dear Eric Nelson,
In message <5329DF5A.7090604@boundarydevices.com> you wrote:
>
> IMHO, this seems like overkill. Should we also prevent over-writing
> the stack or heap?
No. But we should not add any specific alignment requirements to
commands that transfer data to memory. If some driver has such needs
internally, then it should be handled there, but in a way that is
transparent to the user.
> Note that "sata read/write" and "usb read/write" have the same issues.
So these should be fixed, too. Patches welcome :-)
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"UNIX was not designed to stop you from doing stupid things, because
that would also stop you from doing clever things." - Doug Gwyn
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-03-19 19:17 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-19 14:16 [U-Boot] MMC and buffer alignment question Markus Niebel
2014-03-19 14:22 ` Eric Nelson
2014-03-19 14:44 ` Wolfgang Denk
2014-03-19 17:40 ` Markus Niebel
2014-03-19 18:18 ` Eric Nelson
2014-03-19 19:17 ` Wolfgang Denk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox