https://bugzilla.kernel.org/show_bug.cgi?id=15701

           Summary: Linux should ignore Producer/Consumer bit in _CRS
                    Address Space descriptors
           Product: ACPI
           Version: 2.5
    Kernel Version: 2.6.34-rc3
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Config-Other
        AssignedTo: acpi_config-ot...@kernel-bugs.osdl.org
        ReportedBy: bjorn.helg...@hp.com
        Regression: No


In the ACPI PCI host bridge driver, the arch-specific code parses _CRS
resources to learn the windows forwarded to the PCI bus.  Both ia64 and x86
follow section 6.4.3.5 of ACPI spec 4.0, which says that Bit[0] of Byte 4 in
QWord, DWord, Word, and Extended Address Space Descriptors is a
"Consumer/Producer" bit.  This bit is set if the device consumes the resource,
and clear if the device produces and consumes it, i.e., if the device forwards
the resource to a downstream bus.

However, it is rumored that BIOSes have not used the Consumer/Producer bit
consistently, and the bit was documented as "Ignored" in ACPI 2.0c.  The bit
was added back in 3.0, but this apparently was a mistake.

I experimented with Windows Server 2008 R2 in a qemu environment, running
SeaBIOS, where I could modify the _CRS description and see how Windows handled
it.

The PCI host bridge windows should be described as ResourceProducer, and the
HPET registers should be described as ResourceConsumer.  As shown here, I
modified the SeaBIOS DSDT to reverse both flags, so the bridge window is a
Consumer and the HPET registers are a Producer:

        Device(PCI0) {
            Name (_HID, EisaId ("PNP0A03"))
            Name (_CRS, ResourceTemplate ()
            {
                ...
                DWordMemory (ResourceConsumer, PosDecode, MinFixed, MaxFixed,
NonCacheable, ReadWrite,
                    0x00000000,         // Address Space Granularity
                    0xE0000000,         // Address Range Minimum
                    0xFEBFFFFF,         // Address Range Maximum
                    0x00000000,         // Address Translation Offset
                    0x1EC00000,         // Address Length
                    ,, , AddressRangeMemory, TypeStatic)
            })
        }
        Device(HPET) {
            Name(_HID,  EISAID("PNP0103"))
            Name(_CRS, ResourceTemplate() {
                DWordMemory(
                    ResourceProducer, PosDecode, MinFixed, MaxFixed,
                    NonCacheable, ReadWrite,
                    0x00000000,
                    0xFED00000,
                    0xFED003FF,
                    0x00000000,
                    0x00000400 /* 1K memory: FED00000 - FED003FF */
                )
            })
        }

The attachments of Windows Device Manager screenshots show that Windows
interpreted the bridge ResourceConsumer as a window and the HPET
ResourceProducer as normal registers.  PCI devices, e.g., the NIC and VGA,
inside the ResourceConsumer range worked normally.

-- 
Configure bugmail: https://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.

------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
acpi-bugzilla mailing list
acpi-bugzilla@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/acpi-bugzilla

Reply via email to