blob: 8564594d915ef2eadcdde48113e9cbf4acb15d1f [file] [log] [blame] [edit]
/* 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_ */