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 'x86-platform-2026-04-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 platform updates from Ingo Molnar:

- Remove M486/M486SX/ELAN support, first minimal step (Ingo Molnar)

- Print AGESA string from DMI additional information entry (Yazen
Ghannam, Mario Limonciello)

- Improve and fix the DMI code (Mario Limonciello):
- Correct an indexing error in <linux/dmi.h>
- Adjust dmi_decode() to use enums <linux/dmi.h>
- Add pr_fmt() for dmi_scan.c to fix & standardize the log prefixes

* tag 'x86-platform-2026-04-13' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/CPU/AMD: Print AGESA string from DMI additional information entry
firmware: dmi: Add pr_fmt() for dmi_scan.c
firmware: dmi: Adjust dmi_decode() to use enums
firmware: dmi: Correct an indexing error in dmi.h
x86/cpu: Remove M486/M486SX/ELAN support

+101 -67
-10
arch/x86/Kconfig
··· 448 448 uniprocessor machines. On a uniprocessor machine, the kernel 449 449 will run faster if you say N here. 450 450 451 - Note that if you say Y here and choose architecture "586" or 452 - "Pentium" under "Processor family", the kernel will not work on 486 453 - architectures. Similarly, multiprocessor kernels for the "PPro" 454 - architecture may not work on all Pentium based boards. 455 - 456 451 People using multiprocessor machines who say Y here should also say 457 452 Y to "Enhanced Real Time Clock Support", below. The "Advanced Power 458 453 Management" code will be disabled if you say Y here. ··· 2767 2772 This driver does not spin down disk drives (see the hdparm(8) 2768 2773 manpage ("man 8 hdparm") for that), and it doesn't turn off 2769 2774 VESA-compliant "green" monitors. 2770 - 2771 - This driver does not support the TI 4000M TravelMate and the ACER 2772 - 486/DX4/75 because they don't have compliant BIOSes. Many "green" 2773 - desktop machines also don't have compliant BIOSes, and this driver 2774 - may cause those machines to panic during the boot phase. 2775 2775 2776 2776 Generally, if you don't have a battery in your machine, there isn't 2777 2777 much point in using this driver and you should say N. If you get
+10 -34
arch/x86/Kconfig.cpu
··· 8 8 This is the processor type of your CPU. This information is 9 9 used for optimizing purposes. In order to compile a kernel 10 10 that can run on all supported x86 CPU types (albeit not 11 - optimally fast), you can specify "486" here. 11 + optimally fast), you can specify "586" here. 12 12 13 - Note that the 386 is no longer supported, this includes 13 + Note that the 386 and 486 is no longer supported, this includes 14 14 AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI 486DLC/DLC2, 15 - UMC 486SX-S and the NexGen Nx586. 15 + UMC 486SX-S and the NexGen Nx586, AMD ELAN and all 486 based 16 + CPUs. 16 17 17 18 The kernel will not necessarily run on earlier architectures than 18 19 the one you have chosen, e.g. a Pentium optimized kernel will run on 19 20 a PPro, but not necessarily on a i486. 20 21 21 22 Here are the settings recommended for greatest speed: 22 - - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or 23 - SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S. 24 23 - "586" for generic Pentium CPUs lacking the TSC 25 24 (time stamp counter) register. 26 25 - "Pentium-Classic" for the Intel Pentium. ··· 44 45 45 46 See each option's help text for additional details. If you don't know 46 47 what to do, choose "Pentium-Pro". 47 - 48 - config M486SX 49 - bool "486SX" 50 - depends on X86_32 51 - help 52 - Select this for an 486-class CPU without an FPU such as 53 - AMD/Cyrix/IBM/Intel SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5S. 54 - 55 - config M486 56 - bool "486DX" 57 - depends on X86_32 58 - help 59 - Select this for an 486-class CPU such as AMD/Cyrix/IBM/Intel 60 - 486DX/DX2/DX4 and UMC U5D. 61 48 62 49 config M586 63 50 bool "586/K5/5x86/6x86/6x86MX" ··· 173 188 stores for this CPU, which can increase performance of some 174 189 operations. 175 190 176 - config MELAN 177 - bool "AMD Elan" 178 - depends on X86_32 179 - help 180 - Select this for an AMD Elan processor. 181 - 182 - Do not use this option for K6/Athlon/Opteron processors! 183 - 184 191 config MGEODEGX1 185 192 bool "GeodeGX1" 186 193 depends on X86_32 ··· 269 292 int 270 293 default "7" if MPENTIUM4 271 294 default "6" if MK7 || MPENTIUMM || MATOM || MVIAC7 || X86_GENERIC || X86_64 272 - default "4" if MELAN || M486SX || M486 || MGEODEGX1 295 + default "4" if MGEODEGX1 273 296 default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX 274 297 275 298 config X86_F00F_BUG 276 299 def_bool y 277 - depends on M586MMX || M586TSC || M586 || M486SX || M486 300 + depends on M586MMX || M586TSC || M586 278 301 279 302 config X86_INVD_BUG 280 303 def_bool y ··· 282 305 283 306 config X86_ALIGNMENT_16 284 307 def_bool y 285 - depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MELAN || MK6 || M586MMX || M586TSC || M586 || M486SX || M486 || MVIAC3_2 || MGEODEGX1 308 + depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK6 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODEGX1 286 309 287 310 config X86_INTEL_USERCOPY 288 311 def_bool y ··· 314 337 int 315 338 default "64" if X86_64 316 339 default "6" if X86_32 && (MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MEFFICEON || MATOM || MK7) 317 - default "5" if X86_32 && X86_CX8 318 - default "4" 340 + default "5" 319 341 320 342 config X86_DEBUGCTLMSR 321 343 def_bool y 322 - depends on !(MK6 || MWINCHIPC6 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486SX || M486) && !UML 344 + depends on !(MK6 || MWINCHIPC6 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586) && !UML 323 345 324 346 config IA32_FEAT_CTL 325 347 def_bool y ··· 354 378 config CPU_SUP_CYRIX_32 355 379 default y 356 380 bool "Support Cyrix processors" if PROCESSOR_SELECT 357 - depends on M486SX || M486 || M586 || M586TSC || M586MMX || (EXPERT && !64BIT) 381 + depends on M586 || M586TSC || M586MMX || (EXPERT && !64BIT) 358 382 help 359 383 This enables detection, tunings and quirks for Cyrix processors 360 384
-2
arch/x86/Makefile_32.cpu
··· 10 10 align := -falign-functions=0 -falign-jumps=0 -falign-loops=0 11 11 endif 12 12 13 - cflags-$(CONFIG_M486SX) += -march=i486 14 - cflags-$(CONFIG_M486) += -march=i486 15 13 cflags-$(CONFIG_M586) += -march=i586 16 14 cflags-$(CONFIG_M586TSC) += -march=i586 17 15 cflags-$(CONFIG_M586MMX) += -march=pentium-mmx
-6
arch/x86/include/asm/vermagic.h
··· 5 5 6 6 #ifdef CONFIG_X86_64 7 7 /* X86_64 does not define MODULE_PROC_FAMILY */ 8 - #elif defined CONFIG_M486SX 9 - #define MODULE_PROC_FAMILY "486SX " 10 - #elif defined CONFIG_M486 11 - #define MODULE_PROC_FAMILY "486 " 12 8 #elif defined CONFIG_M586 13 9 #define MODULE_PROC_FAMILY "586 " 14 10 #elif defined CONFIG_M586TSC ··· 27 31 #define MODULE_PROC_FAMILY "K6 " 28 32 #elif defined CONFIG_MK7 29 33 #define MODULE_PROC_FAMILY "K7 " 30 - #elif defined CONFIG_MELAN 31 - #define MODULE_PROC_FAMILY "ELAN " 32 34 #elif defined CONFIG_MCRUSOE 33 35 #define MODULE_PROC_FAMILY "CRUSOE " 34 36 #elif defined CONFIG_MEFFICEON
+49
arch/x86/kernel/cpu/amd.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 #include <linux/export.h> 3 3 #include <linux/bitops.h> 4 + #include <linux/dmi.h> 4 5 #include <linux/elf.h> 5 6 #include <linux/mm.h> 6 7 #include <linux/kvm_types.h> ··· 1381 1380 return 0; 1382 1381 } 1383 1382 late_initcall(print_s5_reset_status_mmio); 1383 + 1384 + static void __init dmi_scan_additional(const struct dmi_header *d, void *p) 1385 + { 1386 + struct dmi_a_info *info = (struct dmi_a_info *)d; 1387 + void *next, *end; 1388 + 1389 + if (!IS_ENABLED(CONFIG_DMI)) 1390 + return; 1391 + 1392 + if (info->header.type != DMI_ENTRY_ADDITIONAL || 1393 + info->header.length < DMI_A_INFO_MIN_SIZE || 1394 + info->count < 1) 1395 + return; 1396 + 1397 + next = (void *)(info + 1); 1398 + end = (void *)info + info->header.length; 1399 + 1400 + do { 1401 + struct dmi_a_info_entry *entry; 1402 + const char *string_ptr; 1403 + 1404 + entry = (struct dmi_a_info_entry *)next; 1405 + 1406 + /* 1407 + * Not much can be done to validate data. At least the entry 1408 + * length shouldn't be 0. 1409 + */ 1410 + if (!entry->length) 1411 + return; 1412 + 1413 + string_ptr = dmi_string_nosave(&info->header, entry->str_num); 1414 + 1415 + /* Sample string: AGESA!V9 StrixKrackanPI-FP8 1.1.0.0c */ 1416 + if (!strncmp(string_ptr, "AGESA", 5)) { 1417 + pr_info("AGESA: %s\n", string_ptr); 1418 + break; 1419 + } 1420 + 1421 + next += entry->length; 1422 + } while (end - next >= DMI_A_INFO_ENT_MIN_SIZE); 1423 + } 1424 + 1425 + static __init int print_dmi_agesa(void) 1426 + { 1427 + dmi_walk(dmi_scan_additional, NULL); 1428 + return 0; 1429 + } 1430 + late_initcall(print_dmi_agesa);
+19 -15
drivers/firmware/dmi_scan.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #define pr_fmt(fmt) "DMI: " fmt 4 + 2 5 #include <linux/types.h> 3 6 #include <linux/string.h> 4 7 #include <linux/init.h> ··· 47 44 static int dmi_memdev_nr; 48 45 static int dmi_memdev_populated_nr __initdata; 49 46 50 - static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s) 47 + const char *dmi_string_nosave(const struct dmi_header *dm, u8 s) 51 48 { 52 49 const u8 *bp = ((u8 *) dm) + dm->length; 53 50 const u8 *nsp; ··· 66 63 67 64 return dmi_empty_string; 68 65 } 66 + EXPORT_SYMBOL_GPL(dmi_string_nosave); 69 67 70 68 static const char * __init dmi_string(const struct dmi_header *dm, u8 s) 71 69 { ··· 488 484 static void __init dmi_decode(const struct dmi_header *dm, void *dummy) 489 485 { 490 486 switch (dm->type) { 491 - case 0: /* BIOS Information */ 487 + case DMI_ENTRY_BIOS: 492 488 dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); 493 489 dmi_save_ident(dm, DMI_BIOS_VERSION, 5); 494 490 dmi_save_ident(dm, DMI_BIOS_DATE, 8); 495 491 dmi_save_release(dm, DMI_BIOS_RELEASE, 21); 496 492 dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23); 497 493 break; 498 - case 1: /* System Information */ 494 + case DMI_ENTRY_SYSTEM: 499 495 dmi_save_ident(dm, DMI_SYS_VENDOR, 4); 500 496 dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); 501 497 dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); ··· 504 500 dmi_save_ident(dm, DMI_PRODUCT_SKU, 25); 505 501 dmi_save_ident(dm, DMI_PRODUCT_FAMILY, 26); 506 502 break; 507 - case 2: /* Base Board Information */ 503 + case DMI_ENTRY_BASEBOARD: 508 504 dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); 509 505 dmi_save_ident(dm, DMI_BOARD_NAME, 5); 510 506 dmi_save_ident(dm, DMI_BOARD_VERSION, 6); 511 507 dmi_save_ident(dm, DMI_BOARD_SERIAL, 7); 512 508 dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8); 513 509 break; 514 - case 3: /* Chassis Information */ 510 + case DMI_ENTRY_CHASSIS: 515 511 dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4); 516 512 dmi_save_type(dm, DMI_CHASSIS_TYPE, 5); 517 513 dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6); 518 514 dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7); 519 515 dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8); 520 516 break; 521 - case 9: /* System Slots */ 517 + case DMI_ENTRY_SYSTEM_SLOT: 522 518 dmi_save_system_slot(dm); 523 519 break; 524 - case 10: /* Onboard Devices Information */ 520 + case DMI_ENTRY_ONBOARD_DEVICE: 525 521 dmi_save_devices(dm); 526 522 break; 527 - case 11: /* OEM Strings */ 523 + case DMI_ENTRY_OEMSTRINGS: 528 524 dmi_save_oem_strings_devices(dm); 529 525 break; 530 - case 38: /* IPMI Device Information */ 526 + case DMI_ENTRY_IPMI_DEV: 531 527 dmi_save_ipmi_device(dm); 532 528 break; 533 - case 41: /* Onboard Devices Extended Information */ 529 + case DMI_ENTRY_ONBOARD_DEV_EXT: 534 530 dmi_save_extended_devices(dm); 535 531 } 536 532 } ··· 638 634 dmi_ver >> 16, (dmi_ver >> 8) & 0xFF); 639 635 } 640 636 dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); 641 - pr_info("DMI: %s\n", dmi_ids_string); 637 + pr_info("%s\n", dmi_ids_string); 642 638 return 0; 643 639 } 644 640 } ··· 667 663 dmi_ver >> 16, (dmi_ver >> 8) & 0xFF, 668 664 dmi_ver & 0xFF); 669 665 dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string)); 670 - pr_info("DMI: %s\n", dmi_ids_string); 666 + pr_info("%s\n", dmi_ids_string); 671 667 return 0; 672 668 } 673 669 } ··· 762 758 dmi_early_unmap(p, 0x10000); 763 759 } 764 760 error: 765 - pr_info("DMI not present or invalid.\n"); 761 + pr_info("not present or invalid.\n"); 766 762 } 767 763 768 764 static __ro_after_init BIN_ATTR_SIMPLE_ADMIN_RO(smbios_entry_point); ··· 814 810 kobject_del(tables_kobj); 815 811 kobject_put(tables_kobj); 816 812 err: 817 - pr_err("dmi: Firmware registration failed.\n"); 813 + pr_err("Firmware registration failed.\n"); 818 814 819 815 return ret; 820 816 } ··· 835 831 return; 836 832 837 833 dmi_memdev_walk(); 838 - pr_info("DMI: Memory slots populated: %d/%d\n", 834 + pr_info("Memory slots populated: %d/%d\n", 839 835 dmi_memdev_populated_nr, dmi_memdev_nr); 840 836 dump_stack_set_arch_desc("%s", dmi_ids_string); 841 837 }
+23
include/linux/dmi.h
··· 60 60 DMI_ENTRY_OOB_REMOTE_ACCESS, 61 61 DMI_ENTRY_BIS_ENTRY, 62 62 DMI_ENTRY_SYSTEM_BOOT, 63 + DMI_ENTRY_64_MEM_ERROR, 63 64 DMI_ENTRY_MGMT_DEV, 64 65 DMI_ENTRY_MGMT_DEV_COMPONENT, 65 66 DMI_ENTRY_MGMT_DEV_THRES, ··· 70 69 DMI_ENTRY_ADDITIONAL, 71 70 DMI_ENTRY_ONBOARD_DEV_EXT, 72 71 DMI_ENTRY_MGMT_CONTROLLER_HOST, 72 + DMI_ENTRY_TPM_DEVICE, 73 + DMI_ENTRY_PROCESSOR_ADDITIONAL, 74 + DMI_ENTRY_FIRMWARE_INVENTORY, 75 + DMI_ENTRY_STRING_PROPERTY, 73 76 DMI_ENTRY_INACTIVE = 126, 74 77 DMI_ENTRY_END_OF_TABLE = 127, 75 78 }; ··· 90 85 const char *name; 91 86 void *device_data; /* Type specific data */ 92 87 }; 88 + 89 + #define DMI_A_INFO_ENT_MIN_SIZE 0x6 90 + struct dmi_a_info_entry { 91 + u8 length; 92 + u16 handle; 93 + u8 offset; 94 + u8 str_num; 95 + u8 value[]; 96 + } __packed; 97 + 98 + #define DMI_A_INFO_MIN_SIZE 0xB 99 + struct dmi_a_info { 100 + struct dmi_header header; 101 + u8 count; 102 + } __packed; 93 103 94 104 #ifdef CONFIG_DMI 95 105 ··· 135 115 extern u64 dmi_memdev_size(u16 handle); 136 116 extern u8 dmi_memdev_type(u16 handle); 137 117 extern u16 dmi_memdev_handle(int slot); 118 + const char *dmi_string_nosave(const struct dmi_header *dm, u8 s); 138 119 139 120 #else 140 121 ··· 169 148 static inline u16 dmi_memdev_handle(int slot) { return 0xffff; } 170 149 static inline const struct dmi_system_id * 171 150 dmi_first_match(const struct dmi_system_id *list) { return NULL; } 151 + static inline const char * 152 + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return ""; } 172 153 173 154 #endif 174 155