Skip to content

Commit d84e173

Browse files
committed
Merge tag 'acpi-6.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI updates from Rafael Wysocki: "This one is significantly larger than previous ACPI support pull requests because several significant updates have coincided in it. First, there is a routine ACPICA code update, to upstream version 20251212, but this time it covers new ACPI 6.6 material that has not been covered yet. Among other things, it includes definitions of a few new ACPI tables and updates of some others, like the GICv5 MADT structures and ARM IORT IWB node definitions that are used for adding GICv5 ACPI probing on ARM (that technically is IRQ subsystem material, but it depends on the ACPICA changes, so it is included here). The latter alone adds a few hundred lines of new code. Second, there is an update of ACPI _OSC handling including a fix that prevents failures from occurring in some corner cases due to careless handling of _OSC error bits. On top of that, the "system resource" ACPI device objects with the PNP0C01 and PNP0C02 are now going to be handled by the ACPI core device enumeration code instead of handing them over to the legacy PNP system driver which causes device enumeration issues to occur. Some of those issues have been worked around in device drivers and elsewhere and those workarounds should not be necessary any more, so they are going away. Moreover, the time has come to convert all "core ACPI" device drivers that were still using struct acpi_driver objects for device binding into proper platform drivers that use struct platform_driver for this purpose. These updates are accompanied by some requisite core ACPI device enumeration code changes. Next, there are ACPI APEI updates, including changes to avoid excess overhead in the NMI handler and in SEA on the ARM side, changes to unify ACPI-based HW error tracing and logging, and changes to prevent APEI code from reaching out of its allocated memory. There are also some ACPI power management updates, mostly related to the ACPI cpuidle support in the processor driver, suspend-to-idle handling on systems with ACPI support and to ACPI PM of devices. In addition to the above, bugs are fixed and the code is cleaned up in assorted places all over. Specifics: - Update the ACPICA code in the kernel to upstream version 20251212 which includes the following changes: * Add support for new ACPI table DTPR (Michal Camacho Romero) * Release objects with acpi_ut_delete_object_desc() (Zilin Guan) * Add UUIDs for Microsoft fan extensions and UUIDs associated with TPM 2.0 devices (Armin Wolf) * Fix NULL pointer dereference in acpi_ev_address_space_dispatch() (Alexey Simakov) * Add KEYP ACPI table definition (Dave Jiang) * Add support for the Microsoft display mux _OSI string (Armin Wolf) * Add definitions for the IOVT ACPI table (Xianglai Li) * Abort AML bytecode execution on AML_FATAL_OP (Armin Wolf) * Include all fields in subtable type1 for PPTT (Ben Horgan) * Add GICv5 MADT structures and Arm IORT IWB node definitions (Jose Marinho) * Update Parameter Block structure for RAS2 and add a new flag in Memory Affinity Structure for SRAT (Pawel Chmielewski) * Add _VDM (Voltage Domain) object (Pawel Chmielewski) - Add support for GICv5 ACPI probing on ARM which is based on the GICv5 MADT structures and ARM IORT IWB node definitions recently added to ACPICA (Lorenzo Pieralisi) - Rework ACPI PM notification setup for PCI root buses and modify the ACPI PM setup for devices to register wakeup source objects under physical (that is, PCI, platform, etc.) devices instead of doing that under their ACPI companions (Rafael Wysocki) - Adjust debug messages regarding postponed ACPI PM printed during system resume to be more accurate (Rafael Wysocki) - Remove dead code from lps0_device_attach() (Gergo Koteles) - Start to invoke Microsoft Function 9 (Turn On Display) of the Low- Power S0 Idle (LPS0) _DSM in the suspend-to-idle resume flow on systems with ACPI LPS0 support to address a functional issue on Lenovo Yoga Slim 7i Aura (15ILL9), where system fans and keyboard backlights fail to resume after suspend (Jakob Riemenschneider) - Add sysfs attribute cid for exposing _CID lists under ACPI device objects (Rafael Wysocki) - Replace sprintf() with sysfs_emit() in all of the core ACPI sysfs interface code (Sumeet Pawnikar) - Use acpi_get_local_u64_address() in the code implementing ACPI support for PCI to evaluate _ADR instead of evaluating that object directly (Andy Shevchenko) - Add JWIPC JVC9100 to irq1_level_low_skip_override[] to unbreak serial IRQs on that system (Ai Chao) - Fix handling of _OSC errors in acpi_run_osc() to avoid failures on systems where _OSC error bits are set even though the _OSC return buffer contains acknowledged feature bits (Rafael Wysocki) - Clean up and rearrange \_SB._OSC handling for general platform features and USB4 features to avoid code duplication and unnecessary memory management overhead (Rafael Wysocki) - Make the ACPI core device enumeration code handle PNP0C01 and PNP0C02 ("system resource") device objects directly instead of letting the legacy PNP system driver handle them to avoid device enumeration issues on systems where PNP0C02 is present in the _CID list under ACPI device objects with a _HID matching a proper device driver in Linux (Rafael Wysocki) - Drop workarounds for the known device enumeration issues related to _CID lists containing PNP0C02 (Rafael Wysocki) - Drop outdated comment regarding removed function in the ACPI-based device enumeration code (Julia Lawall) - Make PRP0001 device matching work as expected for ACPI device objects using it as a _HID for board development and similar purposes (Kartik Rajput) - Use async schedule function in acpi_scan_clear_dep_fn() to avoid races with user space initialization on some systems (Yicong Yang) - Add a piece of documentation explaining why binding drivers directly to ACPI device objects is not a good idea in general and why it is desirable to convert drivers doing so into proper platform drivers that use struct platform_driver for device binding (Rafael Wysocki) - Convert multiple "core ACPI" drivers, including the NFIT ACPI device driver, the generic ACPI button drivers, the generic ACPI thermal zone driver, the ACPI hardware event device (HED) driver, the ACPI EC driver, the ACPI SMBUS HC driver, the ACPI Smart Battery Subsystem (SBS) driver, and the ACPI backlight (video) driver to proper platform drivers that use struct platform_driver for device binding (Rafael Wysocki) - Use acpi_get_local_u64_address() in the ACPI backlight (video) driver to evaluate _ADR instead of evaluating that object directly (Andy Shevchenko) - Convert the generic ACPI battery driver to a proper platform driver using struct platform_driver for device binding (Rafael Wysocki) - Fix incorrect charging status when current is zero in the generic ACPI battery driver (Ata İlhan Köktürk) - Use LIST_HEAD() for initializing a stack-allocated list in the generic ACPI watchdog device driver (Can Peng) - Rework the ACPI idle driver initialization to register it directly from the common initialization code instead of doing that from a CPU hotplug "online" callback and clean it up (Huisong Li, Rafael Wysocki) - Fix a possible NULL pointer dereference in acpi_processor_errata_piix4() (Tuo Li) - Make read-only array non_mmio_desc[] static const (Colin Ian King) - Prevent the APEI GHES support code on ARM from accessing memory out of bounds or going past the ARM processor CPER record buffer (Mauro Carvalho Chehab) - Prevent cper_print_fw_err() from dumping the entire memory on systems with defective firmware (Mauro Carvalho Chehab) - Improve ghes_notify_nmi() status check to avoid unnecessary overhead in the NMI handler by carrying out all of the requisite preparations and the NMI registration time (Tony Luck) - Refactor the GHES driver by extracting common functionality into reusable helper functions to reduce code duplication and improve the ghes_notify_sea() status check in analogy with the previous ghes_notify_nmi() status check improvement (Shuai Xue) - Make ELOG and GHES log and trace consistently and support the CPER CXL protocol analogously (Fabio De Francesco) - Disable KASAN instrumentation in the APEI GHES driver when compile testing with clang < 18 (Nathan Chancellor) - Let ghes_edac be the preferred driver to load on __ZX__ and _BYO_ systems by extending the platform detection list in the APEI GHES driver (Tony W Wang-oc) - Clean up cppc_perf_caps and cppc_perf_ctrls structs and rename EPP constants for clarity in the ACPI CPPC library (Sumit Gupta)" * tag 'acpi-6.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (117 commits) ACPI: battery: fix incorrect charging status when current is zero ACPI: scan: Use async schedule function in acpi_scan_clear_dep_fn() ACPI: x86: s2idle: Invoke Microsoft _DSM Function 9 (Turn On Display) ACPI: APEI: GHES: Add ghes_edac support for __ZX__ and _BYO_ systems ACPI: APEI: GHES: Disable KASAN instrumentation when compile testing with clang < 18 ACPI: sysfs: Replace sprintf() with sysfs_emit() ACPI: CPPC: Rename EPP constants for clarity ACPI: CPPC: Clean up cppc_perf_caps and cppc_perf_ctrls structs ACPI: processor: idle: Rework the handling of acpi_processor_ffh_lpi_probe() ACPI: processor: idle: Convert acpi_processor_setup_cpuidle_dev() to void ACPI: processor: idle: Convert acpi_processor_setup_cpuidle_states() to void irqchip/gic-v5: Add ACPI IWB probing irqchip/gic-v5: Add ACPI ITS probing irqchip/gic-v5: Add ACPI IRS probing irqchip/gic-v5: Split IRS probing into OF and generic portions PCI/MSI: Make the pci_msi_map_rid_ctlr_node() interface firmware agnostic irqdomain: Add parent field to struct irqchip_fwid ACPI: PCI: simplify code with acpi_get_local_u64_address() ACPI: video: simplify code with acpi_get_local_u64_address() ACPI: PM: Adjust messages regarding postponed ACPI PM ...
2 parents 4adc13e + dfa5dc3 commit d84e173

72 files changed

Lines changed: 2573 additions & 1111 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
.. SPDX-License-Identifier: GPL-2.0
2+
.. include:: <isonum.txt>
3+
4+
=========================================
5+
Why using ACPI drivers is not a good idea
6+
=========================================
7+
8+
:Copyright: |copy| 2026, Intel Corporation
9+
10+
:Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
11+
12+
Even though binding drivers directly to struct acpi_device objects, also
13+
referred to as "ACPI device nodes", allows basic functionality to be provided
14+
at least in some cases, there are problems with it, related to general
15+
consistency, sysfs layout, power management operation ordering, and code
16+
cleanliness.
17+
18+
First of all, ACPI device nodes represent firmware entities rather than
19+
hardware and in many cases they provide auxiliary information on devices
20+
enumerated independently (like PCI devices or CPUs). It is therefore generally
21+
questionable to assign resources to them because the entities represented by
22+
them do not decode addresses in the memory or I/O address spaces and do not
23+
generate interrupts or similar (all of that is done by hardware).
24+
25+
Second, as a general rule, a struct acpi_device can only be a parent of another
26+
struct acpi_device. If that is not the case, the location of the child device
27+
in the device hierarchy is at least confusing and it may not be straightforward
28+
to identify the piece of hardware providing functionality represented by it.
29+
However, binding a driver directly to an ACPI device node may cause that to
30+
happen if the given driver registers input devices or wakeup sources under it,
31+
for example.
32+
33+
Next, using system suspend and resume callbacks directly on ACPI device nodes
34+
is also questionable because it may cause ordering problems to appear. Namely,
35+
ACPI device nodes are registered before enumerating hardware corresponding to
36+
them and they land on the PM list in front of the majority of other device
37+
objects. Consequently, the execution ordering of their PM callbacks may be
38+
different from what is generally expected. Also, in general, dependencies
39+
returned by _DEP objects do not affect ACPI device nodes themselves, but the
40+
"physical" devices associated with them, which potentially is one more source
41+
of inconsistency related to treating ACPI device nodes as "real" device
42+
representation.
43+
44+
All of the above means that binding drivers to ACPI device nodes should
45+
generally be avoided and so struct acpi_driver objects should not be used.
46+
47+
Moreover, a device ID is necessary to bind a driver directly to an ACPI device
48+
node, but device IDs are not generally associated with all of them. Some of
49+
them contain alternative information allowing the corresponding pieces of
50+
hardware to be identified, for example represeted by an _ADR object return
51+
value, and device IDs are not used in those cases. In consequence, confusingly
52+
enough, binding an ACPI driver to an ACPI device node may even be impossible.
53+
54+
When that happens, the piece of hardware corresponding to the given ACPI device
55+
node is represented by another device object, like a struct pci_dev, and the
56+
ACPI device node is the "ACPI companion" of that device, accessible through its
57+
fwnode pointer used by the ACPI_COMPANION() macro. The ACPI companion holds
58+
additional information on the device configuration and possibly some "recipes"
59+
on device manipulation in the form of AML (ACPI Machine Language) bytecode
60+
provided by the platform firmware. Thus the role of the ACPI device node is
61+
similar to the role of a struct device_node on a system where Device Tree is
62+
used for platform description.
63+
64+
For consistency, this approach has been extended to the cases in which ACPI
65+
device IDs are used. Namely, in those cases, an additional device object is
66+
created to represent the piece of hardware corresponding to a given ACPI device
67+
node. By default, it is a platform device, but it may also be a PNP device, a
68+
CPU device, or another type of device, depending on what the given piece of
69+
hardware actually is. There are even cases in which multiple devices are
70+
"backed" or "accompanied" by one ACPI device node (e.g. ACPI device nodes
71+
corresponding to GPUs that may provide firmware interfaces for backlight
72+
brightness control in addition to GPU configuration information).
73+
74+
This means that it really should never be necessary to bind a driver directly to
75+
an ACPI device node because there is a "proper" device object representing the
76+
corresponding piece of hardware that can be bound to by a "proper" driver using
77+
the given ACPI device node as the device's ACPI companion. Thus, in principle,
78+
there is no reason to use ACPI drivers and if they all were replaced with other
79+
driver types (for example, platform drivers), some code could be dropped and
80+
some complexity would go away.

Documentation/driver-api/acpi/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ ACPI Support
77

88
linuxized-acpica
99
scan_handlers
10+
acpi-drivers

drivers/acpi/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,8 @@ config ACPI_EXTLOG
494494
tristate "Extended Error Log support"
495495
depends on X86_MCE && X86_LOCAL_APIC && EDAC
496496
select UEFI_CPER
497+
select ACPI_APEI
498+
select ACPI_APEI_GHES
497499
help
498500
Certain usages such as Predictive Failure Analysis (PFA) require
499501
more information about the error than what can be described in

drivers/acpi/acpi_extlog.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/ratelimit.h>
1313
#include <linux/edac.h>
1414
#include <linux/ras.h>
15+
#include <cxl/event.h>
1516
#include <acpi/ghes.h>
1617
#include <asm/cpu.h>
1718
#include <asm/mce.h>
@@ -132,6 +133,53 @@ static int print_extlog_rcd(const char *pfx,
132133
return 1;
133134
}
134135

136+
static void extlog_print_pcie(struct cper_sec_pcie *pcie_err,
137+
int severity)
138+
{
139+
#ifdef ACPI_APEI_PCIEAER
140+
struct aer_capability_regs *aer;
141+
struct pci_dev *pdev;
142+
unsigned int devfn;
143+
unsigned int bus;
144+
int aer_severity;
145+
int domain;
146+
147+
if (!(pcie_err->validation_bits & CPER_PCIE_VALID_DEVICE_ID &&
148+
pcie_err->validation_bits & CPER_PCIE_VALID_AER_INFO))
149+
return;
150+
151+
aer_severity = cper_severity_to_aer(severity);
152+
aer = (struct aer_capability_regs *)pcie_err->aer_info;
153+
domain = pcie_err->device_id.segment;
154+
bus = pcie_err->device_id.bus;
155+
devfn = PCI_DEVFN(pcie_err->device_id.device,
156+
pcie_err->device_id.function);
157+
pdev = pci_get_domain_bus_and_slot(domain, bus, devfn);
158+
if (!pdev)
159+
return;
160+
161+
pci_print_aer(pdev, aer_severity, aer);
162+
pci_dev_put(pdev);
163+
#endif
164+
}
165+
166+
static void
167+
extlog_cxl_cper_handle_prot_err(struct cxl_cper_sec_prot_err *prot_err,
168+
int severity)
169+
{
170+
#ifdef ACPI_APEI_PCIEAER
171+
struct cxl_cper_prot_err_work_data wd;
172+
173+
if (cxl_cper_sec_prot_err_valid(prot_err))
174+
return;
175+
176+
if (cxl_cper_setup_prot_err_work_data(&wd, prot_err, severity))
177+
return;
178+
179+
cxl_cper_handle_prot_err(&wd);
180+
#endif
181+
}
182+
135183
static int extlog_print(struct notifier_block *nb, unsigned long val,
136184
void *data)
137185
{
@@ -183,6 +231,22 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,
183231
if (gdata->error_data_length >= sizeof(*mem))
184232
trace_extlog_mem_event(mem, err_seq, fru_id, fru_text,
185233
(u8)gdata->error_severity);
234+
} else if (guid_equal(sec_type, &CPER_SEC_CXL_PROT_ERR)) {
235+
struct cxl_cper_sec_prot_err *prot_err =
236+
acpi_hest_get_payload(gdata);
237+
238+
extlog_cxl_cper_handle_prot_err(prot_err,
239+
gdata->error_severity);
240+
} else if (guid_equal(sec_type, &CPER_SEC_PCIE)) {
241+
struct cper_sec_pcie *pcie_err = acpi_hest_get_payload(gdata);
242+
243+
extlog_print_pcie(pcie_err, gdata->error_severity);
244+
} else {
245+
void *err = acpi_hest_get_payload(gdata);
246+
247+
log_non_standard_event(sec_type, fru_id, fru_text,
248+
gdata->error_severity, err,
249+
gdata->error_data_length);
186250
}
187251
}
188252

drivers/acpi/acpi_platform.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,11 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
114114
struct platform_device *pdev = NULL;
115115
struct platform_device_info pdevinfo;
116116
const struct acpi_device_id *match;
117-
struct resource_entry *rentry;
118-
struct list_head resource_list;
119117
struct resource *resources = NULL;
120-
int count;
118+
int count = 0;
121119

122120
/* If the ACPI node already has a physical device attached, skip it. */
123-
if (adev->physical_node_count)
121+
if (adev->physical_node_count && !adev->pnp.type.backlight)
124122
return NULL;
125123

126124
match = acpi_match_acpi_device(forbidden_id_list, adev);
@@ -137,22 +135,28 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
137135
}
138136
}
139137

140-
INIT_LIST_HEAD(&resource_list);
141-
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
142-
if (count < 0)
143-
return NULL;
144-
if (count > 0) {
145-
resources = kcalloc(count, sizeof(*resources), GFP_KERNEL);
146-
if (!resources) {
138+
if (adev->device_type == ACPI_BUS_TYPE_DEVICE && !adev->pnp.type.backlight) {
139+
LIST_HEAD(resource_list);
140+
141+
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
142+
if (count < 0)
143+
return ERR_PTR(-ENODATA);
144+
145+
if (count > 0) {
146+
struct resource_entry *rentry;
147+
148+
resources = kcalloc(count, sizeof(*resources), GFP_KERNEL);
149+
if (!resources) {
150+
acpi_dev_free_resource_list(&resource_list);
151+
return ERR_PTR(-ENOMEM);
152+
}
153+
count = 0;
154+
list_for_each_entry(rentry, &resource_list, node)
155+
acpi_platform_fill_resource(adev, rentry->res,
156+
&resources[count++]);
157+
147158
acpi_dev_free_resource_list(&resource_list);
148-
return ERR_PTR(-ENOMEM);
149159
}
150-
count = 0;
151-
list_for_each_entry(rentry, &resource_list, node)
152-
acpi_platform_fill_resource(adev, rentry->res,
153-
&resources[count++]);
154-
155-
acpi_dev_free_resource_list(&resource_list);
156160
}
157161

158162
memset(&pdevinfo, 0, sizeof(pdevinfo));

drivers/acpi/acpi_pnp.c

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,6 @@ static const struct acpi_device_id acpi_pnp_device_ids[] = {
125125
{"PNP0401"}, /* ECP Printer Port */
126126
/* apple-gmux */
127127
{"APP000B"},
128-
/* system */
129-
{"PNP0c02"}, /* General ID for reserving resources */
130-
{"PNP0c01"}, /* memory controller */
131128
/* rtc_cmos */
132129
{"PNP0b00"},
133130
{"PNP0b01"},
@@ -346,24 +343,10 @@ static bool acpi_pnp_match(const char *idstr, const struct acpi_device_id **matc
346343
return false;
347344
}
348345

349-
/*
350-
* If one of the device IDs below is present in the list of device IDs of a
351-
* given ACPI device object, the PNP scan handler will not attach to that
352-
* object, because there is a proper non-PNP driver in the kernel for the
353-
* device represented by it.
354-
*/
355-
static const struct acpi_device_id acpi_nonpnp_device_ids[] = {
356-
{"INT3F0D"},
357-
{"INTC1080"},
358-
{"INTC1081"},
359-
{"INTC1099"},
360-
{""},
361-
};
362-
363346
static int acpi_pnp_attach(struct acpi_device *adev,
364347
const struct acpi_device_id *id)
365348
{
366-
return !!acpi_match_device_ids(adev, acpi_nonpnp_device_ids);
349+
return true;
367350
}
368351

369352
static struct acpi_scan_handler acpi_pnp_handler = {

drivers/acpi/acpi_processor.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)
5050
{
5151
u8 value1 = 0;
5252
u8 value2 = 0;
53+
struct pci_dev *ide_dev = NULL, *isa_dev = NULL;
5354

5455

5556
if (!dev)
@@ -107,12 +108,12 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)
107108
* each IDE controller's DMA status to make sure we catch all
108109
* DMA activity.
109110
*/
110-
dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
111+
ide_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
111112
PCI_DEVICE_ID_INTEL_82371AB,
112113
PCI_ANY_ID, PCI_ANY_ID, NULL);
113-
if (dev) {
114-
errata.piix4.bmisx = pci_resource_start(dev, 4);
115-
pci_dev_put(dev);
114+
if (ide_dev) {
115+
errata.piix4.bmisx = pci_resource_start(ide_dev, 4);
116+
pci_dev_put(ide_dev);
116117
}
117118

118119
/*
@@ -124,24 +125,25 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)
124125
* disable C3 support if this is enabled, as some legacy
125126
* devices won't operate well if fast DMA is disabled.
126127
*/
127-
dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
128+
isa_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
128129
PCI_DEVICE_ID_INTEL_82371AB_0,
129130
PCI_ANY_ID, PCI_ANY_ID, NULL);
130-
if (dev) {
131-
pci_read_config_byte(dev, 0x76, &value1);
132-
pci_read_config_byte(dev, 0x77, &value2);
131+
if (isa_dev) {
132+
pci_read_config_byte(isa_dev, 0x76, &value1);
133+
pci_read_config_byte(isa_dev, 0x77, &value2);
133134
if ((value1 & 0x80) || (value2 & 0x80))
134135
errata.piix4.fdma = 1;
135-
pci_dev_put(dev);
136+
pci_dev_put(isa_dev);
136137
}
137138

138139
break;
139140
}
140141

141-
if (errata.piix4.bmisx)
142-
dev_dbg(&dev->dev, "Bus master activity detection (BM-IDE) erratum enabled\n");
143-
if (errata.piix4.fdma)
144-
dev_dbg(&dev->dev, "Type-F DMA livelock erratum (C3 disabled)\n");
142+
if (ide_dev)
143+
dev_dbg(&ide_dev->dev, "Bus master activity detection (BM-IDE) erratum enabled\n");
144+
145+
if (isa_dev)
146+
dev_dbg(&isa_dev->dev, "Type-F DMA livelock erratum (C3 disabled)\n");
145147

146148
return 0;
147149
}

0 commit comments

Comments
 (0)