Re: ACPI DMI Dell R200

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxx
> > 
> > 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux