drivers/gpu/drm/xe/xe_survivability_mode.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/xe_survivability_mode.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/xe/xe_survivability_mode.c- Extension
.c- Size
- 14543 bytes
- Lines
- 454
- Domain
- Driver Families
- Bucket
- drivers/gpu
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
xe_survivability_mode.hxe_survivability_mode_types.hlinux/kobject.hlinux/pci.hlinux/sysfs.hxe_configfs.hxe_device.hxe_heci_gsc.hxe_i2c.hxe_mmio.hxe_nvm.hxe_pcode_api.hxe_vsec.h
Detected Declarations
struct xe_survivability_attributefunction set_survivability_infofunction populate_survivability_infofunction log_survivability_infofunction check_boot_failurefunction survivability_mode_showfunction survivability_info_showfunction xe_survivability_mode_finifunction survivability_info_attrs_visiblefunction create_survivability_sysfsfunction enable_boot_survivability_modefunction xe_survivability_mode_is_boot_enabledfunction xe_survivability_mode_is_requestedfunction xe_survivability_mode_runtime_enablefunction xe_survivability_mode_boot_enable
Annotated Snippet
struct xe_survivability_attribute {
struct device_attribute attr;
u8 index;
};
static struct
xe_survivability_attribute *dev_attr_to_survivability_attr(struct device_attribute *attr)
{
return container_of(attr, struct xe_survivability_attribute, attr);
}
static void set_survivability_info(struct xe_mmio *mmio, u32 *info, int id)
{
info[id] = xe_mmio_read32(mmio, PCODE_SCRATCH(id));
}
static void populate_survivability_info(struct xe_device *xe)
{
struct xe_survivability *survivability = &xe->survivability;
u32 *info = survivability->info;
struct xe_mmio *mmio;
u32 id = 0, reg_value;
mmio = xe_root_tile_mmio(xe);
set_survivability_info(mmio, info, CAPABILITY_INFO);
reg_value = info[CAPABILITY_INFO];
survivability->version = REG_FIELD_GET(BREADCRUMB_VERSION, reg_value);
/* FDO mode is exposed only from version 2 */
if (survivability->version >= 2)
survivability->fdo_mode = REG_FIELD_GET(FDO_MODE, reg_value);
if (reg_value & HISTORY_TRACKING) {
set_survivability_info(mmio, info, POSTCODE_TRACE);
if (reg_value & OVERFLOW_SUPPORT)
set_survivability_info(mmio, info, POSTCODE_TRACE_OVERFLOW);
}
/* Traverse the linked list of aux info registers */
if (reg_value & AUXINFO_SUPPORT) {
for (id = REG_FIELD_GET(AUXINFO_REG_OFFSET, reg_value);
id >= AUX_INFO0 && id < MAX_SCRATCH_REG;
id = REG_FIELD_GET(AUXINFO_HISTORY_OFFSET, info[id]))
set_survivability_info(mmio, info, id);
}
}
static void log_survivability_info(struct pci_dev *pdev)
{
struct xe_device *xe = pdev_to_xe_device(pdev);
struct xe_survivability *survivability = &xe->survivability;
u32 *info = survivability->info;
int id;
dev_info(&pdev->dev, "Survivability Boot Status : Critical Failure (%d)\n",
survivability->boot_status);
for (id = 0; id < MAX_SCRATCH_REG; id++) {
if (info[id])
dev_info(&pdev->dev, "%s: 0x%x\n", reg_map[id], info[id]);
}
}
static int check_boot_failure(struct xe_device *xe)
{
struct xe_survivability *survivability = &xe->survivability;
return survivability->boot_status == NON_CRITICAL_FAILURE ||
survivability->boot_status == CRITICAL_FAILURE;
}
static ssize_t survivability_mode_show(struct device *dev,
struct device_attribute *attr, char *buff)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct xe_device *xe = pdev_to_xe_device(pdev);
struct xe_survivability *survivability = &xe->survivability;
return sysfs_emit(buff, "%s\n", survivability->type ? "Runtime" : "Boot");
}
static DEVICE_ATTR_ADMIN_RO(survivability_mode);
static ssize_t survivability_info_show(struct device *dev,
struct device_attribute *attr, char *buff)
{
struct xe_survivability_attribute *sa = dev_attr_to_survivability_attr(attr);
struct pci_dev *pdev = to_pci_dev(dev);
struct xe_device *xe = pdev_to_xe_device(pdev);
struct xe_survivability *survivability = &xe->survivability;
Annotation
- Immediate include surface: `xe_survivability_mode.h`, `xe_survivability_mode_types.h`, `linux/kobject.h`, `linux/pci.h`, `linux/sysfs.h`, `xe_configfs.h`, `xe_device.h`, `xe_heci_gsc.h`.
- Detected declarations: `struct xe_survivability_attribute`, `function set_survivability_info`, `function populate_survivability_info`, `function log_survivability_info`, `function check_boot_failure`, `function survivability_mode_show`, `function survivability_info_show`, `function xe_survivability_mode_fini`, `function survivability_info_attrs_visible`, `function create_survivability_sysfs`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source 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.