nt9856x/BSP/u-boot/disk/part_nvt_mmc_raw.c
2023-03-28 15:07:53 +08:00

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