drivers/crypto/hisilicon/debugfs.c
Source file repositories/reference/linux-study-clean/drivers/crypto/hisilicon/debugfs.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/crypto/hisilicon/debugfs.c- Extension
.c- Size
- 29980 bytes
- Lines
- 1273
- 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.
- 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/hisi_acc_qm.hqm_common.h
Detected Declarations
struct qm_dfx_itemstruct qm_cmd_dump_itemfunction qm_cmd_readfunction dump_showfunction qm_sqc_dumpfunction qm_cqc_dumpfunction qm_eqc_aeqc_dumpfunction q_dump_param_parsefunction qm_sq_dumpfunction qm_cq_dumpfunction qm_eq_aeq_dumpfunction qm_dbg_helpfunction qm_cmd_write_dumpfunction qm_cmd_writefunction hisi_qm_regs_dumpfunction qm_regs_showfunction current_q_readfunction current_q_writefunction clear_enable_readfunction clear_enable_writefunction current_qm_readfunction qm_get_vf_qp_numfunction current_qm_writefunction qm_debug_readfunction qm_debug_writefunction dfx_regs_uninitfunction qm_diff_regs_initfunction qm_last_regs_uninitfunction qm_last_regs_initfunction qm_diff_regs_uninitfunction hisi_qm_regs_debugfs_initfunction hisi_qm_regs_debugfs_uninitfunction hisi_qm_acc_diff_regs_dumpfunction hisi_qm_show_last_dfx_regsfunction qm_usage_percentfunction qm_usage_showfunction qm_diff_regs_showfunction qm_state_showfunction qm_status_readfunction qm_create_debugfs_filefunction qm_debugfs_atomic64_setfunction qm_debugfs_atomic64_getfunction hisi_qm_debug_initfunction hisi_qm_debug_regs_clearexport hisi_qm_regs_dumpexport hisi_qm_regs_debugfs_initexport hisi_qm_regs_debugfs_uninitexport hisi_qm_acc_diff_regs_dump
Annotated Snippet
static const struct file_operations qm_cmd_fops = {
.owner = THIS_MODULE,
.open = simple_open,
.read = qm_cmd_read,
.write = qm_cmd_write,
};
/**
* hisi_qm_regs_dump() - Dump registers's value.
* @s: debugfs file handle.
* @regset: accelerator registers information.
*
* Dump accelerator registers.
*/
void hisi_qm_regs_dump(struct seq_file *s, struct debugfs_regset32 *regset)
{
struct pci_dev *pdev = to_pci_dev(regset->dev);
struct hisi_qm *qm = pci_get_drvdata(pdev);
const struct debugfs_reg32 *regs = regset->regs;
int regs_len = regset->nregs;
int i, ret;
u32 val;
ret = hisi_qm_get_dfx_access(qm);
if (ret)
return;
for (i = 0; i < regs_len; i++) {
val = readl(regset->base + regs[i].offset);
seq_printf(s, "%s= 0x%08x\n", regs[i].name, val);
}
hisi_qm_put_dfx_access(qm);
}
EXPORT_SYMBOL_GPL(hisi_qm_regs_dump);
static int qm_regs_show(struct seq_file *s, void *unused)
{
struct hisi_qm *qm = s->private;
struct debugfs_regset32 regset;
if (qm->fun_type == QM_HW_PF) {
regset.regs = qm_dfx_regs;
regset.nregs = ARRAY_SIZE(qm_dfx_regs);
} else {
regset.regs = qm_vf_dfx_regs;
regset.nregs = ARRAY_SIZE(qm_vf_dfx_regs);
}
regset.base = qm->io_base;
regset.dev = &qm->pdev->dev;
hisi_qm_regs_dump(s, ®set);
return 0;
}
DEFINE_SHOW_ATTRIBUTE(qm_regs);
static u32 current_q_read(struct hisi_qm *qm)
{
return readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) >> QM_DFX_QN_SHIFT;
}
static int current_q_write(struct hisi_qm *qm, u32 val)
{
u32 tmp;
if (val >= qm->debug.curr_qm_qp_num)
return -EINVAL;
tmp = val << QM_DFX_QN_SHIFT |
(readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_FUN_MASK);
writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
tmp = val << QM_DFX_QN_SHIFT |
(readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_FUN_MASK);
writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
return 0;
}
static u32 clear_enable_read(struct hisi_qm *qm)
{
return readl(qm->io_base + QM_DFX_CNT_CLR_CE);
}
/* rd_clr_ctrl 1 enable read clear, otherwise 0 disable it */
static int clear_enable_write(struct hisi_qm *qm, u32 rd_clr_ctrl)
{
Annotation
- Immediate include surface: `linux/hisi_acc_qm.h`, `qm_common.h`.
- Detected declarations: `struct qm_dfx_item`, `struct qm_cmd_dump_item`, `function qm_cmd_read`, `function dump_show`, `function qm_sqc_dump`, `function qm_cqc_dump`, `function qm_eqc_aeqc_dump`, `function q_dump_param_parse`, `function qm_sq_dump`, `function qm_cq_dump`.
- Atlas domain: Driver Families / drivers/crypto.
- Implementation status: pattern implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.