xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc_nor.h (revision 9371a438f4be7dfddd6136e58bec2a34c531ba5a)
1ad309a88SDingqiang Lin /*
2ad309a88SDingqiang Lin  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3ad309a88SDingqiang Lin  *
4ba0501acSDingqiang Lin  * SPDX-License-Identifier:	GPL-2.0
5ad309a88SDingqiang Lin  */
6ad309a88SDingqiang Lin 
7c84f0ed8SJon Lin #ifndef _SFC_NOR_H
8c84f0ed8SJon Lin #define _SFC_NOR_H
9ad309a88SDingqiang Lin 
10ad309a88SDingqiang Lin #include "sfc.h"
11ad309a88SDingqiang Lin 
12ad309a88SDingqiang Lin #define NOR_PAGE_SIZE		256
13ad309a88SDingqiang Lin #define NOR_BLOCK_SIZE		(64 * 1024)
14ad309a88SDingqiang Lin #define NOR_SECS_BLK		(NOR_BLOCK_SIZE / 512)
157edaca22SJon Lin #define NOR_SECS_PAGE		8
16ad309a88SDingqiang Lin 
17ad309a88SDingqiang Lin #define FEA_READ_STATUE_MASK	(0x3 << 0)
18ad309a88SDingqiang Lin #define FEA_STATUE_MODE1	0
19ad309a88SDingqiang Lin #define FEA_STATUE_MODE2	1
20ad309a88SDingqiang Lin #define FEA_4BIT_READ		BIT(2)
21ad309a88SDingqiang Lin #define FEA_4BIT_PROG		BIT(3)
22ad309a88SDingqiang Lin #define FEA_4BYTE_ADDR		BIT(4)
23ad309a88SDingqiang Lin #define FEA_4BYTE_ADDR_MODE	BIT(5)
24ad309a88SDingqiang Lin 
25ad309a88SDingqiang Lin /*Command Set*/
26ad309a88SDingqiang Lin #define CMD_READ_JEDECID        (0x9F)
27ad309a88SDingqiang Lin #define CMD_READ_DATA           (0x03)
28ad309a88SDingqiang Lin #define CMD_READ_STATUS         (0x05)
29ad309a88SDingqiang Lin #define CMD_WRITE_STATUS        (0x01)
30ad309a88SDingqiang Lin #define CMD_PAGE_PROG           (0x02)
31ad309a88SDingqiang Lin #define CMD_SECTOR_ERASE        (0x20)
32ad309a88SDingqiang Lin #define CMD_BLK64K_ERASE        (0xD8)
33ad309a88SDingqiang Lin #define CMD_BLK32K_ERASE        (0x52)
34ad309a88SDingqiang Lin #define CMD_CHIP_ERASE          (0xC7)
35ad309a88SDingqiang Lin #define CMD_WRITE_EN            (0x06)
36ad309a88SDingqiang Lin #define CMD_WRITE_DIS           (0x04)
37ad309a88SDingqiang Lin #define CMD_PAGE_READ           (0x13)
38ad309a88SDingqiang Lin #define CMD_GET_FEATURE         (0x0F)
39ad309a88SDingqiang Lin #define CMD_SET_FEATURE         (0x1F)
40ad309a88SDingqiang Lin #define CMD_PROG_LOAD           (0x02)
41ad309a88SDingqiang Lin #define CMD_PROG_EXEC           (0x10)
42ad309a88SDingqiang Lin #define CMD_BLOCK_ERASE         (0xD8)
43ad309a88SDingqiang Lin #define CMD_READ_DATA_X2        (0x3B)
44ad309a88SDingqiang Lin #define CMD_READ_DATA_X4        (0x6B)
45ad309a88SDingqiang Lin #define CMD_PROG_LOAD_X4        (0x32)
46ad309a88SDingqiang Lin #define CMD_READ_STATUS2        (0x35)
47ad309a88SDingqiang Lin #define CMD_READ_STATUS3        (0x15)
48ad309a88SDingqiang Lin #define CMD_WRITE_STATUS2       (0x31)
49ad309a88SDingqiang Lin #define CMD_WRITE_STATUS3       (0x11)
50ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X1 data */
51ad309a88SDingqiang Lin #define CMD_FAST_READ_X1        (0x0B)
52ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X2 data */
53ad309a88SDingqiang Lin #define CMD_FAST_READ_X2        (0x3B)
54ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
55ad309a88SDingqiang Lin #define CMD_FAST_READ_X4        (0x6B)
56ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
57ad309a88SDingqiang Lin #define CMD_FAST_4READ_X4       (0x6C)
58ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
59ad309a88SDingqiang Lin #define CMD_FAST_READ_A4        (0xEB)
60ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
61ad309a88SDingqiang Lin #define CMD_PAGE_PROG_X4        (0x32)
62ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
63ad309a88SDingqiang Lin #define CMD_PAGE_PROG_A4        (0x38)
64ad309a88SDingqiang Lin #define CMD_RESET_NAND          (0xFF)
65ad309a88SDingqiang Lin #define CMD_ENTER_4BYTE_MODE    (0xB7)
66ad309a88SDingqiang Lin #define CMD_EXIT_4BYTE_MODE     (0xE9)
67ad309a88SDingqiang Lin #define CMD_ENABLE_RESER	(0x66)
68ad309a88SDingqiang Lin #define CMD_RESET_DEVICE	(0x99)
69ad309a88SDingqiang Lin #define CMD_READ_PARAMETER	(0x5A)
70ad309a88SDingqiang Lin 
71ad309a88SDingqiang Lin enum NOR_ERASE_TYPE {
72ad309a88SDingqiang Lin 	ERASE_SECTOR = 0,
73ad309a88SDingqiang Lin 	ERASE_BLOCK64K,
74ad309a88SDingqiang Lin 	ERASE_CHIP
75ad309a88SDingqiang Lin };
76ad309a88SDingqiang Lin 
77ad309a88SDingqiang Lin enum SNOR_IO_MODE {
78ad309a88SDingqiang Lin 	IO_MODE_SPI = 0,
79ad309a88SDingqiang Lin 	IO_MODE_QPI
80ad309a88SDingqiang Lin };
81ad309a88SDingqiang Lin 
82ad309a88SDingqiang Lin enum SNOR_READ_MODE {
83ad309a88SDingqiang Lin 	READ_MODE_NOMAL = 0,
84ad309a88SDingqiang Lin 	READ_MODE_FAST
85ad309a88SDingqiang Lin };
86ad309a88SDingqiang Lin 
87ad309a88SDingqiang Lin enum SNOR_ADDR_MODE {
88ad309a88SDingqiang Lin 	ADDR_MODE_3BYTE = 0,
89ad309a88SDingqiang Lin 	ADDR_MODE_4BYTE
90ad309a88SDingqiang Lin };
91ad309a88SDingqiang Lin 
92ad309a88SDingqiang Lin typedef int (*SNOR_WRITE_STATUS)(u32 reg_index, u8 status);
93ad309a88SDingqiang Lin 
94ad309a88SDingqiang Lin struct SFNOR_DEV {
95ad309a88SDingqiang Lin 	u32	capacity;
96ad309a88SDingqiang Lin 	u8	manufacturer;
97ad309a88SDingqiang Lin 	u8	mem_type;
98ad309a88SDingqiang Lin 	u16	page_size;
99ad309a88SDingqiang Lin 	u32	blk_size;
100ad309a88SDingqiang Lin 
101ad309a88SDingqiang Lin 	u8	read_cmd;
102ad309a88SDingqiang Lin 	u8	prog_cmd;
103ad309a88SDingqiang Lin 	u8	sec_erase_cmd;
104ad309a88SDingqiang Lin 	u8	blk_erase_cmd;
105ad309a88SDingqiang Lin 	u8	QE_bits;
106ad309a88SDingqiang Lin 
107ad309a88SDingqiang Lin 	enum SNOR_READ_MODE  read_mode;
108ad309a88SDingqiang Lin 	enum SNOR_ADDR_MODE  addr_mode;
109ad309a88SDingqiang Lin 	enum SNOR_IO_MODE    io_mode;
110ad309a88SDingqiang Lin 
111ad309a88SDingqiang Lin 	enum SFC_DATA_LINES read_lines;
112ad309a88SDingqiang Lin 	enum SFC_DATA_LINES prog_lines;
113ad309a88SDingqiang Lin 
114ad309a88SDingqiang Lin 	SNOR_WRITE_STATUS write_status;
115534d4d2fSJon Lin 	u32 max_iosize;
116ad309a88SDingqiang Lin };
117ad309a88SDingqiang Lin 
118ad309a88SDingqiang Lin struct flash_info {
119ad309a88SDingqiang Lin 	u32 id;
120ad309a88SDingqiang Lin 
121ad309a88SDingqiang Lin 	u8 block_size;
122ad309a88SDingqiang Lin 	u8 sector_size;
123ad309a88SDingqiang Lin 	u8 read_cmd;
124ad309a88SDingqiang Lin 	u8 prog_cmd;
125ad309a88SDingqiang Lin 
126ad309a88SDingqiang Lin 	u8 read_cmd_4;
127ad309a88SDingqiang Lin 	u8 prog_cmd_4;
128ad309a88SDingqiang Lin 	u8 sector_erase_cmd;
129ad309a88SDingqiang Lin 	u8 block_erase_cmd;
130ad309a88SDingqiang Lin 
131ad309a88SDingqiang Lin 	u8 feature;
132ad309a88SDingqiang Lin 	u8 density;  /* (1 << density) sectors*/
133ad309a88SDingqiang Lin 	u8 QE_bits;
134ad309a88SDingqiang Lin 	u8 reserved2;
135ad309a88SDingqiang Lin };
136ad309a88SDingqiang Lin 
137*9371a438SJon Lin /* flash table packet for easy boot */
138*9371a438SJon Lin #define SNOR_INFO_PACKET_ID	0x464E494E
139*9371a438SJon Lin #define SNOR_INFO_PACKET_HEAD_LEN	14
140*9371a438SJon Lin 
141*9371a438SJon Lin #define SNOR_INFO_PACKET_SPI_MODE_RATE_SHIFT	25
142*9371a438SJon Lin 
143*9371a438SJon Lin struct snor_info_packet {
144*9371a438SJon Lin 	u32 id;
145*9371a438SJon Lin 	u32 head_hash; /*hash for head, check by bootrom.*/
146*9371a438SJon Lin 	u16 head_len;  /*320 - 16 bytes*/
147*9371a438SJon Lin 	u16 version;
148*9371a438SJon Lin 	u8 read_cmd;
149*9371a438SJon Lin 	u8 prog_cmd;
150*9371a438SJon Lin 	u8 read_cmd_4;
151*9371a438SJon Lin 	u8 prog_cmd_4;
152*9371a438SJon Lin 
153*9371a438SJon Lin 	u8 sector_erase_cmd;
154*9371a438SJon Lin 	u8 block_erase_cmd;
155*9371a438SJon Lin 	u8 feature;
156*9371a438SJon Lin 	u8 QE_bits;
157*9371a438SJon Lin 
158*9371a438SJon Lin 	u32 spi_mode;
159*9371a438SJon Lin };
160*9371a438SJon Lin 
161ad309a88SDingqiang Lin int snor_init(struct SFNOR_DEV *p_dev);
162ad309a88SDingqiang Lin u32 snor_get_capacity(struct SFNOR_DEV *p_dev);
163ad309a88SDingqiang Lin int snor_read(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
164c84f0ed8SJon Lin int snor_write(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
165c84f0ed8SJon Lin int snor_erase(struct SFNOR_DEV *p_dev,
166c84f0ed8SJon Lin 	       u32 addr,
167c84f0ed8SJon Lin 	       enum NOR_ERASE_TYPE erase_type);
168c84f0ed8SJon Lin int snor_read_id(u8 *data);
169c84f0ed8SJon Lin int snor_prog_page(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
170c84f0ed8SJon Lin int snor_read_data(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
171c84f0ed8SJon Lin int snor_reset_device(void);
172c84f0ed8SJon Lin int snor_disable_QE(struct SFNOR_DEV *p_dev);
173*9371a438SJon Lin int snor_reinit_from_table_packet(struct SFNOR_DEV *p_dev,
174*9371a438SJon Lin 				  struct snor_info_packet *packet);
175ad309a88SDingqiang Lin #endif
176