On Monday 04 February 2008 08:36, Georges Toth wrote:
> Len Brown wrote:
> >> ACPI: BIOS _OSI(Linux) query ignored
> >> ACPI: DMI System Vendor: Dell Inc.
> >> ACPI: DMI Product Name: PowerEdge R200
> >> ACPI: DMI Product Version:
> >> ACPI: DMI Board Name: 0TY019
> >> ACPI: DMI BIOS Vendor: Dell Inc.
> >> ACPI: DMI BIOS Date: 10/24/2007
> >> ACPI: Please send DMI info above to linux-acpi@vger.kernel.org
> > 
> > thanks, please send me the output from acpidump.
> 
> I've attached it
> Let me know if you need anything else
> 

This DSDT shows that Dell BIOS writers know enough to be dangerous.

It appears that the BIOS writer put in special tests for (Vistal or Linux),
not realizing that Linux always sets Vista.

OSI(Linux) is a NOP on this box.
it will exchange the PNPid of the PCIe/PCI HID/CID, but nothing else.

It is interesting to see that PNP0C01 motherboard device is present only for 
OS's
earlier than XP.

It is also interseting that the SSDT has a special test for Vista,
to enable fixed-feature P-state access, but that code would have
run even without that test.

thanks,
-Len


        Name (TOOS, 0x00)
        Method (INIC, 0, NotSerialized)
        {

            If (CondRefOf (_OSI, Local0))
            {
                If (\_OSI ("Windows 2001"))
                {
                    Store (0x05, TOOS)
                }

                If (\_OSI ("Windows 2001.1"))
                {
                    Store (0x06, TOOS)
                }

                If (\_OSI ("Windows 2001.1 SP1"))
                {
                    Store (0x07, TOOS)
                }

                If (\_OSI ("Windows 2006"))
                {
                    Store (0x08, TOOS)
                }

                If (\_OSI ("Windows 2006.1"))
                {
                    Store (0x08, TOOS)
                }

# OSI(Linux) overwrites TOOS with 1

                If (\_OSI ("Linux"))
                {
                    Store (0x01, TOOS)
                }
            }
            Else
            {
                Store (\_OS, Local0)
                Store (SCMP (Local0, "Microsoft Windows NT"), Local1)
                If (Not (Local1))
                {
                    Store (0x04, TOOS)
                }
                Else
                {
                    Store (SCMP (Local0, "Microsoft Windows"), Local2)
                    If (Not (Local2))
                    {
                        Store (0x02, TOOS)
                    }
                    Else
                    {
                        Store (SCMP (Local0, "Microsoft WindowsME:Millennium 
Edition"), Local3)
                        If (Not (Local3))
                        {
                            Store (0x03, TOOS)
                        }
                    }
                }
            }
        Method (_INI, 0, NotSerialized)
        {
            \_SB.INIC ()
            \_SB.INIS ()
        }
...
        Method (INIS, 0, NotSerialized)
        {
            Store ("Method _INI", Debug)
            If (LNotEqual (RIST, 0x00))
            {
                Store (0xFFFFFFFF, \_SB.PCI0.SBE0.PXHA._ADR)
                Store (0x00, \_SB.PCI0.SBE0.PXHA._STA)
            }

            If (LGreaterEqual (\_SB.TOOS, 0x08))
            {
# Vista gets _PCI0 _HID and _CID exchanged
# to put PCIe as _HID and PCI as _CID

                Store (0x080AD041, \_SB.PCI0._HID)
                Store (0x030AD041, \_SB.PCI0._CID)
            }
            Else
            {
                Store (0x030AD041, \_SB.PCI0._HID)
                Store (0x080AD041, \_SB.PCI0._CID)
            }
        }
       Device (PCI0)
        {
            Name (_HID, EisaId ("PNP0A08"))
            Name (_CID, 0x030AD041)
...


                Device (NIPM)
                {
                    Name (_HID, EisaId ("IPI0001"))
                    Name (_CID, 0x010CD041)
                    Name (_UID, 0x05)
                    Method (_STA, 0, NotSerialized)
                    {
                        If (LEqual (TOOS, 0x01))
                        {
                            Return (0x0F)
# this is effectively a special test for Linux,
# but it is a NOP because of the test below
# I dont' knwo what IPI0001 is...

                        }
                        Else
                        {
                            If (LOr (LEqual (TOOS, 0x07), LEqual (TOOS, 0x08)))
                            {
                                Return (0x0F)
                            }
                            Else
                            {
                                Return (0x00)
                            }
                        }
                    }


...
                Device (MBI1)
                {
                    Name (_HID, EisaId ("PNP0C01"))
# motherboard device
                    Name (_UID, 0x01)
                    Method (_STA, 0, NotSerialized)
                    {
                        If (LOr (LEqual (TOOS, 0x08), LEqual (TOOS, 0x01)))
                        {
# if Vista or Linux
                            Return (0x00)
                        }
                        Else
                        {
                            If (LEqual (TOOS, 0x07))
                            {
# XP SP1
                                Return (0x00)
                            }
                            Else
                            {
# everything else does see motherboard device
                                Return (0x0F)
                            }
                        }
                    }
                   Method (_CRS, 0, NotSerialized)
                    {
                        Name (SBDB, ResourceTemplate ()
                        {
                            IO (Decode16,
                                0x0800,             // Range Minimum
                                0x0800,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0880,             // Range Minimum
                                0x0880,             // Range Maximum
                                0x01,               // Alignment
                                0x40,               // Length
                                )
                            IO (Decode16,
                                0x08C0,             // Range Minimum
                                0x08C0,             // Range Maximum
                                0x01,               // Alignment
                                0x20,               // Length
                                )
                            IO (Decode16,
                                0x08E0,             // Range Minimum
                                0x08E0,             // Range Maximum
                                0x01,               // Alignment
                                0x04,               // Length
                                )
                            IO (Decode16,
                                0x0900,             // Range Minimum
                                0x0900,             // Range Maximum
                                0x01,               // Alignment
                                0x01,               // Length
                                )
                            IO (Decode16,
                                0x0C00,             // Range Minimum
                                0x0C00,             // Range Maximum
                                0x01,               // Alignment
                                0x10,               // Length
                                )
                            IO (Decode16,
                                0x0C10,             // Range Minimum
                                0x0C10,             // Range Maximum
                                0x01,               // Alignment
                                0x10,               // Length
                                )
                            IO (Decode16,
                                0x0CA0,             // Range Minimum
                                0x0CA0,             // Range Maximum
                                0x01,               // Alignment
                                0x08,               // Length
                                )
                            IO (Decode16,
                                0x0CA9,             // Range Minimum
                                0x0CA9,             // Range Maximum
                                0x01,               // Alignment
                                0x03,               // Length
                                )
                           IO (Decode16,
                                0x0CAD,             // Range Minimum
                                0x0CAD,             // Range Maximum
                                0x01,               // Alignment
                                0x03,               // Length
                                )
                            IO (Decode16,
                                0x0C20,             // Range Minimum
                                0x0C20,             // Range Maximum
                                0x01,               // Alignment
                                0x20,               // Length
                                )
                            IO (Decode16,
                                0x0060,             // Range Minimum
                                0x0060,             // Range Maximum
                                0x01,               // Alignment
                                0x01,               // Length
                                _Y08)
                            IO (Decode16,
                                0x0064,             // Range Minimum
                                0x0064,             // Range Maximum
                                0x01,               // Alignment
                                0x01,               // Length
                                _Y09)
                        })
                        CreateByteField (SBDB, 
\_SB.PCI0.ISA.MBIO._CRS._Y08._LEN, KBL1)
                        CreateByteField (SBDB, 
\_SB.PCI0.ISA.MBIO._CRS._Y09._LEN, KBL2)
                        If (LOr (GCKB (), GCMS ()))
                        {
                            Store (Zero, KBL1)
                            Store (Zero, KBL2)
                        }

                        Return (SBDB)
                    }
                }

in SSDT1:

   Scope (_PR.CPU1)
    {
        Method (_PPC, 0, NotSerialized)
        {
            Return (Zero)
        }

        Method (_PCT, 0, NotSerialized)
        {

# if PDC[9] && CFGD != x4000, use MSR for P-states
# Linux comes here
            If (LAnd (LNot (And (CFGD, 0x4000)), LEqual (And (PDC0,
                0x09), 0x09)))
            {
                Return (Package (0x02)
                {
                    ResourceTemplate ()
                    {
                        Register (FFixedHW,
                            0x40,               // Bit Width
                            0x00,               // Bit Offset
                            0x0000000000000199, // Address
                            ,)
                    },

                    ResourceTemplate ()
                    {
                        Register (FFixedHW,
                            0x10,               // Bit Width
                            0x00,               // Bit Offset
                            0x0000000000000198, // Address
                            ,)
                    }
                })
            }

# if PDC[9] && Vista, use MSR for P-states

            If (LAnd (LEqual (And (PDC0, 0x09), 0x09), LGreaterEqual (
                \_SB.TOOS, 0x08)))
            {
                Return (Package (0x02)
                {
                    ResourceTemplate ()
                    {
                        Register (FFixedHW,
                            0x40,               // Bit Width
                            0x00,               // Bit Offset
                            0x0000000000000199, // Address
                            ,)
                    },

                    ResourceTemplate ()
                    {
                        Register (FFixedHW,
                            0x10,               // Bit Width
                            0x00,               // Bit Offset
                            0x0000000000000198, // Address
                            ,)
                    }
                })
            }

# else use IO for P-states

           Return (Package (0x02)
            {
                ResourceTemplate ()
                {
                    Register (SystemIO,
                        0x10,               // Bit Width
                        0x00,               // Bit Offset
                        0x00000000000008E0, // Address
                        ,)
                },

                ResourceTemplate ()
                {
                    Register (SystemIO,
                        0x10,               // Bit Width
                        0x00,               // Bit Offset
                        0x00000000000008E2, // Address
                        ,)
                }
            })
        }

        Method (_PSS, 0, NotSerialized)
        {
            If (LAnd (LNot (And (CFGD, 0x4000)), LEqual (And (PDC0,
                0x09), 0x09)))
            {
                Return (NPSS)
            }

            If (LAnd (LEqual (And (PDC0, 0x09), 0x09), LGreaterEqual (
                \_SB.TOOS, 0x08)))
            {
                Return (NPSS)
            }
# same test as in _PCT, -- MSR accesses gets NPSS (latency 10usec)
# while IO access gets SPSS (latecy 160usec)

            Return (SPSS)
        }
        Name (SPSS, Package (0x02)
        {
            Package (0x06)
            {
                0x0000091D,
                0x00019258,
                0x000000A0,
                0x0000000A,
                0x00000726,
                0x00000726
            },

            Package (0x06)
            {
                0x000007D0,
                0x0000FDE8,
                0x000000A0,
                0x0000000A,
                0x00000614,
                0x00000614
            }
        })
        Name (NPSS, Package (0x02)
        {
            Package (0x06)
            {
                0x0000091D,
                0x00019258,
                0x0000000A,
                0x0000000A,
                0x00000726,
                0x00000726
            },

            Package (0x06)
            {
                0x000007D0,
                0x0000FDE8,
                0x0000000A,
                0x0000000A,
                0x00000614,
                0x00000614
            }
        })
    }

in SSDT3: 
    Scope (\)
    {
        Name (CFGD, 0x00000002)

# CFGD is defined as 2, but never changed

        Name (PDC0, 0x80000000)
        Name (PDC1, 0x80000000)
        Name (PDC2, 0x80000000)
        Name (PDC3, 0x80000000)
    }

-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to