blob: 8b15d6b640c6e2be111906f8760615503a06c3ca [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * drv_asm.c
41 *
42 * Project:
43 * --------
44 * UMOLY_Software
45 *
46 * Description:
47 * ------------
48 * This file implements ASM drivers
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *==============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58
59 *------------------------------------------------------------------------------
60 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
61 *============================================================================
62 ****************************************************************************/
63
64#include "asm_reg.h"
65#include "drv_asm.h"
66#include "intrCtrl.h"
67#include "kal_iram_section_defs.h"
68#include "us_timer.h"
69#include "ex_public.h"
70
71ASM_STRUCT Asm_Infor[ASM_NUM];
72
73kal_uint32 Asm_Infor_gen_config[ASM_NUM];
74kal_uint32 Asm_Infor_context_id[ASM_NUM][ASM_TC_NUM];
75kal_uint32 Asm_Infor_trigger_cnt[ASM_NUM];
76
77
78kal_uint32 ASM_Dummy_Read;
79//kal_uint32 PC_Val[ASM_NUM];
80
81
82EX_BBREG_DUMP Asm_Dump;
83
84kal_uint32 Asm_Dump_Regions[ASM_NUM][3];
85
86//#define ASM_DORMANT_BUFFER_LENGTH (256) //1KB
87//#define ASM_DORMANT_BUFFER_SIZE (ASM_DORMANT_BUFFER_LENGTH*4/1024) //1KB
88
89
90//__attribute__((section("NONCACHEDZI"))) __attribute__ ((aligned ( 32 ))) kal_uint32 g_ASM_DORMAT_BUFFER[ASM_DORMANT_BUFFER_LENGTH];
91
92
93
94/*****************************************************************************
95 * Internal Function *
96 *****************************************************************************/
97void ASM_AckAllIntStatus(kal_uint32 core);
98void ASM_SetSPMAndWaitSMPGrant(kal_uint32 core);
99
100
101/*****************************************************************************
102 * Public Function *
103 *****************************************************************************/
104#define CP0_TraceControl_read(val)\
105 do { \
106 __asm__ __volatile__ ( \
107 "mfc0 %0, $23, 1\n\t" \
108 "nop\n\t" \
109 "nop\n\t" \
110 "nop\n\t" \
111 : "=r"(val)\
112 : "0"(val)\
113 ); \
114 } while(0)
115
116
117#define CP0_TraceControl_write(val) \
118 do { \
119 __asm__ __volatile__ ( \
120 "mtc0 %0, $23, 1\n\t" \
121 "nop\n\t" \
122 "nop\n\t" \
123 "nop\n\t" \
124 : \
125 : "r"(val)\
126 ); \
127 } while(0)
128
129/*************************************************************************
130* FUNCTION
131* Asm_PowerOffPDTrace
132*
133* DESCRIPTION
134* Power off PDTrace
135*
136* PARAMETERS
137*
138* RETURNS
139*
140*************************************************************************/
141void Asm_PowerOffPDTrace(void)
142{
143// kal_uint32 val;
144
145// CP0_TraceControl_read(val);
146 CP0_TraceControl_write(0x80000000);
147
148}
149/*************************************************************************
150* FUNCTION
151* Asm_InitInforAllCore
152*
153* DESCRIPTION
154* Init Asm Infor
155*
156* PARAMETERS
157*
158* RETURNS
159*
160*************************************************************************/
161void Asm_InitInforAllCore(void)
162{
163
164 memset((kal_uint8*)Asm_Infor, 0x00, sizeof(Asm_Infor));
165
166}
167
168/*************************************************************************
169* FUNCTION
170* ASM_EnableMcuELM
171*
172* DESCRIPTION
173* Enable Mcu ELM feature
174*
175* PARAMETERS
176*
177* core: core number
178*
179* RETURNS
180*
181*************************************************************************/
182void ASM_EnableMcuELM(kal_uint32 core)
183{
184 Asm_Infor_gen_config[core] |= ASM_MCU_ELM_EN_MASK;
185
186 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
187
188
189}
190
191
192
193/*************************************************************************
194* FUNCTION
195* ASM_DisableMcuELM
196*
197* DESCRIPTION
198* Disable Mcu ELM feature
199*
200* PARAMETERS
201*
202* core: core number
203*
204* RETURNS
205*
206*************************************************************************/
207void ASM_DisableMcuELM(kal_uint32 core)
208{
209
210 Asm_Infor_gen_config[core] &= (~ASM_MCU_ELM_EN_MASK);
211
212 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
213
214}
215
216
217
218/*************************************************************************
219* FUNCTION
220* ASM_SetAddon
221*
222* DESCRIPTION
223* Set ASM addon information
224*
225* PARAMETERS
226* kal_uint32 core : core number
227* kal_uint32 tc : tc number
228* kal_uint32* addon_infor : addon information(max is 8 words)
229* kal_uint32* size : addon information size
230* kal_uint32 start_index : addon start index
231*
232* RETURNS
233*
234* ASM_ERROR_CODE
235*
236*************************************************************************/
237
238ASM_ERROR_CODE ASM_SetAddon(kal_uint32 core,kal_uint32 tc,kal_uint32* addon_infor,kal_uint32 size,kal_uint32 start_index )
239{
240 kal_uint32 i;
241 volatile kal_uint32 *extra_addon_info_base_addr;
242
243#if defined(MT6763) || defined(MT6739)
244//For ASM GCR is overlapped with CIRQ
245 if((ASM_CORE0 == core) && (tc == 3))
246 {
247 return ASM_ERROR_CODE_NO_ERROR;
248 }
249#endif //#if defined(MT6763)
250
251//Remove read status check to speed up write addon
252// if(Asm_Infor[core].mode_config&APB_WR_GCR_BIT_EN)
253// extra_addon_info_base_addr = (kal_uint32 *)ASM_PROFILE_ADDON_INFO_(core,tc);
254// else
255 extra_addon_info_base_addr = (kal_uint32 *)ASM_GCR_PROFILE_ADDON_INFO_(core,tc);
256
257 if(start_index < ASM_PROFILE_END && start_index >= ASM_ADDON_INFO0_EN)
258 {
259 start_index -= ASM_ADDON_INFO0_EN;
260 if( (start_index + size) > ASM_ADDON_NUM)
261 {
262 //ASSERT(0);
263 return ASM_ERROR_CODE_OVER_ADDON_INDEX;
264 }
265 }
266 else
267 {
268 //ASSERT(0);
269 return ASM_ERROR_CODE_OVER_ADDON_SIZE;
270 }
271
272 for( i = 0 ; i < size ; ++i )
273 {
274 Asm_Infor[core].addon[tc][start_index+i]= addon_infor[i];
275 *(extra_addon_info_base_addr+start_index+i) = addon_infor[i];
276 }
277
278 return ASM_ERROR_CODE_NO_ERROR;
279}
280
281
282/*************************************************************************
283* FUNCTION
284* ASM_GetProfilingOption
285*
286* DESCRIPTION
287* Get profile options and addon setting
288*
289* PARAMETERS
290*
291* kal_uint32 core : core number
292*
293* RETURNS
294*
295* kal_uint32 : profile option
296*
297*************************************************************************/
298kal_uint32 ASM_GetProfilingOption(kal_uint32 core)
299{
300 return Asm_Infor[core].profile_en;
301
302}
303
304/*************************************************************************
305* FUNCTION
306* ASM_EnablePDI
307*
308* DESCRIPTION
309* Enable PDI options to ASM
310*
311* PARAMETERS
312*
313* kal_uint32 core : core number
314*
315* RETURNS
316*
317*************************************************************************/
318void ASM_EnablePDI(kal_uint32 core)
319{
320 Asm_Infor_gen_config[core] |= ASM_PDI_MASK;
321
322 ASM_SET_GEN_CONFIG(core, Asm_Infor_gen_config[core]);
323}
324
325
326/*************************************************************************
327* FUNCTION
328* ASM_DisablePDI
329*
330* DESCRIPTION
331* Disable PDI options to ASM
332*
333* PARAMETERS
334*
335* kal_uint32 core : core number
336*
337* RETURNS
338*
339*************************************************************************/
340void ASM_DisablePDI(kal_uint32 core)
341{
342 Asm_Infor_gen_config[core] &= (~ASM_PDI_MASK);
343
344 ASM_SET_GEN_CONFIG(core, Asm_Infor_gen_config[core]);
345
346}
347
348/*************************************************************************
349* FUNCTION
350* ASM_EnableApbWrite
351*
352* DESCRIPTION
353* Enable APB write options to ASM
354*
355* PARAMETERS
356*
357* kal_uint32 core : core number
358*
359* RETURNS
360*
361*************************************************************************/
362void ASM_EnableApbWrite(kal_uint32 core)
363{
364 Asm_Infor[core].mode_config |= APB_WR_GCR_BIT_EN;
365
366 ASM_SET_MODE_CONFIG(core, Asm_Infor[core].mode_config);
367
368}
369/*************************************************************************
370* FUNCTION
371* ASM_DisableApbWrite
372*
373* DESCRIPTION
374* Disable APB write options to ASM
375*
376* PARAMETERS
377*
378* kal_uint32 core : core number
379*
380* RETURNS
381*
382*************************************************************************/
383void ASM_DisableApbWrite(kal_uint32 core)
384{
385 Asm_Infor[core].mode_config &= (~APB_WR_GCR_BIT_EN);
386
387 ASM_SET_MODE_CONFIG(core, Asm_Infor[core].mode_config);
388
389}
390
391/*************************************************************************
392* FUNCTION
393* ASM_GetMode
394*
395* DESCRIPTION
396* Get ASM setting Mode
397*
398* PARAMETERS
399* kal_uint32 mode : ASM Mode
400*
401* RETURNS
402*
403* kal_uint32 : ASM Mode
404*
405*************************************************************************/
406kal_uint32 ASM_GetMode(kal_uint32 core)
407{
408 return Asm_Infor[core].asm_mode;
409}
410
411
412/*************************************************************************
413* FUNCTION
414* ASM_SetMode
415*
416* DESCRIPTION
417* Set ASM Mode config
418*
419* PARAMETERS
420* kal_uint32 core : core number
421* kal_uint32 mode : ASM Mode
422*
423* RETURNS
424*
425* ASM_ERROR_CODE
426*
427*************************************************************************/
428ASM_ERROR_CODE ASM_SetMode(kal_uint32 core,kal_uint32 mode)
429{
430 kal_uint32 mode_config[ASM_MODE_END] = {0,
431 0,
432 ASM_HW_SWLA_STRAM_MODE_CONFIG_VAL,
433 ASM_HW_SWLA_WRAP_MODE_CONFIG_VAL,
434 ASM_HW_SWTR_STRAM_MODE_CONFIG_VAL,
435 ASM_HW_SWTR_WRAP_MODE_CONFIG_VAL
436 };
437 if(mode < ASM_MODE_END)
438 {
439 Asm_Infor[core].asm_mode = mode;
440 Asm_Infor[core].mode_config = mode_config[mode];
441
442 ASM_SET_MODE_CONFIG(core,Asm_Infor[core].mode_config);
443 }
444 else
445 {
446// MSG(MSG_ERR,"Set Mode error. Mode: %d\r\n",mode );
447// ASSERT(0);
448 return ASM_ERROR_CODE_WRONG_MODE;
449 }
450 return ASM_ERROR_CODE_NO_ERROR;
451}
452
453
454/*************************************************************************
455* FUNCTION
456* ASM_WaitIdle
457*
458* DESCRIPTION
459* Wait for ASM idle
460*
461* PARAMETERS
462*
463* kal_uint32 core : core number
464*
465* RETURNS
466*
467* ASM_ERROR_CODE
468*
469*************************************************************************/
470ASM_ERROR_CODE ASM_WaitIdle(kal_uint32 core)
471{
472 kal_uint32 idle_state;
473 kal_uint32 wait_cnt = 0;
474 kal_uint32 wait_limit = 10000;
475
476 do
477 {
478 ASM_GET_IDLE(core,idle_state);
479 wait_cnt++;
480 }while((idle_state == 0) && (wait_cnt < wait_limit));
481 //MSG(MSG_INFO,"Wait for idle cnt %d!\r\n",wait_cnt);
482
483 if(wait_cnt == wait_limit)
484 {
485// MSG(MSG_ERR,"Wait for idle fail!\r\n");
486// ASSERT(0);
487 return ASM_ERROR_CODE_WAIT_IDLE_FAIL;
488 }
489
490 return ASM_ERROR_CODE_NO_ERROR;
491}
492
493
494/*************************************************************************
495* FUNCTION
496* ASM_Start
497*
498* DESCRIPTION
499* Start ASM
500*
501* PARAMETERS
502*
503* kal_uint32 core : core number
504*
505* RETURNS
506*
507* ASM_ERROR_CODE
508*
509*************************************************************************/
510ASM_ERROR_CODE ASM_Start(kal_uint32 core)
511{
512// Asm_PowerOffPDTrace();
513 Asm_Infor_gen_config[core] |= ASM_ENABLE_MASK;
514
515 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
516 return ASM_ERROR_CODE_NO_ERROR;
517}
518
519
520/*************************************************************************
521* FUNCTION
522* ASM_Stop
523*
524* DESCRIPTION
525* Stop ASM
526*
527* PARAMETERS
528*
529* kal_uint32 core : core number
530*
531* RETURNS
532*
533* ASM_ERROR_CODE
534*
535*************************************************************************/
536ASM_ERROR_CODE ASM_Stop(kal_uint32 core)
537{
538 ASM_ERROR_CODE error_code = ASM_ERROR_CODE_NO_ERROR;
539
540 Asm_Infor[core].stop_time = ust_get_current_time();
541
542 if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
543 {
544 Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
545
546 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
547
548 error_code = ASM_WaitIdle(core);
549
550 // read ASM config before dump for debug
551 ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
552 ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
553 ASM_GET_REM_LOG_BUF_SIZE(core,Asm_Infor[core].buf_remain_size);
554 ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
555 ASM_GET_SRAM_MAX_WATER(core,Asm_Infor[core].water_level);
556
557
558 }
559 return error_code;
560
561}
562
563/*************************************************************************
564* FUNCTION
565* ASM_Stop
566*
567* DESCRIPTION
568* Disable ASM then write to disable register without wait for idle
569*
570* PARAMETERS
571*
572* kal_uint32 core : core number
573*
574* RETURNS
575*
576*************************************************************************/
577void ASM_StopWithoutWaitIdle(kal_uint32 core)
578{
579 if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
580 {
581 Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
582
583 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
584 }
585
586}
587/*************************************************************************
588* FUNCTION
589* ASM_Reset
590*
591* DESCRIPTION
592* Reset ASM
593*
594* PARAMETERS
595*
596* kal_uint32 core : core number
597*
598* RETURNS
599*
600*************************************************************************/
601void ASM_Reset(kal_uint32 core)
602{
603 Asm_Infor_gen_config[core] &= (~ASM_ENABLE_MASK);
604
605 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core] | ASM_RESET_MASK);
606}
607
608/*************************************************************************
609* FUNCTION
610* ASM_SPM_Reset
611*
612* DESCRIPTION
613* Reset ASM without update Asm_Infor enable setting for SPM
614*
615* PARAMETERS
616*
617* kal_uint32 core : core number
618*
619* RETURNS
620*
621*************************************************************************/
622void ASM_SPM_Reset(kal_uint32 core)
623{
624
625 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core] | ASM_RESET_MASK);
626}
627
628
629
630
631/*************************************************************************
632* FUNCTION
633* ASM_CheckBufferSize
634*
635* DESCRIPTION
636* Get buffer size after aligned
637*
638* PARAMETERS
639*
640* kal_uint32 core : core number
641*
642* RETURNS
643*
644* kal_uint32: buffer size
645*
646*************************************************************************/
647
648kal_uint32 ASM_CheckBufferSize(kal_uint32 buffer_size)
649{
650
651 //64bytes aligned
652 return (buffer_size&0xFFFFFFE0);
653
654
655}
656/*************************************************************************
657* FUNCTION
658* ASM_InitBuffer
659*
660* DESCRIPTION
661* Set ASM EMI buffer to ASM
662*
663* PARAMETERS
664* kal_uint32 core : core number
665* kal_uint32 addr : ASM EMI buffer
666* kal_uint32 size : ASM EMI buffer size
667*
668* RETURNS
669*
670* ASM_ERROR_CODE
671*
672*************************************************************************/
673ASM_ERROR_CODE ASM_InitBuffer(kal_uint32 core,kal_uint32 addr,kal_uint32 size)
674{
675 kal_uint32 size_64bytes_aligned;
676
677
678 size_64bytes_aligned = ASM_CheckBufferSize(size);
679
680 if(size_64bytes_aligned == 0)
681 {
682 return ASM_ERROR_CODE_BUFFER_TOO_SMALL;
683 }
684
685 //Set logging buffer
686 Asm_Infor[core].buf_base_address = addr;
687 Asm_Infor[core].thresh_value = size_64bytes_aligned / ASM_BUF_ALT_TH_VAL;
688
689 //uint:Byte
690 Asm_Infor[core].buf_size = size_64bytes_aligned;
691 Asm_Infor[core].buf_read_ptr = addr;
692 Asm_Infor[core].buf_write_ptr = addr;
693
694 ASM_SET_LOG_BUF_BASEADDR(core, Asm_Infor[core].buf_base_address);
695 ASM_SET_LOG_BUF_SIZE(core, Asm_Infor[core].buf_size);
696 ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
697 ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
698 ASM_SET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
699
700
701 return ASM_ERROR_CODE_NO_ERROR;
702}
703
704/*************************************************************************
705* FUNCTION
706* ASM_GetBufferSettingSize
707*
708* DESCRIPTION
709* Get ASM EMI buffer setting size
710*
711* PARAMETERS
712*
713* kal_uint32 core : core number
714*
715* RETURNS
716*
717* kal_uint32 : buffer setting size
718*
719*************************************************************************/
720kal_uint32 ASM_GetBufferSettingSize(kal_uint32 core)
721{
722 return (Asm_Infor[core].buf_size);
723}
724
725/*************************************************************************
726* FUNCTION
727* ASM_GetBufferWrapCnt
728*
729* DESCRIPTION
730* Get ASM EMI buffer wrap count
731*
732* PARAMETERS
733*
734* kal_uint32 core : core number
735*
736* RETURNS
737*
738* kal_uint32 : ASM wrap count
739*
740*************************************************************************/
741kal_uint32 ASM_GetBufferWrapCnt(kal_uint32 core)
742{
743 ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
744
745 return (Asm_Infor[core].wrap_cnt);
746}
747
748
749/*************************************************************************
750* FUNCTION
751* ASM_GetSRAMWaterLevel
752*
753* DESCRIPTION
754* Get ASM SRAM water level
755*
756* PARAMETERS
757*
758* kal_uint32 core : core number
759*
760* RETURNS
761*
762* kal_uint32 : ASM water level
763*
764*************************************************************************/
765kal_uint32 ASM_GetSRAMWaterLevel(kal_uint32 core)
766{
767 ASM_GET_SRAM_MAX_WATER(core,Asm_Infor[core].water_level);
768
769 return (Asm_Infor[core].water_level);
770}
771
772/*************************************************************************
773* FUNCTION
774* ASM_ClearBufferData
775*
776* DESCRIPTION
777* Set EMI buffer initial value 0xFFFFFFFF
778*
779* PARAMETERS
780*
781* kal_uint32 core : core number
782*
783* RETURNS
784*
785*************************************************************************/
786void ASM_ClearBufferData(kal_uint32 core)
787{
788
789 kal_uint8* ptr;
790 ptr = (kal_uint8*)Asm_Infor[core].buf_base_address;
791 memset(ptr,0xFF,Asm_Infor[core].buf_size);
792
793
794}
795
796
797/*************************************************************************
798* FUNCTION
799* ASM_GetBufBaseAddr
800*
801* DESCRIPTION
802* Get EMI buffer base address
803*
804* PARAMETERS
805*
806* kal_uint32 core : core number
807*
808* RETURNS
809* Buffer Base address
810*
811*************************************************************************/
812kal_uint32 ASM_GetBufBaseAddr(kal_uint32 core)
813{
814 return Asm_Infor[core].buf_base_address;
815}
816
817/*************************************************************************
818* FUNCTION
819* ASM_Address2Offset
820*
821* DESCRIPTION
822* Tramsfer reasd/write Address to Offset
823*
824* PARAMETERS
825*
826* RETURNS
827*
828*************************************************************************/
829void ASM_Address2Offset(kal_uint32 core,kal_uint32* addr_ptr)
830{
831 kal_uint32 base_addr;
832 base_addr = ASM_GetBufBaseAddr(core);
833
834 *addr_ptr = (*addr_ptr - base_addr)/4;
835}
836
837/*************************************************************************
838* FUNCTION
839* ASM_Offset2Address
840*
841* DESCRIPTION
842* Tramsfer reasd/write Offset to Address
843*
844* PARAMETERS
845*
846* RETURNS
847*
848*************************************************************************/
849void ASM_Offset2Address(kal_uint32 core,kal_uint32* addr_ptr)
850{
851 kal_uint32 base_addr;
852 base_addr = ASM_GetBufBaseAddr(core);
853
854 *addr_ptr = base_addr+((*addr_ptr)*4);
855}
856
857
858/*************************************************************************
859* FUNCTION
860* ASM_GetBufReadWritePtr
861*
862* DESCRIPTION
863* Get EMI buffer read/write pointer
864*
865* PARAMETERS
866*
867* kal_uint32 core : core number
868* kal_uint32* rd_ptr : buffer read pointer
869* kal_uint32* wr_ptr : buffer write pointer
870*
871* RETURNS
872*
873*
874*************************************************************************/
875void ASM_GetBufReadWritePtr(kal_uint32 core,kal_uint32* rd_ptr, kal_uint32* wr_ptr)
876{
877 ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
878 ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
879
880 *rd_ptr = Asm_Infor[core].buf_read_ptr;
881 *wr_ptr = Asm_Infor[core].buf_write_ptr;
882}
883
884/*************************************************************************
885* FUNCTION
886* ASM_GetBufReadWriteAddress
887*
888* DESCRIPTION
889* Get EMI buffer read/write pointer
890*
891* PARAMETERS
892*
893* kal_uint32 core : core number
894* kal_uint32* rd_ptr : buffer read address (unit: byte)
895* kal_uint32* wr_ptr : buffer write pointer (unit:byte)
896* kal_uint32* remain_size : buffer remain_size (unit:byte)
897*
898* RETURNS
899*
900*
901*************************************************************************/
902ASM_ERROR_CODE ASM_GetBufReadWriteAddress(kal_uint32 core,kal_uint32* rd_addr, kal_uint32* wr_addr,kal_uint32* remain_size)
903{
904 kal_uint32 rd_ptr;
905 kal_uint32 wr_ptr;
906 kal_uint32 remain_ptr;
907
908
909
910 ASM_GET_BUF_RD_PTR(core,rd_ptr);
911 ASM_GET_BUF_WR_PTR(core,wr_ptr);
912 ASM_GET_REM_LOG_BUF_SIZE(core,remain_ptr);
913
914
915 if((Asm_Infor[core].buf_base_address <= rd_ptr) && (rd_ptr != 0))
916 {
917 *rd_addr = (rd_ptr - Asm_Infor[core].buf_base_address);
918 Asm_Infor[core].buf_read_ptr = rd_ptr;
919 }
920 else
921 {
922 *rd_addr = 0;
923 return ASM_ERROR_CODE_INVALID_RW_POINTER;
924 }
925
926 if((Asm_Infor[core].buf_base_address <= wr_ptr) && (wr_ptr != 0))
927 {
928 *wr_addr = (wr_ptr - Asm_Infor[core].buf_base_address);
929 Asm_Infor[core].buf_write_ptr = wr_ptr;
930
931 *remain_size = (remain_ptr*4);
932 Asm_Infor[core].buf_remain_size = remain_ptr;
933 }
934 else
935 {
936 *wr_addr = 0;
937 *remain_size = 0;
938 return ASM_ERROR_CODE_INVALID_RW_POINTER;
939 }
940
941 return ASM_ERROR_CODE_NO_ERROR;
942
943}
944/*************************************************************************
945* FUNCTION
946* ASM_GetOutputDataSize
947*
948* DESCRIPTION
949* Get EMI buffer read/write pointer then return data size
950*
951* PARAMETERS
952*
953* kal_uint32 core : core number
954*
955* RETURNS
956* kal_uint32 : data size(words)
957*
958*************************************************************************/
959kal_uint32 ASM_GetOutputDataSize(kal_uint32 core)
960{
961 ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
962 ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
963
964 if(Asm_Infor[core].buf_read_ptr > Asm_Infor[core].buf_write_ptr)
965 {
966 return(Asm_Infor[core].buf_size -(Asm_Infor[core].buf_read_ptr- Asm_Infor[core].buf_write_ptr));
967 }
968 else
969 {
970 return(Asm_Infor[core].buf_write_ptr - Asm_Infor[core].buf_read_ptr);
971 }
972}
973
974/*************************************************************************
975* FUNCTION
976* ASM_GetBufReadPtr
977*
978* DESCRIPTION
979* Get EMI buffer read pointer
980*
981* PARAMETERS
982*
983* kal_uint32 core : core number
984*
985* RETURNS
986* read pointer
987*
988*************************************************************************/
989kal_uint32 ASM_GetBufReadPtr(kal_uint32 core)
990{
991 ASM_GET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
992 kal_uint32 addr = Asm_Infor[core].buf_read_ptr;
993 ASM_Address2Offset(core,&addr);
994 return addr;
995}
996
997/*************************************************************************
998* FUNCTION
999* ASM_GetBufWritePtr
1000*
1001* DESCRIPTION
1002* Get EMI buffer write pointer
1003*
1004* PARAMETERS
1005*
1006* kal_uint32 core : core number
1007*
1008* RETURNS
1009* write pointer
1010*
1011*************************************************************************/
1012kal_uint32 ASM_GetBufWritePtr(kal_uint32 core)
1013{
1014 ASM_GET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
1015 kal_uint32 addr = Asm_Infor[core].buf_write_ptr;
1016 ASM_Address2Offset(core,&addr);
1017
1018 return addr;
1019}
1020
1021
1022
1023/*************************************************************************
1024* FUNCTION
1025* ASM_GetPDICnt
1026*
1027* DESCRIPTION
1028* Get PDI count
1029*
1030* PARAMETERS
1031*
1032* kal_uint32 core : core number
1033*
1034* RETURNS
1035*
1036* kal_uint32 : PDI count
1037*
1038*************************************************************************/
1039kal_uint32 ASM_GetPDICnt(kal_uint32 core)
1040{
1041 ASM_GET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);
1042 return Asm_Infor[core].pdi_cnt;
1043}
1044
1045
1046/*************************************************************************
1047* FUNCTION
1048* ASM_UpdateBufReadPtr
1049*
1050* DESCRIPTION
1051* Update EMI buffer read pointer
1052*
1053* PARAMETERS
1054*
1055* kal_uint32 core : core number
1056* kal_uint32 rd_ptr : read pointer to update(unit: word)
1057*
1058* RETURNS
1059*
1060*************************************************************************/
1061void ASM_UpdateBufReadPtr(kal_uint32 core,kal_uint32 rd_ptr)
1062{
1063 ASM_Offset2Address(core,&rd_ptr);
1064
1065 Asm_Infor[core].buf_read_ptr = rd_ptr;
1066
1067 ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
1068
1069}
1070
1071/*************************************************************************
1072* FUNCTION
1073* ASM_UpdateBufReadAddress
1074*
1075* DESCRIPTION
1076* Update EMI buffer read address
1077*
1078* PARAMETERS
1079*
1080* kal_uint32 core : core number
1081* kal_uint32 addr : read address to update(unit:byte)
1082*
1083* RETURNS
1084*
1085*************************************************************************/
1086void ASM_UpdateBufReadAddress(kal_uint32 core,kal_uint32 addr)
1087{
1088 addr += Asm_Infor[core].buf_base_address;
1089
1090 Asm_Infor[core].buf_read_ptr = addr;
1091
1092 ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
1093
1094}
1095
1096/*************************************************************************
1097* FUNCTION
1098* ASM_GetBufferInfor
1099*
1100* DESCRIPTION
1101* Update EMI buffer read pointer
1102*
1103* PARAMETERS
1104*
1105* kal_uint32 core : core number
1106* kal_uint32 addr : ASM EMI base address (unit:byte)
1107* kal_uint32 size : ASM EMI buffer size(unit:byte)
1108* kal_uint32 read_addr : read address (unit:byte)
1109* kal_uint32 write_addr : write address (unit:byte)
1110*
1111* RETURNS
1112*
1113*************************************************************************/
1114void ASM_GetBufferInfor(kal_uint32 core,kal_uint32* addr, kal_uint32* size, kal_uint32* read_addr, kal_uint32* write_addr)
1115{
1116 kal_uint32 remain_size;
1117 ASM_GetBufReadWriteAddress(core,read_addr,write_addr,&remain_size);
1118 *size = Asm_Infor[core].buf_size;
1119 *addr = Asm_Infor[core].buf_base_address;
1120
1121}
1122
1123/*************************************************************************
1124* FUNCTION
1125* ASM_RestoreBufferSetting
1126*
1127* DESCRIPTION
1128* Restore ASM EMI buffer setting to ASM register
1129*
1130* PARAMETERS
1131*
1132* kal_uint32 core : core number
1133*
1134* RETURNS
1135*
1136*************************************************************************/
1137void ASM_RestoreBufferSetting(kal_uint32 core)
1138{
1139 ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
1140 ASM_SET_LOG_BUF_BASEADDR(core,Asm_Infor[core].buf_base_address);
1141 ASM_SET_LOG_BUF_SIZE(core,Asm_Infor[core].buf_size);
1142 ASM_SET_BUF_RD_PTR(core,Asm_Infor[core].buf_read_ptr);
1143 ASM_SET_BUF_WR_PTR(core,Asm_Infor[core].buf_write_ptr);
1144
1145}
1146
1147
1148/*************************************************************************
1149* FUNCTION
1150* ASM_SaveBufferSetting
1151*
1152* DESCRIPTION
1153* Get then save buffer setting
1154*
1155* PARAMETERS
1156*
1157* kal_uint32 core : core number
1158*
1159* RETURNS
1160*
1161*************************************************************************/
1162void ASM_SaveBufferSetting(kal_uint32 core)
1163{
1164//only need to get latest read/write pointer
1165 ASM_GetBufReadPtr(core);
1166 ASM_GetBufWritePtr(core);
1167 ASM_GET_REM_LOG_BUF_SIZE(core,Asm_Infor[core].buf_remain_size);
1168}
1169
1170/*************************************************************************
1171* FUNCTION
1172* ASM_SaveSramSetting
1173*
1174* DESCRIPTION
1175* Get and save sram setting
1176*
1177* PARAMETERS
1178*
1179* kal_uint32 core : core number
1180*
1181* RETURNS
1182*
1183*
1184*************************************************************************/
1185void ASM_SaveSramSetting(kal_uint32 core)
1186{
1187 ASM_GET_SRAM_STATUS(core,Asm_Infor[core].sram_status);
1188 ASM_GET_SRAM_MAX_BUF_SIZE(core,Asm_Infor[core].sram_max_buf_size);
1189}
1190
1191/*************************************************************************
1192* FUNCTION
1193* ASM_RestoreSramSetting
1194*
1195* DESCRIPTION
1196* Set ASM sram read pointer
1197*
1198* PARAMETERS
1199*
1200* kal_uint32 core : core number
1201*
1202* RETURNS
1203*
1204*
1205*************************************************************************/
1206void ASM_RestoreSramSetting(kal_uint32 core)
1207{
1208 ASM_SET_SRAM_STATUS(core,Asm_Infor[core].sram_status);
1209 ASM_SET_SRAM_MAX_BUF_SIZE(core,Asm_Infor[core].sram_max_buf_size);
1210
1211}
1212
1213/*************************************************************************
1214* FUNCTION
1215* ASM_RestoreAddon
1216*
1217* DESCRIPTION
1218* Restore Addon setting to ASM
1219*
1220* PARAMETERS
1221*
1222* kal_uint32 core : core number
1223*
1224* RETURNS
1225*
1226*
1227*************************************************************************/
1228void ASM_RestoreAddon(kal_uint32 core)
1229{
1230 kal_uint32 index,tc, tc_num;
1231 volatile kal_uint32 *extra_addon_info_base_addr;
1232
1233 tc_num = ASM_TC_NUM;
1234#if defined(MT6763) || defined(MT6739)
1235 //For ASM GCR is overlapped with CIRQ
1236 if(ASM_CORE0 == core)
1237 {
1238 tc_num = 3;
1239 }
1240#endif //#if defined(MT6763)
1241
1242 for( tc = 0 ; tc < tc_num ; tc++ )
1243 {
1244 extra_addon_info_base_addr = (kal_uint32 *)ASM_GCR_PROFILE_ADDON_INFO_(core,tc);
1245
1246 for( index = 0 ; index < ASM_ADDON_NUM ; index++ )
1247 {
1248 if(Asm_Infor[core].profile_en&(1 << (index+ASM_ADDON_INFO0_EN)))
1249 *(extra_addon_info_base_addr+index) = Asm_Infor[core].addon[tc][index];
1250 }
1251 }
1252
1253}
1254
1255
1256/*************************************************************************
1257* FUNCTION
1258* ASM_SaveContextID
1259*
1260* DESCRIPTION
1261* Save TC context ID
1262*
1263* PARAMETERS
1264*
1265* kal_uint32 core : core number
1266*
1267* RETURNS
1268*
1269*
1270*************************************************************************/
1271void ASM_SaveContextID(kal_uint32 core)
1272{
1273 kal_uint32 tc_index;
1274
1275 for( tc_index = 0 ; tc_index < ASM_TC_NUM ; tc_index++ )
1276 {
1277 ASM_GET_TC_CONTEXT_ID(core,tc_index,Asm_Infor_context_id[core][tc_index]);
1278 }
1279
1280}
1281
1282/*************************************************************************
1283* FUNCTION
1284* ASM_RestoreContextID
1285*
1286* DESCRIPTION
1287* Restore TC context ID to ASM
1288*
1289* PARAMETERS
1290*
1291* kal_uint32 core : core number
1292*
1293* RETURNS
1294*
1295*
1296*************************************************************************/
1297void ASM_RestoreContextID(kal_uint32 core)
1298{
1299 kal_uint32 tc;
1300
1301
1302 for( tc = 0 ; tc < ASM_TC_NUM ; tc++ )
1303 {
1304 ASM_SET_GCR_TC_CONTEXT_ID(core,tc,Asm_Infor_context_id[core][tc]);
1305 }
1306
1307}
1308
1309/*************************************************************************
1310* FUNCTION
1311* ASM_SetBufferThresholdValue
1312*
1313* DESCRIPTION
1314* Set ASM buffer threshold value
1315*
1316* PARAMETERS
1317*
1318* kal_uint32 core : core number
1319* kal_uint32 val : threhold value
1320*
1321* RETURNS
1322*
1323*
1324*************************************************************************/
1325void ASM_SetBufferThresholdValue(kal_uint32 core,kal_uint32 val)
1326{
1327 Asm_Infor[core].thresh_value = val;
1328
1329 ASM_SET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
1330
1331}
1332
1333/*************************************************************************
1334* FUNCTION
1335* ASM_GetBufferThresholdValue
1336*
1337* DESCRIPTION
1338* Get ASM buffer threshold value
1339*
1340* PARAMETERS
1341*
1342* kal_uint32 core : core number
1343*
1344* RETURNS
1345*
1346* kal_uint32 val : threhold value
1347*
1348*************************************************************************/
1349kal_uint32 ASM_GetBufferThresholdValue(kal_uint32 core)
1350{
1351 ASM_GET_BUF_ALT_THRESH(core,Asm_Infor[core].thresh_value);
1352 return Asm_Infor[core].thresh_value;
1353}
1354
1355
1356
1357/*************************************************************************
1358* FUNCTION
1359* ASM_SaveConfigForSPM
1360*
1361* DESCRIPTION
1362* Save register for SPM
1363*
1364* PARAMETERS
1365*
1366* kal_uint32 core : core number
1367*
1368* RETURNS
1369*
1370*************************************************************************/
1371void ASM_SaveConfigForSPM(kal_uint32 core)
1372{
1373 Asm_Infor[core].spm_set++;
1374
1375 if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
1376 {
1377 Asm_Infor[core].asm_is_enabled = 1;
1378
1379 ASM_SetSPMAndWaitSMPGrant(core);
1380
1381 ASM_SaveBufferSetting(core);
1382 ASM_SaveSramSetting(core);
1383 //ASM_SaveContextID(core);
1384
1385 ASM_GET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
1386 ASM_GET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);
1387
1388 //to avoid ASM is not power down, that will cause ASM be lock
1389 ASM_SPM_Reset(core);
1390
1391
1392 }
1393}
1394
1395
1396/*************************************************************************
1397* FUNCTION
1398* ASM_SaveCoreConfigForSPM
1399*
1400* DESCRIPTION
1401* Save register for SPM
1402*
1403* PARAMETERS
1404*
1405* kal_uint32 core : core number
1406*
1407* RETURNS
1408*
1409*************************************************************************/
1410void ASM_SaveCoreConfigForSPM(void)
1411{
1412
1413 kal_uint32 core = kal_get_current_core_id();
1414
1415 ASM_SaveConfigForSPM(core);
1416
1417}
1418
1419
1420/*************************************************************************
1421* FUNCTION
1422* ASM_SaveConfigForSPM_AllCore
1423*
1424* DESCRIPTION
1425* Save all ASM for SPM
1426*
1427* PARAMETERS
1428*
1429*
1430* RETURNS
1431*
1432*************************************************************************/
1433void ASM_SaveConfigForSPM_AllCore(void)
1434{
1435 kal_uint32 core;
1436
1437 for(core = 0; core < ASM_NUM; core++)
1438 ASM_SaveConfigForSPM(core);
1439}
1440
1441/*************************************************************************
1442* FUNCTION
1443* ASM_WaitSMPGrant
1444*
1445* DESCRIPTION
1446* Wait ASM SPM Grant
1447*
1448* PARAMETERS
1449*
1450* kal_uint32 core : core number
1451*
1452* RETURNS
1453* read address
1454*
1455*************************************************************************/
1456void ASM_SetSPMAndWaitSMPGrant(kal_uint32 core)
1457{
1458 kal_uint32 grant = 0;
1459 kal_uint32 wait_cnt = 0;
1460
1461 ASM_SET_SPM_REQ(core,1);
1462
1463 do
1464 {
1465 ASM_GET_SPM_GRANT(core,grant);
1466 wait_cnt++;
1467 }while((grant == 0) &&(wait_cnt < 10));
1468
1469// if(wait_cnt > 1)
1470// MSG(MSG_ERR,"[core %d]Wait for Grant fail count %d\r\n",core,wait_cnt);
1471}
1472
1473/*************************************************************************
1474* FUNCTION
1475* ASM_RestoreConfigforSPM
1476*
1477* DESCRIPTION
1478* Restore ASM after SPM
1479*
1480* PARAMETERS
1481*
1482* kal_uint32 core : core number
1483*
1484* RETURNS
1485* read address
1486*
1487*************************************************************************/
1488void ASM_RestoreConfigforSPM(kal_uint32 core)
1489{
1490 if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
1491 {
1492 ASM_SET_PROFILE_EN(core,Asm_Infor[core].profile_en);
1493
1494 ASM_RestoreBufferSetting(core);
1495 ASM_RestoreSramSetting(core);
1496
1497 if(Asm_Infor[core].asm_mode > ASM_HW_SWLA_WRAP_MODE)
1498 {
1499 ASM_SET_TRACER_SAMPLE_RATE(core,Asm_Infor[core].sample_rate);
1500// if(Asm_Infor[core].swtr_header != ASM_HW_SWTR_HEADER_VAL)
1501// {
1502// ASM_SET_TR_HEAD(core,Asm_Infor[core].swtr_header);
1503// }
1504 }
1505
1506 if(Asm_Infor[core].pdi_cnt)
1507 {
1508 ASM_SET_PDI_CNT(core,Asm_Infor[core].pdi_cnt);
1509 }
1510
1511 if(Asm_Infor[core].wrap_cnt)
1512 {
1513 ASM_SET_WRAP_CNT(core,Asm_Infor[core].wrap_cnt);
1514 }
1515
1516 if(Asm_Infor[core].axi_config != ASM_AXI_CONFIG_DEFAULT_VAL)
1517 {
1518 ASM_SET_AXI_CONFIG(core,Asm_Infor[core].axi_config);
1519 }
1520
1521 ASM_SET_MODE_CONFIG(core,Asm_Infor[core].mode_config);
1522 ASM_SET_L2IMCR(core,Asm_Infor[core].int_en);
1523
1524 ASM_RestoreAddon(core);
1525 ASM_RestoreContextID(core);
1526
1527 //clear SPM REQ
1528 ASM_SET_SPM_REQ(core,0);
1529
1530 ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
1531
1532 Asm_Infor[core].asm_is_enabled = 0;
1533
1534
1535 }
1536}
1537
1538
1539/*************************************************************************
1540* FUNCTION
1541* ASM_RestoreCoreConfigforSPM
1542*
1543* DESCRIPTION
1544* Restore ASM after SPM
1545*
1546* PARAMETERS
1547*
1548* kal_uint32 core : core number
1549*
1550* RETURNS
1551* read address
1552*
1553*************************************************************************/
1554void ASM_RestoreCoreConfigforSPM(void)
1555{
1556
1557 kal_uint32 core = kal_get_current_core_id();
1558
1559 ASM_RestoreConfigforSPM(core);
1560
1561}
1562
1563
1564/*************************************************************************
1565* FUNCTION
1566* ASM_RestoreConfigforSPM_AllCore
1567*
1568* DESCRIPTION
1569* Save all ASM for SPM
1570*
1571* PARAMETERS
1572*
1573*
1574* RETURNS
1575*
1576*************************************************************************/
1577void ASM_RestoreConfigforSPM_AllCore(void)
1578{
1579 kal_uint32 core;
1580
1581 for(core = 0; core < ASM_NUM; core++)
1582 ASM_RestoreConfigforSPM(core);
1583}
1584/*************************************************************************
1585* FUNCTION
1586* ASM_SetProfileFilter
1587*
1588* DESCRIPTION
1589* Set profile option
1590*
1591* PARAMETERS
1592*
1593* kal_uint32 core : core number
1594* kal_uint32 option : enable profile option
1595*
1596* RETURNS
1597*
1598*
1599*************************************************************************/
1600
1601void ASM_SetProfileFilter(kal_uint32 core,kal_uint32 option )
1602{
1603 Asm_Infor[core].profile_en = option;
1604
1605//ELM can not pause now, and this enable bit will keep ELM running
1606// if(option & ASM_MCU_ELM_OPTION_MASK)
1607// {
1608// Asm_Infor[core].gen_config |= ASM_MCU_ELM_EN_MASK;
1609// }
1610
1611
1612 ASM_SET_PROFILE_EN(core,Asm_Infor[core].profile_en);
1613}
1614
1615
1616/*************************************************************************
1617* FUNCTION
1618* ASM_SWTRSetSampleRate
1619*
1620* DESCRIPTION
1621* Set SWTR mode sampling rate
1622*
1623* PARAMETERS
1624*
1625* kal_uint32 core : core number
1626* kal_uint32 sample_rate : sampling rate
1627*
1628* RETURNS
1629*
1630* ASM_ERROR_CODE
1631*
1632*************************************************************************/
1633
1634ASM_ERROR_CODE ASM_SWTRSetSampleRate(kal_uint32 core,kal_uint32 sample_rate)
1635{
1636 if(sample_rate == 0)
1637 return ASM_ERROR_CODE_INVALID_SAMPLE_RATE;
1638
1639 Asm_Infor[core].sample_rate = sample_rate;
1640
1641 ASM_SET_TRACER_SAMPLE_RATE(core,sample_rate);
1642
1643 return ASM_ERROR_CODE_NO_ERROR;
1644}
1645
1646
1647/*************************************************************************
1648* FUNCTION
1649* ASM_InitSetting
1650*
1651* DESCRIPTION
1652* Set ASM Mode Config
1653*
1654* PARAMETERS
1655*
1656* kal_uint32 core : core number
1657* kal_uint32 mode : ASM mode
1658* kal_uint32* buffer : Buffer pointer
1659* kal_uint32 buffer_size : Buffer size
1660* kal_uint32 option_en : option enabled
1661* kal_uint32 sampling_rate : SWTR sample rate
1662*
1663* RETURNS
1664*
1665* ASM_ERROR_CODE
1666*
1667*************************************************************************/
1668ASM_ERROR_CODE ASM_InitSetting(kal_uint32 core,kal_uint32 mode, kal_uint32 *buffer,kal_uint32 buffer_size,kal_uint32 option_en,kal_uint32 sampling_rate)
1669{
1670 ASM_ERROR_CODE error_code = ASM_ERROR_CODE_NO_ERROR;
1671
1672 Asm_Infor[core].start_time = ust_get_current_time();
1673
1674 ASM_Reset(core);
1675
1676 error_code = ASM_InitBuffer(core,(kal_uint32)buffer,buffer_size);
1677 if(error_code != ASM_ERROR_CODE_NO_ERROR)
1678 return error_code;
1679
1680 error_code = ASM_SetMode(core,mode);
1681 if(error_code != ASM_ERROR_CODE_NO_ERROR)
1682 return error_code;
1683
1684 if(Asm_Infor[core].asm_mode > ASM_HW_SWLA_WRAP_MODE)
1685 {
1686 error_code = ASM_SWTRSetSampleRate(core,sampling_rate);
1687 if(error_code != ASM_ERROR_CODE_NO_ERROR)
1688 return error_code;
1689
1690 }
1691
1692 ASM_SetProfileFilter(core,option_en);
1693
1694 ASM_EnablePDI(core);
1695
1696 ASM_DisableApbWrite(core);
1697
1698// ASM_SET_GEN_CONFIG(core,Asm_Infor_gen_config[core]);
1699
1700 Asm_Infor_trigger_cnt[core] = 0;
1701
1702 ASM_AckAllIntStatus(core);
1703
1704 if(ASM_WRAP_MODE_EN&Asm_Infor[core].mode_config)
1705 {
1706 ASM_McuCoreIntIRQMask(core);
1707 }
1708 else
1709 {
1710 ASM_McuCoreIntIRQUnMask(core);
1711 }
1712
1713 Asm_Infor[core].axi_config = ASM_AXI_CONFIG_DEFAULT_VAL;
1714
1715 return error_code;
1716
1717}
1718
1719
1720
1721/*************************************************************************
1722* FUNCTION
1723* ASM_SetTCContextID
1724*
1725* DESCRIPTION
1726* ASM context ID by core and TC
1727*
1728* PARAMETERS
1729*
1730* kal_uint32 core : core number
1731* kal_uint32 tc : tc number
1732* kal_uint32 id : context id
1733*
1734* RETURNS
1735*
1736*************************************************************************/
1737
1738void ASM_SetTCContextID(kal_uint32 core, kal_uint32 tc,kal_uint32 id)
1739{
1740 Asm_Infor_context_id[core][tc] = id;
1741 ASM_SET_GCR_TC_CONTEXT_ID(core,tc,Asm_Infor_context_id[core][tc]);
1742
1743}
1744
1745
1746
1747/*************************************************************************
1748* FUNCTION
1749* ASM_BufferIsWrap
1750*
1751* DESCRIPTION
1752* Check buffer Wrap
1753*
1754* PARAMETERS
1755*
1756* kal_uint32 core : core number
1757*
1758* RETURNS
1759*
1760*************************************************************************/
1761
1762kal_bool ASM_BufferIsWrap(kal_uint32 core)
1763{
1764 ASM_GetBufferWrapCnt(core);
1765
1766 if(Asm_Infor[core].wrap_cnt)
1767 {
1768 return KAL_TRUE;
1769 }
1770 else
1771 {
1772 return KAL_FALSE;
1773 }
1774}
1775
1776/*************************************************************************
1777* FUNCTION
1778* ASM_SetIntEnable
1779*
1780* DESCRIPTION
1781* Set ASM Imterrupter enable
1782*
1783* PARAMETERS
1784*
1785* kal_uint32 core : core number
1786* ASM_INT_TYPE : asm interrupter id
1787*
1788* RETURNS
1789*
1790*
1791*************************************************************************/
1792void ASM_SetIntEnable(kal_uint32 core,ASM_INT_TYPE int_id)
1793{
1794 Asm_Infor[core].int_en |= (1 << int_id);
1795
1796 ASM_SET_L2IMCR(core,(1 << int_id));
1797}
1798
1799/*************************************************************************
1800* FUNCTION
1801* ASM_SetIntDisable
1802*
1803* DESCRIPTION
1804* Set ASM Imterrupter disable
1805*
1806* PARAMETERS
1807*
1808* kal_uint32 core : core number
1809* ASM_INT_TYPE : asm interrupter id
1810*
1811* RETURNS
1812*
1813*
1814*************************************************************************/
1815void ASM_SetIntDisable(kal_uint32 core,ASM_INT_TYPE int_id)
1816{
1817 Asm_Infor[core].int_en &= (~(1 << int_id));
1818
1819 ASM_SET_L2IMSR(core,(1 << int_id));
1820
1821}
1822
1823
1824/*************************************************************************
1825* FUNCTION
1826* ASM_McuCoreIQRMask
1827*
1828* DESCRIPTION
1829* Set ASM Mcu core interrupter Mask
1830*
1831* PARAMETERS
1832*
1833* kal_uint32 core : core number
1834* ASM_INT_TYPE irq : irq index
1835*
1836* RETURNS
1837*
1838*
1839*************************************************************************/
1840void ASM_McuCoreIQRMask(kal_uint32 core,ASM_INT_TYPE irq)
1841{
1842 ASM_SetIntDisable(core,irq);
1843}
1844
1845/*************************************************************************
1846* FUNCTION
1847* ASM_McuCoreIntIRQMask
1848*
1849* DESCRIPTION
1850* Set ASM Mcu core Int Mask
1851*
1852* PARAMETERS
1853*
1854* kal_uint32 core : core number
1855*
1856* RETURNS
1857*
1858*
1859*************************************************************************/
1860void ASM_McuCoreIntIRQMask(kal_uint32 core)
1861{
1862 ASM_McuCoreIQRMask(core,ASM_THRESHOLD_INT);
1863
1864}
1865
1866
1867/*************************************************************************
1868* FUNCTION
1869* ASM_McuCoreIntUnMask
1870*
1871* DESCRIPTION
1872* Set ASM Mcu core interrupter UmMask
1873*
1874* PARAMETERS
1875*
1876* kal_uint32 core : core number
1877* ASM_INT_TYPE irq : irq index
1878*
1879* RETURNS
1880*
1881*
1882*************************************************************************/
1883void ASM_McuCoreIRQUnMask(kal_uint32 core,ASM_INT_TYPE irq)
1884{
1885 ASM_SetIntEnable(core,irq);
1886}
1887
1888/*************************************************************************
1889* FUNCTION
1890* ASM_McuCoreIntAck
1891*
1892* DESCRIPTION
1893* Set ASM Mcu core interrupter ack
1894*
1895* PARAMETERS
1896*
1897* kal_uint32 core : core number
1898* ASM_INT_TYPE irq : irq index
1899*
1900* RETURNS
1901*
1902*
1903*************************************************************************/
1904void ASM_McuCoreIRQAck(kal_uint32 core,ASM_INT_TYPE irq)
1905{
1906 ASM_SET_L2ISAR(core,(1 << irq));
1907}
1908
1909
1910
1911
1912
1913/*************************************************************************
1914* FUNCTION
1915* ASM_McuCoreIntIRQUnMask
1916*
1917* DESCRIPTION
1918* Set ASM Mcu core Int UmMask
1919*
1920* PARAMETERS
1921*
1922* kal_uint32 core : core number
1923*
1924* RETURNS
1925*
1926*
1927*************************************************************************/
1928void ASM_McuCoreIntIRQUnMask(kal_uint32 core)
1929{
1930 ASM_McuCoreIRQUnMask(core,ASM_THRESHOLD_INT);
1931}
1932
1933/*************************************************************************
1934* FUNCTION
1935* ASM_McuCoreIntIRQAck
1936*
1937* DESCRIPTION
1938* Set ASM Mcu core Int ack
1939*
1940* PARAMETERS
1941*
1942* kal_uint32 core : core number
1943*
1944* RETURNS
1945*
1946*
1947*************************************************************************/
1948void ASM_McuCoreIntIRQAck(kal_uint32 core)
1949{
1950 ASM_McuCoreIRQAck(core,ASM_THRESHOLD_INT);
1951
1952}
1953
1954
1955/*************************************************************************
1956* FUNCTION
1957* ASM_McuIntIRQMask
1958*
1959* DESCRIPTION
1960* Set ASM Mcu int IRQ Mask
1961*
1962* PARAMETERS
1963*
1964* RETURNS
1965*
1966*
1967*************************************************************************/
1968void ASM_McuIntIRQMask(void)
1969{
1970 IRQMask(MD_IRQID_ABM_INT);
1971}
1972
1973
1974/*************************************************************************
1975* FUNCTION
1976* ASM_McuIntIRQUnMask
1977*
1978* DESCRIPTION
1979* Set ASM Mcu int IRQUnMask
1980*
1981* PARAMETERS
1982*
1983* RETURNS
1984*
1985*
1986*************************************************************************/
1987void ASM_McuIntIRQUnMask(void)
1988{
1989 IRQUnmask(MD_IRQID_ABM_INT);
1990}
1991
1992/*************************************************************************
1993* FUNCTION
1994* ASM_McuErrorIRQMask
1995*
1996* DESCRIPTION
1997* Set ASM Mcu error IRQ Mask
1998*
1999* PARAMETERS
2000*
2001* RETURNS
2002*
2003*
2004*************************************************************************/
2005void ASM_McuErrorIRQMask(void)
2006{
2007 IRQMask(MD_IRQID_ABM_ERROR_INT);
2008}
2009
2010
2011/*************************************************************************
2012* FUNCTION
2013* ASM_McuErrorUnMask
2014*
2015* DESCRIPTION
2016* Set ASM Mcu error IRQUnMask
2017*
2018* PARAMETERS
2019*
2020* RETURNS
2021*
2022*
2023*************************************************************************/
2024void ASM_McuErrorIRQUnMask(void)
2025{
2026 IRQUnmask(MD_IRQID_ABM_ERROR_INT);
2027}
2028
2029
2030
2031/*************************************************************************
2032* FUNCTION
2033* ASM_McuIntRegsterLISR
2034*
2035* DESCRIPTION
2036* reigster ASM mcu int IRQ LISR
2037*
2038* PARAMETERS
2039*
2040* void* reg_lisr : LISR callback
2041*
2042* RETURNS
2043*
2044*
2045*************************************************************************/
2046void ASM_McuIntRegsterLISR(void* reg_lisr)
2047{
2048 //IRQ_Register_LISR(MD_IRQID_ABM_INT, reg_lisr, "ASM MCU int lisr");
2049 //IRQSensitivity(MD_IRQID_ABM_INT, KAL_FALSE);
2050 IRQUnmask(MD_IRQID_ABM_INT);
2051}
2052
2053/*************************************************************************
2054* FUNCTION
2055* ASM_McuErrorRegsterLISR
2056*
2057* DESCRIPTION
2058* reigster ASM mcu error IRQ LISR
2059*
2060* PARAMETERS
2061*
2062* void* reg_lisr : LISR callback
2063*
2064* RETURNS
2065*
2066*
2067*************************************************************************/
2068void ASM_McuErrorRegsterLISR(void* reg_lisr)
2069{
2070 //IRQ_Register_LISR(MD_IRQID_ABM_ERROR_INT, reg_lisr, "ASM MCU error lisr");
2071 //IRQSensitivity(MD_IRQID_ABM_ERROR_INT, KAL_FALSE);
2072 IRQUnmask(MD_IRQID_ABM_ERROR_INT);
2073}
2074
2075
2076/*************************************************************************
2077* FUNCTION
2078* ASM_GetIntStatus
2079*
2080* DESCRIPTION
2081* Get ASM int status
2082*
2083* PARAMETERS
2084*
2085* kal_uint32 core : core number
2086*
2087* RETURNS
2088*
2089* kal_uint32 : interrupter status value
2090*
2091*************************************************************************/
2092kal_uint32 ASM_GetIntStatus(kal_uint32 core)
2093{
2094 ASM_GET_L2ISAR(core,Asm_Infor[core].int_status);
2095
2096 return Asm_Infor[core].int_status;
2097}
2098
2099/*************************************************************************
2100* FUNCTION
2101* ASM_AckAllIntStatus
2102*
2103* DESCRIPTION
2104* Ack ASM all interrupter
2105*
2106* PARAMETERS
2107*
2108* kal_uint32 core : core number
2109*
2110* RETURNS
2111*
2112*
2113*************************************************************************/
2114void ASM_AckAllIntStatus(kal_uint32 core)
2115{
2116 ASM_SET_L2ISAR(core,0x1F);
2117 ASM_GetIntStatus(core);
2118
2119}
2120
2121
2122
2123/*************************************************************************
2124* FUNCTION
2125* ASM_SendTrigger
2126*
2127* DESCRIPTION
2128* Send ASM trigger command
2129*
2130* PARAMETERS
2131*
2132* kal_uint32 core : core number
2133* kal_uint32 tc : tc number
2134*
2135* RETURNS
2136*
2137*
2138*************************************************************************/
2139void ASM_SendTrigger(kal_uint32 core,kal_uint32 tc)
2140{
2141 if(Asm_Infor_gen_config[core]&ASM_ENABLE_MASK)
2142 {
2143 ASM_SET_GCR_SWLA_TRIG(core,tc);
2144
2145 Asm_Infor_trigger_cnt[core]++;
2146 }
2147}
2148
2149
2150/*************************************************************************
2151* FUNCTION
2152* ASM_GetMcuIntStatusAndMask
2153*
2154* DESCRIPTION
2155* Get Top mcu int and mask status
2156*
2157* PARAMETERS
2158*
2159* kal_uint32* status: mcu interrupter status
2160* kal_uint32* mask: mcu interrupter mask status
2161*
2162* RETURNS
2163*
2164*
2165*************************************************************************/
2166void ASM_GetMcuIntStatusAndMask(kal_uint32* status,kal_uint32* mask)
2167{
2168 kal_uint32 val;
2169 ASM_GET_TOP_STATUS(val);
2170
2171 *status = (val&ASM_TOP_INT_STATUS_MASK) >> ASM_TOP_INT_STATUS_BIT;
2172 *mask = (val&ASM_TOP_INT_MASK_STATUS_MASK) >> ASM_TOP_INT_MASK_STATUS_BIT;
2173}
2174
2175
2176/*************************************************************************
2177* FUNCTION
2178* ASM_GetTcContextId
2179*
2180* DESCRIPTION
2181* Get tc context id
2182*
2183* PARAMETERS
2184*
2185* kal_uint32 core: core id
2186* kal_uint32 tc: tc id
2187*
2188* RETURNS
2189*
2190* kal_uint32 : context id
2191*
2192*************************************************************************/
2193kal_uint32 ASM_GetTcContextId(kal_uint32 core,kal_uint32 tc)
2194{
2195 kal_uint32 val;
2196 ASM_GET_TC_CONTEXT_ID(core,tc,val);
2197 return val;
2198}
2199
2200
2201
2202
2203/*************************************************************************
2204* FUNCTION
2205* ASM_SetDumpRegion
2206*
2207* DESCRIPTION
2208* Set ASM dump region
2209*
2210* PARAMETERS
2211*
2212*
2213* RETURNS
2214*
2215*
2216*************************************************************************/
2217void ASM_SetDumpRegion(void)
2218{
2219 /* bbreg dump setting */
2220#if 0
2221/* under construction !*/
2222/* under construction !*/
2223/* under construction !*/
2224/* under construction !*/
2225/* under construction !*/
2226/* under construction !*/
2227/* under construction !*/
2228/* under construction !*/
2229/* under construction !*/
2230/* under construction !*/
2231/* under construction !*/
2232/* under construction !*/
2233/* under construction !*/
2234/* under construction !*/
2235#endif
2236}
2237
2238
2239