| /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ |
| /* |
| * Copyright (c) 2019 Amlogic, Inc. All rights reserved. |
| */ |
| |
| #ifndef __MESON_RSV_H_ |
| #define __MESON_RSV_H_ |
| |
| #define BBT_NAND_MAGIC "nbbt" |
| #define ENV_NAND_MAGIC "nenv" |
| #define KEY_NAND_MAGIC "nkey" |
| #define SEC_NAND_MAGIC "nsec" |
| #define DTB_NAND_MAGIC "ndtb" |
| #define DDR_NAND_MAGIC "nddr" |
| |
| /*define abnormal state for reserved area*/ |
| #define POWER_ABNORMAL_FLAG 0x01 |
| #define ECC_ABNORMAL_FLAG 0x02 |
| #define DDR_PARA_SIZE 2048 |
| |
| #define BBT_INFO_INDEX 0 |
| #define ENV_INFO_INDEX 1 |
| #define KEY_INFO_INDEX 2 |
| #define DTB_INFO_INDEX 3 |
| #define DDR_INFO_INDEX 4 |
| |
| #define INFO_DATA(n, b, s) { .name = (n), .blocks = (b), .size = (s) } |
| |
| #define BBT_START_BLOCK 20 |
| #define BBT_TOTAL_BLOCKS 4 |
| |
| enum BL2_LAYOUT_SELECT { |
| BL2_LAYOUT_DEFAULT = 0, //BL2 align with block size |
| BL2_LAYOUT_512 = 1, //BL2 size fixed 512 pages |
| BL2_LAYOUT_1024 = 2, //BL2 size fixed 1024 pages |
| }; |
| |
| struct rsv_part { |
| char name[8]; |
| unsigned int start_block; |
| unsigned int blocks; |
| unsigned int size; |
| }; |
| |
| struct meson_rsv_info_t { |
| struct mtd_info *mtd; |
| struct valid_node_t *nvalid; |
| struct free_node_t *nfree; |
| unsigned int start; |
| unsigned int end; |
| unsigned int size; |
| char name[8]; |
| u_char valid; |
| u_char init; |
| void *handler; |
| }; |
| |
| struct valid_node_t { |
| s16 ec; |
| s16 blk_addr; |
| s16 page_addr; |
| int timestamp; |
| s16 status; |
| }; |
| |
| struct free_node_t { |
| unsigned int index; |
| s16 ec; |
| s16 blk_addr; |
| int dirty_flag; |
| struct free_node_t *next; |
| }; |
| |
| struct oobinfo_t { |
| char name[4]; |
| s16 ec; |
| unsigned timestamp:15; |
| unsigned status_page:1; |
| }; |
| |
| #define MAX_MESON_RSV_INFO_NUM 8 |
| |
| struct meson_rsv_handler_t { |
| struct mtd_info *mtd; |
| unsigned long long fn_bitmask; |
| struct free_node_t **free_node; |
| struct rsv_part *rsv_part; |
| int entries; |
| struct meson_rsv_info_t rsv_info[MAX_MESON_RSV_INFO_NUM]; |
| void *priv; |
| }; |
| |
| int rsvname2index(const char *rsv_name); |
| u32 meson_rsv_part_get_start_block(struct mtd_info *mtd); |
| u32 meson_rsv_part_get_bl2_part_size(struct mtd_info *mtd); |
| u32 meson_rsv_part_get_bl2_copy_number(struct mtd_info *mtd); |
| u32 meson_rsv_part_get_bl2_copy_size(struct mtd_info *mtd); |
| u64 meson_rsv_part_get_tpl_start(struct mtd_info *mtd); |
| u64 meson_rsv_part_get_tpl_size(struct mtd_info *mtd); |
| int meson_ext_rsv_info_read(u_char *dest, size_t size, int index); |
| int meson_ext_rsv_info_write(u_char *source, size_t size, int index); |
| u32 meson_ext_rsv_info_size(int index); |
| int meson_ext_rsv_info_erase(int index); |
| |
| void meson_rsv_check_all_except_bbt(void); |
| int meson_rsv_check_bbt(void); |
| int meson_rsv_save_bbt(u8 *bbt); |
| int meson_rsv_read_bbt(u8 *bbt); |
| |
| int meson_rsv_check(struct meson_rsv_info_t *rsv_info); |
| int meson_rsv_init(struct mtd_info *mtd, struct meson_rsv_handler_t *handler); |
| int meson_rsv_scan(struct meson_rsv_info_t *rsv_info); |
| int meson_rsv_read(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| int meson_rsv_save(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| int meson_rsv_write(struct meson_rsv_info_t *rsv_info, u_char *buf); |
| int meson_rsv_erase_protect(struct meson_rsv_handler_t *handler, |
| uint32_t block_addr); |
| int meson_rsv_add_dtb(void *blob, int parent_offset); |
| struct mtd_info *mtd_store_get(int dev); |
| |
| struct rsv_part *get_mtd_rsv_partition(void); |
| int get_mtd_rsv_partition_count(void); |
| |
| #endif/* __MESON_RSV_H_ */ |