1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */
4
5 #ifndef _SFC_NAND_MTD_H
6 #define _SFC_NAND_MTD_H
7
8 #define CONFIG_MTD_NAND_BBT_USING_FLASH
9
10 #ifndef nand_bbt_block_status
11 /* BBT related functions */
12 enum nand_bbt_block_status {
13 NAND_BBT_BLOCK_STATUS_UNKNOWN,
14 NAND_BBT_BLOCK_GOOD,
15 NAND_BBT_BLOCK_WORN,
16 NAND_BBT_BLOCK_RESERVED,
17 NAND_BBT_BLOCK_FACTORY_BAD,
18 NAND_BBT_BLOCK_NUM_STATUS,
19 };
20 #endif
21
22 /* nand_bbt option */
23 #define NANDDEV_BBT_USE_FLASH BIT(0)
24 #define NANDDEV_BBT_SCANNED BIT(1)
25
26 /* The maximum number of blocks to scan for a bbt */
27 #define NANDDEV_BBT_SCAN_MAXBLOCKS 4
28
29 struct snand_bbt {
30 unsigned long *cache;
31 unsigned int option;
32 unsigned int version;
33 };
34
35 struct snand_mtd_dev {
36 struct SFNAND_DEV *snand;
37 struct mutex *lock; /* to lock this object */
38 struct mtd_info mtd;
39 u8 *dma_buf;
40 struct snand_bbt bbt;
41 };
42
snanddev_neraseblocks(const struct snand_mtd_dev * nand)43 static inline unsigned int snanddev_neraseblocks(const struct snand_mtd_dev *nand)
44 {
45 unsigned int ret = nand->mtd.size >> nand->mtd.erasesize_shift;
46
47 return ret;
48 }
49
snanddev_bbt_is_initialized(struct snand_mtd_dev * nand)50 static inline bool snanddev_bbt_is_initialized(struct snand_mtd_dev *nand)
51 {
52 return !!nand->bbt.cache;
53 }
54
snanddev_bbt_pos_to_entry(struct snand_mtd_dev * nand,const loff_t pos)55 static inline unsigned int snanddev_bbt_pos_to_entry(struct snand_mtd_dev *nand,
56 const loff_t pos)
57 {
58 return (unsigned int)(pos >> nand->mtd.erasesize_shift);
59 }
60
snanddev_to_mtd(struct snand_mtd_dev * nand)61 static inline struct mtd_info *snanddev_to_mtd(struct snand_mtd_dev *nand)
62 {
63 return &nand->mtd;
64 }
65
mtd_to_snanddev(struct mtd_info * mtd)66 static inline struct snand_mtd_dev *mtd_to_snanddev(struct mtd_info *mtd)
67 {
68 return mtd->priv;
69 }
70
71 int snanddev_bbt_init(struct snand_mtd_dev *nand);
72 void snanddev_bbt_cleanup(struct snand_mtd_dev *nand);
73 int snanddev_bbt_update(struct snand_mtd_dev *nand);
74 int snanddev_bbt_get_block_status(const struct snand_mtd_dev *nand,
75 unsigned int entry);
76 int snanddev_bbt_set_block_status(struct snand_mtd_dev *nand, unsigned int entry,
77 enum nand_bbt_block_status status);
78
79 int sfc_nand_isbad_mtd(struct mtd_info *mtd, loff_t ofs);
80 int sfc_nand_erase_mtd(struct mtd_info *mtd, u32 addr);
81
82 #endif
83