pismo upgraded to 750fx not detected correctly
Chris Studholme
cvs at cs.utoronto.ca
Sun Jun 22 01:58:05 EST 2003
Terry,
Thanks for the code snippet and all the info. I hope to add this check
immediately after the device-tree is copied to ram and then I'll modify
the in ram version to reflect the properties of a 750fx. I'll post a
patch here when I get something working.
Chris.
On Fri, 20 Jun 2003, Terry Greeniaus wrote:
>
> On Thu, 19 Jun 2003, Chris Studholme wrote:
>
> > On Fri, 13 Jun 2003, Terry Greeniaus wrote:
> >
> > > The PowerLogix 900 MHz bluechips are 750FX CPUs, however they have been
> > > strapped so that the PVR reports itself as 0x0008nnnn instead of
> > > 0x7000nnnn, so that Apple's OpenFirmware can better support them (in
> > > particular, to automatically enable the L2 cache). The correct way (on
> > > these boards, anyhow) to determine if this is a 750FX is by writing to
> > > the HID1 register and seeing if it changed. I have a code snippet to do
> > > this if anyone wants it, although it isn't LinuxPPC-specific. This is
> > > backwards-compatible with normal 750 CPUs, they don't take an exception
> > > if you try to write to the HID1 register.
> >
> > I would like to see the code snippet. Do you know how the bluechip G4
> > upgrade for the pismo works? Is it also reported as 0x0008nnnn? If so,
> > how does your code snippet handle that case?
>
> All of the G4 bluechips are either 7400 (in the older models, not
> anymore though) or 7410 CPUs strapped normally (PVR = 0x000Cnnnn [7400]
> or 0x800Cnnnn [7410]). Since these are strapped normally, nothing
> special needs to be done to handle that case. Here's the code snippet
> we use in our software to determine if you are on a 750 or 750FX:
>
> UInt32 getRealPVR()
> {
> UInt32 pvr = getSPR(287);
> UInt32 realPVR = pvr;
> if((pvr & 0xFFFF0000) == 0x00080000)
> {
> // This could be a 750FX strapped as a 750 PVR
> UInt32 hid1 = getHID1();
> if(hid1 & 0x00010000)
> {
> // PLL1 is in use, fiddle with PLL0
> setHID1(hid1 ^ 0x00000200);
> if(getHID1() != hid1)
> {
> // HID1 changed, this is a 750FX
> realPVR = (0x70000000 |
> (pvr & 0x0000FFFF));
> setHID1(hid1);
> }
> }
> else
> {
> // PLL0 is in use, fiddle with PLL1
> setHID1(hid1 ^ 0x00000002);
> if(getHID1() != hid1)
> {
> // HID1 changed, this is a 750FX
> realPVR = (0x70000000 |
> (pvr & 0x0000FFFF));
> setHID1(hid1);
> }
> }
> }
> return realPVR;
> }
>
> Basically this just checks to see if we have a 750 PVR, and if we do it
> tries writing to the PLL bits of the PLL that isn't in use in HID1. If
> HID1 changes, then we have a 750FX rather than a 750. Finally, we reset
> HID1 back to whatever it was before we changed it.
>
> This is a bit annoying because it means you can't always rely on a mfpvr
> instruction in some assembly code. We run this routine once when our
> software starts up and store the result in a global variable which we
> use in the rest of the code. Also, note that the lower 16 bits of the
> PVR remain unchanged regardless of how the CPU is strapped, so we mask
> off the top 16 bits only and replace them with 0x7000nnnn.
>
> BTW I am only subscribed to the list digest, so if you want more timely
> replies (i.e. more than once a day :P ) CC me with the list message.
>
> TG
>
>
>
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list