1*552a848eSStefano Babic /* 2*552a848eSStefano Babic * Copyright 2008-2015 Freescale Semiconductor, Inc. 3*552a848eSStefano Babic * 4*552a848eSStefano Babic * SPDX-License-Identifier: GPL-2.0+ 5*552a848eSStefano Babic * 6*552a848eSStefano Babic * Command for encapsulating DEK blob 7*552a848eSStefano Babic */ 8*552a848eSStefano Babic 9*552a848eSStefano Babic #include <common.h> 10*552a848eSStefano Babic #include <command.h> 11*552a848eSStefano Babic #include <environment.h> 12*552a848eSStefano Babic #include <malloc.h> 13*552a848eSStefano Babic #include <asm/byteorder.h> 14*552a848eSStefano Babic #include <linux/compiler.h> 15*552a848eSStefano Babic #include <fsl_sec.h> 16*552a848eSStefano Babic #include <asm/arch/clock.h> 17*552a848eSStefano Babic #include <mapmem.h> 18*552a848eSStefano Babic 19*552a848eSStefano Babic DECLARE_GLOBAL_DATA_PTR; 20*552a848eSStefano Babic 21*552a848eSStefano Babic /** 22*552a848eSStefano Babic * blob_dek() - Encapsulate the DEK as a blob using CAM's Key 23*552a848eSStefano Babic * @src: - Address of data to be encapsulated 24*552a848eSStefano Babic * @dst: - Desination address of encapsulated data 25*552a848eSStefano Babic * @len: - Size of data to be encapsulated 26*552a848eSStefano Babic * 27*552a848eSStefano Babic * Returns zero on success,and negative on error. 28*552a848eSStefano Babic */ 29*552a848eSStefano Babic static int blob_encap_dek(const u8 *src, u8 *dst, u32 len) 30*552a848eSStefano Babic { 31*552a848eSStefano Babic int ret = 0; 32*552a848eSStefano Babic u32 jr_size = 4; 33*552a848eSStefano Babic 34*552a848eSStefano Babic u32 out_jr_size = sec_in32(CONFIG_SYS_FSL_JR0_ADDR + 0x102c); 35*552a848eSStefano Babic if (out_jr_size != jr_size) { 36*552a848eSStefano Babic hab_caam_clock_enable(1); 37*552a848eSStefano Babic sec_init(); 38*552a848eSStefano Babic } 39*552a848eSStefano Babic 40*552a848eSStefano Babic if (!((len == 128) | (len == 192) | (len == 256))) { 41*552a848eSStefano Babic debug("Invalid DEK size. Valid sizes are 128, 192 and 256b\n"); 42*552a848eSStefano Babic return -1; 43*552a848eSStefano Babic } 44*552a848eSStefano Babic 45*552a848eSStefano Babic len /= 8; 46*552a848eSStefano Babic ret = blob_dek(src, dst, len); 47*552a848eSStefano Babic 48*552a848eSStefano Babic return ret; 49*552a848eSStefano Babic } 50*552a848eSStefano Babic 51*552a848eSStefano Babic /** 52*552a848eSStefano Babic * do_dek_blob() - Handle the "dek_blob" command-line command 53*552a848eSStefano Babic * @cmdtp: Command data struct pointer 54*552a848eSStefano Babic * @flag: Command flag 55*552a848eSStefano Babic * @argc: Command-line argument count 56*552a848eSStefano Babic * @argv: Array of command-line arguments 57*552a848eSStefano Babic * 58*552a848eSStefano Babic * Returns zero on success, CMD_RET_USAGE in case of misuse and negative 59*552a848eSStefano Babic * on error. 60*552a848eSStefano Babic */ 61*552a848eSStefano Babic static int do_dek_blob(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 62*552a848eSStefano Babic { 63*552a848eSStefano Babic uint32_t src_addr, dst_addr, len; 64*552a848eSStefano Babic uint8_t *src_ptr, *dst_ptr; 65*552a848eSStefano Babic int ret = 0; 66*552a848eSStefano Babic 67*552a848eSStefano Babic if (argc != 4) 68*552a848eSStefano Babic return CMD_RET_USAGE; 69*552a848eSStefano Babic 70*552a848eSStefano Babic src_addr = simple_strtoul(argv[1], NULL, 16); 71*552a848eSStefano Babic dst_addr = simple_strtoul(argv[2], NULL, 16); 72*552a848eSStefano Babic len = simple_strtoul(argv[3], NULL, 10); 73*552a848eSStefano Babic 74*552a848eSStefano Babic src_ptr = map_sysmem(src_addr, len/8); 75*552a848eSStefano Babic dst_ptr = map_sysmem(dst_addr, BLOB_SIZE(len/8)); 76*552a848eSStefano Babic 77*552a848eSStefano Babic ret = blob_encap_dek(src_ptr, dst_ptr, len); 78*552a848eSStefano Babic 79*552a848eSStefano Babic return ret; 80*552a848eSStefano Babic } 81*552a848eSStefano Babic 82*552a848eSStefano Babic /***************************************************/ 83*552a848eSStefano Babic static char dek_blob_help_text[] = 84*552a848eSStefano Babic "src dst len - Encapsulate and create blob of data\n" 85*552a848eSStefano Babic " $len bits long at address $src and\n" 86*552a848eSStefano Babic " store the result at address $dst.\n"; 87*552a848eSStefano Babic 88*552a848eSStefano Babic U_BOOT_CMD( 89*552a848eSStefano Babic dek_blob, 4, 1, do_dek_blob, 90*552a848eSStefano Babic "Data Encryption Key blob encapsulation", 91*552a848eSStefano Babic dek_blob_help_text 92*552a848eSStefano Babic ); 93