xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc_nand.h (revision 629111d37996267232c8b26eedf3319c949a580e)
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 
10c84f0ed8SJon Lin #include "flash_com.h"
11ba0501acSDingqiang Lin 
12f28847a8SJon Lin #define SFC_NAND_WAIT_TIME_OUT		3
13c84f0ed8SJon Lin #define SFC_NAND_PROG_ERASE_ERROR	2
14c84f0ed8SJon Lin #define SFC_NAND_HW_ERROR		1
15ba0501acSDingqiang Lin #define SFC_NAND_ECC_ERROR		NAND_ERROR
16ba0501acSDingqiang Lin #define SFC_NAND_ECC_REFRESH		NAND_STS_REFRESH
17ba0501acSDingqiang Lin #define SFC_NAND_ECC_OK			NAND_STS_OK
18ba0501acSDingqiang Lin 
19f25e3cafSJon Lin #define SFC_NAND_PAGE_MAX_SIZE		4224
20f25e3cafSJon Lin #define SFC_NAND_SECTOR_FULL_SIZE	528
21c84f0ed8SJon Lin #define SFC_NAND_SECTOR_SIZE		512
22ba0501acSDingqiang Lin 
23ba0501acSDingqiang Lin #define FEA_READ_STATUE_MASK    (0x3 << 0)
24ba0501acSDingqiang Lin #define FEA_STATUE_MODE1        0
25ba0501acSDingqiang Lin #define FEA_STATUE_MODE2        1
26ba0501acSDingqiang Lin #define FEA_4BIT_READ           BIT(2)
27ba0501acSDingqiang Lin #define FEA_4BIT_PROG           BIT(3)
28ba0501acSDingqiang Lin #define FEA_4BYTE_ADDR          BIT(4)
29ba0501acSDingqiang Lin #define FEA_4BYTE_ADDR_MODE	BIT(5)
3025098c06SDingqiang Lin #define FEA_SOFT_QOP_BIT	BIT(6)
31ba0501acSDingqiang Lin 
32ba0501acSDingqiang Lin /* Command Set */
33ba0501acSDingqiang Lin #define CMD_READ_JEDECID        (0x9F)
34ba0501acSDingqiang Lin #define CMD_READ_DATA           (0x03)
35ba0501acSDingqiang Lin #define CMD_READ_STATUS         (0x05)
36ba0501acSDingqiang Lin #define CMD_WRITE_STATUS        (0x01)
37ba0501acSDingqiang Lin #define CMD_PAGE_PROG           (0x02)
38ba0501acSDingqiang Lin #define CMD_SECTOR_ERASE        (0x20)
39ba0501acSDingqiang Lin #define CMD_BLK64K_ERASE        (0xD8)
40ba0501acSDingqiang Lin #define CMD_BLK32K_ERASE        (0x52)
41ba0501acSDingqiang Lin #define CMD_CHIP_ERASE          (0xC7)
42ba0501acSDingqiang Lin #define CMD_WRITE_EN            (0x06)
43ba0501acSDingqiang Lin #define CMD_WRITE_DIS           (0x04)
44ba0501acSDingqiang Lin #define CMD_PAGE_READ           (0x13)
45ba0501acSDingqiang Lin #define CMD_GET_FEATURE         (0x0F)
46ba0501acSDingqiang Lin #define CMD_SET_FEATURE         (0x1F)
47ba0501acSDingqiang Lin #define CMD_PROG_LOAD           (0x02)
48ba0501acSDingqiang Lin #define CMD_PROG_EXEC           (0x10)
49ba0501acSDingqiang Lin #define CMD_BLOCK_ERASE         (0xD8)
50ba0501acSDingqiang Lin #define CMD_READ_DATA_X2        (0x3B)
51ba0501acSDingqiang Lin #define CMD_READ_DATA_X4        (0x6B)
52ba0501acSDingqiang Lin #define CMD_PROG_LOAD_X4        (0x32)
53ba0501acSDingqiang Lin #define CMD_READ_STATUS2        (0x35)
54ba0501acSDingqiang Lin #define CMD_READ_STATUS3        (0x15)
55ba0501acSDingqiang Lin #define CMD_WRITE_STATUS2       (0x31)
56ba0501acSDingqiang Lin #define CMD_WRITE_STATUS3       (0x11)
57ba0501acSDingqiang Lin #define CMD_FAST_READ_X1        (0x0B)  /* X1 cmd, X1 addr, X1 data */
58ba0501acSDingqiang Lin #define CMD_FAST_READ_X2        (0x3B)  /* X1 cmd, X1 addr, X2 data */
59ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
60ba0501acSDingqiang Lin #define CMD_FAST_READ_X4        (0x6B)
61ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
62ba0501acSDingqiang Lin #define CMD_FAST_4READ_X4       (0x6C)
63ba0501acSDingqiang Lin /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
64ba0501acSDingqiang Lin #define CMD_FAST_READ_A4        (0xEB)
65ba0501acSDingqiang Lin /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
66ba0501acSDingqiang Lin #define CMD_PAGE_PROG_X4        (0x32)
67ba0501acSDingqiang Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
68ba0501acSDingqiang Lin #define CMD_PAGE_PROG_A4        (0x38)
69ba0501acSDingqiang Lin #define CMD_RESET_NAND          (0xFF)
70ba0501acSDingqiang Lin 
71ba0501acSDingqiang Lin #define CMD_ENTER_4BYTE_MODE    (0xB7)
72ba0501acSDingqiang Lin #define CMD_EXIT_4BYTE_MODE     (0xE9)
73ba0501acSDingqiang Lin #define CMD_ENABLE_RESER	(0x66)
74ba0501acSDingqiang Lin #define CMD_RESET_DEVICE	(0x99)
75ba0501acSDingqiang Lin 
76ba0501acSDingqiang Lin struct SFNAND_DEV {
77ba0501acSDingqiang Lin 	u32 capacity;
78ba0501acSDingqiang Lin 	u32 block_size;
79ba0501acSDingqiang Lin 	u16 page_size;
80ba0501acSDingqiang Lin 	u8 manufacturer;
81ba0501acSDingqiang Lin 	u8 mem_type;
82ba0501acSDingqiang Lin 	u8 read_lines;
83ba0501acSDingqiang Lin 	u8 prog_lines;
84ba0501acSDingqiang Lin 	u8 page_read_cmd;
85ba0501acSDingqiang Lin 	u8 page_prog_cmd;
86*629111d3SJon Lin 	u8 *recheck_buffer;
87ba0501acSDingqiang Lin };
88ba0501acSDingqiang Lin 
89a6fcac41SJon Lin struct nand_mega_area {
90a6fcac41SJon Lin 	u8 off0;
91a6fcac41SJon Lin 	u8 off1;
92a6fcac41SJon Lin 	u8 off2;
93a6fcac41SJon Lin 	u8 off3;
94a6fcac41SJon Lin };
95a6fcac41SJon Lin 
96ba0501acSDingqiang Lin struct nand_info {
97b833c879SJon Lin 	u8 id0;
98b833c879SJon Lin 	u8 id1;
99b833c879SJon Lin 	u8 id2;
100ba0501acSDingqiang Lin 
101ba0501acSDingqiang Lin 	u16 sec_per_page;
102ba0501acSDingqiang Lin 	u16 page_per_blk;
103ba0501acSDingqiang Lin 	u16 plane_per_die;
104ba0501acSDingqiang Lin 	u16 blk_per_plane;
105ba0501acSDingqiang Lin 
106ba0501acSDingqiang Lin 	u8 feature;
107ba0501acSDingqiang Lin 
108ba0501acSDingqiang Lin 	u8 density;  /* (1 << density) sectors*/
109ba0501acSDingqiang Lin 	u8 max_ecc_bits;
110f28847a8SJon Lin 	u8 has_qe_bits;
111ba0501acSDingqiang Lin 
112a6fcac41SJon Lin 	struct nand_mega_area meta;
1136281205aSDingqiang Lin 	u32 (*ecc_status)(void);
114ba0501acSDingqiang Lin };
115ba0501acSDingqiang Lin 
116cd67f373SDingqiang Lin extern struct nand_phy_info	g_nand_phy_info;
117cd67f373SDingqiang Lin extern struct nand_ops		g_nand_ops;
118cd67f373SDingqiang Lin 
119ba0501acSDingqiang Lin u32 sfc_nand_init(void);
120cd67f373SDingqiang Lin void sfc_nand_deinit(void);
121ba0501acSDingqiang Lin int sfc_nand_read_id(u8 *buf);
122c84f0ed8SJon Lin u32 sfc_nand_erase_block(u8 cs, u32 addr);
123c84f0ed8SJon Lin u32 sfc_nand_prog_page(u8 cs, u32 addr, u32 *p_data, u32 *p_spare);
124c84f0ed8SJon Lin u32 sfc_nand_read_page(u8 cs, u32 addr, u32 *p_data, u32 *p_spare);
125f28847a8SJon Lin u32 sfc_nand_prog_page_raw(u8 cs, u32 addr, u32 *p_page_buf);
126f28847a8SJon Lin u32 sfc_nand_read_page_raw(u8 cs, u32 addr, u32 *p_page_buf);
127c84f0ed8SJon Lin u32 sfc_nand_check_bad_block(u8 cs, u32 addr);
128c84f0ed8SJon Lin u32 sfc_nand_mark_bad_block(u8 cs, u32 addr);
129c84f0ed8SJon Lin void sfc_nand_ftl_ops_init(void);
130c84f0ed8SJon Lin struct SFNAND_DEV *sfc_nand_get_private_dev(void);
131ba0501acSDingqiang Lin 
132ba0501acSDingqiang Lin #endif
133