[Skiboot] [PATCH 07/16] core: hardcode P9 large decrementer width

Stewart Smith stewart at linux.ibm.com
Tue Feb 12 12:23:54 AEDT 2019


Oliver <oohall at gmail.com> writes:
> On Mon, Feb 11, 2019 at 3:12 PM Stewart Smith <stewart at linux.ibm.com> wrote:
>>
>> Nicholas Piggin <npiggin at gmail.com> writes:
>> > There is no good reason to "discover" the large decremeter width.
>> > We are firmware, we know the large decrementer width.
>> >
>> > Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
>>
>> Oliver - do you remember the original motivation around detecting it
>> rather than just coding how many bits there were? Was it because we were
>> experimenting with things in sim before the HW design was finalised? Or
>> are we just being fancy?
>
> Dunno. I'm pretty sure this was one of the first bits of skiboot code
> I wrote so either,
>
> a) I was overthinking it, or
> b) Mikey told me to.
>
> I do remember having to get some mambo bugs fixed to test it though.
> So it's possible the actual size wasn't finalised yet.

Mikey, was it (b) ?

(and at this point am *I* overthinking this? Hard-coding it is *fine*)

>
> Oliver
>
>>
>> > ---
>> >  core/cpu.c | 43 +++++++------------------------------------
>> >  1 file changed, 7 insertions(+), 36 deletions(-)
>> >
>> > diff --git a/core/cpu.c b/core/cpu.c
>> > index 5d933bf5c..e7ffe3003 100644
>> > --- a/core/cpu.c
>> > +++ b/core/cpu.c
>> > @@ -1044,48 +1044,19 @@ void init_boot_cpu(void)
>> >       init_hid();
>> >  }
>> >
>> > -static void enable_large_dec(bool on)
>> > -{
>> > -     u64 lpcr = mfspr(SPR_LPCR);
>> > -
>> > -     if (on)
>> > -             lpcr |= SPR_LPCR_P9_LD;
>> > -     else
>> > -             lpcr &= ~SPR_LPCR_P9_LD;
>> > -
>> > -     mtspr(SPR_LPCR, lpcr);
>> > -     isync();
>> > -}
>> > -
>> > -#define HIGH_BIT (1ull << 63)
>> > -
>> >  static int find_dec_bits(void)
>> >  {
>> > -     int bits = 65; /* we always decrement once */
>> > -     u64 mask = ~0ull;
>> > +     int bits;
>> >
>> >       if (proc_gen < proc_gen_p9)
>> > -             return 32;
>> > -
>> > -     /* The ISA doesn't specify the width of the decrementer register so we
>> > -      * need to discover it. When in large mode (LPCR.LD = 1) reads from the
>> > -      * DEC SPR are sign extended to 64 bits and writes are truncated to the
>> > -      * physical register width. We can use this behaviour to detect the
>> > -      * width by starting from an all 1s value and left shifting until we
>> > -      * read a value from the DEC with it's high bit cleared.
>> > -      */
>> > -
>> > -     enable_large_dec(true);
>> > -
>> > -     do {
>> > -             bits--;
>> > -             mask = mask >> 1;
>> > -             mtspr(SPR_DEC, mask);
>> > -     } while (mfspr(SPR_DEC) & HIGH_BIT);
>> > -
>> > -     enable_large_dec(false);
>> > +             bits = 32;
>> > +     else if (proc_gen == proc_gen_p9)
>> > +             bits = 56;
>> > +     else
>> > +             assert(0);
>> >
>> >       prlog(PR_DEBUG, "CPU: decrementer bits %d\n", bits);
>> > +
>> >       return bits;
>> >  }
>> >
>> > --
>> > 2.18.0
>> >
>> > _______________________________________________
>> > Skiboot mailing list
>> > Skiboot at lists.ozlabs.org
>> > https://lists.ozlabs.org/listinfo/skiboot
>> >
>>
>> --
>> Stewart Smith
>> OPAL Architect, IBM.
>>
>

-- 
Stewart Smith
OPAL Architect, IBM.



More information about the Skiboot mailing list