Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'acpi-6.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI fixes from Rafael Wysocki:
"These fix issues introduced during this merge window (ACPI/PCI, device
enumeration and documentation) and some other ones found recently.

Specifics:

- Add missing device reference counting to acpi_get_pci_dev() after
changing it recently (Rafael Wysocki)

- Fix resource list walk in acpi_dma_get_range() (Robin Murphy)

- Add IRQ override quirk for LENOVO IdeaPad and extend the IRQ
override warning message (Jiri Slaby)

- Fix integer overflow in ghes_estatus_pool_init() (Ashish Kalra)

- Fix multiple error records handling in one of the ACPI extlog
driver code paths (Tony Luck)

- Prune DSDT override documentation from index after dropping it
(Bagas Sanjaya)"

* tag 'acpi-6.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI: scan: Fix DMA range assignment
ACPI: PCI: Fix device reference counting in acpi_get_pci_dev()
ACPI: resource: note more about IRQ override
ACPI: resource: do IRQ override on LENOVO IdeaPad
ACPI: extlog: Handle multiple records
ACPI: APEI: Fix integer overflow in ghes_estatus_pool_init()
Documentation: ACPI: Prune DSDT override documentation from index

+60 -35
-1
Documentation/admin-guide/acpi/index.rst
··· 9 9 :maxdepth: 1 10 10 11 11 initrd_table_override 12 - dsdt-override 13 12 ssdt-overlays 14 13 cppc_sysfs 15 14 fan_performance_states
+20 -13
drivers/acpi/acpi_extlog.c
··· 12 12 #include <linux/ratelimit.h> 13 13 #include <linux/edac.h> 14 14 #include <linux/ras.h> 15 + #include <acpi/ghes.h> 15 16 #include <asm/cpu.h> 16 17 #include <asm/mce.h> 17 18 ··· 139 138 int cpu = mce->extcpu; 140 139 struct acpi_hest_generic_status *estatus, *tmp; 141 140 struct acpi_hest_generic_data *gdata; 142 - const guid_t *fru_id = &guid_null; 143 - char *fru_text = ""; 141 + const guid_t *fru_id; 142 + char *fru_text; 144 143 guid_t *sec_type; 145 144 static u32 err_seq; 146 145 ··· 161 160 162 161 /* log event via trace */ 163 162 err_seq++; 164 - gdata = (struct acpi_hest_generic_data *)(tmp + 1); 165 - if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID) 166 - fru_id = (guid_t *)gdata->fru_id; 167 - if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT) 168 - fru_text = gdata->fru_text; 169 - sec_type = (guid_t *)gdata->section_type; 170 - if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) { 171 - struct cper_sec_mem_err *mem = (void *)(gdata + 1); 172 - if (gdata->error_data_length >= sizeof(*mem)) 173 - trace_extlog_mem_event(mem, err_seq, fru_id, fru_text, 174 - (u8)gdata->error_severity); 163 + apei_estatus_for_each_section(tmp, gdata) { 164 + if (gdata->validation_bits & CPER_SEC_VALID_FRU_ID) 165 + fru_id = (guid_t *)gdata->fru_id; 166 + else 167 + fru_id = &guid_null; 168 + if (gdata->validation_bits & CPER_SEC_VALID_FRU_TEXT) 169 + fru_text = gdata->fru_text; 170 + else 171 + fru_text = ""; 172 + sec_type = (guid_t *)gdata->section_type; 173 + if (guid_equal(sec_type, &CPER_SEC_PLATFORM_MEM)) { 174 + struct cper_sec_mem_err *mem = (void *)(gdata + 1); 175 + 176 + if (gdata->error_data_length >= sizeof(*mem)) 177 + trace_extlog_mem_event(mem, err_seq, fru_id, fru_text, 178 + (u8)gdata->error_severity); 179 + } 175 180 } 176 181 177 182 out:
+1 -1
drivers/acpi/apei/ghes.c
··· 163 163 clear_fixmap(fixmap_idx); 164 164 } 165 165 166 - int ghes_estatus_pool_init(int num_ghes) 166 + int ghes_estatus_pool_init(unsigned int num_ghes) 167 167 { 168 168 unsigned long addr, len; 169 169 int rc;
+1
drivers/acpi/pci_root.c
··· 323 323 324 324 list_for_each_entry(pn, &adev->physical_node_list, node) { 325 325 if (dev_is_pci(pn->dev)) { 326 + get_device(pn->dev); 326 327 pci_dev = to_pci_dev(pn->dev); 327 328 break; 328 329 }
+33 -16
drivers/acpi/resource.c
··· 428 428 { } 429 429 }; 430 430 431 + static const struct dmi_system_id lenovo_82ra[] = { 432 + { 433 + .ident = "LENOVO IdeaPad Flex 5 16ALC7", 434 + .matches = { 435 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 436 + DMI_MATCH(DMI_PRODUCT_NAME, "82RA"), 437 + }, 438 + }, 439 + { } 440 + }; 441 + 431 442 struct irq_override_cmp { 432 443 const struct dmi_system_id *system; 433 444 unsigned char irq; 434 445 unsigned char triggering; 435 446 unsigned char polarity; 436 447 unsigned char shareable; 448 + bool override; 437 449 }; 438 450 439 - static const struct irq_override_cmp skip_override_table[] = { 440 - { medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, 441 - { asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0 }, 451 + static const struct irq_override_cmp override_table[] = { 452 + { medion_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, 453 + { asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, 454 + { lenovo_82ra, 6, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true }, 455 + { lenovo_82ra, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true }, 442 456 }; 443 457 444 458 static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, 445 459 u8 shareable) 446 460 { 447 461 int i; 462 + 463 + for (i = 0; i < ARRAY_SIZE(override_table); i++) { 464 + const struct irq_override_cmp *entry = &override_table[i]; 465 + 466 + if (dmi_check_system(entry->system) && 467 + entry->irq == gsi && 468 + entry->triggering == triggering && 469 + entry->polarity == polarity && 470 + entry->shareable == shareable) 471 + return entry->override; 472 + } 448 473 449 474 #ifdef CONFIG_X86 450 475 /* ··· 480 455 if (boot_cpu_has(X86_FEATURE_ZEN)) 481 456 return false; 482 457 #endif 483 - 484 - for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) { 485 - const struct irq_override_cmp *entry = &skip_override_table[i]; 486 - 487 - if (dmi_check_system(entry->system) && 488 - entry->irq == gsi && 489 - entry->triggering == triggering && 490 - entry->polarity == polarity && 491 - entry->shareable == shareable) 492 - return false; 493 - } 494 458 495 459 return true; 496 460 } ··· 512 498 u8 pol = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; 513 499 514 500 if (triggering != trig || polarity != pol) { 515 - pr_warn("ACPI: IRQ %d override to %s, %s\n", gsi, 516 - t ? "level" : "edge", p ? "low" : "high"); 501 + pr_warn("ACPI: IRQ %d override to %s%s, %s%s\n", gsi, 502 + t ? "level" : "edge", 503 + trig == triggering ? "" : "(!)", 504 + p ? "low" : "high", 505 + pol == polarity ? "" : "(!)"); 517 506 triggering = trig; 518 507 polarity = pol; 519 508 }
+4 -3
drivers/acpi/scan.c
··· 1509 1509 goto out; 1510 1510 } 1511 1511 1512 + *map = r; 1513 + 1512 1514 list_for_each_entry(rentry, &list, node) { 1513 1515 if (rentry->res->start >= rentry->res->end) { 1514 - kfree(r); 1516 + kfree(*map); 1517 + *map = NULL; 1515 1518 ret = -EINVAL; 1516 1519 dev_dbg(dma_dev, "Invalid DMA regions configuration\n"); 1517 1520 goto out; ··· 1526 1523 r->offset = rentry->offset; 1527 1524 r++; 1528 1525 } 1529 - 1530 - *map = r; 1531 1526 } 1532 1527 out: 1533 1528 acpi_dev_free_resource_list(&list);
+1 -1
include/acpi/ghes.h
··· 71 71 void ghes_unregister_vendor_record_notifier(struct notifier_block *nb); 72 72 #endif 73 73 74 - int ghes_estatus_pool_init(int num_ghes); 74 + int ghes_estatus_pool_init(unsigned int num_ghes); 75 75 76 76 /* From drivers/edac/ghes_edac.c */ 77 77