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