log_store_pl.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. /* This software/firmware and related documentation ("MediaTek Software") are
  2. * protected under relevant copyright laws. The information contained herein is
  3. * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
  4. * the prior written permission of MediaTek inc. and/or its licensors, any
  5. * reproduction, modification, use or disclosure of MediaTek Software, and
  6. * information contained herein, in whole or in part, shall be strictly
  7. * prohibited.
  8. *
  9. * MediaTek Inc. (C) 2010. All rights reserved.
  10. *
  11. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  12. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  13. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  14. * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
  15. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  16. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  17. * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
  18. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  19. * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
  20. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  21. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  22. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
  23. * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
  24. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
  26. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
  27. * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
  28. * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  29. * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. *
  31. * The following software/firmware and/or related documentation ("MediaTek
  32. * Software") have been modified by MediaTek Inc. All revisions are subject to
  33. * any receiver's applicable license agreements with MediaTek Inc.
  34. */
  35. #include <platform.h>
  36. #include "partition.h"
  37. #include "log_store_pl.h"
  38. #include "dram_buffer.h"
  39. #define MOD "PL_LOG_STORE"
  40. #define AEE_IPANIC_PLABLE "expdb"
  41. //#define PRINT_EARLY_KERNEL_LOG
  42. #define DEBUG_LOG
  43. // !!!!!!! Because log store be called by print, so these function don't use print log to debug.
  44. #ifdef DEBUG_LOG
  45. #define LOG_DEBUG(fmt, ...) \
  46. log_store_enable = false; \
  47. print(fmt, ##__VA_ARGS__); \
  48. log_store_enable = true
  49. #else
  50. #define LOG_DEBUG(fmt, ...)
  51. #endif
  52. #define LOG_MEM_ALIGNMENT (0x1000) //PAGE Alignment(4K)
  53. #define EMMC_LOG_BUF_SIZE (0x200000)
  54. typedef enum {
  55. LOG_WRITE = 0x1, // Log is write to buff
  56. LOG_READ_KERNEL = 0x2, // Log have readed by kernel
  57. LOG_WRITE_EMMC = 0x4, // log need save to emmc
  58. LOG_EMPTY = 0x8, // log is empty
  59. LOG_FULL = 0x10, // log is full
  60. LOG_PL_FINISH = 0X20, // pl boot up finish
  61. LOG_LK_FINISH = 0X40, // lk boot up finish
  62. LOG_DEFAULT = LOG_WRITE_EMMC|LOG_EMPTY,
  63. } BLOG_FLAG;
  64. //printk log store buff, 1 DRAM, 0 SRAM. only printk user DRAM,
  65. // we can user printk SRAM buff to store log.
  66. extern int g_log_drambuf;
  67. #define C_LOG_SRAM_BUF_SIZE (20480)
  68. extern char log_sram_buf[C_LOG_SRAM_BUF_SIZE];
  69. #define bootarg g_dram_buf->bootarg
  70. static int log_store_status = BUFF_NOT_READY;
  71. static struct sram_log_header *sram_header = (struct sram_log_header*)SRAM_LOG_ADDR;
  72. static struct pl_lk_log *dram_curlog_header = &(((struct sram_log_header*)SRAM_LOG_ADDR)->dram_curlog_header);
  73. static struct dram_buf_header *sram_dram_buff = &(((struct sram_log_header*)SRAM_LOG_ADDR)->dram_buf);
  74. static char *pbuff = NULL;
  75. static int log_store_sram = 1;
  76. static int sram_store_count = 0;
  77. static bool log_store_enable = true;
  78. static u32 part_start_addr, part_end_addr, part_size;
  79. static blkdev_t *bootdev;
  80. static part_t *part_ptr;
  81. void format_log_buff(void)
  82. {
  83. memset(dram_curlog_header, 0, sizeof(struct pl_lk_log));
  84. dram_curlog_header->sig = LOG_STORE_SIG;
  85. dram_curlog_header->buff_size = LOG_STORE_SIZE;
  86. dram_curlog_header->off_pl = sizeof(struct pl_lk_log);
  87. dram_curlog_header->off_lk = sizeof(struct pl_lk_log);
  88. dram_curlog_header->pl_flag = LOG_DEFAULT;
  89. dram_curlog_header->lk_flag = LOG_DEFAULT;
  90. return;
  91. }
  92. bool trigger_once = true;
  93. int logbuf_valid(void)
  94. {
  95. if ((dram_curlog_header != NULL) && (dram_curlog_header->sig == LOG_STORE_SIG) &&
  96. (dram_curlog_header->buff_size == LOG_STORE_SIZE) && (dram_curlog_header->off_pl == sizeof(struct pl_lk_log))
  97. && ((dram_curlog_header->sz_lk + dram_curlog_header->sz_pl + dram_curlog_header->off_pl) <= LOG_STORE_SIZE)
  98. && (dram_curlog_header->pl_flag <= 0x80 - 1) && (dram_curlog_header->lk_flag <= 0x80 - 1))
  99. return 1;
  100. if (trigger_once && dram_curlog_header) {
  101. LOG_DEBUG("%s: logbuf_valid failed\n", MOD);
  102. LOG_DEBUG("%s: dram_curlog_header 0x%x sig 0x%x buff_size 0x%x\n", MOD, dram_curlog_header, dram_curlog_header->sig, dram_curlog_header->buff_size);
  103. LOG_DEBUG("%s: off_pl 0x%x sz_pl 0x%x pl_flag 0x%x\n", MOD, dram_curlog_header->off_pl, dram_curlog_header->sz_pl, dram_curlog_header->pl_flag);
  104. LOG_DEBUG("%s: off_lk 0x%x sz_lk 0x%x lk_flag 0x%x\n", MOD, dram_curlog_header->off_lk, dram_curlog_header->sz_lk, dram_curlog_header->lk_flag);
  105. trigger_once = false;
  106. }
  107. return 0;
  108. }
  109. bool read_config_emmc(struct log_emmc_header *buf) {
  110. if (bootdev == NULL || part_ptr == NULL) {
  111. LOG_DEBUG("%s: partition information is error.\n", MOD);
  112. return false;
  113. }
  114. int ret = 0;
  115. log_store_enable = false;
  116. ret = blkdev_read(bootdev, part_end_addr - bootdev->blksz, sizeof(struct log_emmc_header), (u8 *)buf, part_ptr->part_id);
  117. log_store_enable = true;
  118. if (ret) {
  119. LOG_DEBUG("%s:read postfix error, ret value = 0x%x\n", MOD, ret);
  120. return false;
  121. }
  122. if (buf->sig != LOG_EMMC_SIG) { //sig error, format it
  123. LOG_DEBUG("%s:read config error, sig 0x%x, size 0x%d, format them.\n", MOD, buf->sig, bootdev->blksz);
  124. memset(buf, 0, sizeof(struct log_emmc_header));
  125. buf->sig = LOG_EMMC_SIG;
  126. log_store_enable = false;
  127. ret = blkdev_write(bootdev, part_end_addr - bootdev->blksz, sizeof(struct log_emmc_header), (u8 *)buf, part_ptr->part_id);
  128. log_store_enable = true;
  129. if (ret)
  130. return false;
  131. }
  132. return true;
  133. }
  134. bool write_config_emmc(u32 type, u32 value) {
  135. if (bootdev == NULL || part_ptr == NULL) {
  136. LOG_DEBUG("%s: write partition information is error.\n", MOD);
  137. return false;
  138. }
  139. struct log_emmc_header log_header;
  140. int ret = 0;
  141. if (read_config_emmc(&log_header)) {
  142. if (type == 0) { // can add other item
  143. log_header.offset = value;
  144. }
  145. log_store_enable = false;
  146. ret = blkdev_write(bootdev, part_end_addr - bootdev->blksz, sizeof(log_header), (u8 *)&log_header, part_ptr->part_id);
  147. log_store_enable = true;
  148. if (ret)
  149. return false;
  150. }
  151. return true;
  152. }
  153. #ifndef DRAM_PHY_ADDR
  154. #define DRAM_PHY_ADDR (0x40000000)
  155. #endif
  156. u32 store_emmc(char * buf, u32 store_size, u32 offset) {
  157. int ret = 0;
  158. u32 emmc_remain_buf_size = 0;
  159. if ((unsigned long)buf < (unsigned long)DRAM_PHY_ADDR)
  160. return 0;
  161. if (offset % bootdev->blksz)
  162. offset = (offset / bootdev->blksz + 1) * bootdev->blksz;
  163. if (offset >= EMMC_LOG_BUF_SIZE - bootdev->blksz)
  164. offset = 0;
  165. if (store_size > EMMC_LOG_BUF_SIZE/4) {
  166. /* store size max 0.25 emm log, now is 512K */
  167. buf = buf + (store_size - EMMC_LOG_BUF_SIZE/4);
  168. store_size = EMMC_LOG_BUF_SIZE/4;
  169. }
  170. emmc_remain_buf_size = EMMC_LOG_BUF_SIZE - bootdev->blksz - offset;
  171. if (store_size > emmc_remain_buf_size) {
  172. log_store_enable = false; // write remain space
  173. ret = blkdev_write(bootdev, part_end_addr - EMMC_LOG_BUF_SIZE + offset, emmc_remain_buf_size, buf, part_ptr->part_id);
  174. log_store_enable = true;
  175. if (ret) {
  176. LOG_DEBUG("%s:write log to emmc error, ret value = 0x%x\n", MOD, ret);
  177. return offset;
  178. }
  179. log_store_enable = false; // write from begain with remain data
  180. ret = blkdev_write(bootdev, part_end_addr - EMMC_LOG_BUF_SIZE, store_size - emmc_remain_buf_size, buf + emmc_remain_buf_size, part_ptr->part_id);
  181. log_store_enable = true;
  182. if (ret) {
  183. LOG_DEBUG("%s:write log to emmc error, ret value = 0x%x\n", MOD, ret);
  184. return 0;
  185. }
  186. offset = store_size - emmc_remain_buf_size;
  187. } else {
  188. log_store_enable = false;
  189. ret = blkdev_write(bootdev, part_end_addr - EMMC_LOG_BUF_SIZE + offset, store_size, buf, part_ptr->part_id);
  190. log_store_enable = true;
  191. if (ret) {
  192. LOG_DEBUG("%s:write log to emmc error, ret value = 0x%x\n", MOD, ret);
  193. return offset;
  194. }
  195. offset = offset + store_size;
  196. }
  197. if (offset % bootdev->blksz)
  198. offset = (offset / bootdev->blksz + 1) * bootdev->blksz;
  199. return offset;
  200. }
  201. // store log buff to emmc
  202. void log_to_emmc(struct sram_log_header *sram_buff)
  203. {
  204. int ret = 0;
  205. u32 atf_end = 0;
  206. #if CFG_GZ_SUPPORT
  207. u32 gz_end = 0;
  208. #endif
  209. LOG_DEBUG("%s:log_to_emmc function flag 0x%x!\n",MOD, sram_dram_buff->flag);
  210. if (bootdev == NULL || part_ptr == NULL) {
  211. LOG_DEBUG("%s: write partition information is error.\n", MOD);
  212. return;
  213. }
  214. if (sram_buff == NULL) {
  215. LOG_DEBUG("%s:sram_buff is null!\n",MOD);
  216. return;
  217. }
  218. if (sram_dram_buff == NULL) {
  219. LOG_DEBUG("%s:sram_dram_buff is NULL!\n",MOD);
  220. return;
  221. }
  222. if (sram_dram_buff->sig != DRAM_HEADER_SIG) {
  223. LOG_DEBUG("%s:sram_dram_buff->sig 0x%x!\n",MOD,sram_dram_buff->sig);
  224. return;
  225. }
  226. if ((u32 *)sram_dram_buff->buf_addr == NULL) {
  227. LOG_DEBUG("%s:sram_dram_buff->buf_addr is NULL!\n",MOD);
  228. return;
  229. }
  230. if (sram_dram_buff->buf_size != LOG_STORE_SIZE) {
  231. LOG_DEBUG("%s:error:sram_dram_buff->buf_size 0x%x not 0x%x!\n",MOD,sram_dram_buff->buf_size, LOG_STORE_SIZE);
  232. return;
  233. }
  234. if ((sram_dram_buff->flag & NEED_SAVE_TO_EMMC) != NEED_SAVE_TO_EMMC) {
  235. LOG_DEBUG("%s:don't need to store to emmc, flag 0x%x!\n",MOD,sram_dram_buff->flag);
  236. return;
  237. }
  238. sram_buff->reboot_count++;
  239. pbuff = (char *)sram_dram_buff->buf_addr;
  240. dram_curlog_header = &(sram_header->dram_curlog_header);
  241. if (!logbuf_valid()) {
  242. LOG_DEBUG("%s:logbuf not valid!\n", MOD);
  243. return;
  244. }
  245. //save the top 3 times, after that, 10 times scale
  246. if (sram_buff->reboot_count >= sram_buff->save_to_emmc) {
  247. u32 ret;
  248. struct log_emmc_header header;
  249. u32 write_size;
  250. if (read_config_emmc(&header) == false)
  251. return;
  252. LOG_DEBUG("%s:last pl log size 0x%x, lk log size 0x%x!\n", MOD, dram_curlog_header->sz_pl, dram_curlog_header->sz_lk);
  253. /* write preloader/lk log */
  254. LOG_DEBUG("%s: /* write preloader/lk log addr 0x%x size 0x%x, offset 0x%x*/\n", MOD,
  255. pbuff + dram_curlog_header->off_pl, dram_curlog_header->sz_lk + dram_curlog_header->sz_pl, header.offset);
  256. write_size = dram_curlog_header->sz_lk + dram_curlog_header->sz_pl;
  257. if (write_size % bootdev->blksz) // write as block
  258. write_size = (write_size / bootdev->blksz + 1) * bootdev->blksz;
  259. header.offset = store_emmc(pbuff + dram_curlog_header->off_pl, write_size, header.offset);
  260. /* write ATF log */
  261. if (sram_dram_buff->atf_log_addr != 0 && sram_dram_buff->atf_log_len != 0) {
  262. atf_end = sram_dram_buff->atf_log_addr;
  263. while (*(u64 *)atf_end != 0) {
  264. atf_end += bootdev->blksz;
  265. if (atf_end > (sram_dram_buff->atf_log_addr
  266. + sram_dram_buff->atf_log_len)) {
  267. atf_end -= bootdev->blksz;
  268. break;
  269. }
  270. }
  271. LOG_DEBUG("%s: /* write ATF log addr 0x%x size 0x%x, offset 0x%x*/\n",MOD,
  272. sram_dram_buff->atf_log_addr, atf_end - sram_dram_buff->atf_log_addr, header.offset);
  273. header.offset = store_emmc((void*)sram_dram_buff->atf_log_addr, atf_end - sram_dram_buff->atf_log_addr, header.offset);
  274. }
  275. #if CFG_GZ_SUPPORT
  276. /* write GZ log */
  277. if (sram_header->gz_log_addr && sram_header->gz_log_len) {
  278. gz_end = sram_header->gz_log_addr;
  279. while (*(u64 *)gz_end != 0) {
  280. gz_end += bootdev->blksz;
  281. if (gz_end > (sram_header->gz_log_addr
  282. + sram_header->gz_log_len)) {
  283. gz_end -= bootdev->blksz;
  284. break;
  285. }
  286. }
  287. LOG_DEBUG("%s: /* write GZ log addr 0x%x size 0x%x, offset 0x%x*/\n",MOD,
  288. sram_header->gz_log_addr, gz_end - sram_header->gz_log_addr, header.offset);
  289. header.offset = store_emmc((void*)sram_header->gz_log_addr, gz_end - sram_header->gz_log_addr, header.offset);
  290. }
  291. #endif
  292. /* write kernel log, kernel size by block */
  293. if ((sram_dram_buff->flag & BUFF_EARLY_PRINTK) && sram_dram_buff->klog_addr != 0
  294. && sram_dram_buff->klog_size != 0) {
  295. LOG_DEBUG("%s: /* write kernel log addr 0x%x size 0x%x, offset 0x%x*/\n",MOD,
  296. header.offset, sram_dram_buff->klog_size, header.offset);
  297. header.offset = store_emmc((void*)sram_dram_buff->klog_addr, sram_dram_buff->klog_size, header.offset);
  298. }
  299. write_config_emmc(0, header.offset);
  300. if (sram_buff->reboot_count >= 3)
  301. sram_buff->save_to_emmc = 5 * sram_buff->reboot_count;
  302. } else {
  303. LOG_DEBUG("%s:reboot_count %d,save_to_emmc %d.\n", MOD, sram_buff->reboot_count, sram_buff->save_to_emmc);
  304. }
  305. return;
  306. }
  307. #ifdef PRINT_EARLY_KERNEL_LOG
  308. void kernel_log_show(void)
  309. {
  310. int i = 0;
  311. char value;
  312. if (sram_dram_buff == NULL)
  313. return;
  314. // print early printk message
  315. if ((sram_dram_buff->flag & BUFF_EARLY_PRINTK) && sram_dram_buff->klog_addr != 0
  316. && sram_dram_buff->klog_size != 0) {
  317. log_store_enable = false;
  318. for (i=0; i < sram_dram_buff->klog_size; i++) {
  319. value = *((char *)sram_dram_buff->klog_addr+i);
  320. print("%c",value);
  321. }
  322. log_store_enable = true;
  323. }
  324. }
  325. #endif
  326. void get_emmc_add(void) {
  327. log_store_enable = false;
  328. bootdev = blkdev_get(CFG_BOOT_DEV);
  329. log_store_enable = true;
  330. if (NULL == bootdev) {
  331. LOG_DEBUG("%s can't find boot device(%d)\n", MOD, CFG_BOOT_DEV);
  332. return ;
  333. }
  334. log_store_enable = false;
  335. part_ptr = (part_t*)part_get(AEE_IPANIC_PLABLE);
  336. log_store_enable = true;
  337. if (part_ptr == NULL) {
  338. LOG_DEBUG("%s:log_to_emmc get partition error!\n",MOD);
  339. return;
  340. }
  341. #if ((CFG_BOOT_DEV == BOOTDEV_SDMMC) || (CFG_BOOT_DEV == BOOTDEV_UFS))
  342. part_start_addr = part_ptr->start_sect * bootdev->blksz;
  343. part_end_addr = (part_ptr->start_sect + part_ptr->nr_sects) * bootdev->blksz;
  344. part_size = part_ptr->nr_sects * bootdev->blksz;
  345. LOG_DEBUG("%s:%s partition start addr 0x%x, end addr 0x%x, partition size 0x%x, nr_sects 0x%x, blksz 0x%x!\n",
  346. MOD, AEE_IPANIC_PLABLE, part_start_addr, part_end_addr, part_size, part_ptr->nr_sects, bootdev->blksz);
  347. #else
  348. part_start_addr = mt_part_get_start_addr(part_ptr) * bootdev->blksz;
  349. part_end_addr = (mt_part_get_start_addr(part_ptr)+ mt_part_get_size(part_ptr)) * bootdev->blksz;
  350. part_size = mt_part_get_size(part_ptr) * bootdev->blksz;
  351. LOG_DEBUG("%s:%s partition start addr 0x%x, end addr 0x%x, partition size 0x%x, nr_sects 0x%x, blksz 0x%x!\n",
  352. MOD, AEE_IPANIC_PLABLE, part_start_addr, part_end_addr, part_size, mt_part_get_size(part_ptr), bootdev->blksz);
  353. #endif
  354. }
  355. #if CFG_UART_DYNAMIC_SWITCH
  356. void update_uart_log_flag(void)
  357. {
  358. struct log_emmc_header header;
  359. if (read_config_emmc(&header) && header.uart_flag == 0x01) {
  360. set_log_switch(1);
  361. }
  362. LOG_DEBUG("%s:get uart flag= 0x%x\n", MOD, header.uart_flag);
  363. }
  364. #endif
  365. void log_store_init(void)
  366. {
  367. if (log_store_status != BUFF_NOT_READY) {
  368. LOG_DEBUG("%s:log_sotore_status is ready!\n",MOD);
  369. return;
  370. }
  371. // SRAM buff header init
  372. sram_header = (struct sram_log_header*)SRAM_LOG_ADDR;
  373. LOG_DEBUG("%s:sram->sig value 0x%x!\n",MOD,sram_header->sig);
  374. if (sram_header->sig != SRAM_HEADER_SIG) {
  375. memset(sram_header,0, sizeof(struct sram_log_header));
  376. LOG_DEBUG("%s:sram header is not match, format all!\n",MOD);
  377. sram_header->sig = SRAM_HEADER_SIG;
  378. LOG_DEBUG("%s:set ram_header->sig = 0x%x\n", MOD, sram_header->sig);
  379. }
  380. get_emmc_add();
  381. #if CFG_UART_DYNAMIC_SWITCH
  382. update_uart_log_flag();
  383. #endif
  384. // Save log to emmc
  385. log_to_emmc(sram_header);
  386. #ifdef PRINT_EARLY_KERNEL_LOG
  387. kernel_log_show();
  388. #endif
  389. memset(sram_dram_buff, 0, sizeof(struct dram_buf_header));
  390. sram_dram_buff->sig = DRAM_HEADER_SIG;
  391. log_store_enable = false;
  392. pbuff = (char *)((u32)mblock_reserve_ext(&bootarg.mblock_info,
  393. (u64)(LOG_STORE_SIZE), (u64)LOG_MEM_ALIGNMENT, 0x80000000, 1, "log_store"));
  394. log_store_enable = true;
  395. if (!pbuff) {
  396. LOG_DEBUG("%s:dram log allocation error!\n",MOD);
  397. sram_dram_buff->flag = BUFF_ALLOC_ERROR;
  398. log_store_status = BUFF_ALLOC_ERROR;
  399. return;
  400. }
  401. memset(pbuff, 0, LOG_STORE_SIZE);
  402. sram_dram_buff->buf_addr = (u32)pbuff;
  403. sram_dram_buff->buf_offsize = sizeof(struct pl_lk_log);
  404. sram_dram_buff->buf_size = LOG_STORE_SIZE;
  405. sram_dram_buff->flag = BUFF_VALID | CAN_FREE | NEED_SAVE_TO_EMMC | ARRAY_BUFF;
  406. sram_dram_buff->buf_point = 0;
  407. // init DRAM buff
  408. format_log_buff();
  409. log_store_status = BUFF_READY;
  410. LOG_DEBUG("%s:sram_header 0x%x,sig 0x%x, sram_dram_buff 0x%x, buf_addr 0x%x\n", MOD,\
  411. sram_header, sram_header->sig, sram_dram_buff, sram_dram_buff->buf_addr);
  412. return;
  413. }
  414. void store_switch_to_dram(void)
  415. {
  416. int i=0;
  417. log_store_sram = 0;
  418. log_store_init();
  419. if (g_log_drambuf == 1) {
  420. for (i=0; i < sram_store_count; i++) {
  421. pl_log_store(log_sram_buf[i]);
  422. }
  423. }
  424. }
  425. void pl_log_store(char c)
  426. {
  427. if (log_store_enable == false) {
  428. return;
  429. }
  430. if ((log_store_status == BUFF_ALLOC_ERROR) || (log_store_status == BUFF_FULL)) {
  431. return;
  432. }
  433. if ((log_store_sram ==1) && (g_log_drambuf == 1)) {
  434. if (sram_store_count < C_LOG_SRAM_BUF_SIZE) {
  435. log_sram_buf[sram_store_count++] = c;
  436. }
  437. return;
  438. }
  439. if (log_store_status == BUFF_NOT_READY) {
  440. log_store_init();
  441. return;
  442. }
  443. if (logbuf_valid() == 0) {
  444. return;
  445. }
  446. if (log_store_status != BUFF_READY) {
  447. return;
  448. }
  449. *(pbuff + dram_curlog_header->off_pl + dram_curlog_header->sz_pl) = c;
  450. dram_curlog_header->sz_pl++; // dram_curlog_header->sz_pl++;
  451. sram_dram_buff->buf_point = dram_curlog_header->sz_pl; // dram_curlog_header->sz_pl;
  452. if ((dram_curlog_header->off_pl + dram_curlog_header->sz_pl) >= LOG_STORE_SIZE) {
  453. log_store_status = BUFF_FULL;
  454. LOG_DEBUG("%s: dram buff full", MOD);
  455. }
  456. return;
  457. }