/*
 * Copyright (c) 2019 Actions Semiconductor Co., Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief partition interface
 */

#ifndef __PARTITION_H__
#define __PARTITION_H__

#define MAX_PARTITION_COUNT	30

struct partition_entry {
	u8_t name[8];
	u8_t type;
	u8_t file_id;
	u8_t mirror_id:4;
	u8_t storage_id:4;
	u8_t flag;
	u32_t offset;
	u32_t size;
	u32_t file_offset;
}  __attribute__((packed));


//storage_id
#define STORAGE_ID_NOR 		0
#define STORAGE_ID_SD	 	1
#define STORAGE_ID_NAND  	2
#define STORAGE_ID_MAX		3


#define PARTITION_FLAG_ENABLE_CRC			(1 << 0)
#define PARTITION_FLAG_ENABLE_ENCRYPTION	(1 << 1)
#define PARTITION_FLAG_BOOT_CHECK			(1 << 2)

#define PARTITION_MIRROR_ID_A				(0)
#define PARTITION_MIRROR_ID_B				(1)
#define PARTITION_MIRROR_ID_INVALID			(0xf)

#define PARTITION_TYPE_INVALID				(0)
#define PARTITION_TYPE_BOOT					(1)
#define PARTITION_TYPE_SYSTEM				(2)
#define PARTITION_TYPE_RECOVERY				(3)
#define PARTITION_TYPE_DATA					(4)
#define PARTITION_TYPE_TEMP					(5)
#define PARTITION_TYPE_PARAM				(6)

/* predefined file ids */
#define PARTITION_FILE_ID_INVALID			(0)
#define PARTITION_FILE_ID_BOOT				(1)
#define PARTITION_FILE_ID_PARAM				(2)
#define PARTITION_FILE_ID_RECOVERY			(3)
#define PARTITION_FILE_ID_SYSTEM			(4)
#define PARTITION_FILE_ID_SDFS				(5)
#define PARTITION_FILE_ID_NVRAM_FACTORY		(6)
#define PARTITION_FILE_ID_NVRAM_FACTORY_RW	(7)
#define PARTITION_FILE_ID_NVRAM_USER		(8)
#define PARTITION_FILE_ID_IMAGE_SCRATCH		(9)
/*sdfs 10-40*/
#define PARTITION_FILE_ID_SDFS_PART_BASE	(10)
#define PARTITION_FILE_ID_SDFS_PART0		(PARTITION_FILE_ID_SDFS_PART_BASE+0)
#define PARTITION_FILE_ID_SDFS_PART1		(PARTITION_FILE_ID_SDFS_PART_BASE+1)
#define PARTITION_FILE_ID_SDFS_PART2		(PARTITION_FILE_ID_SDFS_PART_BASE+2)
#define PARTITION_FILE_ID_SDFS_PART30		(PARTITION_FILE_ID_SDFS_PART_BASE+30)

#define PARTITION_FILE_ID_UDISK				40

#define PARTITION_FILE_ID_OTA_TEMP			(0xfe)
#define PARTITION_FILE_ID_RESERVED			(0xff)

const struct partition_entry *partition_get_part(u8_t file_id);
const struct partition_entry *partition_get_mirror_part(u8_t file_id);
const struct partition_entry *partition_find_part(u32_t nor_phy_addr);
const struct partition_entry *partition_get_part_by_id(u8_t part_id);
const struct partition_entry *partition_get_temp_part(void);
const struct partition_entry *partition_get_stf_part(u8_t stor_id, u8_t file_id);
const struct partition_entry *partition_get_part_by_type_mirrorid(u8_t type, u8_t mirrorid);



u8_t partition_get_current_file_id(void);
u8_t partition_get_current_mirror_id(void);
int partition_is_mirror_part(const struct partition_entry *part);

int partition_get_max_file_size(const struct partition_entry *part);
int partition_is_param_part(const struct partition_entry *part);
int partition_is_boot_part(const struct partition_entry *part);
int partition_file_mapping(u8_t file_id, u32_t vaddr);
int  partition_valid_check(void);


#endif /* __PARTITION_H__ */
