part.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
  6. * the prior written permission of MediaTek inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of MediaTek Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * MediaTek Inc. (C) 2010. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  15. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
  25. * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
  30. * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  32. *
  33. * The following software/firmware and/or related documentation ("MediaTek
  34. * Software") have been modified by MediaTek Inc. All revisions are subject to
  35. * any receiver's applicable license agreements with MediaTek Inc.
  36. */
  37. #include "typedefs.h"
  38. #include "platform.h"
  39. #include "blkdev.h"
  40. #include "part.h"
  41. #include "gfh.h"
  42. #include "dram_buffer.h"
  43. #include "sec_boot.h"
  44. #if CFG_PMT_SUPPORT
  45. #include "pmt.h"
  46. #endif
  47. #define MOD "PART"
  48. #define TO_BLKS_ALIGN(size, blksz) (((size) + (blksz) - 1) / (blksz))
  49. u8 g_cur_part_name[32] = {0};
  50. typedef union {
  51. part_hdr_t part_hdr;
  52. gfh_file_info_t file_info_hdr;
  53. } img_hdr_t;
  54. #define IMG_HDR_BUF_SIZE 512
  55. #define img_hdr_buf (g_dram_buf->img_hdr_buf)
  56. #define part_num (g_dram_buf->part_num)
  57. #define part_info (g_dram_buf->part_info)
  58. static void if_overlap_with_dram_buffer(u32 img_start, u32 img_end)
  59. {
  60. u32 dram_buf_start, dram_buf_end;
  61. dram_buf_start = (u32)g_dram_buf;
  62. dram_buf_end = (u32)g_dram_buf + sizeof(dram_buf_t);
  63. //check image start
  64. if ((dram_buf_start <= img_start) && (img_start < dram_buf_end) ||
  65. (dram_buf_start < img_end) && (img_end <= dram_buf_end)) {
  66. print("[%s] dram_buf overlap\n", MOD);
  67. ASSERT(0);
  68. }
  69. // to check more if img_start < dram_buf_start < dram_buf_end < img_end
  70. if ((img_start <= dram_buf_start ) && (dram_buf_start < img_end) ||
  71. (img_start < dram_buf_end) && (dram_buf_end <= img_end)) {
  72. print("[%s] dram_buf overlap\n", MOD);
  73. ASSERT(0);
  74. }
  75. }
  76. int part_init(void)
  77. {
  78. blkdev_t *bdev;
  79. part_t *part;
  80. u32 erasesz;
  81. unsigned long lastblk;
  82. part_num = 0;
  83. memset(part_info, 0x00, sizeof(part_info));
  84. #ifdef PL_PROFILING
  85. u32 profiling_time;
  86. profiling_time = 0;
  87. #endif
  88. cust_part_init();
  89. bdev = blkdev_get(CFG_BOOT_DEV);
  90. if(!bdev)
  91. return -1;
  92. #if 0
  93. part = cust_part_tbl();
  94. if (!bdev || !part)
  95. return -1;
  96. erasesz = bdev->blksz;
  97. part->blks = TO_BLKS_ALIGN(part->size, erasesz);
  98. #ifndef MTK_EMMC_SUPPORT
  99. if(part->type == TYPE_LOW)
  100. lastblk = part->startblk + part->blks*2;
  101. else
  102. lastblk = part->startblk + part->blks;
  103. #endif
  104. while (1) {
  105. part++;
  106. if (!part->name)
  107. break;
  108. if (part->startblk == 0)
  109. part->startblk = lastblk;
  110. part->blks = TO_BLKS_ALIGN(part->size, erasesz);
  111. #ifndef MTK_EMMC_SUPPORT
  112. if(part->type == TYPE_LOW)
  113. lastblk = part->startblk + part->blks*2;
  114. else
  115. lastblk = part->startblk + part->blks;
  116. #endif
  117. }
  118. #endif
  119. #if CFG_PMT_SUPPORT
  120. #ifdef PL_PROFILING
  121. profiling_time = get_timer(0);
  122. #endif
  123. pmt_init();
  124. #ifdef PL_PROFILING
  125. printf("#T#pmt_init=%d\n", get_timer(profiling_time));
  126. #endif
  127. #endif
  128. return 0;
  129. }
  130. part_t *part_get(char *name)
  131. {
  132. int index = 0;
  133. memcpy(g_cur_part_name, name, 32);
  134. part_t *part = (part_t *)cust_part_tbl();
  135. char* nameptr = name;
  136. if(!strcmp(name, PART_SECURE))
  137. {
  138. nameptr = PART_SECCFG;
  139. }
  140. if(!strcmp(name, PART_SECCFG_LOW))
  141. {
  142. nameptr = PART_SECCFG;
  143. }
  144. if(!strcmp(name, PART_SECSTATIC))
  145. {
  146. nameptr = PART_SEC_RO;
  147. }
  148. if(!strcmp(name, PART_SECSTATIC_LOW))
  149. {
  150. nameptr = PART_SEC_RO;
  151. }
  152. if(!strcmp(name, PART_ANDSYSIMG))
  153. {
  154. nameptr = PART_ANDROID;
  155. }
  156. if(!strcmp(name, PART_USER))
  157. {
  158. nameptr = PART_USRDATA;
  159. }
  160. if(!strcmp(name, PART_LK_LOW))
  161. {
  162. nameptr = PART_UBOOT;
  163. }
  164. if(!strcmp(name, PART_LK2_LOW))
  165. {
  166. nameptr = PART_UBOOT2;
  167. }
  168. if(!strcmp(name, PART_LOADER_EXT1_LOW))
  169. {
  170. nameptr = PART_LOADER_EXT1;
  171. }
  172. if(!strcmp(name, PART_LOADER_EXT2_LOW))
  173. {
  174. nameptr = PART_LOADER_EXT2;
  175. }
  176. if(!strcmp(name, PART_TEE1_LOW))
  177. {
  178. nameptr = PART_TEE1;
  179. }
  180. if(!strcmp(name, PART_TEE2_LOW))
  181. {
  182. nameptr = PART_TEE2;
  183. }
  184. if(!strcmp(name, PART_EFUSE_LOW))
  185. {
  186. nameptr = PART_EFUSE;
  187. }
  188. while (part->name && index < PART_MAX_COUNT) {
  189. if (!strcmp(nameptr, part->name)) {
  190. print("[%s] %s %s\n",__FUNCTION__, nameptr, name);
  191. #if CFG_PMT_SUPPORT
  192. return (part_t *)pmt_get_part(part, index);
  193. #else
  194. return part;
  195. #endif
  196. }
  197. part++; index++;
  198. }
  199. return NULL;
  200. }
  201. void put_part(part_t *part)
  202. {
  203. return;
  204. }
  205. unsigned long mt_part_get_start_addr(part_t *part)
  206. {
  207. blkdev_t *bdev;
  208. bdev = blkdev_get(CFG_BOOT_DEV);
  209. if(!bdev)
  210. return -1;
  211. return part->startblk * bdev->blksz;
  212. }
  213. unsigned long mt_part_get_size(part_t *part)
  214. {
  215. blkdev_t *bdev;
  216. bdev = blkdev_get(CFG_BOOT_DEV);
  217. if(!bdev)
  218. return -1;
  219. return part->size * bdev->blksz;
  220. }
  221. unsigned int mt_part_get_part_id(part_t *part)
  222. {
  223. return 0;
  224. }
  225. int part_load(blkdev_t *bdev, part_t *part, u32 *addr, u32 offset, u32 *size)
  226. {
  227. int ret;
  228. img_hdr_t *hdr = (img_hdr_t *)img_hdr_buf;
  229. part_hdr_t *part_hdr = &hdr->part_hdr;
  230. gfh_file_info_t *file_info_hdr = &hdr->file_info_hdr;
  231. unsigned int sec_policy_idx = 0;
  232. unsigned int img_auth_required = 0;
  233. unsigned int sec_feature_mask = 0;
  234. /* specify the read offset */
  235. u64 src = part->startblk * bdev->blksz + offset;
  236. u32 dsize = 0, maddr = 0, mode = 0;
  237. u32 ms;
  238. #ifdef MTK_SECURITY_SW_SUPPORT
  239. /* get security policy of current partition */
  240. print("[%s] partition name = %s\n", MOD, g_cur_part_name);
  241. sec_policy_idx = get_policy_entry_idx(g_cur_part_name);
  242. img_auth_required = get_vfy_policy(sec_policy_idx);
  243. print("[%s] img_auth_required = %x\n", MOD, img_auth_required);
  244. #endif
  245. /* retrieve partition header. */
  246. if (blkdev_read(bdev, src, sizeof(img_hdr_t), (u8*)hdr,0) != 0) {
  247. print("[%s]bdev(%d) read error (%s)\n", MOD, bdev->type, part->name);
  248. return -1;
  249. }
  250. #ifdef MTK_SECURITY_SW_SUPPORT
  251. ms = get_timer(0);
  252. if (img_auth_required) {
  253. sec_malloc_buf_reset();
  254. ret = sec_img_auth_init(g_cur_part_name, part_hdr->info.name);
  255. if (ret) {
  256. print("[%s] cert chain vfy fail...\n", MOD);
  257. ASSERT(0);
  258. }
  259. /*add anti roll back hook*/
  260. #ifdef MTK_SECURITY_ANTI_ROLLBACK
  261. ret = sec_rollback_check(0);
  262. if (ret) {
  263. print("[%s] img ver check fail...\n", MOD);
  264. ASSERT(0);
  265. }
  266. #endif
  267. }
  268. ms = get_timer(ms);
  269. print("[%s] part: %s img: %s cert vfy(%d ms)\n", MOD, g_cur_part_name, part_hdr->info.name, ms);
  270. #endif
  271. if (part_hdr->info.magic == PART_MAGIC) {
  272. /* load image with partition header */
  273. part_hdr->info.name[31] = '\0';
  274. print("[%s]Img with part header\n", MOD);
  275. print("[%s]name:%s\n", MOD, part_hdr->info.name);
  276. print("[%s]addr:%xh\n", MOD, part_hdr->info.maddr);
  277. print("[%s]size:%d\n", MOD, part_hdr->info.dsize);
  278. print("[%s]magic:%xh\n", MOD, part_hdr->info.magic);
  279. maddr = part_hdr->info.maddr;
  280. dsize = part_hdr->info.dsize;
  281. mode = part_hdr->info.mode;
  282. src += sizeof(part_hdr_t);
  283. memcpy(part_info + part_num, part_hdr, sizeof(part_hdr_t));
  284. part_num++;
  285. } else {
  286. print("[%s]%s img not exist\n", MOD, part->name);
  287. return -1;
  288. }
  289. if (maddr == PART_HEADER_MEMADDR) {
  290. maddr = *addr;
  291. #if CFG_ATF_SUPPORT
  292. } else if (mode == LOAD_ADDR_MODE_BACKWARD) {
  293. maddr = tee_get_load_addr(maddr);
  294. #endif
  295. }
  296. if_overlap_with_dram_buffer((u32)maddr, ((u32)maddr + dsize));
  297. ms = get_timer(0);
  298. if (0 == (ret = blkdev_read(bdev, src, dsize, (u8*)maddr,0))) {
  299. if(addr) *addr = maddr;
  300. if(size) *size = dsize;
  301. }
  302. ms = get_timer(ms);
  303. print("\n[%s]load \"%s\" from 0x%llx(dev) to 0x%x (mem) [%s]\n", MOD,
  304. part->name, src, maddr, (ret == 0) ? "SUCCESS" : "FAILED");
  305. if( ms == 0 )
  306. ms+=1;
  307. print("[%s]load speed:%dKB/s,%d bytes,%dms\n", MOD, ((dsize / ms) * 1000) / 1024, dsize, ms);
  308. #ifdef MTK_SECURITY_SW_SUPPORT
  309. ms = get_timer(0);
  310. if (img_auth_required) {
  311. unsigned int cert_chain_sz = 0;
  312. unsigned int padding_sz = 0;
  313. print("[%s] img vfy...", MOD);
  314. ret = sec_img_auth(maddr, dsize);
  315. if (ret) {
  316. print("fail\n");
  317. ASSERT(0);
  318. }
  319. else {
  320. print("ok\n");
  321. }
  322. }
  323. ms = get_timer(ms);
  324. print("[%s] part: %s img: %s vfy(%d ms)\n", MOD, g_cur_part_name, part_hdr->info.name, ms);
  325. ret = sec_get_img_size(g_cur_part_name, part_hdr->info.name, size);
  326. if (ret)
  327. return ret;
  328. #endif
  329. return ret;
  330. }
  331. int part_load_raw_part(blkdev_t *bdev, part_t *part, u32 *addr, u32 offset, u32 *size)
  332. {
  333. int ret;
  334. img_hdr_t *hdr = (img_hdr_t *)img_hdr_buf;
  335. part_hdr_t *part_hdr = &hdr->part_hdr;
  336. gfh_file_info_t *file_info_hdr = &hdr->file_info_hdr;
  337. /* specify the read offset */
  338. u64 src = part->startblk * bdev->blksz + offset;
  339. u32 dsize = 0, maddr = 0;
  340. u32 ms;
  341. ret = 0;
  342. /* retrieve partition header. */
  343. if (blkdev_read(bdev, src, *size, (u8*)(*addr),0) != 0) {
  344. //print("[%s]bdev(%d) read error (%s)\n", MOD, bdev->type, part->name);
  345. ret = -1;
  346. }
  347. return ret;
  348. }
  349. int if_equal_img_name(blkdev_t *bdev, part_t *part, u32 offset, const char* img_name)
  350. {
  351. int ret;
  352. int i;
  353. img_hdr_t *hdr;
  354. part_hdr_t *part_hdr;
  355. u64 src;
  356. ret = 0;
  357. i = 0;
  358. hdr = (img_hdr_t *)img_hdr_buf;
  359. part_hdr = &hdr->part_hdr;
  360. /* specify the read offset */
  361. src = ((u64)part->startblk *(u64) bdev->blksz) + (u64)offset;
  362. /* print("enter if_equal_img_name\n"); */
  363. /* retrieve partition header. */
  364. if (blkdev_read(bdev, src, sizeof(img_hdr_t), (u8*)hdr, part->part_id) != 0) {
  365. //print("[%s] bdev(%d) read error (%s)\n", MOD, bdev->type, part->name);
  366. ret=-1;
  367. }
  368. /* print("img_name:%s, info.name:%s, len(%d)\n", img_name,
  369. part_hdr->info.name,
  370. strlen(img_name)); */
  371. if (0 == ret)
  372. ret = strncmp(img_name, part_hdr->info.name, strlen(img_name));
  373. return !ret;
  374. }
  375. void part_dump(void)
  376. {
  377. blkdev_t *bdev;
  378. part_t *part;
  379. u32 blksz;
  380. u64 start, end;
  381. bdev = blkdev_get(CFG_BOOT_DEV);
  382. part = (part_t *)cust_part_tbl();
  383. blksz = bdev->blksz;
  384. print("\n[%s]blksz:%dB\n", MOD, blksz);
  385. while (part->name) {
  386. start = (u64)part->startblk * blksz;
  387. end = (u64)(part->startblk + part->blks) * blksz - 1;
  388. print("[%s][0x%llx-0x%llx] \"%s\" (%d blocks)\n", MOD, start, end,
  389. part->name, part->blks);
  390. part++;
  391. }
  392. }
  393. unsigned long mt_part_get_active_bit(part_t *part)
  394. {
  395. return 0;
  396. }
  397. int get_part_info(u8 *buf, u32 *maddr, u32 *dsize, u32 *mode, u8 bMsg)
  398. {
  399. int ret = 0;
  400. part_hdr_t *part_hdr = (part_hdr_t *)buf;
  401. if (part_hdr->info.magic == PART_MAGIC) {
  402. /* load image with partition header */
  403. part_hdr->info.name[31] = '\0';
  404. if (bMsg) {
  405. print("[%s] partition hdr (1)\n", MOD);
  406. print("[%s] Image with part header\n", MOD);
  407. print("[%s] name : %s\n", MOD, part_hdr->info.name);
  408. print("[%s] addr : %xh mode : %d\n", MOD, part_hdr->info.maddr, part_hdr->info.mode);
  409. print("[%s] size : %d\n", MOD, part_hdr->info.dsize);
  410. print("[%s] magic: %xh\n", MOD, part_hdr->info.magic);
  411. }
  412. *maddr = part_hdr->info.maddr;
  413. *dsize = part_hdr->info.dsize;
  414. *mode = part_hdr->info.mode;
  415. } else {
  416. if (bMsg) {
  417. print("[%s] partition hdr (0)\n", MOD);
  418. }
  419. return -1;
  420. }
  421. return ret;
  422. }