blob: 8564594d915ef2eadcdde48113e9cbf4acb15d1f [file] [log] [blame]
Bo Lv72d0e902023-01-02 14:27:34 +00001/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#ifndef __MESON_RSV_H_
7#define __MESON_RSV_H_
8
Bo Lv72d0e902023-01-02 14:27:34 +00009#define BBT_NAND_MAGIC "nbbt"
10#define ENV_NAND_MAGIC "nenv"
11#define KEY_NAND_MAGIC "nkey"
12#define SEC_NAND_MAGIC "nsec"
13#define DTB_NAND_MAGIC "ndtb"
14#define DDR_NAND_MAGIC "nddr"
15
16/*define abnormal state for reserved area*/
17#define POWER_ABNORMAL_FLAG 0x01
18#define ECC_ABNORMAL_FLAG 0x02
19#define DDR_PARA_SIZE 2048
20
Bichao Zheng5ced7b52023-07-25 15:20:20 +080021#define BBT_INFO_INDEX 0
22#define ENV_INFO_INDEX 1
23#define KEY_INFO_INDEX 2
24#define DTB_INFO_INDEX 3
25#define DDR_INFO_INDEX 4
26
27#define INFO_DATA(n, b, s) { .name = (n), .blocks = (b), .size = (s) }
28
Liang Yang215deef2024-09-19 15:22:17 +080029#define BBT_START_BLOCK 20
30#define BBT_TOTAL_BLOCKS 4
31
32enum BL2_LAYOUT_SELECT {
33 BL2_LAYOUT_DEFAULT = 0, //BL2 align with block size
34 BL2_LAYOUT_512 = 1, //BL2 size fixed 512 pages
35 BL2_LAYOUT_1024 = 2, //BL2 size fixed 1024 pages
36};
37
38struct rsv_part {
Bichao Zheng5ced7b52023-07-25 15:20:20 +080039 char name[8];
Liang Yang215deef2024-09-19 15:22:17 +080040 unsigned int start_block;
Bichao Zheng5ced7b52023-07-25 15:20:20 +080041 unsigned int blocks;
42 unsigned int size;
43};
44
Bo Lv72d0e902023-01-02 14:27:34 +000045struct meson_rsv_info_t {
46 struct mtd_info *mtd;
47 struct valid_node_t *nvalid;
48 struct free_node_t *nfree;
49 unsigned int start;
50 unsigned int end;
51 unsigned int size;
52 char name[8];
53 u_char valid;
54 u_char init;
55 void *handler;
56};
57
58struct valid_node_t {
59 s16 ec;
60 s16 blk_addr;
61 s16 page_addr;
62 int timestamp;
63 s16 status;
64};
65
66struct free_node_t {
67 unsigned int index;
68 s16 ec;
69 s16 blk_addr;
70 int dirty_flag;
71 struct free_node_t *next;
72};
73
74struct oobinfo_t {
75 char name[4];
76 s16 ec;
77 unsigned timestamp:15;
78 unsigned status_page:1;
79};
80
Liang Yang215deef2024-09-19 15:22:17 +080081#define MAX_MESON_RSV_INFO_NUM 8
82
Bo Lv72d0e902023-01-02 14:27:34 +000083struct meson_rsv_handler_t {
84 struct mtd_info *mtd;
85 unsigned long long fn_bitmask;
Liang Yang215deef2024-09-19 15:22:17 +080086 struct free_node_t **free_node;
87 struct rsv_part *rsv_part;
88 int entries;
89 struct meson_rsv_info_t rsv_info[MAX_MESON_RSV_INFO_NUM];
Bo Lv72d0e902023-01-02 14:27:34 +000090 void *priv;
91};
92
Liang Yang215deef2024-09-19 15:22:17 +080093int rsvname2index(const char *rsv_name);
94u32 meson_rsv_part_get_start_block(struct mtd_info *mtd);
95u32 meson_rsv_part_get_bl2_part_size(struct mtd_info *mtd);
Liang Yang51736e42024-10-09 19:03:13 +080096u32 meson_rsv_part_get_bl2_copy_number(struct mtd_info *mtd);
97u32 meson_rsv_part_get_bl2_copy_size(struct mtd_info *mtd);
Liang Yang215deef2024-09-19 15:22:17 +080098u64 meson_rsv_part_get_tpl_start(struct mtd_info *mtd);
99u64 meson_rsv_part_get_tpl_size(struct mtd_info *mtd);
100int meson_ext_rsv_info_read(u_char *dest, size_t size, int index);
101int meson_ext_rsv_info_write(u_char *source, size_t size, int index);
102u32 meson_ext_rsv_info_size(int index);
103int meson_ext_rsv_info_erase(int index);
104
105void meson_rsv_check_all_except_bbt(void);
106int meson_rsv_check_bbt(void);
107int meson_rsv_save_bbt(u8 *bbt);
108int meson_rsv_read_bbt(u8 *bbt);
109
Bo Lv72d0e902023-01-02 14:27:34 +0000110int meson_rsv_check(struct meson_rsv_info_t *rsv_info);
111int meson_rsv_init(struct mtd_info *mtd, struct meson_rsv_handler_t *handler);
112int meson_rsv_scan(struct meson_rsv_info_t *rsv_info);
113int meson_rsv_read(struct meson_rsv_info_t *rsv_info, u_char *buf);
114int meson_rsv_save(struct meson_rsv_info_t *rsv_info, u_char *buf);
115int meson_rsv_write(struct meson_rsv_info_t *rsv_info, u_char *buf);
116int meson_rsv_erase_protect(struct meson_rsv_handler_t *handler,
117uint32_t block_addr);
zhikui.cui1b35b7f2024-08-12 06:01:40 +0000118int meson_rsv_add_dtb(void *blob, int parent_offset);
119struct mtd_info *mtd_store_get(int dev);
Liang Yang215deef2024-09-19 15:22:17 +0800120
121struct rsv_part *get_mtd_rsv_partition(void);
122int get_mtd_rsv_partition_count(void);
123
Bo Lv72d0e902023-01-02 14:27:34 +0000124#endif/* __MESON_RSV_H_ */