xref: /openbmc/linux/drivers/mtd/spi-nor/sfdp.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1cb481b92STudor Ambarus /* SPDX-License-Identifier: GPL-2.0 */
2cb481b92STudor Ambarus /*
3cb481b92STudor Ambarus  * Copyright (C) 2005, Intec Automation Inc.
4cb481b92STudor Ambarus  * Copyright (C) 2014, Freescale Semiconductor, Inc.
5cb481b92STudor Ambarus  */
6cb481b92STudor Ambarus 
7cb481b92STudor Ambarus #ifndef __LINUX_MTD_SFDP_H
8cb481b92STudor Ambarus #define __LINUX_MTD_SFDP_H
9cb481b92STudor Ambarus 
10e8aec15dSMantas Pucka /* SFDP revisions */
11e8aec15dSMantas Pucka #define SFDP_JESD216_MAJOR	1
12e8aec15dSMantas Pucka #define SFDP_JESD216_MINOR	0
13e8aec15dSMantas Pucka #define SFDP_JESD216A_MINOR	5
14e8aec15dSMantas Pucka #define SFDP_JESD216B_MINOR	6
15e8aec15dSMantas Pucka 
1686d4cdf8STakahiro Kuwano /* SFDP DWORDS are indexed from 1 but C arrays are indexed from 0. */
1786d4cdf8STakahiro Kuwano #define SFDP_DWORD(i)		((i) - 1)
18*4e53ab0cSTudor Ambarus #define SFDP_MASK_CHECK(dword, mask)		(((dword) & (mask)) == (mask))
1986d4cdf8STakahiro Kuwano 
20cb481b92STudor Ambarus /* Basic Flash Parameter Table */
21cb481b92STudor Ambarus 
2286d4cdf8STakahiro Kuwano /* JESD216 rev D defines a Basic Flash Parameter Table of 20 DWORDs. */
23dec18bd8SPratyush Yadav #define BFPT_DWORD_MAX		20
24cb481b92STudor Ambarus 
25cb481b92STudor Ambarus struct sfdp_bfpt {
26cb481b92STudor Ambarus 	u32	dwords[BFPT_DWORD_MAX];
27cb481b92STudor Ambarus };
28cb481b92STudor Ambarus 
29cb481b92STudor Ambarus /* The first version of JESD216 defined only 9 DWORDs. */
30cb481b92STudor Ambarus #define BFPT_DWORD_MAX_JESD216			9
31dec18bd8SPratyush Yadav #define BFPT_DWORD_MAX_JESD216B			16
32cb481b92STudor Ambarus 
33cb481b92STudor Ambarus /* 1st DWORD. */
34cb481b92STudor Ambarus #define BFPT_DWORD1_FAST_READ_1_1_2		BIT(16)
35cb481b92STudor Ambarus #define BFPT_DWORD1_ADDRESS_BYTES_MASK		GENMASK(18, 17)
36cb481b92STudor Ambarus #define BFPT_DWORD1_ADDRESS_BYTES_3_ONLY	(0x0UL << 17)
37cb481b92STudor Ambarus #define BFPT_DWORD1_ADDRESS_BYTES_3_OR_4	(0x1UL << 17)
38cb481b92STudor Ambarus #define BFPT_DWORD1_ADDRESS_BYTES_4_ONLY	(0x2UL << 17)
39cb481b92STudor Ambarus #define BFPT_DWORD1_DTR				BIT(19)
40cb481b92STudor Ambarus #define BFPT_DWORD1_FAST_READ_1_2_2		BIT(20)
41cb481b92STudor Ambarus #define BFPT_DWORD1_FAST_READ_1_4_4		BIT(21)
42cb481b92STudor Ambarus #define BFPT_DWORD1_FAST_READ_1_1_4		BIT(22)
43cb481b92STudor Ambarus 
44cb481b92STudor Ambarus /* 5th DWORD. */
45cb481b92STudor Ambarus #define BFPT_DWORD5_FAST_READ_2_2_2		BIT(0)
46cb481b92STudor Ambarus #define BFPT_DWORD5_FAST_READ_4_4_4		BIT(4)
47cb481b92STudor Ambarus 
48cb481b92STudor Ambarus /* 11th DWORD. */
49cb481b92STudor Ambarus #define BFPT_DWORD11_PAGE_SIZE_SHIFT		4
50cb481b92STudor Ambarus #define BFPT_DWORD11_PAGE_SIZE_MASK		GENMASK(7, 4)
51cb481b92STudor Ambarus 
52cb481b92STudor Ambarus /* 15th DWORD. */
53cb481b92STudor Ambarus 
54cb481b92STudor Ambarus /*
55cb481b92STudor Ambarus  * (from JESD216 rev B)
56cb481b92STudor Ambarus  * Quad Enable Requirements (QER):
57cb481b92STudor Ambarus  * - 000b: Device does not have a QE bit. Device detects 1-1-4 and 1-4-4
58cb481b92STudor Ambarus  *         reads based on instruction. DQ3/HOLD# functions are hold during
59cb481b92STudor Ambarus  *         instruction phase.
60cb481b92STudor Ambarus  * - 001b: QE is bit 1 of status register 2. It is set via Write Status with
61cb481b92STudor Ambarus  *         two data bytes where bit 1 of the second byte is one.
62cb481b92STudor Ambarus  *         [...]
63cb481b92STudor Ambarus  *         Writing only one byte to the status register has the side-effect of
64cb481b92STudor Ambarus  *         clearing status register 2, including the QE bit. The 100b code is
65cb481b92STudor Ambarus  *         used if writing one byte to the status register does not modify
66cb481b92STudor Ambarus  *         status register 2.
67cb481b92STudor Ambarus  * - 010b: QE is bit 6 of status register 1. It is set via Write Status with
68cb481b92STudor Ambarus  *         one data byte where bit 6 is one.
69cb481b92STudor Ambarus  *         [...]
70cb481b92STudor Ambarus  * - 011b: QE is bit 7 of status register 2. It is set via Write status
71cb481b92STudor Ambarus  *         register 2 instruction 3Eh with one data byte where bit 7 is one.
72cb481b92STudor Ambarus  *         [...]
73cb481b92STudor Ambarus  *         The status register 2 is read using instruction 3Fh.
74cb481b92STudor Ambarus  * - 100b: QE is bit 1 of status register 2. It is set via Write Status with
75cb481b92STudor Ambarus  *         two data bytes where bit 1 of the second byte is one.
76cb481b92STudor Ambarus  *         [...]
77cb481b92STudor Ambarus  *         In contrast to the 001b code, writing one byte to the status
78cb481b92STudor Ambarus  *         register does not modify status register 2.
79cb481b92STudor Ambarus  * - 101b: QE is bit 1 of status register 2. Status register 1 is read using
80cb481b92STudor Ambarus  *         Read Status instruction 05h. Status register2 is read using
81cb481b92STudor Ambarus  *         instruction 35h. QE is set via Write Status instruction 01h with
82cb481b92STudor Ambarus  *         two data bytes where bit 1 of the second byte is one.
83cb481b92STudor Ambarus  *         [...]
84cb481b92STudor Ambarus  */
85cb481b92STudor Ambarus #define BFPT_DWORD15_QER_MASK			GENMASK(22, 20)
86cb481b92STudor Ambarus #define BFPT_DWORD15_QER_NONE			(0x0UL << 20) /* Micron */
87cb481b92STudor Ambarus #define BFPT_DWORD15_QER_SR2_BIT1_BUGGY		(0x1UL << 20)
88cb481b92STudor Ambarus #define BFPT_DWORD15_QER_SR1_BIT6		(0x2UL << 20) /* Macronix */
89cb481b92STudor Ambarus #define BFPT_DWORD15_QER_SR2_BIT7		(0x3UL << 20)
90cb481b92STudor Ambarus #define BFPT_DWORD15_QER_SR2_BIT1_NO_RD		(0x4UL << 20)
91cb481b92STudor Ambarus #define BFPT_DWORD15_QER_SR2_BIT1		(0x5UL << 20) /* Spansion */
92cb481b92STudor Ambarus 
93*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_MASK			GENMASK(31, 24)
94*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_ALWAYS_4B		BIT(30)
95*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_4B_OPCODES		BIT(29)
96*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_16BIT_NV_CR		BIT(28)
97*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_BRWR			BIT(27)
98*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_WREAR			BIT(26)
99*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_WREN_EN4B		BIT(25)
100*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EN4B_EN4B			BIT(24)
101*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_MASK			GENMASK(18, 14)
102*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_16BIT_NV_CR		BIT(18)
103*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_BRWR			BIT(17)
104*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_WREAR			BIT(16)
105*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_WREN_EX4B		BIT(15)
106*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_EX4B_EX4B			BIT(14)
107*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_MASK			\
108*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_MASK | BFPT_DWORD16_EX4B_MASK)
109*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_16BIT_NV_CR		\
110*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_16BIT_NV_CR | BFPT_DWORD16_EX4B_16BIT_NV_CR)
111*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_BRWR			\
112*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_BRWR | BFPT_DWORD16_EX4B_BRWR)
113*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_WREAR			\
114*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_WREAR | BFPT_DWORD16_EX4B_WREAR)
115*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_WREN_EN4B_EX4B	\
116*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_WREN_EN4B | BFPT_DWORD16_EX4B_WREN_EX4B)
117*4e53ab0cSTudor Ambarus #define BFPT_DWORD16_4B_ADDR_MODE_EN4B_EX4B		\
118*4e53ab0cSTudor Ambarus 	(BFPT_DWORD16_EN4B_EN4B | BFPT_DWORD16_EX4B_EX4B)
1191131324aSPratyush Yadav #define BFPT_DWORD16_SWRST_EN_RST		BIT(12)
1201131324aSPratyush Yadav 
1210e1b2fc4SPratyush Yadav #define BFPT_DWORD18_CMD_EXT_MASK		GENMASK(30, 29)
1220e1b2fc4SPratyush Yadav #define BFPT_DWORD18_CMD_EXT_REP		(0x0UL << 29) /* Repeat */
1230e1b2fc4SPratyush Yadav #define BFPT_DWORD18_CMD_EXT_INV		(0x1UL << 29) /* Invert */
1240e1b2fc4SPratyush Yadav #define BFPT_DWORD18_CMD_EXT_RES		(0x2UL << 29) /* Reserved */
1250e1b2fc4SPratyush Yadav #define BFPT_DWORD18_CMD_EXT_16B		(0x3UL << 29) /* 16-bit opcode */
1260e1b2fc4SPratyush Yadav 
127cb481b92STudor Ambarus struct sfdp_parameter_header {
128cb481b92STudor Ambarus 	u8		id_lsb;
129cb481b92STudor Ambarus 	u8		minor;
130cb481b92STudor Ambarus 	u8		major;
131cb481b92STudor Ambarus 	u8		length; /* in double words */
132cb481b92STudor Ambarus 	u8		parameter_table_pointer[3]; /* byte address */
133cb481b92STudor Ambarus 	u8		id_msb;
134cb481b92STudor Ambarus };
135cb481b92STudor Ambarus 
136cb481b92STudor Ambarus #endif /* __LINUX_MTD_SFDP_H */
137