int optimus_sdc_burn_dtb_load(HIMAGE hImg) { s64 itemSz = 0; HIMAGEITEM hImgItem = NULL; int rc = 0; const char* partName = "dtb"; u64 partBaseOffset = OPTIMUS_DOWNLOAD_TRANSFER_BUF_ADDR; unsigned char* dtbTransferBuf = (unsigned char*)partBaseOffset; //meson1.dtb but not meson.dtb for m8 compatible if (_check_if_secureboot_enabled()) { DWN_MSG("SecureEnabled, use meson1_ENC\n"); hImgItem = image_item_open(hImg, partName, "meson1_ENC"); } else { hImgItem = image_item_open(hImg, partName, "meson1"); } if (!hImgItem) { DWN_WRN("Fail to open item [meson1,%s]\n", partName); return ITEM_NOT_EXIST; } itemSz = image_item_get_size(hImgItem); if (!itemSz) { DWN_ERR("Item size 0\n"); image_item_close(hImgItem); return __LINE__; } #if 1 const unsigned itemSzNotAligned = image_item_get_first_cluster_size(hImg, hImgItem); if (itemSzNotAligned /*& 0x7*/) {//Not Aligned 8bytes/64bits, mmc dma read will failed DWN_MSG("align 4 mmc read...\t");//Assert Make 'DDR' buffer addr align 8 dtbTransferBuf += image_get_cluster_size(hImg) - itemSzNotAligned; partBaseOffset += image_get_cluster_size(hImg) - itemSzNotAligned; } #endif rc = image_item_read(hImg, hImgItem, dtbTransferBuf, (unsigned)itemSz); if (rc) { DWN_ERR("Failed at item read, rc = %d\n", rc); image_item_close(hImgItem); return __LINE__; } image_item_close(hImgItem); rc = optimus_parse_img_download_info(partName, itemSz, "normal", "mem", partBaseOffset); if (rc) { DWN_ERR("Failed in init down info\n"); return __LINE__; } { unsigned wrLen = 0; char errInfo[512]; wrLen = optimus_download_img_data(dtbTransferBuf, (unsigned)itemSz, errInfo); rc = (wrLen == itemSz) ? 0 : __LINE__; } return rc; }
//fetch the keys names which need be burned from item[conf, keys] static int sdc_burn_get_user_key_names(HIMAGE hImg, const char* **pKeysName, unsigned* keysNum) { int rc = 0; HIMAGEITEM hImgItem = NULL; unsigned itemSz = 0; unsigned char* thisReadBuf = (unsigned char*)OPTIMUS_SPARSE_IMG_FILL_VAL_BUF;//This buf is not used and not need reuse when burning keys const unsigned thisReadBufSz = (OPTIMUS_SPARSE_IMG_FILL_BUF_SZ >> 1); const char* *keysName = (const char**)(thisReadBuf + thisReadBufSz); hImgItem = image_item_open(hImg, "conf", "keys"); if (!hImgItem) { DWN_ERR("Fail to open keys.conf\n"); return ITEM_NOT_EXIST; } itemSz = (unsigned)image_item_get_size(hImgItem); if (!itemSz) { DWN_ERR("Item size 0\n"); image_item_close(hImgItem); return __LINE__; } const unsigned itemSzNotAligned = image_item_get_first_cluster_size(hImg, hImgItem); if (itemSzNotAligned /*& 0x7*/) {//Not Aligned 8bytes/64bits, mmc dma read will failed DWN_MSG("align 4 mmc read...\t");//Assert Make 'DDR' buffer addr align 8 thisReadBuf += image_get_cluster_size(hImg); thisReadBuf -= itemSzNotAligned; } rc = image_item_read(hImg, hImgItem, thisReadBuf, itemSz); if (rc) { DWN_ERR("Failed at item read, rc = %d\n", rc); image_item_close(hImgItem); return __LINE__; } image_item_close(hImgItem); if (itemSz >= thisReadBufSz) { DWN_ERR("itemSz(0x%x) of keys.conf too large, > max 0x%x.\n", itemSz, thisReadBufSz); return __LINE__; } rc = _optimus_parse_buf_2_lines((char*)thisReadBuf, itemSz, keysName, keysNum, 16); if (rc) { DWN_ERR("Fail in parse buf_2_lines\n"); return __LINE__; } rc = _optimus_abandon_ini_comment_lines((char**)keysName, *keysNum); *pKeysName = keysName; return rc; }