Esempio n. 1
0
int do_hab_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
    if ((argc != 1)) {
        cmd_usage(cmdtp);
        return 1;
    }

    get_hab_status();

    return 0;
}
Esempio n. 2
0
int checkboard(void)
{
	printf("Board: MX6SoloLite-EVK (0x%x): [ ", fsl_system_rev);

	switch (__REG(SRC_BASE_ADDR + 0x8)) {
	case 0x0001:
		printf("POR");
		break;
	case 0x0009:
		printf("RST");
		break;
	case 0x0010:
	case 0x0011:
		printf("WDOG");
		break;
	default:
		printf("unknown");
	}
	printf(" ]\n");

	printf("Boot Device: ");
	switch (get_boot_device()) {
	case WEIM_NOR_BOOT:
		printf("NOR\n");
		break;
	case ONE_NAND_BOOT:
		printf("ONE NAND\n");
		break;
	case I2C_BOOT:
		printf("I2C\n");
		break;
	case SPI_NOR_BOOT:
		printf("SPI NOR\n");
		break;
	case SD_BOOT:
		printf("SD\n");
		break;
	case MMC_BOOT:
		printf("MMC\n");
		break;
	case UNKNOWN_BOOT:
	default:
		printf("UNKNOWN\n");
		break;
	}

#ifdef CONFIG_SECURE_BOOT
	get_hab_status();
#endif

	return 0;
}
Esempio n. 3
0
uint32_t authenticate_image(uint32_t ddr_start, uint32_t image_size)
{
    uint32_t load_addr = 0;
    size_t bytes;
    ptrdiff_t ivt_offset = 0;
    int result = 0;
    ulong start;
    hab_rvt_authenticate_image_t *hab_rvt_authenticate_image;
    hab_rvt_entry_t *hab_rvt_entry;
    hab_rvt_exit_t *hab_rvt_exit;

    hab_rvt_authenticate_image = hab_rvt_authenticate_image_p;
    hab_rvt_entry = hab_rvt_entry_p;
    hab_rvt_exit = hab_rvt_exit_p;

    if (is_hab_enabled()) {
        printf("\nAuthenticate image from DDR location 0x%x...\n",
               ddr_start);

        hab_caam_clock_enable(1);

        if (hab_rvt_entry() == HAB_SUCCESS) {
            /* If not already aligned, Align to ALIGN_SIZE */
            ivt_offset = (image_size + ALIGN_SIZE - 1) &
                         ~(ALIGN_SIZE - 1);

            start = ddr_start;
            bytes = ivt_offset + IVT_SIZE + CSF_PAD_SIZE;
#ifdef DEBUG
            printf("\nivt_offset = 0x%x, ivt addr = 0x%x\n",
                   ivt_offset, ddr_start + ivt_offset);
            puts("Dumping IVT\n");
            print_buffer(ddr_start + ivt_offset,
                         (void *)(ddr_start + ivt_offset),
                         4, 0x8, 0);

            puts("Dumping CSF Header\n");
            print_buffer(ddr_start + ivt_offset+IVT_SIZE,
                         (void *)(ddr_start + ivt_offset+IVT_SIZE),
                         4, 0x10, 0);

            get_hab_status();

            puts("\nCalling authenticate_image in ROM\n");
            printf("\tivt_offset = 0x%x\n", ivt_offset);
            printf("\tstart = 0x%08lx\n", start);
            printf("\tbytes = 0x%x\n", bytes);
#endif
            /*
             * If the MMU is enabled, we have to notify the ROM
             * code, or it won't flush the caches when needed.
             * This is done, by setting the "pu_irom_mmu_enabled"
             * word to 1. You can find its address by looking in
             * the ROM map. This is critical for
             * authenticate_image(). If MMU is enabled, without
             * setting this bit, authentication will fail and may
             * crash.
             */
            /* Check MMU enabled */
            if (get_cr() & CR_M) {
                if (is_cpu_type(MXC_CPU_MX6Q) ||
                        is_cpu_type(MXC_CPU_MX6D)) {
                    /*
                     * This won't work on Rev 1.0.0 of
                     * i.MX6Q/D, since their ROM doesn't
                     * do cache flushes. don't think any
                     * exist, so we ignore them.
                     */
                    if (!is_mx6dqp())
                        writel(1, MX6DQ_PU_IROM_MMU_EN_VAR);
                } else if (is_cpu_type(MXC_CPU_MX6DL) ||
                           is_cpu_type(MXC_CPU_MX6SOLO)) {
                    writel(1, MX6DLS_PU_IROM_MMU_EN_VAR);
                } else if (is_cpu_type(MXC_CPU_MX6SL)) {
                    writel(1, MX6SL_PU_IROM_MMU_EN_VAR);
                }
            }

            load_addr = (uint32_t)hab_rvt_authenticate_image(
                            HAB_CID_UBOOT,
                            ivt_offset, (void **)&start,
                            (size_t *)&bytes, NULL);
            if (hab_rvt_exit() != HAB_SUCCESS) {
                puts("hab exit function fail\n");
                load_addr = 0;
            }
        } else {
            puts("hab entry function fail\n");
        }

        hab_caam_clock_enable(0);

        get_hab_status();
    } else {
        puts("hab fuse not enabled\n");
    }

    if ((!is_hab_enabled()) || (load_addr != 0))
        result = 1;

    return result;
}
Esempio n. 4
0
uint32_t authenticate_image(uint32_t ddr_start, uint32_t image_size)
{
	uint32_t load_addr = 0;
	size_t bytes;
	ptrdiff_t ivt_offset = 0;
	int result = 0;
	ulong start;
	hab_rvt_authenticate_image_t *hab_rvt_authenticate_image;
	hab_rvt_entry_t *hab_rvt_entry;
	hab_rvt_exit_t *hab_rvt_exit;

	hab_rvt_authenticate_image = hab_rvt_authenticate_image_p;
	hab_rvt_entry = hab_rvt_entry_p;
	hab_rvt_exit = hab_rvt_exit_p;

	if (is_hab_enabled()) {
		printf("\nAuthenticate uImage from DDR location 0x%x...\n",
			ddr_start);

		hab_caam_clock_enable(1);

		if (hab_rvt_entry() == HAB_SUCCESS) {
			/* If not already aligned, Align to ALIGN_SIZE */
			ivt_offset = (image_size + ALIGN_SIZE - 1) &
					~(ALIGN_SIZE - 1);

			start = ddr_start;
			bytes = ivt_offset + IVT_SIZE + CSF_PAD_SIZE;

#ifdef DEBUG_AUTHENTICATE_IMAGE
			printf("\nivt_offset = 0x%x, ivt addr = 0x%x\n",
			       ivt_offset, ddr_start + ivt_offset);
			printf("Dumping IVT\n");
			dump_mem(ddr_start + ivt_offset, 0x20);

			printf("Dumping CSF Header\n");
			dump_mem(ddr_start + ivt_offset + 0x20, 0x40);

			get_hab_status();

			printf("\nCalling authenticate_image in ROM\n");
			printf("\tivt_offset = 0x%x\n\tstart = 0x%08x"
			       "\n\tbytes = 0x%x\n", ivt_offset, start, bytes);
#endif
			load_addr = (uint32_t)hab_rvt_authenticate_image(
					HAB_CID_UBOOT,
					ivt_offset, (void **)&start,
					(size_t *)&bytes, NULL);
			if (hab_rvt_exit() != HAB_SUCCESS) {
				printf("hab exit function fail\n");
				load_addr = 0;
			}
		} else
			printf("hab entry function fail\n");

		hab_caam_clock_enable(0);

		get_hab_status();
	}

	if ((!is_hab_enabled()) || (load_addr != 0))
		result = 1;

	return result;
}