mirror of
https://github.com/hardkernel/kernel_common_drivers.git
synced 2026-06-25 12:03:48 +09:00
6d366b548c
PD#SWPL-177473 Problem: 1.uboot pass partitions by cmdline in default 2.uboot pass rsv parameter by kernel dtb Solution: 1.first register partitions from cmdline rather than dts 2.first parse rsv parameter from dts rsv part table Verify: AW419-C308L-Socket #020 Change-Id: Id7cb010d012768d54602be37d35940efed367d6e Signed-off-by: zhikui.cui <zhikui.cui@amlogic.com>
141 lines
3.6 KiB
C
141 lines
3.6 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 CONFIG_ENV_SIZE (64 * 1024U)
|
|
|
|
#define DEFAULT_NAND_RSV_BLOCK_NUM 48
|
|
#define DEFAULT_NAND_GAP_BLOCK_NUM 4
|
|
#define DEFAULT_NAND_BBT_BLOCK_NUM 4
|
|
#define DEFAULT_NAND_ENV_BLOCK_NUM 8
|
|
#define DEFAULT_NAND_KEY_BLOCK_NUM 8
|
|
#define DEFAULT_NAND_DTB_BLOCK_NUM 4
|
|
#define DEFAULT_NAND_DDR_BLOCK_NUM 0
|
|
|
|
#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 NAND_BOOT_NAME "bootloader"
|
|
#define NAND_NORMAL_NAME "nandnormal"
|
|
/*define abnormal state for reserved area*/
|
|
#define POWER_ABNORMAL_FLAG 0x01
|
|
#define ECC_ABNORMAL_FLAG 0x02
|
|
|
|
enum meson_rsv_blk_cnt {
|
|
NAND_RSV_INDEX = 0,
|
|
NAND_GAP_INDEX,
|
|
NAND_BBT_INDEX,
|
|
NAND_ENV_INDEX,
|
|
NAND_KEY_INDEX,
|
|
NAND_DTB_INDEX,
|
|
NAND_DDR_INDEX,
|
|
NAND_RSV_END_INDEX
|
|
};
|
|
|
|
struct meson_rsv_part_t {
|
|
char name[32];
|
|
u32 block_cnt;
|
|
u32 size;
|
|
u32 index;
|
|
u32 block_start;
|
|
};
|
|
|
|
struct meson_rsv_info_t {
|
|
struct mtd_info *mtd;
|
|
struct valid_node_t *valid_node;
|
|
struct free_node_t *free_node;
|
|
unsigned int start_block;
|
|
unsigned int end_block;
|
|
unsigned int size;
|
|
char name[8];
|
|
u_char valid;
|
|
u_char init;
|
|
void *handler;
|
|
int (*read)(u_char *dest, size_t size);
|
|
int (*write)(u_char *src, size_t size);
|
|
};
|
|
|
|
struct valid_node_t {
|
|
s16 ec;
|
|
s16 phy_blk_addr;
|
|
s16 phy_page_addr;
|
|
int timestamp;
|
|
s16 status;
|
|
};
|
|
|
|
struct free_node_t {
|
|
unsigned int index;
|
|
s16 ec;
|
|
s16 phy_blk_addr;
|
|
int dirty_flag;
|
|
struct free_node_t *next;
|
|
};
|
|
|
|
struct oobinfo_t {
|
|
char name[4];//4
|
|
s16 ec;//2
|
|
unsigned timestamp:15;
|
|
unsigned status_page:1;
|
|
};
|
|
|
|
struct meson_rsv_ops {
|
|
int (*_erase)(struct mtd_info *mtd, struct erase_info *einfo);
|
|
int (*_write_oob)(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops);
|
|
int (*_read_oob)(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops);
|
|
int (*_block_markbad)(struct mtd_info *mtd, loff_t off);
|
|
int (*_block_isbad)(struct mtd_info *mtd, loff_t off);
|
|
int (*_get_device)(struct mtd_info *mtd);
|
|
void (*_release_device)(struct mtd_info *mtd);
|
|
};
|
|
|
|
struct meson_rsv_handler_t {
|
|
struct mtd_info *mtd;
|
|
unsigned long long freenodebitmask;
|
|
struct free_node_t *free_node[DEFAULT_NAND_RSV_BLOCK_NUM];
|
|
struct meson_rsv_info_t *bbt;
|
|
struct meson_rsv_info_t *env;
|
|
struct meson_rsv_info_t *key;
|
|
struct meson_rsv_info_t *dtb;
|
|
struct meson_rsv_ops rsv_ops;
|
|
void *priv;
|
|
};
|
|
|
|
int meson_rsv_key_read(u_char *dest, size_t size);
|
|
int meson_rsv_key_write(u_char *source, size_t size);
|
|
int meson_rsv_erase_protect(struct meson_rsv_handler_t *handler,
|
|
uint32_t block_addr);
|
|
|
|
#include<linux/cdev.h>
|
|
#define DTB_CDEV_NAME "dtb"
|
|
#define ENV_CDEV_NAME "nand_env"
|
|
|
|
struct meson_rsv_user_t {
|
|
struct meson_rsv_info_t *info;
|
|
dev_t devt;
|
|
struct cdev cdev;
|
|
struct device *dev;
|
|
struct class *cls;
|
|
/* in case crash */
|
|
struct mutex lock;
|
|
};
|
|
|
|
int meson_rsv_prase_parameter_from_dtb(struct mtd_info *mtd,
|
|
struct device_node *part_np);
|
|
int meson_rsv_prase_parameter_from_cmdline(struct mtd_info *mtd);
|
|
int meson_rsv_register_cdev(struct meson_rsv_info_t *info, char *name);
|
|
int meson_rsv_register_unifykey(struct meson_rsv_info_t *key);
|
|
int meson_rsv_bbt_write(u_char *source, size_t size);
|
|
int meson_rsv_init(struct mtd_info *mtd, struct meson_rsv_handler_t *handler);
|
|
int meson_rsv_check(struct meson_rsv_info_t *rsv_info);
|
|
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);
|
|
u32 meson_rsv_get_block_cnt(enum meson_rsv_blk_cnt name);
|
|
#endif/* __MESON_RSV_H_ */
|