• Hans de Goede's avatar
    ACPI / platform: Add SMB0001 HID to forbidden_id_list · ea41e453
    Hans de Goede authored
    commit 2bbb5fa37475d7aa5fa62f34db1623f3da2dfdfa upstream.
    
    Many HP AMD based laptops contain an SMB0001 device like this:
    
    Device (SMBD)
    {
        Name (_HID, "SMB0001")  // _HID: Hardware ID
        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
        {
            IO (Decode16,
                0x0B20,             // Range Minimum
                0x0B20,             // Range Maximum
                0x20,               // Alignment
                0x20,               // Length
                )
            IRQ (Level, ActiveLow, Shared, )
                {7}
        })
    }
    
    The legacy style IRQ resource here causes acpi_dev_get_irqresource() to
    be called with legacy=true and this message to show in dmesg:
    ACPI: IRQ 7 override to edge, high
    
    This causes issues when later on the AMD0030 GPIO device gets enumerated:
    
    Device (GPIO)
    {
        Name (_HID, "AMDI0030")  // _HID: Hardware ID
        Name (_CID, "AMDI0030")  // _CID: Compatible ID
        Name (_UID, Zero)  // _UID: Unique ID
        Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
        {
    	Name (RBUF, ResourceTemplate ()
    	{
    	    Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, )
    	    {
    		0x00000007,
    	    }
    	    Memory32Fixed (ReadWrite,
    		0xFED81500,         // Address Base
    		0x00000400,         // Address Length
    		)
    	})
    	Return (RBUF) /* \_SB_.GPIO._CRS.RBUF */
        }
    }
    
    Now acpi_dev_get_irqresource() gets called with legacy=false, but because
    of the earlier override of the trigger-type acpi_register_gsi() returns
    -EBUSY (because we try to register the same interrupt with a different
    trigger-type) and we end up setting IORESOURCE_DISABLED in the flags.
    
    The setting of IORESOURCE_DISABLED causes platform_get_irq() to call
    acpi_irq_get() which is not implemented on x86 and returns -EINVAL.
    resulting in the following in dmesg:
    
    amd_gpio AMDI0030:00: Failed to get gpio IRQ: -22
    amd_gpio: probe of AMDI0030:00 failed with error -22
    
    The SMB0001 is a "virtual" device in the sense that the only way the OS
    interacts with it is through calling a couple of methods to do SMBus
    transfers. As such it is weird that it has IO and IRQ resources at all,
    because the driver for it is not expected to ever access the hardware
    directly.
    
    The Linux driver for the SMB0001 device directly binds to the acpi_device
    through the acpi_bus, so we do not need to instantiate a platform_device
    for this ACPI device. This commit adds the SMB0001 HID to the
    forbidden_id_list, avoiding the instantiating of a platform_device for it.
    Not instantiating a platform_device means we will no longer call
    acpi_dev_get_irqresource() for the legacy IRQ resource fixing the probe of
    the AMDI0030 device failing.
    
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1644013
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=198715
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199523Reported-by: 's avatarLukas Kahnert <openproggerfreak@gmail.com>
    Tested-by: 's avatarMarc <suaefar@googlemail.com>
    Cc: All applicable <stable@vger.kernel.org>
    Signed-off-by: 's avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: 's avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ea41e453
Name
Last commit
Last update
..
acpica Loading commit data...
apei Loading commit data...
arm64 Loading commit data...
dptf Loading commit data...
nfit Loading commit data...
pmic Loading commit data...
Kconfig Loading commit data...
Makefile Loading commit data...
ac.c Loading commit data...
acpi_amba.c Loading commit data...
acpi_apd.c Loading commit data...
acpi_cmos_rtc.c Loading commit data...
acpi_configfs.c Loading commit data...
acpi_dbg.c Loading commit data...
acpi_extlog.c Loading commit data...
acpi_ipmi.c Loading commit data...
acpi_lpat.c Loading commit data...
acpi_lpss.c Loading commit data...
acpi_memhotplug.c Loading commit data...
acpi_pad.c Loading commit data...
acpi_platform.c Loading commit data...
acpi_pnp.c Loading commit data...
acpi_processor.c Loading commit data...
acpi_video.c Loading commit data...
acpi_watchdog.c Loading commit data...
battery.c Loading commit data...
battery.h Loading commit data...
bgrt.c Loading commit data...
blacklist.c Loading commit data...
bus.c Loading commit data...
button.c Loading commit data...
cm_sbs.c Loading commit data...
container.c Loading commit data...
cppc_acpi.c Loading commit data...
custom_method.c Loading commit data...
debugfs.c Loading commit data...
device_pm.c Loading commit data...
device_sysfs.c Loading commit data...
dock.c Loading commit data...
ec.c Loading commit data...
ec_sys.c Loading commit data...
event.c Loading commit data...
evged.c Loading commit data...
fan.c Loading commit data...
glue.c Loading commit data...
gsi.c Loading commit data...
hed.c Loading commit data...
internal.h Loading commit data...
ioapic.c Loading commit data...
numa.c Loading commit data...
nvs.c Loading commit data...
osi.c Loading commit data...
osl.c Loading commit data...
pci_irq.c Loading commit data...
pci_link.c Loading commit data...
pci_mcfg.c Loading commit data...
pci_root.c Loading commit data...
pci_slot.c Loading commit data...
power.c Loading commit data...
proc.c Loading commit data...
processor_core.c Loading commit data...
processor_driver.c Loading commit data...
processor_idle.c Loading commit data...
processor_pdc.c Loading commit data...
processor_perflib.c Loading commit data...
processor_thermal.c Loading commit data...
processor_throttling.c Loading commit data...
property.c Loading commit data...
reboot.c Loading commit data...
resource.c Loading commit data...
sbs.c Loading commit data...
sbshc.c Loading commit data...
sbshc.h Loading commit data...
scan.c Loading commit data...
sleep.c Loading commit data...
sleep.h Loading commit data...
spcr.c Loading commit data...
sysfs.c Loading commit data...
tables.c Loading commit data...
thermal.c Loading commit data...
utils.c Loading commit data...
video_detect.c Loading commit data...
wakeup.c Loading commit data...