drivers/firmware/dmi_scan.c
Source file repositories/reference/linux-study-clean/drivers/firmware/dmi_scan.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/firmware/dmi_scan.c- Extension
.c- Size
- 30161 bytes
- Lines
- 1224
- Domain
- Driver Families
- Bucket
- drivers/firmware
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/types.hlinux/string.hlinux/init.hlinux/module.hlinux/ctype.hlinux/dmi.hlinux/efi.hlinux/memblock.hlinux/random.hasm/dmi.hlinux/unaligned.h
Detected Declarations
function dmi_stringfunction dmi_decode_tablefunction foundfunction dmi_walk_earlyfunction dmi_checksumfunction dmi_save_identfunction dmi_save_releasefunction dmi_save_uuidfunction dmi_save_typefunction dmi_save_one_devicefunction dmi_save_devicesfunction dmi_save_oem_strings_devicesfunction dmi_save_ipmi_devicefunction dmi_save_dev_pciaddrfunction dmi_save_extended_devicesfunction dmi_save_system_slotfunction count_mem_devicesfunction save_mem_devicesfunction dmi_memdev_walkfunction dmi_decodefunction print_filteredfunction dmi_format_idsfunction dmi_presentfunction dmi_checksumfunction dmi_smbios3_presentfunction dmi_scan_machinefunction dmi_initfunction informationfunction dmi_matchesfunction dmi_is_end_of_tablefunction dmi_check_systemfunction dmi_name_in_serialfunction dmi_name_in_vendorsfunction dmi_get_datefunction dmi_get_bios_yearfunction dmi_walkfunction strfunction dmi_memdev_namefunction dmi_memdev_sizefunction dmi_memdev_typefunction dmi_memdev_handlemodule init dmi_initexport dmi_kobjexport dmi_string_nosaveexport dmi_availableexport dmi_check_systemexport dmi_first_matchexport dmi_get_system_info
Annotated Snippet
/* This is called as a core_initcall() because it isn't
* needed during early boot. This also means we can
* iounmap the space when we're done with it.
*/
p = dmi_early_remap(efi.smbios, 32);
if (p == NULL)
goto error;
memcpy_fromio(buf, p, 32);
dmi_early_unmap(p, 32);
if (!dmi_present(buf)) {
dmi_available = 1;
return;
}
} else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) {
p = dmi_early_remap(SMBIOS_ENTRY_POINT_SCAN_START, 0x10000);
if (p == NULL)
goto error;
/*
* Same logic as above, look for a 64-bit entry point
* first, and if not found, fall back to 32-bit entry point.
*/
memcpy_fromio(buf, p, 16);
for (q = p + 16; q < p + 0x10000; q += 16) {
memcpy_fromio(buf + 16, q, 16);
if (!dmi_smbios3_present(buf)) {
dmi_available = 1;
dmi_early_unmap(p, 0x10000);
return;
}
memcpy(buf, buf + 16, 16);
}
/*
* Iterate over all possible DMI header addresses q.
* Maintain the 32 bytes around q in buf. On the
* first iteration, substitute zero for the
* out-of-range bytes so there is no chance of falsely
* detecting an SMBIOS header.
*/
memset(buf, 0, 16);
for (q = p; q < p + 0x10000; q += 16) {
memcpy_fromio(buf + 16, q, 16);
if (!dmi_present(buf)) {
dmi_available = 1;
dmi_early_unmap(p, 0x10000);
return;
}
memcpy(buf, buf + 16, 16);
}
dmi_early_unmap(p, 0x10000);
}
error:
pr_info("not present or invalid.\n");
}
static __ro_after_init BIN_ATTR_SIMPLE_ADMIN_RO(smbios_entry_point);
static __ro_after_init BIN_ATTR_SIMPLE_ADMIN_RO(DMI);
static int __init dmi_init(void)
{
struct kobject *tables_kobj;
u8 *dmi_table;
int ret = -ENOMEM;
if (!dmi_available)
return 0;
/*
* Set up dmi directory at /sys/firmware/dmi. This entry should stay
* even after farther error, as it can be used by other modules like
* dmi-sysfs.
*/
dmi_kobj = kobject_create_and_add("dmi", firmware_kobj);
if (!dmi_kobj)
goto err;
tables_kobj = kobject_create_and_add("tables", dmi_kobj);
if (!tables_kobj)
goto err;
dmi_table = dmi_remap(dmi_base, dmi_len);
if (!dmi_table)
goto err_tables;
bin_attr_smbios_entry_point.size = smbios_entry_point_size;
bin_attr_smbios_entry_point.private = smbios_entry_point;
ret = sysfs_create_bin_file(tables_kobj, &bin_attr_smbios_entry_point);
if (ret)
Annotation
- Immediate include surface: `linux/types.h`, `linux/string.h`, `linux/init.h`, `linux/module.h`, `linux/ctype.h`, `linux/dmi.h`, `linux/efi.h`, `linux/memblock.h`.
- Detected declarations: `function dmi_string`, `function dmi_decode_table`, `function found`, `function dmi_walk_early`, `function dmi_checksum`, `function dmi_save_ident`, `function dmi_save_release`, `function dmi_save_uuid`, `function dmi_save_type`, `function dmi_save_one_device`.
- Atlas domain: Driver Families / drivers/firmware.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.