blob: 7e17c83435a0d254349272c815e831614e2bc0f0 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Header file of amlogic reserve manager
*
* Copyright (C) 2018 Amlogic Corporation
*
* Licensed under the GPL-2 or later.
*
*/
#ifndef __MESON_RSV_H_
#define __MESON_RSV_H_
#define NAND_RSV_BLOCK_NUM 48
#define NAND_GAP_BLOCK_NUM 4
#define NAND_BBT_BLOCK_NUM 4
#define NAND_ENV_BLOCK_NUM 8
#define NAND_KEY_BLOCK_NUM 8
#define NAND_DTB_BLOCK_NUM 4
#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 abnormal state for reserved area*/
#define POWER_ABNORMAL_FLAG 0x01
#define ECC_ABNORMAL_FLAG 0x02
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;
};
struct meson_rsv_handler_t {
struct mtd_info *mtd;
unsigned long long fn_bitmask;
struct free_node_t *free_node[NAND_RSV_BLOCK_NUM];
struct meson_rsv_info_t *bbt;
#ifndef CONFIG_ENV_IS_IN_NAND
struct meson_rsv_info_t *env;
#endif
struct meson_rsv_info_t *key;
struct meson_rsv_info_t *dtb;
void *priv;
};
int meson_rsv_bbt_read(u_char *dest, size_t size);
int meson_rsv_key_read(u_char *dest, size_t size);
int meson_rsv_env_read(u_char *dest, size_t size);
int meson_rsv_dtb_read(u_char *dest, size_t size);
/* do not provide bbt write operates */
int meson_rsv_key_write(u_char *source, size_t size);
int meson_rsv_env_write(u_char *source, size_t size);
int meson_rsv_dtb_write(u_char *source, size_t size);
uint32_t meson_rsv_bbt_size(void);
uint32_t meson_rsv_key_size(void);
uint32_t meson_rsv_env_size(void);
uint32_t meson_rsv_dtb_size(void);
/* do not provide bbt erase operates */
int meson_rsv_key_erase(void);
int meson_rsv_env_erase(void);
int meson_rsv_dtb_erase(void);
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);
#endif/* __MESON_RSV_H_ */