93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
/*
|
|
* (C) Copyright 2001
|
|
* Yonghui.yu , Amlogic Inc, [email protected].
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
|
|
#ifdef HAVE_BLOCK_DEVICE
|
|
extern int get_part_info_from_tbl(block_dev_desc_t * dev_desc,
|
|
int part_num, disk_partition_t * info);
|
|
int get_part_info_by_name(block_dev_desc_t *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 partitions */
|
|
static int _get_partition_info_aml(block_dev_desc_t * 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->dev);
|
|
return -1;
|
|
}
|
|
|
|
PRINTF(" part %d found @ %lx size %lx\n",part_num,info->start,info->size);
|
|
return 0;
|
|
}
|
|
|
|
int get_partition_info_aml(block_dev_desc_t * 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(block_dev_desc_t *dev_desc,
|
|
const char *name, disk_partition_t *info)
|
|
{
|
|
return (get_part_info_by_name(dev_desc,
|
|
name, info));
|
|
}
|
|
|
|
void print_part_aml(block_dev_desc_t * 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->dev);
|
|
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 (block_dev_desc_t *dev_desc)
|
|
{
|
|
ALLOC_CACHE_ALIGN_BUFFER(char, buffer, dev_desc->blksz);
|
|
if (IF_TYPE_MMC != dev_desc->if_type)
|
|
return 1;
|
|
if (dev_desc->block_read(dev_desc->dev, AML_MPT_OFFSET, 1, (ulong *) buffer) != 1)
|
|
return -1;
|
|
if (!strncmp(buffer, "MPT", 3))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
#endif
|