public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
@ 2010-12-03 14:27 Matthias Weißer
  2010-12-03 14:47 ` Wolfgang Denk
  0 siblings, 1 reply; 8+ messages in thread
From: Matthias Weißer @ 2010-12-03 14:27 UTC (permalink / raw)
  To: u-boot

Hi

I just activated the dcache on our jadecpu board but it seems to me that 
this breaks some commands.

jade> dcache
Data (writethrough) Cache is OFF
jade> usb start
(Re)start USB...
USB:   scanning bus for devices... 2 USB Device(s) found
        scanning bus for storage devices... 1 Storage Device(s) found
jade> dcache on
Data (writethrough) Cache is ON
jade> usb start
(Re)start USB...
USB:   scanning bus for devices... ERROR: CTL:TIMEOUT
2 USB Device(s) found
        scanning bus for storage devices... 0 Storage Device(s) found
jade> dcache off
Data (writethrough) Cache is OFF
jade> usb start
(Re)start USB...
USB:   scanning bus for devices... 2 USB Device(s) found
        scanning bus for storage devices... 1 Storage Device(s) found
jade>

Same goes for tftpboot on this machine and also on a imx25 based system 
which is currently not in mainline. As there is a timeout involved I had 
the timer implementation under suspicion where some static variables may 
be used before relocation but moving them to gd_t didn't help.

Has anyone an explanation for this behavior? Is anyone out there having 
dcache running on an ARM926 and working usb/tftpboot?

Many thanks,
Matthias

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 14:27 [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu Matthias Weißer
@ 2010-12-03 14:47 ` Wolfgang Denk
  2010-12-03 15:09   ` Matthias Weißer
  0 siblings, 1 reply; 8+ messages in thread
From: Wolfgang Denk @ 2010-12-03 14:47 UTC (permalink / raw)
  To: u-boot

Dear =?ISO-8859-15?Q?Matthias_Wei=DFer?=,

In message <4CF8FE3E.9010105@arcor.de> you wrote:
> 
> I just activated the dcache on our jadecpu board but it seems to me that 
> this breaks some commands.

I am not surprised.

> Has anyone an explanation for this behavior? Is anyone out there having 
> dcache running on an ARM926 and working usb/tftpboot?

Many drivers have not been written to work with enabled caches.

As far as USB is concerned, you might be lucky that your system usies
a EHCI controller, so setting CONFIG_EHCI_DCACHE should help.

As for the network driver, you will probably have to figure out
yourself how to fix that.

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
When all is said and done, more is said than done.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 14:47 ` Wolfgang Denk
@ 2010-12-03 15:09   ` Matthias Weißer
  2010-12-03 15:33     ` Wolfgang Denk
  0 siblings, 1 reply; 8+ messages in thread
From: Matthias Weißer @ 2010-12-03 15:09 UTC (permalink / raw)
  To: u-boot

Hello Wolfgang

Am 03.12.2010 15:47, schrieb Wolfgang Denk:
>> Has anyone an explanation for this behavior? Is anyone out there having
>> dcache running on an ARM926 and working usb/tftpboot?
>
> Many drivers have not been written to work with enabled caches.

What is the reason that special handling is needed when dcache is 
enabled? If a driver doesn't use any DMA there should be no need as the 
dcache is only enabled for the RAM and not for any memory mapped IO if I 
understand the code in arch/arm/lib/cache-cp15.c right.

> As far as USB is concerned, you might be lucky that your system usies
> a EHCI controller, so setting CONFIG_EHCI_DCACHE should help.

No, only OHCI.

> As for the network driver, you will probably have to figure out
> yourself how to fix that.

As the memory mapped network controller (SMSC9221) is not cached it 
shouldn't be a problem or do I miss something here?

> Patches welcome.

If someone can give me a little push into the right direction I will try 
but currently I have no idea what to do besides activating the cache 
right before the default "bootm" booting.

Thanks a lot
Matthias

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 15:09   ` Matthias Weißer
@ 2010-12-03 15:33     ` Wolfgang Denk
  2010-12-03 16:34       ` Albert ARIBAUD
  2010-12-03 16:43       ` Matthias Weißer
  0 siblings, 2 replies; 8+ messages in thread
From: Wolfgang Denk @ 2010-12-03 15:33 UTC (permalink / raw)
  To: u-boot

Dear =?ISO-8859-1?Q?Matthias_Wei=DFer?=,

In message <4CF90819.7040904@arcor.de> you wrote:
> 
> >> Has anyone an explanation for this behavior? Is anyone out there having
> >> dcache running on an ARM926 and working usb/tftpboot?
> >
> > Many drivers have not been written to work with enabled caches.
> 
> What is the reason that special handling is needed when dcache is 
> enabled? If a driver doesn't use any DMA there should be no need as the 
> dcache is only enabled for the RAM and not for any memory mapped IO if I 
> understand the code in arch/arm/lib/cache-cp15.c right.

On ARM, device write accesses are typically just store instructions
(in C: assignments to a volatile pointer). With caches on, these
accesses will be - guess what? cached, i. e. they are NOT written to
the device, at least not immediately.  And if you repeatedly read a
register (like when polling for some status bit to change) these
accesses will be cached, too.

You need to make sure that caches are properly flushed / invalidated
at the right points.

> > As far as USB is concerned, you might be lucky that your system usies
> > a EHCI controller, so setting CONFIG_EHCI_DCACHE should help.
> 
> No, only OHCI.

Bad luck.

> As the memory mapped network controller (SMSC9221) is not cached it 
> shouldn't be a problem or do I miss something here?

You said you had enabled the data cache, so why do you think these
accesses are not cached?

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
Blast medicine anyway!  We've learned to tie into every organ in the
human body but one.  The brain!  The brain is what life is all about.
	-- McCoy, "The Menagerie", stardate 3012.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 15:33     ` Wolfgang Denk
@ 2010-12-03 16:34       ` Albert ARIBAUD
  2010-12-03 16:48         ` Matthias Weißer
  2010-12-03 16:43       ` Matthias Weißer
  1 sibling, 1 reply; 8+ messages in thread
From: Albert ARIBAUD @ 2010-12-03 16:34 UTC (permalink / raw)
  To: u-boot

Le 03/12/2010 16:33, Wolfgang Denk a ?crit :

>> What is the reason that special handling is needed when dcache is
>> enabled? If a driver doesn't use any DMA there should be no need as the
>> dcache is only enabled for the RAM and not for any memory mapped IO if I
>> understand the code in arch/arm/lib/cache-cp15.c right.
>
> On ARM, device write accesses are typically just store instructions
> (in C: assignments to a volatile pointer). With caches on, these
> accesses will be - guess what? cached, i. e. they are NOT written to
> the device, at least not immediately.  And if you repeatedly read a
> register (like when polling for some status bit to change) these
> accesses will be cached, too.

In addition to making sure that register reads/write are not bitten by 
caching, note that some controllers have DMA capabilities which require 
proper cache handling for DMA memory buffers -- typically flushing them 
from cache before a DMA to the device, and invalidating their cache 
entries after a DMA from the device.

> Best regards,
>
> Wolfgang Denk

Amicalement,
-- 
Albert.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 15:33     ` Wolfgang Denk
  2010-12-03 16:34       ` Albert ARIBAUD
@ 2010-12-03 16:43       ` Matthias Weißer
  2010-12-03 16:55         ` Wolfgang Denk
  1 sibling, 1 reply; 8+ messages in thread
From: Matthias Weißer @ 2010-12-03 16:43 UTC (permalink / raw)
  To: u-boot

Hello Wolfgang

Am 03.12.2010 16:33, schrieb Wolfgang Denk:
> Dear =?ISO-8859-1?Q?Matthias_Wei=DFer?=,
> 
> In message <4CF90819.7040904@arcor.de> you wrote:
>>
>>>> Has anyone an explanation for this behavior? Is anyone out there having
>>>> dcache running on an ARM926 and working usb/tftpboot?
>>>
>>> Many drivers have not been written to work with enabled caches.
>>
>> What is the reason that special handling is needed when dcache is 
>> enabled? If a driver doesn't use any DMA there should be no need as the 
>> dcache is only enabled for the RAM and not for any memory mapped IO if I 
>> understand the code in arch/arm/lib/cache-cp15.c right.
> 
> On ARM, device write accesses are typically just store instructions
> (in C: assignments to a volatile pointer). With caches on, these
> accesses will be - guess what? cached, i. e. they are NOT written to
>
> the device, at least not immediately.  And if you repeatedly read a
> register (like when polling for some status bit to change) these
> accesses will be cached, too.

I understand this behavior. But it is only true if the memory area in
question is marked as cacheable.

>> As the memory mapped network controller (SMSC9221) is not cached it 
>> shouldn't be a problem or do I miss something here?
> 
> You said you had enabled the data cache, so why do you think these
> accesses are not cached?

Please see arch/arm/lib/cache-cp15.c
The code there creates 4096 page table entries (1MB each) for the whole
4GB address space and initializes each entry in a way that it is not
cacheable (mmu_setup():71). It then changes the page table entries which
are pointing to a RAM area to make these, and only these, cacheable
(dram_bank_mmu_setup():57).

If the whole address space would be cached I would expect that even
writing to NOR flash fails as the write accesses wouldn't reach the
flash chip. But that works perfect on both of my systems.

Thanks
Matthias Wei?er

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 16:34       ` Albert ARIBAUD
@ 2010-12-03 16:48         ` Matthias Weißer
  0 siblings, 0 replies; 8+ messages in thread
From: Matthias Weißer @ 2010-12-03 16:48 UTC (permalink / raw)
  To: u-boot

Am 03.12.2010 17:34, schrieb Albert ARIBAUD:
> In addition to making sure that register reads/write are not bitten by 
> caching, note that some controllers have DMA capabilities which require 
> proper cache handling for DMA memory buffers -- typically flushing them 
> from cache before a DMA to the device, and invalidating their cache 
> entries after a DMA from the device.

This is true. DMA and caching can be a lot of fun for a driver developer
:-) But I can guarantee that the network driver doesn't use any DMA
transfer as the hardware doesn't support it.

Thanks
Matthias Wei?er

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu
  2010-12-03 16:43       ` Matthias Weißer
@ 2010-12-03 16:55         ` Wolfgang Denk
  0 siblings, 0 replies; 8+ messages in thread
From: Wolfgang Denk @ 2010-12-03 16:55 UTC (permalink / raw)
  To: u-boot

Dear =?ISO-8859-1?Q?Matthias_Wei=DFer?=,

In message <4CF91E29.7000906@arcor.de> you wrote:
> 
> > You said you had enabled the data cache, so why do you think these
> > accesses are not cached?
> 
> Please see arch/arm/lib/cache-cp15.c
> The code there creates 4096 page table entries (1MB each) for the whole
> 4GB address space and initializes each entry in a way that it is not
> cacheable (mmu_setup():71). It then changes the page table entries which
> are pointing to a RAM area to make these, and only these, cacheable
> (dram_bank_mmu_setup():57).

You did not mention this before. You just said: "I enabled dcache"
which for e sounds as if you did this globally.

Well, I'm not an export for AT91 in any way...

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
The human mind treats a new idea the way the body  treats  a  strange
protein - it rejects it.                                 - P. Medawar

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-12-03 16:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-03 14:27 [U-Boot] arm: Activating dcache breaks 'usb start' and 'tftpboot' on jadecpu Matthias Weißer
2010-12-03 14:47 ` Wolfgang Denk
2010-12-03 15:09   ` Matthias Weißer
2010-12-03 15:33     ` Wolfgang Denk
2010-12-03 16:34       ` Albert ARIBAUD
2010-12-03 16:48         ` Matthias Weißer
2010-12-03 16:43       ` Matthias Weißer
2010-12-03 16:55         ` Wolfgang Denk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox