xref: /rk3399_rockchip-uboot/drivers/rkflash/flash.h (revision b8dc613cbc483a8abfcf4203e4fa0e18f60b1d27)
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 __FLASH_H
8ba0501acSDingqiang Lin #define __FLASH_H
9ba0501acSDingqiang Lin 
10ba0501acSDingqiang Lin #ifndef BIT
11ba0501acSDingqiang Lin #define BIT(nr)			(1 << (nr))
12ba0501acSDingqiang Lin #endif
13ba0501acSDingqiang Lin 
14ba0501acSDingqiang Lin #define MAX_FLASH_NUM			2
15ba0501acSDingqiang Lin #define MAX_IDB_RESERVED_BLOCK		12
16ba0501acSDingqiang Lin 
17ba0501acSDingqiang Lin #define NAND_CACHE_READ_EN		BIT(0)
18ba0501acSDingqiang Lin #define NAND_CACHE_RANDOM_READ_EN	BIT(1)
19ba0501acSDingqiang Lin #define NAND_CACHE_PROG_EN		BIT(2)
20ba0501acSDingqiang Lin #define NAND_MULTI_READ_EN		BIT(3)
21ba0501acSDingqiang Lin 
22ba0501acSDingqiang Lin #define NAND_MULTI_PROG_EN		BIT(4)
23ba0501acSDingqiang Lin #define NAND_INTERLEAVE_EN		BIT(5)
24ba0501acSDingqiang Lin #define NAND_READ_RETRY_EN		BIT(6)
25ba0501acSDingqiang Lin #define NAND_RANDOMIZER_EN		BIT(7)
26ba0501acSDingqiang Lin 
27ba0501acSDingqiang Lin #define NAND_INTER_MODE_OFFSET		(0x8)
28ba0501acSDingqiang Lin #define NAND_INTER_MODE_MARK		(0x07)
29ba0501acSDingqiang Lin #define NAND_INTER_SDR_EN		BIT(0)
30ba0501acSDingqiang Lin #define NAND_INTER_ONFI_EN		BIT(1)
31ba0501acSDingqiang Lin #define NAND_INTER_TOGGLE_EN		BIT(2)
32ba0501acSDingqiang Lin 
33ba0501acSDingqiang Lin #define NAND_SDR_EN			BIT(8)
34ba0501acSDingqiang Lin #define NAND_ONFI_EN			BIT(9)
35ba0501acSDingqiang Lin #define NAND_TOGGLE_EN			BIT(10)
36ba0501acSDingqiang Lin #define NAND_UNIQUE_ID_EN		BIT(11)
37ba0501acSDingqiang Lin 
38ba0501acSDingqiang Lin #define RESET_CMD		0xff
39ba0501acSDingqiang Lin #define READ_ID_CMD		0x90
40ba0501acSDingqiang Lin #define READ_STATUS_CMD		0x70
41ba0501acSDingqiang Lin #define PAGE_PROG_CMD		0x8010
42ba0501acSDingqiang Lin #define BLOCK_ERASE_CMD		0x60d0
43ba0501acSDingqiang Lin #define READ_CMD		0x0030
44ba0501acSDingqiang Lin #define READ_DP_OUT_CMD		0x05E0
45*6f226dcaSJon Lin #define READ_ECC_STATUS_CMD	0x7A
46ba0501acSDingqiang Lin 
47ba0501acSDingqiang Lin #define SAMSUNG			0x00	/* SAMSUNG */
48ba0501acSDingqiang Lin #define TOSHIBA			0x01	/* TOSHIBA */
49ba0501acSDingqiang Lin #define HYNIX			0x02	/* HYNIX */
50ba0501acSDingqiang Lin #define INFINEON		0x03	/* INFINEON */
51ba0501acSDingqiang Lin #define MICRON			0x04	/* MICRON */
52ba0501acSDingqiang Lin #define RENESAS			0x05	/* RENESAS */
53ba0501acSDingqiang Lin #define ST			0x06	/* ST */
54ba0501acSDingqiang Lin #define INTEL			0x07	/* intel */
55ba0501acSDingqiang Lin #define Sandisk			0x08	/* Sandisk */
56ba0501acSDingqiang Lin 
57ba0501acSDingqiang Lin #define RR_NONE			0x00
58ba0501acSDingqiang Lin #define RR_HY_1			0x01	/* hynix H27UCG8T2M */
59ba0501acSDingqiang Lin #define RR_HY_2			0x02	/* hynix H27UBG08U0B */
60ba0501acSDingqiang Lin #define RR_HY_3			0x03	/* hynix H27UCG08U0B H27UBG08U0C */
61ba0501acSDingqiang Lin #define RR_HY_4                 0x04	/* hynix H27UCG8T2A */
62ba0501acSDingqiang Lin #define RR_HY_5                 0x05	/* hynix H27UCG8T2E */
63ba0501acSDingqiang Lin #define RR_HY_6                 0x06	/* hynix H27QCG8T2F5R-BCG */
64ba0501acSDingqiang Lin #define RR_MT_1                 0x11	/* micron */
65ba0501acSDingqiang Lin #define RR_MT_2                 0x12	/* micron L94C L95B */
66ba0501acSDingqiang Lin #define RR_TH_1                 0x21	/* toshiba */
67ba0501acSDingqiang Lin #define RR_TH_2                 0x22	/* toshiba */
68ba0501acSDingqiang Lin #define RR_TH_3                 0x23	/* toshiba */
69ba0501acSDingqiang Lin #define RR_SS_1                 0x31	/* samsung */
70ba0501acSDingqiang Lin #define RR_SD_1                 0x41	/* Sandisk */
71ba0501acSDingqiang Lin #define RR_SD_2                 0x42	/* Sandisk */
72ba0501acSDingqiang Lin #define RR_SD_3                 0x43	/* Sandisk */
73ba0501acSDingqiang Lin #define RR_SD_4                 0x44	/* Sandisk */
74ba0501acSDingqiang Lin 
75ba0501acSDingqiang Lin /*  0 1 2 3 4 5 6 7 8 9 slc */
76ba0501acSDingqiang Lin #define LSB_0	0
77ba0501acSDingqiang Lin /*  0 1 2 3 6 7 A B E F hynix, micron 74A */
78ba0501acSDingqiang Lin #define LSB_1	1
79ba0501acSDingqiang Lin /*  0 1 3 5 7 9 B D toshiba samsung sandisk */
80ba0501acSDingqiang Lin #define LSB_2	2
81ba0501acSDingqiang Lin /*  0 1 2 3 4 5 8 9 C D 10 11 micron 84A */
82ba0501acSDingqiang Lin #define LSB_3	3
83ba0501acSDingqiang Lin /*  0 1 2 3 4 5 7 8 A B E F micron L95B */
84ba0501acSDingqiang Lin #define LSB_4	4
85ba0501acSDingqiang Lin /*  0 1 2 3 4 5 8 9 14 15 20 21 26 27 micron B74A TLC */
86ba0501acSDingqiang Lin #define LSB_6	6
87ba0501acSDingqiang Lin /*  0 3 6 9 C F 12 15 18 15 1B 1E 21 24 K9ABGD8U0C TLC */
88ba0501acSDingqiang Lin #define LSB_7	7
89ba0501acSDingqiang Lin 
90ba0501acSDingqiang Lin /* BadBlockFlagMode */
91ba0501acSDingqiang Lin /* first spare @ first page of each blocks */
92ba0501acSDingqiang Lin #define BBF_1	1
93ba0501acSDingqiang Lin /* first spare @ last page of each blocks */
94ba0501acSDingqiang Lin #define BBF_2	2
95ba0501acSDingqiang Lin /* first spare @ first and last page of each blocks */
96ba0501acSDingqiang Lin #define BBF_11	3
97ba0501acSDingqiang Lin /* sandisk 15nm flash prog first page without data and check status */
98ba0501acSDingqiang Lin #define BBF_3	4
99ba0501acSDingqiang Lin 
100ba0501acSDingqiang Lin #define MPM_0	0	/* block 0 ~ 1 */
101ba0501acSDingqiang Lin #define MPM_1	1	/* block 0 ~ 2048... */
102ba0501acSDingqiang Lin 
103ba0501acSDingqiang Lin struct NAND_PARA_INFO_T {
104ba0501acSDingqiang Lin 	u8	id_bytes;
105ba0501acSDingqiang Lin 	u8	nand_id[6];
106ba0501acSDingqiang Lin 	u8	vendor;
107ba0501acSDingqiang Lin 	u8	die_per_chip;
108ba0501acSDingqiang Lin 	u8	sec_per_page;
109ba0501acSDingqiang Lin 	u16	page_per_blk;
110ba0501acSDingqiang Lin 	u8	cell;	/* 1 slc , 2 mlc , 3 tlc */
111ba0501acSDingqiang Lin 	u8	plane_per_die;
112ba0501acSDingqiang Lin 	u16	 blk_per_plane;
113ba0501acSDingqiang Lin 	u16	operation_opt;
114ba0501acSDingqiang Lin 	u8	lsb_mode;
115ba0501acSDingqiang Lin 	u8	read_retry_mode;
116ba0501acSDingqiang Lin 	u8	ecc_bits;
117ba0501acSDingqiang Lin 	u8	access_freq;
118ba0501acSDingqiang Lin 	u8	opt_mode;
119ba0501acSDingqiang Lin 	u8	die_gap;
120ba0501acSDingqiang Lin 	u8	bad_block_mode;
121ba0501acSDingqiang Lin 	u8	multi_plane_mode;
122ba0501acSDingqiang Lin 	u8	reversd2[6];	/* 32 bytes */
123ba0501acSDingqiang Lin };
124ba0501acSDingqiang Lin 
125ba0501acSDingqiang Lin extern struct nand_phy_info	g_nand_phy_info;
126ba0501acSDingqiang Lin extern struct nand_ops		g_nand_ops;
127ba0501acSDingqiang Lin extern void __iomem *nandc_base;
128ba0501acSDingqiang Lin 
129ba0501acSDingqiang Lin void nandc_flash_get_id(u8 cs, void *buf);
130ba0501acSDingqiang Lin void nandc_flash_reset(u8 chip_sel);
131ba0501acSDingqiang Lin u32 nandc_flash_init(void __iomem *nandc_addr);
132ba0501acSDingqiang Lin u32 nandc_flash_deinit(void);
133ba0501acSDingqiang Lin 
134ba0501acSDingqiang Lin #endif
135