drivers/hwtracing/coresight/coresight-tmc-core.c

Source file repositories/reference/linux-study-clean/drivers/hwtracing/coresight/coresight-tmc-core.c

File Facts

System
Linux kernel
Corpus path
drivers/hwtracing/coresight/coresight-tmc-core.c
Extension
.c
Size
26057 bytes
Lines
1062
Domain
Driver Families
Bucket
drivers/hwtracing
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations tmc_fops = {
	.owner		= THIS_MODULE,
	.open		= tmc_open,
	.read		= tmc_read,
	.release	= tmc_release,
};

static int tmc_crashdata_open(struct inode *inode, struct file *file)
{
	int err = 0;
	unsigned long flags;
	struct tmc_resrv_buf *rbuf;
	struct tmc_crash_metadata *mdata;
	struct tmc_drvdata *drvdata = container_of(file->private_data,
						   struct tmc_drvdata,
						   crashdev);

	mdata = drvdata->crash_mdata.vaddr;
	rbuf = &drvdata->resrv_buf;

	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
	if (mdata->valid)
		rbuf->reading = true;
	else
		err = -ENOENT;
	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);
	if (err)
		goto exit;

	nonseekable_open(inode, file);
	dev_dbg(&drvdata->csdev->dev, "%s: successfully opened\n", __func__);
exit:
	return err;
}

static ssize_t tmc_crashdata_read(struct file *file, char __user *data,
				  size_t len, loff_t *ppos)
{
	char *bufp;
	ssize_t actual;
	struct tmc_drvdata *drvdata = container_of(file->private_data,
						   struct tmc_drvdata,
						   crashdev);

	actual = tmc_get_resvbuf_trace(drvdata, *ppos, len, &bufp);
	if (actual <= 0)
		return 0;

	if (copy_to_user(data, bufp, actual)) {
		dev_dbg(&drvdata->csdev->dev,
			"%s: copy_to_user failed\n", __func__);
		return -EFAULT;
	}

	*ppos += actual;
	dev_dbg(&drvdata->csdev->dev, "%zu bytes copied\n", actual);

	return actual;
}

static int tmc_crashdata_release(struct inode *inode, struct file *file)
{
	unsigned long flags;
	struct tmc_resrv_buf *rbuf;
	struct tmc_drvdata *drvdata = container_of(file->private_data,
						   struct tmc_drvdata,
						   crashdev);

	rbuf = &drvdata->resrv_buf;
	raw_spin_lock_irqsave(&drvdata->spinlock, flags);
	rbuf->reading = false;
	raw_spin_unlock_irqrestore(&drvdata->spinlock, flags);

	dev_dbg(&drvdata->csdev->dev, "%s: released\n", __func__);
	return 0;
}

static const struct file_operations tmc_crashdata_fops = {
	.owner		= THIS_MODULE,
	.open		= tmc_crashdata_open,
	.read		= tmc_crashdata_read,
	.release	= tmc_crashdata_release,
};

static enum tmc_mem_intf_width tmc_get_memwidth(u32 devid)
{
	enum tmc_mem_intf_width memwidth;

	/*
	 * Excerpt from the TRM:

Annotation

Implementation Notes