drivers/gpu/drm/panfrost/panfrost_dump.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/panfrost/panfrost_dump.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/panfrost/panfrost_dump.c
Extension
.c
Size
6567 bytes
Lines
242
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 panfrost_dump_iterator {
	void *start;
	struct panfrost_dump_object_header *hdr;
	void *data;
};

static const unsigned short panfrost_dump_registers[] = {
	SHADER_READY_LO,
	SHADER_READY_HI,
	TILER_READY_LO,
	TILER_READY_HI,
	L2_READY_LO,
	L2_READY_HI,
	JOB_INT_MASK,
	JOB_INT_STAT,
	JS_HEAD_LO(0),
	JS_HEAD_HI(0),
	JS_TAIL_LO(0),
	JS_TAIL_HI(0),
	JS_AFFINITY_LO(0),
	JS_AFFINITY_HI(0),
	JS_CONFIG(0),
	JS_STATUS(0),
	JS_HEAD_NEXT_LO(0),
	JS_HEAD_NEXT_HI(0),
	JS_AFFINITY_NEXT_LO(0),
	JS_AFFINITY_NEXT_HI(0),
	JS_CONFIG_NEXT(0),
	MMU_INT_MASK,
	MMU_INT_STAT,
	AS_TRANSTAB_LO(0),
	AS_TRANSTAB_HI(0),
	AS_MEMATTR_LO(0),
	AS_MEMATTR_HI(0),
	AS_FAULTSTATUS(0),
	AS_FAULTADDRESS_LO(0),
	AS_FAULTADDRESS_HI(0),
	AS_STATUS(0),
};

static void panfrost_core_dump_header(struct panfrost_dump_iterator *iter,
				      u32 type, void *data_end)
{
	struct panfrost_dump_object_header *hdr = iter->hdr;

	hdr->magic = PANFROSTDUMP_MAGIC;
	hdr->type = type;
	hdr->file_offset = iter->data - iter->start;
	hdr->file_size = data_end - iter->data;

	iter->hdr++;
	iter->data += hdr->file_size;
}

static void
panfrost_core_dump_registers(struct panfrost_dump_iterator *iter,
			     struct panfrost_device *pfdev,
			     u32 as_nr, int slot)
{
	struct panfrost_dump_registers *dumpreg = iter->data;
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(panfrost_dump_registers); i++, dumpreg++) {
		unsigned int js_as_offset = 0;
		unsigned int reg;

		if (panfrost_dump_registers[i] >= JS_BASE &&
		    panfrost_dump_registers[i] <= JS_BASE + JS_SLOT_STRIDE)
			js_as_offset = slot * JS_SLOT_STRIDE;
		else if (panfrost_dump_registers[i] >= MMU_BASE &&
			 panfrost_dump_registers[i] <= MMU_BASE + MMU_AS_STRIDE)
			js_as_offset = (as_nr << MMU_AS_SHIFT);

		reg = panfrost_dump_registers[i] + js_as_offset;

		dumpreg->reg = reg;
		dumpreg->value = gpu_read(pfdev, reg);
	}

	panfrost_core_dump_header(iter, PANFROSTDUMP_BUF_REG, dumpreg);
}

void panfrost_core_dump(struct panfrost_job *job)
{
	struct panfrost_device *pfdev = job->pfdev;
	struct panfrost_dump_iterator iter;
	struct drm_gem_object *dbo;
	unsigned int n_obj, n_bomap_pages;
	u64 *bomap, *bomap_start;
	size_t file_size;

Annotation

Implementation Notes