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.

Dependency Surface

Detected Declarations

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

Implementation Notes