drivers/dma/qcom/hidma_mgmt_sys.c

Source file repositories/reference/linux-study-clean/drivers/dma/qcom/hidma_mgmt_sys.c

File Facts

System
Linux kernel
Corpus path
drivers/dma/qcom/hidma_mgmt_sys.c
Extension
.c
Size
6803 bytes
Lines
286
Domain
Driver Families
Bucket
drivers/dma
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 hidma_chan_attr {
	struct hidma_mgmt_dev *mdev;
	int index;
	struct kobj_attribute attr;
};

struct hidma_mgmt_fileinfo {
	char *name;
	int mode;
	int (*get)(struct hidma_mgmt_dev *mdev);
	int (*set)(struct hidma_mgmt_dev *mdev, u64 val);
};

#define IMPLEMENT_GETSET(name)					\
static int get_##name(struct hidma_mgmt_dev *mdev)		\
{								\
	return mdev->name;					\
}								\
static int set_##name(struct hidma_mgmt_dev *mdev, u64 val)	\
{								\
	u64 tmp;						\
	int rc;							\
								\
	tmp = mdev->name;					\
	mdev->name = val;					\
	rc = hidma_mgmt_setup(mdev);				\
	if (rc)							\
		mdev->name = tmp;				\
	return rc;						\
}

#define DECLARE_ATTRIBUTE(name, mode)				\
	{#name, mode, get_##name, set_##name}

IMPLEMENT_GETSET(hw_version_major)
IMPLEMENT_GETSET(hw_version_minor)
IMPLEMENT_GETSET(max_wr_xactions)
IMPLEMENT_GETSET(max_rd_xactions)
IMPLEMENT_GETSET(max_write_request)
IMPLEMENT_GETSET(max_read_request)
IMPLEMENT_GETSET(dma_channels)
IMPLEMENT_GETSET(chreset_timeout_cycles)

static int set_priority(struct hidma_mgmt_dev *mdev, unsigned int i, u64 val)
{
	u64 tmp;
	int rc;

	if (i >= mdev->dma_channels)
		return -EINVAL;

	tmp = mdev->priority[i];
	mdev->priority[i] = val;
	rc = hidma_mgmt_setup(mdev);
	if (rc)
		mdev->priority[i] = tmp;
	return rc;
}

static int set_weight(struct hidma_mgmt_dev *mdev, unsigned int i, u64 val)
{
	u64 tmp;
	int rc;

	if (i >= mdev->dma_channels)
		return -EINVAL;

	tmp = mdev->weight[i];
	mdev->weight[i] = val;
	rc = hidma_mgmt_setup(mdev);
	if (rc)
		mdev->weight[i] = tmp;
	return rc;
}

static struct hidma_mgmt_fileinfo hidma_mgmt_files[] = {
	DECLARE_ATTRIBUTE(hw_version_major, S_IRUGO),
	DECLARE_ATTRIBUTE(hw_version_minor, S_IRUGO),
	DECLARE_ATTRIBUTE(dma_channels, S_IRUGO),
	DECLARE_ATTRIBUTE(chreset_timeout_cycles, S_IRUGO),
	DECLARE_ATTRIBUTE(max_wr_xactions, S_IRUGO),
	DECLARE_ATTRIBUTE(max_rd_xactions, S_IRUGO),
	DECLARE_ATTRIBUTE(max_write_request, S_IRUGO),
	DECLARE_ATTRIBUTE(max_read_request, S_IRUGO),
};

static ssize_t show_values(struct device *dev, struct device_attribute *attr,
			   char *buf)
{
	struct hidma_mgmt_dev *mdev = dev_get_drvdata(dev);

Annotation

Implementation Notes