xref: /linux-6.15/include/linux/mmc/core.h (revision ed97550d)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2aaac1b47SPierre Ossman /*
3aaac1b47SPierre Ossman  *  linux/include/linux/mmc/core.h
4aaac1b47SPierre Ossman  */
5aaac1b47SPierre Ossman #ifndef LINUX_MMC_CORE_H
6aaac1b47SPierre Ossman #define LINUX_MMC_CORE_H
7aaac1b47SPierre Ossman 
8313162d0SPaul Gortmaker #include <linux/completion.h>
98da00734SUlf Hansson #include <linux/types.h>
10aaac1b47SPierre Ossman 
11aaac1b47SPierre Ossman struct mmc_data;
12aaac1b47SPierre Ossman struct mmc_request;
13aaac1b47SPierre Ossman 
149a9f7e13SVictor Shih #define UHS2_MAX_PAYLOAD_LEN 2
159a9f7e13SVictor Shih #define UHS2_MAX_RESP_LEN 20
169a9f7e13SVictor Shih 
179a9f7e13SVictor Shih struct uhs2_command {
189a9f7e13SVictor Shih 	u16	header;
199a9f7e13SVictor Shih 	u16	arg;
209a9f7e13SVictor Shih 	__be32	payload[UHS2_MAX_PAYLOAD_LEN];
219a9f7e13SVictor Shih 	u8	payload_len;
229a9f7e13SVictor Shih 	u8	packet_len;
239a9f7e13SVictor Shih 	u8	tmode_half_duplex;
249a9f7e13SVictor Shih 	u8	uhs2_resp[UHS2_MAX_RESP_LEN];	/* UHS2 native cmd resp */
259a9f7e13SVictor Shih 	u8	uhs2_resp_len;			/* UHS2 native cmd resp len */
269a9f7e13SVictor Shih };
279a9f7e13SVictor Shih 
28aaac1b47SPierre Ossman struct mmc_command {
29aaac1b47SPierre Ossman 	u32			opcode;
30aaac1b47SPierre Ossman 	u32			arg;
31ce39f9d1SSeungwon Jeon #define MMC_CMD23_ARG_REL_WR	(1 << 31)
32ce39f9d1SSeungwon Jeon #define MMC_CMD23_ARG_TAG_REQ	(1 << 29)
33aaac1b47SPierre Ossman 	u32			resp[4];
34aaac1b47SPierre Ossman 	unsigned int		flags;		/* expected response type */
35aaac1b47SPierre Ossman #define MMC_RSP_PRESENT	(1 << 0)
36aaac1b47SPierre Ossman #define MMC_RSP_136	(1 << 1)		/* 136 bit response */
37aaac1b47SPierre Ossman #define MMC_RSP_CRC	(1 << 2)		/* expect valid crc */
38aaac1b47SPierre Ossman #define MMC_RSP_BUSY	(1 << 3)		/* card may send busy */
39aaac1b47SPierre Ossman #define MMC_RSP_OPCODE	(1 << 4)		/* response contains opcode */
4097018580SDavid Brownell 
4197018580SDavid Brownell #define MMC_CMD_MASK	(3 << 5)		/* non-SPI command type */
42aaac1b47SPierre Ossman #define MMC_CMD_AC	(0 << 5)
43aaac1b47SPierre Ossman #define MMC_CMD_ADTC	(1 << 5)
44aaac1b47SPierre Ossman #define MMC_CMD_BC	(2 << 5)
45aaac1b47SPierre Ossman #define MMC_CMD_BCR	(3 << 5)
46aaac1b47SPierre Ossman 
4797018580SDavid Brownell #define MMC_RSP_SPI_S1	(1 << 7)		/* one status byte */
4897018580SDavid Brownell #define MMC_RSP_SPI_S2	(1 << 8)		/* second byte */
4997018580SDavid Brownell #define MMC_RSP_SPI_B4	(1 << 9)		/* four data bytes */
5097018580SDavid Brownell #define MMC_RSP_SPI_BUSY (1 << 10)		/* card may send busy */
5197018580SDavid Brownell 
52aaac1b47SPierre Ossman /*
5397018580SDavid Brownell  * These are the native response types, and correspond to valid bit
54aaac1b47SPierre Ossman  * patterns of the above flags.  One additional valid pattern
55aaac1b47SPierre Ossman  * is all zeros, which means we don't expect a response.
56aaac1b47SPierre Ossman  */
57aaac1b47SPierre Ossman #define MMC_RSP_NONE	(0)
58aaac1b47SPierre Ossman #define MMC_RSP_R1	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
59aaac1b47SPierre Ossman #define MMC_RSP_R1B	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY)
60*ed97550dSAndy-ld Lu #define MMC_RSP_R1B_NO_CRC (MMC_RSP_PRESENT|MMC_RSP_OPCODE|MMC_RSP_BUSY)
61aaac1b47SPierre Ossman #define MMC_RSP_R2	(MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC)
62aaac1b47SPierre Ossman #define MMC_RSP_R3	(MMC_RSP_PRESENT)
635c4e6f13SPierre Ossman #define MMC_RSP_R4	(MMC_RSP_PRESENT)
64b2bcc798SPierre Ossman #define MMC_RSP_R5	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
65aaac1b47SPierre Ossman #define MMC_RSP_R6	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
66aaac1b47SPierre Ossman #define MMC_RSP_R7	(MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
67aaac1b47SPierre Ossman 
68aaac1b47SPierre Ossman #define mmc_resp_type(cmd)	((cmd)->flags & (MMC_RSP_PRESENT|MMC_RSP_136|MMC_RSP_CRC|MMC_RSP_BUSY|MMC_RSP_OPCODE))
69aaac1b47SPierre Ossman 
70aaac1b47SPierre Ossman /*
7197018580SDavid Brownell  * These are the SPI response types for MMC, SD, and SDIO cards.
7297018580SDavid Brownell  * Commands return R1, with maybe more info.  Zero is an error type;
7397018580SDavid Brownell  * callers must always provide the appropriate MMC_RSP_SPI_Rx flags.
7497018580SDavid Brownell  */
7597018580SDavid Brownell #define MMC_RSP_SPI_R1	(MMC_RSP_SPI_S1)
7697018580SDavid Brownell #define MMC_RSP_SPI_R1B	(MMC_RSP_SPI_S1|MMC_RSP_SPI_BUSY)
7797018580SDavid Brownell #define MMC_RSP_SPI_R2	(MMC_RSP_SPI_S1|MMC_RSP_SPI_S2)
7897018580SDavid Brownell #define MMC_RSP_SPI_R3	(MMC_RSP_SPI_S1|MMC_RSP_SPI_B4)
7997018580SDavid Brownell #define MMC_RSP_SPI_R4	(MMC_RSP_SPI_S1|MMC_RSP_SPI_B4)
8097018580SDavid Brownell #define MMC_RSP_SPI_R5	(MMC_RSP_SPI_S1|MMC_RSP_SPI_S2)
8197018580SDavid Brownell #define MMC_RSP_SPI_R7	(MMC_RSP_SPI_S1|MMC_RSP_SPI_B4)
8297018580SDavid Brownell 
8397018580SDavid Brownell #define mmc_spi_resp_type(cmd)	((cmd)->flags & \
8497018580SDavid Brownell 		(MMC_RSP_SPI_S1|MMC_RSP_SPI_BUSY|MMC_RSP_SPI_S2|MMC_RSP_SPI_B4))
8597018580SDavid Brownell 
8697018580SDavid Brownell /*
87aaac1b47SPierre Ossman  * These are the command types.
88aaac1b47SPierre Ossman  */
89aaac1b47SPierre Ossman #define mmc_cmd_type(cmd)	((cmd)->flags & MMC_CMD_MASK)
90aaac1b47SPierre Ossman 
91aaac1b47SPierre Ossman 	unsigned int		retries;	/* max number of retries */
92f5c5179bSUlf Hansson 	int			error;		/* command error */
93aaac1b47SPierre Ossman 
9417b0429dSPierre Ossman /*
9517b0429dSPierre Ossman  * Standard errno values are used for errors, but some have specific
9617b0429dSPierre Ossman  * meaning in the MMC layer:
9717b0429dSPierre Ossman  *
9817b0429dSPierre Ossman  * ETIMEDOUT    Card took too long to respond
9917b0429dSPierre Ossman  * EILSEQ       Basic format problem with the received or sent data
10017b0429dSPierre Ossman  *              (e.g. CRC check failed, incorrect opcode in response
10117b0429dSPierre Ossman  *              or bad end bit)
10217b0429dSPierre Ossman  * EINVAL       Request cannot be performed because of restrictions
10317b0429dSPierre Ossman  *              in hardware and/or the driver
10417b0429dSPierre Ossman  * ENOMEDIUM    Host can determine that the slot is empty and is
10517b0429dSPierre Ossman  *              actively failing requests
10617b0429dSPierre Ossman  */
107aaac1b47SPierre Ossman 
1081d4d7744SUlf Hansson 	unsigned int		busy_timeout;	/* busy detect timeout in ms */
109aaac1b47SPierre Ossman 	struct mmc_data		*data;		/* data segment associated with cmd */
110aaac1b47SPierre Ossman 	struct mmc_request	*mrq;		/* associated request */
111403a0293SAvri Altman 
1129a9f7e13SVictor Shih 	struct uhs2_command	*uhs2_cmd;	/* UHS2 command */
1139a9f7e13SVictor Shih 
114403a0293SAvri Altman 	/* for SDUC */
115403a0293SAvri Altman 	bool has_ext_addr;
116403a0293SAvri Altman 	u8 ext_addr;
117aaac1b47SPierre Ossman };
118aaac1b47SPierre Ossman 
119aaac1b47SPierre Ossman struct mmc_data {
120aaac1b47SPierre Ossman 	unsigned int		timeout_ns;	/* data timeout (in ns, max 80ms) */
121aaac1b47SPierre Ossman 	unsigned int		timeout_clks;	/* data timeout (in clocks) */
122aaac1b47SPierre Ossman 	unsigned int		blksz;		/* data block size */
123aaac1b47SPierre Ossman 	unsigned int		blocks;		/* number of blocks */
124d2f82254SAdrian Hunter 	unsigned int		blk_addr;	/* block address */
125f5c5179bSUlf Hansson 	int			error;		/* data error */
126aaac1b47SPierre Ossman 	unsigned int		flags;
127aaac1b47SPierre Ossman 
128d2f82254SAdrian Hunter #define MMC_DATA_WRITE		BIT(8)
129d2f82254SAdrian Hunter #define MMC_DATA_READ		BIT(9)
130d2f82254SAdrian Hunter /* Extra flags used by CQE */
131d2f82254SAdrian Hunter #define MMC_DATA_QBR		BIT(10)		/* CQE queue barrier*/
132d2f82254SAdrian Hunter #define MMC_DATA_PRIO		BIT(11)		/* CQE high priority */
133d2f82254SAdrian Hunter #define MMC_DATA_REL_WR		BIT(12)		/* Reliable write */
134d2f82254SAdrian Hunter #define MMC_DATA_DAT_TAG	BIT(13)		/* Tag request */
135d2f82254SAdrian Hunter #define MMC_DATA_FORCED_PRG	BIT(14)		/* Forced programming */
136aaac1b47SPierre Ossman 
137aaac1b47SPierre Ossman 	unsigned int		bytes_xfered;
138aaac1b47SPierre Ossman 
139aaac1b47SPierre Ossman 	struct mmc_command	*stop;		/* stop command */
140aaac1b47SPierre Ossman 	struct mmc_request	*mrq;		/* associated request */
141aaac1b47SPierre Ossman 
142aaac1b47SPierre Ossman 	unsigned int		sg_len;		/* size of scatter list */
14320848903SChaotian Jing 	int			sg_count;	/* mapped sg entries */
144aaac1b47SPierre Ossman 	struct scatterlist	*sg;		/* I/O scatter list */
145aa8b683aSPer Forlin 	s32			host_cookie;	/* host private data */
146aaac1b47SPierre Ossman };
147aaac1b47SPierre Ossman 
1482220eedfSKonstantin Dorfman struct mmc_host;
149aaac1b47SPierre Ossman struct mmc_request {
150d0c97cfbSAndrei Warkentin 	struct mmc_command	*sbc;		/* SET_BLOCK_COUNT for multiblock */
151aaac1b47SPierre Ossman 	struct mmc_command	*cmd;
152aaac1b47SPierre Ossman 	struct mmc_data		*data;
153aaac1b47SPierre Ossman 	struct mmc_command	*stop;
154aaac1b47SPierre Ossman 
155aa8b683aSPer Forlin 	struct completion	completion;
1565163af5aSAdrian Hunter 	struct completion	cmd_completion;
157aaac1b47SPierre Ossman 	void			(*done)(struct mmc_request *);/* completion function */
158d3bf68aeSAdrian Hunter 	/*
159d3bf68aeSAdrian Hunter 	 * Notify uppers layers (e.g. mmc block driver) that recovery is needed
160d3bf68aeSAdrian Hunter 	 * due to an error associated with the mmc_request. Currently used only
161d3bf68aeSAdrian Hunter 	 * by CQE.
162d3bf68aeSAdrian Hunter 	 */
163d3bf68aeSAdrian Hunter 	void			(*recovery_notifier)(struct mmc_request *);
1642220eedfSKonstantin Dorfman 	struct mmc_host		*host;
1655163af5aSAdrian Hunter 
1665163af5aSAdrian Hunter 	/* Allow other commands during this ongoing data transfer or busy wait */
1675163af5aSAdrian Hunter 	bool			cap_cmd_during_tfr;
168d2f82254SAdrian Hunter 
169d2f82254SAdrian Hunter 	int			tag;
17093f1c150SEric Biggers 
17193f1c150SEric Biggers #ifdef CONFIG_MMC_CRYPTO
17286c639ceSEric Biggers 	const struct bio_crypt_ctx *crypto_ctx;
17393f1c150SEric Biggers 	int			crypto_key_slot;
17493f1c150SEric Biggers #endif
1759a9f7e13SVictor Shih 	struct uhs2_command	uhs2_cmd;
176aaac1b47SPierre Ossman };
177aaac1b47SPierre Ossman 
178aaac1b47SPierre Ossman struct mmc_card;
179aaac1b47SPierre Ossman 
18023888bfeSUlf Hansson void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq);
18123888bfeSUlf Hansson int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd,
18223888bfeSUlf Hansson 		int retries);
183aaac1b47SPierre Ossman 
184b71597edSWolfram Sang int mmc_hw_reset(struct mmc_card *card);
1859723f69dSWolfram Sang int mmc_sw_reset(struct mmc_card *card);
18623888bfeSUlf Hansson void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card);
1872342f332SNicolas Pitre 
188100e9186SRobert P. J. Day #endif /* LINUX_MMC_CORE_H */
189