drivers/platform/x86/intel/vsec_tpmi.c
Source file repositories/reference/linux-study-clean/drivers/platform/x86/intel/vsec_tpmi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/platform/x86/intel/vsec_tpmi.c- Extension
.c- Size
- 25467 bytes
- Lines
- 887
- Domain
- Driver Families
- Bucket
- drivers/platform
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/align.hlinux/auxiliary_bus.hlinux/bitfield.hlinux/debugfs.hlinux/delay.hlinux/intel_tpmi.hlinux/intel_vsec.hlinux/io.hlinux/iopoll.hlinux/module.hlinux/notifier.hlinux/pci.hlinux/security.hlinux/sizes.hlinux/string_helpers.h
Detected Declarations
struct intel_tpmi_pfs_entrystruct intel_tpmi_pm_featurestruct intel_tpmi_infostruct tpmi_info_headerstruct tpmi_feature_statefunction tpmi_register_notifierfunction tpmi_unregister_notifierfunction tpmi_get_resource_countfunction tpmi_wait_for_ownerfunction tpmi_read_feature_statusfunction tpmi_get_feature_statusfunction tpmi_pfs_dbg_showfunction tpmi_mem_dump_showfunction mem_writefunction mem_write_showfunction mem_write_openfunction tpmi_dbgfs_registerfunction tpmi_set_control_basefunction tpmi_create_devicefunction tpmi_create_devicesfunction tpmi_process_infofunction tpmi_fetch_pfs_headerfunction intel_vsec_tpmi_initfunction tpmi_create_devicesfunction tpmi_probefunction tpmi_remove
Annotated Snippet
static const struct file_operations mem_write_ops = {
.open = mem_write_open,
.read = seq_read,
.write = mem_write,
.llseek = seq_lseek,
.release = single_release,
};
#define tpmi_to_dev(info) ((info)->vsec_dev->dev)
static void tpmi_dbgfs_register(struct intel_tpmi_info *tpmi_info)
{
char name[64];
int i;
snprintf(name, sizeof(name), "tpmi-%s", dev_name(tpmi_to_dev(tpmi_info)));
tpmi_info->dbgfs_dir = debugfs_create_dir(name, NULL);
debugfs_create_file("pfs_dump", 0444, tpmi_info->dbgfs_dir, tpmi_info, &tpmi_pfs_dbg_fops);
for (i = 0; i < tpmi_info->feature_count; ++i) {
struct intel_tpmi_pm_feature *pfs;
struct dentry *dir;
pfs = &tpmi_info->tpmi_features[i];
snprintf(name, sizeof(name), "tpmi-id-%02x", pfs->pfs_header.tpmi_id);
dir = debugfs_create_dir(name, tpmi_info->dbgfs_dir);
debugfs_create_file("mem_dump", 0444, dir, pfs, &tpmi_mem_dump_fops);
debugfs_create_file("mem_write", 0644, dir, pfs, &mem_write_ops);
}
}
static void tpmi_set_control_base(struct auxiliary_device *auxdev,
struct intel_tpmi_info *tpmi_info,
struct intel_tpmi_pm_feature *pfs)
{
void __iomem *mem;
u32 size;
size = TPMI_GET_SINGLE_ENTRY_SIZE(pfs);
if (!size)
return;
mem = devm_ioremap(&auxdev->dev, pfs->vsec_offset, size);
if (!mem)
return;
/* mem is pointing to TPMI CONTROL base */
tpmi_info->tpmi_control_mem = mem;
}
static const char *intel_tpmi_name(enum intel_tpmi_id id)
{
switch (id) {
case TPMI_ID_RAPL:
return "rapl";
case TPMI_ID_PEM:
return "pem";
case TPMI_ID_UNCORE:
return "uncore";
case TPMI_ID_SST:
return "sst";
case TPMI_ID_PLR:
return "plr";
default:
return NULL;
}
}
/* String Length for tpmi-"feature_name(upto 8 bytes)" */
#define TPMI_FEATURE_NAME_LEN 14
static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
struct intel_tpmi_pm_feature *pfs,
u64 pfs_start)
{
struct intel_vsec_device *vsec_dev = tpmi_info->vsec_dev;
char feature_id_name[TPMI_FEATURE_NAME_LEN];
struct intel_vsec_device *feature_vsec_dev;
struct tpmi_feature_state feature_state;
struct resource *res, *tmp;
const char *name;
int i, ret;
ret = tpmi_read_feature_status(tpmi_info, pfs->pfs_header.tpmi_id, &feature_state);
if (ret)
return ret;
/*
Annotation
- Immediate include surface: `linux/align.h`, `linux/auxiliary_bus.h`, `linux/bitfield.h`, `linux/debugfs.h`, `linux/delay.h`, `linux/intel_tpmi.h`, `linux/intel_vsec.h`, `linux/io.h`.
- Detected declarations: `struct intel_tpmi_pfs_entry`, `struct intel_tpmi_pm_feature`, `struct intel_tpmi_info`, `struct tpmi_info_header`, `struct tpmi_feature_state`, `function tpmi_register_notifier`, `function tpmi_unregister_notifier`, `function tpmi_get_resource_count`, `function tpmi_wait_for_owner`, `function tpmi_read_feature_status`.
- Atlas domain: Driver Families / drivers/platform.
- Implementation status: pattern implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.