drivers/crypto/hisilicon/sec2/sec_main.c

Source file repositories/reference/linux-study-clean/drivers/crypto/hisilicon/sec2/sec_main.c

File Facts

System
Linux kernel
Corpus path
drivers/crypto/hisilicon/sec2/sec_main.c
Extension
.c
Size
42929 bytes
Lines
1576
Domain
Driver Families
Bucket
drivers/crypto
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 sec_dbg_fops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = sec_debug_read,
	.write = sec_debug_write,
};

static int sec_debugfs_atomic64_get(void *data, u64 *val)
{
	*val = atomic64_read((atomic64_t *)data);

	return 0;
}

static int sec_debugfs_atomic64_set(void *data, u64 val)
{
	if (val)
		return -EINVAL;

	atomic64_set((atomic64_t *)data, 0);

	return 0;
}

DEFINE_DEBUGFS_ATTRIBUTE(sec_atomic64_ops, sec_debugfs_atomic64_get,
			 sec_debugfs_atomic64_set, "%llu\n");

static int sec_regs_show(struct seq_file *s, void *unused)
{
	hisi_qm_regs_dump(s, s->private);

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(sec_regs);

static int sec_cap_regs_show(struct seq_file *s, void *unused)
{
	struct hisi_qm *qm = s->private;
	u32 i, size;

	size = qm->cap_tables.qm_cap_size;
	for (i = 0; i < size; i++)
		seq_printf(s, "%s= 0x%08x\n", qm->cap_tables.qm_cap_table[i].name,
			   qm->cap_tables.qm_cap_table[i].cap_val);

	size = qm->cap_tables.dev_cap_size;
	for (i = 0; i < size; i++)
		seq_printf(s, "%s= 0x%08x\n", qm->cap_tables.dev_cap_table[i].name,
			   qm->cap_tables.dev_cap_table[i].cap_val);

	return 0;
}

DEFINE_SHOW_ATTRIBUTE(sec_cap_regs);

static int sec_core_debug_init(struct hisi_qm *qm)
{
	struct dfx_diff_registers *sec_regs = qm->debug.acc_diff_regs;
	struct sec_dev *sec = container_of(qm, struct sec_dev, qm);
	struct device *dev = &qm->pdev->dev;
	struct sec_dfx *dfx = &sec->debug.dfx;
	struct debugfs_regset32 *regset;
	struct dentry *tmp_d;
	int i;

	tmp_d = debugfs_create_dir("sec_dfx", qm->debug.debug_root);

	regset = devm_kzalloc(dev, sizeof(*regset), GFP_KERNEL);
	if (!regset)
		return -ENOMEM;

	regset->regs = sec_dfx_regs;
	regset->nregs = ARRAY_SIZE(sec_dfx_regs);
	regset->base = qm->io_base;
	regset->dev = dev;

	if (qm->pdev->device == PCI_DEVICE_ID_HUAWEI_SEC_PF)
		debugfs_create_file("regs", 0444, tmp_d, regset, &sec_regs_fops);
	if (qm->fun_type == QM_HW_PF && sec_regs)
		debugfs_create_file("diff_regs", 0444, tmp_d,
				      qm, &sec_diff_regs_fops);

	for (i = 0; i < ARRAY_SIZE(sec_dfx_labels); i++) {
		atomic64_t *data = (atomic64_t *)((uintptr_t)dfx +
					sec_dfx_labels[i].offset);
		debugfs_create_file(sec_dfx_labels[i].name, 0644,
				   tmp_d, data, &sec_atomic64_ops);
	}

Annotation

Implementation Notes