Bo Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 1 | /* 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 Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 9 | #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 Zheng | 5ced7b5 | 2023-07-25 15:20:20 +0800 | [diff] [blame] | 21 | #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 Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 29 | #define BBT_START_BLOCK 20 |
| 30 | #define BBT_TOTAL_BLOCKS 4 |
| 31 | |
| 32 | enum 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 | |
| 38 | struct rsv_part { |
Bichao Zheng | 5ced7b5 | 2023-07-25 15:20:20 +0800 | [diff] [blame] | 39 | char name[8]; |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 40 | unsigned int start_block; |
Bichao Zheng | 5ced7b5 | 2023-07-25 15:20:20 +0800 | [diff] [blame] | 41 | unsigned int blocks; |
| 42 | unsigned int size; |
| 43 | }; |
| 44 | |
Bo Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 45 | struct 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 | |
| 58 | struct valid_node_t { |
| 59 | s16 ec; |
| 60 | s16 blk_addr; |
| 61 | s16 page_addr; |
| 62 | int timestamp; |
| 63 | s16 status; |
| 64 | }; |
| 65 | |
| 66 | struct 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 | |
| 74 | struct oobinfo_t { |
| 75 | char name[4]; |
| 76 | s16 ec; |
| 77 | unsigned timestamp:15; |
| 78 | unsigned status_page:1; |
| 79 | }; |
| 80 | |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 81 | #define MAX_MESON_RSV_INFO_NUM 8 |
| 82 | |
Bo Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 83 | struct meson_rsv_handler_t { |
| 84 | struct mtd_info *mtd; |
| 85 | unsigned long long fn_bitmask; |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 86 | 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 Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 90 | void *priv; |
| 91 | }; |
| 92 | |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 93 | int rsvname2index(const char *rsv_name); |
| 94 | u32 meson_rsv_part_get_start_block(struct mtd_info *mtd); |
| 95 | u32 meson_rsv_part_get_bl2_part_size(struct mtd_info *mtd); |
Liang Yang | 51736e4 | 2024-10-09 19:03:13 +0800 | [diff] [blame] | 96 | u32 meson_rsv_part_get_bl2_copy_number(struct mtd_info *mtd); |
| 97 | u32 meson_rsv_part_get_bl2_copy_size(struct mtd_info *mtd); |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 98 | u64 meson_rsv_part_get_tpl_start(struct mtd_info *mtd); |
| 99 | u64 meson_rsv_part_get_tpl_size(struct mtd_info *mtd); |
| 100 | int meson_ext_rsv_info_read(u_char *dest, size_t size, int index); |
| 101 | int meson_ext_rsv_info_write(u_char *source, size_t size, int index); |
| 102 | u32 meson_ext_rsv_info_size(int index); |
| 103 | int meson_ext_rsv_info_erase(int index); |
| 104 | |
| 105 | void meson_rsv_check_all_except_bbt(void); |
| 106 | int meson_rsv_check_bbt(void); |
| 107 | int meson_rsv_save_bbt(u8 *bbt); |
| 108 | int meson_rsv_read_bbt(u8 *bbt); |
| 109 | |
Bo Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 110 | int meson_rsv_check(struct meson_rsv_info_t *rsv_info); |
| 111 | int meson_rsv_init(struct mtd_info *mtd, struct meson_rsv_handler_t *handler); |
| 112 | int meson_rsv_scan(struct meson_rsv_info_t *rsv_info); |
| 113 | int meson_rsv_read(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| 114 | int meson_rsv_save(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| 115 | int meson_rsv_write(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| 116 | int meson_rsv_erase_protect(struct meson_rsv_handler_t *handler, |
| 117 | uint32_t block_addr); |
zhikui.cui | 1b35b7f | 2024-08-12 06:01:40 +0000 | [diff] [blame] | 118 | int meson_rsv_add_dtb(void *blob, int parent_offset); |
| 119 | struct mtd_info *mtd_store_get(int dev); |
Liang Yang | 215deef | 2024-09-19 15:22:17 +0800 | [diff] [blame] | 120 | |
| 121 | struct rsv_part *get_mtd_rsv_partition(void); |
| 122 | int get_mtd_rsv_partition_count(void); |
| 123 | |
Bo Lv | 72d0e90 | 2023-01-02 14:27:34 +0000 | [diff] [blame] | 124 | #endif/* __MESON_RSV_H_ */ |