Subject: Re: Resetting a 405GPr
To: None <tech-ports@netbsd.org>
From: Peter Seebach <seebs@plethora.net>
List: tech-ports
Date: 03/07/2006 00:14:41
In message <20060307060303.26C3E23402@thoreau.thistledown.com.au>, Simon Burge 
writes:
>> _C_LABEL(ppc4xx_reset):
>>         mfspr   %r3,SPR_DBCR0
>>         oris    %r3,%r13,DBCR0_RST_SYSTEM@h
>>         mtspr   SPR_DBCR0,%r3
>>         ba      0

A followup:  I am pretty convinced this code should be wrong.  Not that
the right code works.

Line 1: mfspr   %r3,SPR_DBCR0
	Load DBCR0 into r3
Line 2: oris    %r3,%r13,DBCR0_RST_SYSTEM@h
	Or the top half of DBCR0_RST_SYSTEM with the leftmost bits of r13 into
	r3.
Line 3: mtspr   SPR_DBCR0,%r3
	Load r3 into DBCR0

The first operation has no effect, because we immediately smash it with
whatever random garbage happened to be in r13.

>The only thing I can think of is some sort of prefetch or something, but
>that's clutching at straws.  Does putting a few nops after the mtspr
>make a difference?

Hmm.  I'll try that next.

The one thing I've noticed is that, if I drop into the debugger first, it
works.  I am not entirely sure why.  It looks like DDB is oring in 0x48000000
before it runs, but I don't THINK that should matter, and I'm pretty sure
that Linux isn't doing it.

But... Nope, no effect from nops, or from anything else I can find.

-s