125 lines
3.2 KiB
C
125 lines
3.2 KiB
C
/* 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_ */
|