• Witold Szczeponik's avatar
    pnpacpi: register disabled resources · 29df8d8f
    Witold Szczeponik authored
    When parsing PnP ACPI resource structures, it may happen that some of
    the resources are disabled (in which case "the size" of the resource
    equals zero).
    
    The current solution is to skip these resources completely - with the
    unfortunate side effect that they are not registered despite the fact
    that they exist, after all.  (The downside of this approach is that
    these resources cannot be used as templates for setting the actual
    device's resources because they are missing from the template.) The
    kernel's APM implementation does not suffer from this problem and
    registers all resources regardless of "their size".
    
    This patch fixes a problem with (at least) the vintage IBM ThinkPad 600E
    (and most likely also with the 600, 600X, and 770X which have a very
    similar layout) where some of its PnP devices support options where
    either an IRQ, a DMA, or an IO port is disabled.  Without this patch,
    the devices can not be configured using the
    "/sys/bus/pnp/devices/*/resources" interface.
    
    The manipulation of these resources is important because the 600E has
    very demanding requirements.  For instance, the number of IRQs is not
    sufficient to support all devices of the 600E.  Fortunately, some of the
    devices, like the sound card's MPU-401 UART, can be configured to not
    use any IRQ, hence freeing an IRQ for a device that requires one.
    (Still, the device's "ResourceTemplate" requires an IRQ resource
    descriptor which cannot be created if the resource has not been
    registered in the first place.)
    
    As an example, the dependent sets of the 600E's CSC0103 device (the
    MPU-401 UART) are listed, with the patch applied, as:
    
      Dependent: 00 - Priority preferred
        port 0x300-0x330, align 0xf, size 0x4, 16-bit address decoding
        irq <none> High-Edge
      Dependent: 01 - Priority acceptable
        port 0x300-0x330, align 0xf, size 0x4, 16-bit address decoding
        irq 5,7,2/9,10,11,15 High-Edge
    
    (The same result is obtained when PNPBIOS is used instead of PnP ACPI.)
    Without the patch, the IRQ resource in the preferred option is not
    listed at all:
    
      Dependent: 00 - Priority preferred
        port 0x300-0x330, align 0xf, size 0x4, 16-bit address decoding
      Dependent: 01 - Priority acceptable
        port 0x300-0x330, align 0xf, size 0x4, 16-bit address decoding
        irq 5,7,2/9,10,11,15 High-Edge
    
    And in fact, the 600E's DSDT lists the disabled IRQ as an option, as can
    be seen from the following excerpt from the DSDT:
    
    	Name (_PRS, ResourceTemplate ()
    	{
            StartDependentFn (0x00, 0x00)
            {
                IO (Decode16, 0x0300, 0x0330, 0x10, 0x04)
                IRQNoFlags () {}
            }
            StartDependentFn (0x01, 0x00)
            {
                IO (Decode16, 0x0300, 0x0330, 0x10, 0x04)
                IRQNoFlags () {5,7,9,10,11,15}
            }
            EndDependentFn ()
    	})
    
    With this patch applied, a user space program - or maybe even the kernel
    - can allocate all devices' resources optimally.  For the 600E, this
    means to find optimal resources for (at least) the serial port, the
    parallel port, the infrared port, the MWAVE modem, the sound card, and
    the MPU-401 UART.
    
    The patch applies the idea to register disabled resources to all types
    of resources, not just to IRQs, DMAs, and IO ports.  At the same time,
    it mimics the behavior of the "pnp_assign_xxx" functions from
    "drivers/pnp/manager.c" where resources with "no size" are considered
    disabled.
    
    No regressions were observed on hardware that does not require this
    patch.
    
    The patch is applied against 2.6.39.
    
    NB: The kernel's current PnP interface does not allow for disabling individual
    resources using the "/sys/bus/pnp/devices/$device/resources" file.  Assuming
    this could be done, a device could be configured to use a disabled resource
    using a simple series of calls:
    
      echo disable > /sys/bus/pnp/devices/$device/resources
      echo clear > /sys/bus/pnp/devices/$device/resources
      echo set irq disabled > /sys/bus/pnp/devices/$device/resources
      echo fill > /sys/bus/pnp/devices/$device/resources
      echo activate > /sys/bus/pnp/devices/$device/resources
    
    This patch addresses only the parsing of PnP ACPI devices.
    
    ChangeLog (v1 -> v2):
     - extend patch description
     - fix typo in patch itself
    Signed-off-by: default avatarWitold Szczeponik <Witold.Szczeponik@gmx.net>
    Cc: Len Brown <lenb@kernel.org>
    Cc: Adam Belay <abelay@mit.edu>
    Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
    Cc: Matthew Garrett <mjg@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    29df8d8f
rsparser.c 32.4 KB