drivers/gpu/drm/lima/lima_drv.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/lima/lima_drv.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/lima/lima_drv.c
Extension
.c
Size
12325 bytes
Lines
504
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 lima_block_reader {
	void *dst;
	size_t base;
	size_t count;
	size_t off;
	ssize_t read;
};

static bool lima_read_block(struct lima_block_reader *reader,
			    void *src, size_t src_size)
{
	size_t max_off = reader->base + src_size;

	if (reader->off < max_off) {
		size_t size = min_t(size_t, max_off - reader->off,
				    reader->count);

		memcpy(reader->dst, src + (reader->off - reader->base), size);

		reader->dst += size;
		reader->off += size;
		reader->read += size;
		reader->count -= size;
	}

	reader->base = max_off;

	return !!reader->count;
}

static ssize_t lima_error_state_read(struct file *filp, struct kobject *kobj,
				     const struct bin_attribute *attr, char *buf,
				     loff_t off, size_t count)
{
	struct device *dev = kobj_to_dev(kobj);
	struct lima_device *ldev = dev_get_drvdata(dev);
	struct lima_sched_error_task *et;
	struct lima_block_reader reader = {
		.dst = buf,
		.count = count,
		.off = off,
	};

	mutex_lock(&ldev->error_task_list_lock);

	if (lima_read_block(&reader, &ldev->dump, sizeof(ldev->dump))) {
		list_for_each_entry(et, &ldev->error_task_list, list) {
			if (!lima_read_block(&reader, et->data, et->size))
				break;
		}
	}

	mutex_unlock(&ldev->error_task_list_lock);
	return reader.read;
}

static ssize_t lima_error_state_write(struct file *file, struct kobject *kobj,
				      const struct bin_attribute *attr, char *buf,
				      loff_t off, size_t count)
{
	struct device *dev = kobj_to_dev(kobj);
	struct lima_device *ldev = dev_get_drvdata(dev);
	struct lima_sched_error_task *et, *tmp;

	mutex_lock(&ldev->error_task_list_lock);

	list_for_each_entry_safe(et, tmp, &ldev->error_task_list, list) {
		list_del(&et->list);
		kvfree(et);
	}

	ldev->dump.size = 0;
	ldev->dump.num_tasks = 0;

	mutex_unlock(&ldev->error_task_list_lock);

	return count;
}

static const struct bin_attribute lima_error_state_attr = {
	.attr.name = "error",
	.attr.mode = 0600,
	.size = 0,
	.read = lima_error_state_read,
	.write = lima_error_state_write,
};

static int lima_pdev_probe(struct platform_device *pdev)
{
	struct lima_device *ldev;

Annotation

Implementation Notes