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