xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc_nand.h (revision 6281205a07d87a6722d342cddc8a4dfd33eafa20)
1ba0501acSDingqiang Lin /*
2ba0501acSDingqiang Lin  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3ba0501acSDingqiang Lin  *
4ba0501acSDingqiang Lin  * SPDX-License-Identifier:	GPL-2.0
5ba0501acSDingqiang Lin  */
6ba0501acSDingqiang Lin 
7ba0501acSDingqiang Lin #ifndef __SFC_NAND_H
8ba0501acSDingqiang Lin #define __SFC_NAND_H
9ba0501acSDingqiang Lin 
10ba0501acSDingqiang Lin #define SFC_NAND_STRESS_TEST_EN		0
11ba0501acSDingqiang Lin 
12ba0501acSDingqiang Lin #define SFC_NAND_PROG_ERASE_ERROR	-2
13ba0501acSDingqiang Lin #define SFC_NAND_HW_ERROR		-1
14ba0501acSDingqiang Lin #define SFC_NAND_ECC_ERROR		NAND_ERROR
15ba0501acSDingqiang Lin #define SFC_NAND_ECC_REFRESH		NAND_STS_REFRESH
16ba0501acSDingqiang Lin #define SFC_NAND_ECC_OK			NAND_STS_OK
17ba0501acSDingqiang Lin 
18ba0501acSDingqiang Lin #define SFC_NAND_PAGE_MAX_SIZE		2112
19ba0501acSDingqiang Lin 
20ba0501acSDingqiang Lin #define FEA_READ_STATUE_MASK    (0x3 << 0)
21ba0501acSDingqiang Lin #define FEA_STATUE_MODE1        0
22ba0501acSDingqiang Lin #define FEA_STATUE_MODE2        1
23ba0501acSDingqiang Lin #define FEA_4BIT_READ           BIT(2)
24ba0501acSDingqiang Lin #define FEA_4BIT_PROG           BIT(3)
25ba0501acSDingqiang Lin #define FEA_4BYTE_ADDR          BIT(4)
26ba0501acSDingqiang Lin #define FEA_4BYTE_ADDR_MODE	BIT(5)
27ba0501acSDingqiang Lin 
28ba0501acSDingqiang Lin #define MID_WINBOND             0xEF
29ba0501acSDingqiang Lin #define MID_GIGADEV             0xC8
30ba0501acSDingqiang Lin #define MID_MICRON              0x2C
31ba0501acSDingqiang Lin #define MID_MACRONIX            0xC2
32ba0501acSDingqiang Lin #define MID_SPANSION            0x01
33ba0501acSDingqiang Lin #define MID_EON                 0x1C
34ba0501acSDingqiang Lin #define MID_ST                  0x20
35ba0501acSDingqiang Lin 
36ba0501acSDingqiang Lin /* Command Set */
37ba0501acSDingqiang Lin #define CMD_READ_JEDECID        (0x9F)
38ba0501acSDingqiang Lin #define CMD_READ_DATA           (0x03)
39ba0501acSDingqiang Lin #define CMD_READ_STATUS         (0x05)
40ba0501acSDingqiang Lin #define CMD_WRITE_STATUS        (0x01)
41ba0501acSDingqiang Lin #define CMD_PAGE_PROG           (0x02)
42ba0501acSDingqiang Lin #define CMD_SECTOR_ERASE        (0x20)
43ba0501acSDingqiang Lin #define CMD_BLK64K_ERASE        (0xD8)
44ba0501acSDingqiang Lin #define CMD_BLK32K_ERASE        (0x52)
45ba0501acSDingqiang Lin #define CMD_CHIP_ERASE          (0xC7)
46ba0501acSDingqiang Lin #define CMD_WRITE_EN            (0x06)
47ba0501acSDingqiang Lin #define CMD_WRITE_DIS           (0x04)
48ba0501acSDingqiang Lin #define CMD_PAGE_READ           (0x13)
49ba0501acSDingqiang Lin #define CMD_GET_FEATURE         (0x0F)
50ba0501acSDingqiang Lin #define CMD_SET_FEATURE         (0x1F)
51ba0501acSDingqiang Lin #define CMD_PROG_LOAD           (0x02)
52ba0501acSDingqiang Lin #define CMD_PROG_EXEC           (0x10)
53ba0501acSDingqiang Lin #define CMD_BLOCK_ERASE         (0xD8)
54ba0501acSDingqiang Lin #define CMD_READ_DATA_X2        (0x3B)
55ba0501acSDingqiang Lin #define CMD_READ_DATA_X4        (0x6B)
56ba0501acSDingqiang Lin #define CMD_PROG_LOAD_X4        (0x32)
57ba0501acSDingqiang Lin #define CMD_READ_STATUS2        (0x35)
58ba0501acSDingqiang Lin #define CMD_READ_STATUS3        (0x15)
59ba0501acSDingqiang Lin #define CMD_WRITE_STATUS2       (0x31)
60ba0501acSDingqiang Lin #define CMD_WRITE_STATUS3       (0x11)
61ba0501acSDingqiang Lin #define CMD_FAST_READ_X1        (0x0B)  /* X1 cmd, X1 addr, X1 data */
62ba0501acSDingqiang Lin #define CMD_FAST_READ_X2        (0x3B)  /* X1 cmd, X1 addr, X2 data */
63ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
64ba0501acSDingqiang Lin #define CMD_FAST_READ_X4        (0x6B)
65ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
66ba0501acSDingqiang Lin #define CMD_FAST_4READ_X4       (0x6C)
67ba0501acSDingqiang Lin /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
68ba0501acSDingqiang Lin #define CMD_FAST_READ_A4        (0xEB)
69ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
70ba0501acSDingqiang Lin #define CMD_PAGE_PROG_X4        (0x32)
71ba0501acSDingqiang Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
72ba0501acSDingqiang Lin #define CMD_PAGE_PROG_A4        (0x38)
73ba0501acSDingqiang Lin #define CMD_RESET_NAND          (0xFF)
74ba0501acSDingqiang Lin 
75ba0501acSDingqiang Lin #define CMD_ENTER_4BYTE_MODE    (0xB7)
76ba0501acSDingqiang Lin #define CMD_EXIT_4BYTE_MODE     (0xE9)
77ba0501acSDingqiang Lin #define CMD_ENABLE_RESER	(0x66)
78ba0501acSDingqiang Lin #define CMD_RESET_DEVICE	(0x99)
79ba0501acSDingqiang Lin 
80ba0501acSDingqiang Lin struct SFNAND_DEV {
81ba0501acSDingqiang Lin 	u32 capacity;
82ba0501acSDingqiang Lin 	u32 block_size;
83ba0501acSDingqiang Lin 	u16 page_size;
84ba0501acSDingqiang Lin 	u8 manufacturer;
85ba0501acSDingqiang Lin 	u8 mem_type;
86ba0501acSDingqiang Lin 	u8 read_lines;
87ba0501acSDingqiang Lin 	u8 prog_lines;
88ba0501acSDingqiang Lin 	u8 page_read_cmd;
89ba0501acSDingqiang Lin 	u8 page_prog_cmd;
90ba0501acSDingqiang Lin };
91ba0501acSDingqiang Lin 
92ba0501acSDingqiang Lin struct nand_info {
93ba0501acSDingqiang Lin 	u32 id;
94ba0501acSDingqiang Lin 
95ba0501acSDingqiang Lin 	u16 sec_per_page;
96ba0501acSDingqiang Lin 	u16 page_per_blk;
97ba0501acSDingqiang Lin 	u16 plane_per_die;
98ba0501acSDingqiang Lin 	u16 blk_per_plane;
99ba0501acSDingqiang Lin 
100ba0501acSDingqiang Lin 	u8 page_read_cmd;
101ba0501acSDingqiang Lin 	u8 page_prog_cmd;
102ba0501acSDingqiang Lin 	u8 read_cache_cmd_1;
103ba0501acSDingqiang Lin 	u8 prog_cache_cmd_1;
104ba0501acSDingqiang Lin 
105ba0501acSDingqiang Lin 	u8 read_cache_cmd_4;
106ba0501acSDingqiang Lin 	u8 prog_cache_cmd_4;
107ba0501acSDingqiang Lin 	u8 block_erase_cmd;
108ba0501acSDingqiang Lin 	u8 feature;
109ba0501acSDingqiang Lin 
110ba0501acSDingqiang Lin 	u8 density;  /* (1 << density) sectors*/
111ba0501acSDingqiang Lin 	u8 max_ecc_bits;
112ba0501acSDingqiang Lin 	u8 QE_address;
113ba0501acSDingqiang Lin 	u8 QE_bits;
114ba0501acSDingqiang Lin 
115ba0501acSDingqiang Lin 	u8 spare_offs_1;
116ba0501acSDingqiang Lin 	u8 spare_offs_2;
117*6281205aSDingqiang Lin 	u32 (*ecc_status)(void);
118ba0501acSDingqiang Lin };
119ba0501acSDingqiang Lin 
120ba0501acSDingqiang Lin u32 sfc_nand_init(void);
121ba0501acSDingqiang Lin int sfc_nand_read_id(u8 *buf);
122*6281205aSDingqiang Lin u32 sfc_nand_ecc_status_sp1(void);
123*6281205aSDingqiang Lin u32 sfc_nand_ecc_status_sp3(void);
124ba0501acSDingqiang Lin 
125ba0501acSDingqiang Lin #endif
126