drivers/crypto/stm32/stm32-hash.c

Source file repositories/reference/linux-study-clean/drivers/crypto/stm32/stm32-hash.c

File Facts

System
Linux kernel
Corpus path
drivers/crypto/stm32/stm32-hash.c
Extension
.c
Size
63416 bytes
Lines
2539
Domain
Driver Families
Bucket
drivers/crypto
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 stm32_hash_ctx {
	struct stm32_hash_dev	*hdev;
	struct crypto_shash	*xtfm;
	unsigned long		flags;

	u8			key[HASH_MAX_KEY_SIZE];
	int			keylen;
};

struct stm32_hash_state {
	u32			flags;

	u16			bufcnt;
	u16			blocklen;

	u8 buffer[HASH_BUFLEN] __aligned(sizeof(u32));

	/* hash state */
	u32			hw_context[3 + HASH_CSR_NB_MAX];
};

struct stm32_hash_request_ctx {
	struct stm32_hash_dev	*hdev;
	unsigned long		op;

	u8 digest[SHA512_DIGEST_SIZE] __aligned(sizeof(u32));
	size_t			digcnt;

	struct scatterlist	*sg;
	struct scatterlist	sgl[2]; /* scatterlist used to realize alignment */
	unsigned int		offset;
	unsigned int		total;
	struct scatterlist	sg_key;

	dma_addr_t		dma_addr;
	size_t			dma_ct;
	int			nents;

	u8			data_type;

	struct stm32_hash_state state;
};

struct stm32_hash_algs_info {
	struct ahash_engine_alg	*algs_list;
	size_t			size;
};

struct stm32_hash_pdata {
	const int				alg_shift;
	const struct stm32_hash_algs_info	*algs_info;
	size_t					algs_info_size;
	bool					has_sr;
	bool					has_mdmat;
	bool					context_secured;
	bool					broken_emptymsg;
	bool					ux500;
};

struct stm32_hash_dev {
	struct list_head	list;
	struct device		*dev;
	struct clk		*clk;
	struct reset_control	*rst;
	void __iomem		*io_base;
	phys_addr_t		phys_base;
	u8			xmit_buf[HASH_BUFLEN] __aligned(sizeof(u32));
	u32			dma_mode;
	bool			polled;

	struct ahash_request	*req;
	struct crypto_engine	*engine;

	unsigned long		flags;

	struct dma_chan		*dma_lch;
	struct completion	dma_completion;

	const struct stm32_hash_pdata	*pdata;
};

struct stm32_hash_drv {
	struct list_head	dev_list;
	spinlock_t		lock; /* List protection access */
};

static struct stm32_hash_drv stm32_hash = {
	.dev_list = LIST_HEAD_INIT(stm32_hash.dev_list),
	.lock = __SPIN_LOCK_UNLOCKED(stm32_hash.lock),
};

Annotation

Implementation Notes