drivers/platform/x86/intel/sdsi.c
Source file repositories/reference/linux-study-clean/drivers/platform/x86/intel/sdsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/platform/x86/intel/sdsi.c- Extension
.c- Size
- 17931 bytes
- Lines
- 711
- Domain
- Driver Families
- Bucket
- drivers/platform
- Inferred role
- Driver Families: implementation source
- Status
- source 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.
- 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/auxiliary_bus.hlinux/bits.hlinux/bitfield.hlinux/device.hlinux/intel_vsec.hlinux/iopoll.hlinux/kernel.hlinux/module.hlinux/overflow.hlinux/pci.hlinux/slab.hlinux/sysfs.hlinux/types.hlinux/uaccess.h
Detected Declarations
struct sdsi_mbox_infostruct disc_tablestruct sdsi_privenum sdsi_commandfunction sdsi_memcpy64_toiofunction sdsi_memcpy64_fromiofunction sdsi_complete_transactionfunction sdsi_status_to_errnofunction sdsi_mbox_pollfunction sdsi_mbox_cmd_readfunction sdsi_mbox_cmd_writefunction sdsi_mbox_acquirefunction sdsi_mbox_writefunction sdsi_mbox_readfunction sdsi_ib_lockedfunction sdsi_provisionfunction provision_akc_writefunction provision_cap_writefunction certificate_readfunction state_certificate_readfunction meter_certificate_readfunction meter_current_readfunction registers_readfunction sdsi_battr_is_visiblefunction guid_showfunction sdsi_get_layoutfunction sdsi_map_mbox_registersfunction sdsi_probe
Annotated Snippet
struct sdsi_mbox_info {
u64 *payload;
void *buffer;
u64 control_flags;
int size;
};
struct disc_table {
u32 access_info;
u32 guid;
u32 offset;
};
struct sdsi_priv {
struct mutex mb_lock; /* Mailbox access lock */
struct device *dev;
void __iomem *control_addr;
void __iomem *mbox_addr;
void __iomem *regs_addr;
int control_size;
int maibox_size;
int registers_size;
u32 guid;
u32 features;
};
/* SDSi mailbox operations must be performed using 64bit mov instructions */
static __always_inline void
sdsi_memcpy64_toio(u64 __iomem *to, const u64 *from, size_t count_bytes)
{
size_t count = count_bytes / sizeof(*to);
int i;
for (i = 0; i < count; i++)
writeq(from[i], &to[i]);
}
static __always_inline void
sdsi_memcpy64_fromio(u64 *to, const u64 __iomem *from, size_t count_bytes)
{
size_t count = count_bytes / sizeof(*to);
int i;
for (i = 0; i < count; i++)
to[i] = readq(&from[i]);
}
static inline void sdsi_complete_transaction(struct sdsi_priv *priv)
{
u64 control = FIELD_PREP(CTRL_COMPLETE, 1);
lockdep_assert_held(&priv->mb_lock);
writeq(control, priv->control_addr);
}
static int sdsi_status_to_errno(u32 status)
{
switch (status) {
case SDSI_MBOX_CMD_SUCCESS:
return 0;
case SDSI_MBOX_CMD_TIMEOUT:
return -ETIMEDOUT;
default:
return -EIO;
}
}
static int sdsi_mbox_poll(struct sdsi_priv *priv, struct sdsi_mbox_info *info,
size_t *data_size)
{
struct device *dev = priv->dev;
u32 total, loop, eom, status, message_size;
u64 control;
int ret;
lockdep_assert_held(&priv->mb_lock);
/* For reads, data sizes that are larger than the mailbox size are read in packets. */
total = 0;
loop = 0;
do {
u32 packet_size;
/* Poll on ready bit */
ret = readq_poll_timeout(priv->control_addr, control, control & CTRL_READY,
MBOX_POLLING_PERIOD_US, MBOX_TIMEOUT_US);
if (ret)
break;
eom = FIELD_GET(CTRL_EOM, control);
Annotation
- Immediate include surface: `linux/auxiliary_bus.h`, `linux/bits.h`, `linux/bitfield.h`, `linux/device.h`, `linux/intel_vsec.h`, `linux/iopoll.h`, `linux/kernel.h`, `linux/module.h`.
- Detected declarations: `struct sdsi_mbox_info`, `struct disc_table`, `struct sdsi_priv`, `enum sdsi_command`, `function sdsi_memcpy64_toio`, `function sdsi_memcpy64_fromio`, `function sdsi_complete_transaction`, `function sdsi_status_to_errno`, `function sdsi_mbox_poll`, `function sdsi_mbox_cmd_read`.
- Atlas domain: Driver Families / drivers/platform.
- Implementation status: source 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.