/*
 * (C) Copyright 2001
 * Yonghui.yu , Amlogic Inc, yonghui.yu@amlogic.com.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <command.h>
#include <memalign.h>
#ifdef CONFIG_HAVE_BLOCK_DEVICE
extern int get_part_info_from_tbl(struct blk_desc * dev_desc,
	int part_num, disk_partition_t * info);
int get_part_info_by_name(struct blk_desc *dev_desc,
	const char *name, disk_partition_t *info);
#define	AML_PART_DEBUG	(0)

#if	(AML_PART_DEBUG)
#define	PRINTF(fmt,args...)	printf (fmt ,##args)
#else
#define PRINTF(fmt,args...)
#endif

#define AML_SEC_SIZE	(512)
#define MAGIC_OFFSET	(1)

/* read back boot partitons */
static int _get_partition_info_aml(struct blk_desc * dev_desc,
	int part_num, disk_partition_t * info, int verb)
{
	int ret = 0;

	if (IF_TYPE_MMC != dev_desc->if_type)
		return -1;

	info->blksz=dev_desc->blksz;
	sprintf ((char *)info->type, "U-Boot");
	/* using partition name in partition tables */
	ret = get_part_info_from_tbl(dev_desc, part_num, info);
	if (ret) {
		printf ("** Partition %d not found on device %d **\n",
			part_num,dev_desc->devnum);
		return -1;
	}

	PRINTF(" part %d found @ %lx size %lx\n",part_num,info->start,info->size);
	return 0;
}

int get_partition_info_aml(struct blk_desc * dev_desc,
	int part_num, disk_partition_t * info)
{
	return(_get_partition_info_aml(dev_desc, part_num, info, 1));
}

int get_partition_info_aml_by_name(struct blk_desc *dev_desc,
	const char *name, disk_partition_t *info)
{
	return (get_part_info_by_name(dev_desc,
		name, info));
}

void print_part_aml(struct blk_desc * dev_desc)
{
	disk_partition_t info;
	int i;
	if (_get_partition_info_aml(dev_desc,0,&info,0) == -1) {
		printf("** No boot partition found on device %d **\n",dev_desc->devnum);
		return;
	}
	printf("Part   Start     Sect x Size Type  name\n");
	i=0;
	do {
		printf(" %02d " LBAFU " " LBAFU " %6ld %.32s %.32s\n",
		       i++, info.start, info.size, info.blksz, info.type, info.name);
	} while (_get_partition_info_aml(dev_desc,i,&info,0)!=-1);
}
#define AML_MPT_OFFSET	(73728)	/* 36M */
/* fix 40Mbyte to check the MPT magic */
int test_part_aml (struct blk_desc *dev_desc)
{
	ALLOC_CACHE_ALIGN_BUFFER(char, buffer, dev_desc->blksz);
	if (blk_dread(dev_desc, AML_MPT_OFFSET, 1, (ulong *) buffer) != 1)
		return -1;
	if (!strncmp(buffer, "MPT", 3))
		return 0;
	return 1;
}


U_BOOT_PART_TYPE(aml) = {
	.name		= "AML",
	.part_type	= PART_TYPE_AML,
	.max_entries	= AML_ENTRY_NUMBERS,
	.get_info	= get_partition_info_aml,
	.print		= print_part_aml,
	.test		= test_part_aml,
};


#endif
