reset on mpc83xx
christophe.leroy at c-s.fr
Fri May 1 19:18:46 CEST 2020
Le 30/04/2020 à 21:06, Rasmus Villemoes a écrit :
> On 30/04/2020 17.03, Christophe Leroy wrote:
>> Le 30/04/2020 à 16:44, Rasmus Villemoes a écrit :
>>> I'm wondering why the sysreset_mpc83xx driver (as well as the similar
>>> code in arch/powerpc/cpu/mpc83xx/cpu.c) removes the MSR_IR and MSR_DR
>>> bits from MSR.
>>> But since the arch/powerpc/cpu/mpc83xx/cpu.c code in U-Boot has been
>>> there forever, I assume I'm missing something fundamental.
>> On my mpc8321 it works.
>> However I agree it looks odd.
>> I think it works by chance because we have a 1:1 MMU mapping, but if you
>> have a difference mapping I can't see how you can disable Instruction
>> MMU without going through a write into SRR0/SRR1 and an rfi.
> OK, thanks. Can you test if it still works if you change the code to not
> clear the MSR_IR and MSR_DR bits? (I expect it will, since I assume
> you'd have noticed if reboot from linux didn't work).
Due to the COVID-19 lockdown I'm working from home and don't have access
to HW tools to recover by boards in case I flash a bad Uboot, so I won't
do that for now.
However I confirm reboot works properly in Linux.
> I'm actually wondering what the core does after the MSR_IR bit gets
> cleared. If address translation is disabled, what instruction does it
> then do immediately after the mtmsr? I mean, the pc has some value, but
> how does that get interpreted without MSR_IR set?
After the mtmsr it probably continues with a few instructions that are
already in the pipeline, until the isync. Then after the isync it will
try to fetch from the physical address having the value of the pc.
If it doesn't have an existing address, you'll get a machine check.
> And yes, the (unused, it seems) disable_addr_trans routine in start.S
> does seem to be somewhat more complicated than a simple RMW of MSR,
> suggesting that if disabling address translation was really needed
> before reset, it should be done using that rather than by just clearing
> the bits directly.
Yes disable_addr_trans() is exactly what has to be done for disabling
instruction address translation.
For disabling only data address translation can be done with an RMW of
MSR + isync.
More information about the U-Boot