xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc_nor.h (revision 452922453704d589000f28553900ff8c3971effc)
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)
38*45292245SJon Lin #define CMD_PAGE_FASTREAD4B     (0x0C)
39ad309a88SDingqiang Lin #define CMD_GET_FEATURE         (0x0F)
40ad309a88SDingqiang Lin #define CMD_SET_FEATURE         (0x1F)
41ad309a88SDingqiang Lin #define CMD_PROG_LOAD           (0x02)
42ad309a88SDingqiang Lin #define CMD_PROG_EXEC           (0x10)
43ad309a88SDingqiang Lin #define CMD_BLOCK_ERASE         (0xD8)
44ad309a88SDingqiang Lin #define CMD_READ_DATA_X2        (0x3B)
45ad309a88SDingqiang Lin #define CMD_READ_DATA_X4        (0x6B)
46ad309a88SDingqiang Lin #define CMD_PROG_LOAD_X4        (0x32)
47ad309a88SDingqiang Lin #define CMD_READ_STATUS2        (0x35)
48ad309a88SDingqiang Lin #define CMD_READ_STATUS3        (0x15)
49ad309a88SDingqiang Lin #define CMD_WRITE_STATUS2       (0x31)
50ad309a88SDingqiang Lin #define CMD_WRITE_STATUS3       (0x11)
51ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X1 data */
52ad309a88SDingqiang Lin #define CMD_FAST_READ_X1        (0x0B)
53ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X2 data */
54ad309a88SDingqiang Lin #define CMD_FAST_READ_X2        (0x3B)
55ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
56ad309a88SDingqiang Lin #define CMD_FAST_READ_X4        (0x6B)
57ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
58ad309a88SDingqiang Lin #define CMD_FAST_4READ_X4       (0x6C)
59ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
60ad309a88SDingqiang Lin #define CMD_FAST_READ_A4        (0xEB)
61ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
62ad309a88SDingqiang Lin #define CMD_PAGE_PROG_X4        (0x32)
63ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
64ad309a88SDingqiang Lin #define CMD_PAGE_PROG_A4        (0x38)
65a097a4fcSJon Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
66a097a4fcSJon Lin #define CMD_PAGE_PROG_4PP       (0x3E)
67ad309a88SDingqiang Lin #define CMD_RESET_NAND          (0xFF)
68ad309a88SDingqiang Lin #define CMD_ENTER_4BYTE_MODE    (0xB7)
69ad309a88SDingqiang Lin #define CMD_EXIT_4BYTE_MODE     (0xE9)
70ad309a88SDingqiang Lin #define CMD_ENABLE_RESER	(0x66)
71ad309a88SDingqiang Lin #define CMD_RESET_DEVICE	(0x99)
72ad309a88SDingqiang Lin #define CMD_READ_PARAMETER	(0x5A)
73ad309a88SDingqiang Lin 
74ad309a88SDingqiang Lin enum NOR_ERASE_TYPE {
75ad309a88SDingqiang Lin 	ERASE_SECTOR = 0,
76ad309a88SDingqiang Lin 	ERASE_BLOCK64K,
77ad309a88SDingqiang Lin 	ERASE_CHIP
78ad309a88SDingqiang Lin };
79ad309a88SDingqiang Lin 
80ad309a88SDingqiang Lin enum SNOR_IO_MODE {
81ad309a88SDingqiang Lin 	IO_MODE_SPI = 0,
82ad309a88SDingqiang Lin 	IO_MODE_QPI
83ad309a88SDingqiang Lin };
84ad309a88SDingqiang Lin 
85ad309a88SDingqiang Lin enum SNOR_READ_MODE {
86ad309a88SDingqiang Lin 	READ_MODE_NOMAL = 0,
87ad309a88SDingqiang Lin 	READ_MODE_FAST
88ad309a88SDingqiang Lin };
89ad309a88SDingqiang Lin 
90ad309a88SDingqiang Lin enum SNOR_ADDR_MODE {
91ad309a88SDingqiang Lin 	ADDR_MODE_3BYTE = 0,
92ad309a88SDingqiang Lin 	ADDR_MODE_4BYTE
93ad309a88SDingqiang Lin };
94ad309a88SDingqiang Lin 
95ad309a88SDingqiang Lin typedef int (*SNOR_WRITE_STATUS)(u32 reg_index, u8 status);
96ad309a88SDingqiang Lin 
97ad309a88SDingqiang Lin struct SFNOR_DEV {
98ad309a88SDingqiang Lin 	u32	capacity;
99ad309a88SDingqiang Lin 	u8	manufacturer;
100ad309a88SDingqiang Lin 	u8	mem_type;
101ad309a88SDingqiang Lin 	u16	page_size;
102ad309a88SDingqiang Lin 	u32	blk_size;
103ad309a88SDingqiang Lin 
104ad309a88SDingqiang Lin 	u8	read_cmd;
105ad309a88SDingqiang Lin 	u8	prog_cmd;
106ad309a88SDingqiang Lin 	u8	sec_erase_cmd;
107ad309a88SDingqiang Lin 	u8	blk_erase_cmd;
108ad309a88SDingqiang Lin 	u8	QE_bits;
109ad309a88SDingqiang Lin 
110ad309a88SDingqiang Lin 	enum SNOR_READ_MODE  read_mode;
111ad309a88SDingqiang Lin 	enum SNOR_ADDR_MODE  addr_mode;
112ad309a88SDingqiang Lin 	enum SNOR_IO_MODE    io_mode;
113ad309a88SDingqiang Lin 
114ad309a88SDingqiang Lin 	enum SFC_DATA_LINES read_lines;
115ad309a88SDingqiang Lin 	enum SFC_DATA_LINES prog_lines;
116a097a4fcSJon Lin 	enum SFC_DATA_LINES prog_addr_lines;
117ad309a88SDingqiang Lin 
118ad309a88SDingqiang Lin 	SNOR_WRITE_STATUS write_status;
119534d4d2fSJon Lin 	u32 max_iosize;
120ad309a88SDingqiang Lin };
121ad309a88SDingqiang Lin 
122ad309a88SDingqiang Lin struct flash_info {
123ad309a88SDingqiang Lin 	u32 id;
124ad309a88SDingqiang Lin 
125ad309a88SDingqiang Lin 	u8 block_size;
126ad309a88SDingqiang Lin 	u8 sector_size;
127ad309a88SDingqiang Lin 	u8 read_cmd;
128ad309a88SDingqiang Lin 	u8 prog_cmd;
129ad309a88SDingqiang Lin 
130ad309a88SDingqiang Lin 	u8 read_cmd_4;
131ad309a88SDingqiang Lin 	u8 prog_cmd_4;
132ad309a88SDingqiang Lin 	u8 sector_erase_cmd;
133ad309a88SDingqiang Lin 	u8 block_erase_cmd;
134ad309a88SDingqiang Lin 
135ad309a88SDingqiang Lin 	u8 feature;
136ad309a88SDingqiang Lin 	u8 density;  /* (1 << density) sectors*/
137ad309a88SDingqiang Lin 	u8 QE_bits;
138ad309a88SDingqiang Lin 	u8 reserved2;
139ad309a88SDingqiang Lin };
140ad309a88SDingqiang Lin 
1419371a438SJon Lin /* flash table packet for easy boot */
1429371a438SJon Lin #define SNOR_INFO_PACKET_ID	0x464E494E
1439371a438SJon Lin #define SNOR_INFO_PACKET_HEAD_LEN	14
1449371a438SJon Lin 
1459371a438SJon Lin #define SNOR_INFO_PACKET_SPI_MODE_RATE_SHIFT	25
1469371a438SJon Lin 
1479371a438SJon Lin struct snor_info_packet {
1489371a438SJon Lin 	u32 id;
1499371a438SJon Lin 	u32 head_hash; /*hash for head, check by bootrom.*/
1509371a438SJon Lin 	u16 head_len;  /*320 - 16 bytes*/
1519371a438SJon Lin 	u16 version;
1529371a438SJon Lin 	u8 read_cmd;
1539371a438SJon Lin 	u8 prog_cmd;
1549371a438SJon Lin 	u8 read_cmd_4;
1559371a438SJon Lin 	u8 prog_cmd_4;
1569371a438SJon Lin 
1579371a438SJon Lin 	u8 sector_erase_cmd;
1589371a438SJon Lin 	u8 block_erase_cmd;
1599371a438SJon Lin 	u8 feature;
1609371a438SJon Lin 	u8 QE_bits;
1619371a438SJon Lin 
1629371a438SJon Lin 	u32 spi_mode;
1639371a438SJon Lin };
1649371a438SJon Lin 
165ad309a88SDingqiang Lin int snor_init(struct SFNOR_DEV *p_dev);
166ad309a88SDingqiang Lin u32 snor_get_capacity(struct SFNOR_DEV *p_dev);
167ad309a88SDingqiang Lin int snor_read(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
168c84f0ed8SJon Lin int snor_write(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
169c84f0ed8SJon Lin int snor_erase(struct SFNOR_DEV *p_dev,
170c84f0ed8SJon Lin 	       u32 addr,
171c84f0ed8SJon Lin 	       enum NOR_ERASE_TYPE erase_type);
172c84f0ed8SJon Lin int snor_read_id(u8 *data);
173c84f0ed8SJon Lin int snor_prog_page(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
174c84f0ed8SJon Lin int snor_read_data(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
175c84f0ed8SJon Lin int snor_reset_device(void);
176c84f0ed8SJon Lin int snor_disable_QE(struct SFNOR_DEV *p_dev);
1779371a438SJon Lin int snor_reinit_from_table_packet(struct SFNOR_DEV *p_dev,
1789371a438SJon Lin 				  struct snor_info_packet *packet);
179ad309a88SDingqiang Lin #endif
180