170 lines
3.9 KiB
C
Executable File
170 lines
3.9 KiB
C
Executable File
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* (C) Copyright 2001
|
|
* Wayne Lin (Wayne_lin@novatek.com.tw)
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <asm/unaligned.h>
|
|
#include "part_nvt_mmc_raw.h"
|
|
#include <asm/nvt-common/nvt_common.h>
|
|
#include <memalign.h>
|
|
|
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
|
|
|
static int nvt_mmc_raw_emmc_part_parsing(uchar *name, unsigned long *start, unsigned long *size, int part_num)
|
|
{
|
|
int len, len_s, i;
|
|
char *emmcpart = env_get("nvtemmcpart");
|
|
char *s;
|
|
char buf[40];
|
|
|
|
if (emmcpart == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
/* Find the head of the partition string (ex. 0x40000@0x80200(atf)ro) */
|
|
for (i = 0; i < part_num; i++) {
|
|
s = strstr(emmcpart,",");
|
|
if(s == NULL) {
|
|
return -1;
|
|
}
|
|
emmcpart = s + 1;
|
|
}
|
|
|
|
/* Get partition size (ex. 0x40000) */
|
|
s = strstr(emmcpart,"@");
|
|
if(s == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
len = strlen(emmcpart);
|
|
len_s = strlen(s);
|
|
strncpy(buf, emmcpart, len - len_s);
|
|
*size = simple_strtoull(buf, NULL, 16);
|
|
emmcpart = s + 1;
|
|
memset(buf, 0, sizeof(buf));
|
|
|
|
/* Get partition start address (ex. 0x80200) */
|
|
s = strstr(emmcpart,"(");
|
|
if(s == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
len = strlen(emmcpart);
|
|
len_s = strlen(s);
|
|
strncpy(buf, emmcpart, len - len_s);
|
|
*start = simple_strtoull(buf, NULL, 16);
|
|
emmcpart = s + 1;
|
|
memset(buf, 0, sizeof(buf));
|
|
|
|
/* Get partition name (ex. atf) */
|
|
s = strstr(emmcpart,")");
|
|
if(s == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
memset(name, 0, sizeof(name));
|
|
len = strlen(emmcpart);
|
|
len_s = strlen(s);
|
|
strncpy((char *)name, emmcpart, len - len_s);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* only boot records will be listed as valid partitions */
|
|
static int nvt_mmc_raw_part_get_info(struct blk_desc *dev_desc, int part_num,
|
|
disk_partition_t *info)
|
|
{
|
|
#ifdef CONFIG_NVT_IVOT_SOC_FW_UPDATE_SUPPORT
|
|
EMB_PARTITION *pEmb = emb_partition_info_data_curr;
|
|
char buf[40];
|
|
#endif
|
|
|
|
if (dev_desc->devnum != CONFIG_NVT_IVOT_EMMC)
|
|
return -1;
|
|
|
|
info->blksz = dev_desc->blksz;
|
|
strcpy((char *)info->type, "NVT_MMC_RAW");
|
|
if (env_get("nvtemmcpart")) {
|
|
|
|
if (nvt_mmc_raw_emmc_part_parsing(info->name, &info->start, &info->size, part_num) < 0)
|
|
return -1;
|
|
|
|
info->size = info->size / info->blksz;
|
|
info->start = info->start / info->blksz;
|
|
|
|
#ifdef CONFIG_NVT_IVOT_SOC_FW_UPDATE_SUPPORT
|
|
} else if (pEmb != NULL) {
|
|
const EMB_PARTITION *p = pEmb + part_num;
|
|
if (part_num >= EMB_PARTITION_INFO_COUNT)
|
|
return -1;
|
|
switch (p->EmbType) {
|
|
case EMBTYPE_LOADER:
|
|
strcpy((char *)info->name, "loader");
|
|
break;
|
|
case EMBTYPE_FDT:
|
|
strcpy((char *)info->name, "fdt");
|
|
break;
|
|
case EMBTYPE_ATF:
|
|
strcpy((char *)info->name, "atf");
|
|
break;
|
|
case EMBTYPE_UBOOT:
|
|
strcpy((char *)info->name, "uboot");
|
|
break;
|
|
case EMBTYPE_UENV:
|
|
strcpy((char *)info->name, "uenv");
|
|
break;
|
|
case EMBTYPE_LINUX:
|
|
strcpy((char *)info->name, "linux");
|
|
break;
|
|
case EMBTYPE_ROOTFS:
|
|
sprintf(buf, "rootfs%d", p->OrderIdx);
|
|
strcpy((char *)info->name, buf);
|
|
break;
|
|
default:
|
|
strcpy((char *)info->name, "unknow");
|
|
break;
|
|
|
|
}
|
|
info->size = p->PartitionSize / info->blksz;
|
|
info->start = p->PartitionOffset / info->blksz;
|
|
#endif
|
|
} else {
|
|
printf("Partition table is empty\n");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void nvt_mmc_raw_part_print(struct blk_desc *dev_desc)
|
|
{
|
|
int part_num = 0;
|
|
disk_partition_t info;
|
|
while (nvt_mmc_raw_part_get_info(dev_desc, part_num, &info) == 0)
|
|
{
|
|
if (strncmp((const char *)info.name, "unknow", 6))
|
|
printf("partition name[%d]:%-15s sector:%ld@%-10ld\n", part_num, info.name, info.start, info.size);
|
|
part_num++;
|
|
}
|
|
}
|
|
|
|
static int nvt_mmc_raw_part_test(struct blk_desc *dev_desc)
|
|
{
|
|
disk_partition_t info;
|
|
|
|
return nvt_mmc_raw_part_get_info(dev_desc, 1, &info);
|
|
}
|
|
|
|
U_BOOT_PART_TYPE(nvt_mmc_raw) = {
|
|
.name = "NVT_MMC_RAW",
|
|
.part_type = PART_TYPE_NVT_MMC_RAW,
|
|
.max_entries = MAX_ENTRY_NUMBERS,
|
|
.get_info = nvt_mmc_raw_part_get_info,
|
|
.print = nvt_mmc_raw_part_print,
|
|
.test = nvt_mmc_raw_part_test,
|
|
};
|
|
#endif
|