@@ -429,6 +429,7 @@ pal_timer_create_info_table_dt(TIMER_INFO_TABLE *TimerTable)
429429 int i = 0 , frame_number = 0 ;
430430 int addr_cell , size_cell , index = 0 ;
431431 int interrupt_cell ;
432+ int num_interrupts ;
432433
433434 if (TimerTable == NULL )
434435 return ;
@@ -448,11 +449,11 @@ pal_timer_create_info_table_dt(TIMER_INFO_TABLE *TimerTable)
448449 TimerTable -> header .ns_el1_timer_gsiv = 0 ;
449450 TimerTable -> header .virtual_timer_gsiv = 0 ;
450451 TimerTable -> header .el2_timer_gsiv = 0 ;
451- TimerTable -> header .el2_virt_timer_gsiv = 0 ; /* NA in DT*/
452+ TimerTable -> header .el2_virt_timer_gsiv = 0 ;
452453 TimerTable -> header .s_el1_timer_flag = 0 ;
453454 TimerTable -> header .ns_el1_timer_flag = 0 ;
454455 TimerTable -> header .el2_timer_flag = 0 ;
455- TimerTable -> header .el2_virt_timer_flag = 0 ; /* NA in DT*/
456+ TimerTable -> header .el2_virt_timer_flag = 0 ;
456457 TimerTable -> header .virtual_timer_flag = 0 ;
457458
458459 /* Search for system timer , either V8 or V7 available*/
@@ -479,48 +480,108 @@ pal_timer_create_info_table_dt(TIMER_INFO_TABLE *TimerTable)
479480 acs_print (ACS_PRINT_ERR , L" PROPERTY interrupts offset %x, Error %d\n" , offset , prop_len );
480481 return ;
481482 }
483+ else {
484+ acs_print (ACS_PRINT_DEBUG , L" PROPERTY Interrupts Size %d\n" , prop_len );
485+ num_interrupts = prop_len /(interrupt_cell * 4 );
486+ acs_print (ACS_PRINT_DEBUG , L" No of interrupts defined in Property %d\n" , num_interrupts );
487+ }
482488
483489 if (interrupt_cell >= 3 ) { /* Interrupt type available*/
484- if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
485- TimerTable -> header .s_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
486- index ++ ; /* Skip interrupt flag*/
487- if (interrupt_cell == 4 )
488- index ++ ; /* Skip CPU affinity*/
489- if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
490- TimerTable -> header .ns_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
491- index ++ ; /* Skip interrupt flag*/
492- if (interrupt_cell == 4 )
493- index ++ ; /* Skip CPU affinity*/
494- if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
495- TimerTable -> header .virtual_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
496- index ++ ; /* Skip interrupt flag*/
497- if (interrupt_cell == 4 )
498- index ++ ; /* Skip CPU affinity*/
499- if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
500- TimerTable -> header .el2_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
501- index ++ ; /* Skip interrupt flag*/
502- if (interrupt_cell == 4 )
503- index ++ ; /* Skip CPU affinity*/
490+
491+ if (num_interrupts >= 1 ) {
492+ if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
493+ TimerTable -> header .s_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
494+ else {
495+ acs_print (ACS_PRINT_WARN , L" Secure EL1 Phy Timer interrupt Type is not PPI\n" );
496+ index ++ ;
497+ }
498+ index ++ ; /* Skip interrupt flag*/
499+ if (interrupt_cell == 4 )
500+ index ++ ; /* Skip CPU affinity*/
501+ }
502+
503+ if (num_interrupts >= 2 ) {
504+ if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
505+ TimerTable -> header .ns_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
506+ else {
507+ acs_print (ACS_PRINT_WARN , L" EL1 NS phy timer interrupt Type is not PPI\n" );
508+ index ++ ;
509+ }
510+ index ++ ; /* Skip interrupt flag*/
511+ if (interrupt_cell == 4 )
512+ index ++ ; /* Skip CPU affinity*/
513+ }
514+
515+ if (num_interrupts >= 3 ) {
516+ if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
517+ TimerTable -> header .virtual_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
518+ else {
519+ acs_print (ACS_PRINT_WARN , L" Virtual timer interrupt Type is not PPI\n" );
520+ index ++ ;
521+ }
522+ index ++ ; /* Skip interrupt flag*/
523+ if (interrupt_cell == 4 )
524+ index ++ ; /* Skip CPU affinity*/
525+ }
526+
527+ if (num_interrupts >= 4 ) {
528+ if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
529+ TimerTable -> header .el2_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
530+ else {
531+ acs_print (ACS_PRINT_WARN , L" EL2 NS phy timer interrupt Type is not PPI\n" );
532+ index ++ ;
533+ }
534+ index ++ ; /* Skip interrupt flag*/
535+ if (interrupt_cell == 4 )
536+ index ++ ; /* Skip CPU affinity*/
537+ }
538+
539+ if (num_interrupts >= 5 ) {
540+ if (fdt32_to_cpu (Pintr [index ++ ]) == GIC_PPI )
541+ TimerTable -> header .el2_virt_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]) + PPI_OFFSET ;
542+ else {
543+ acs_print (ACS_PRINT_WARN , L" EL2 Virtual timer interrupt Type is not PPI\n" );
544+ index ++ ;
545+ }
546+ index ++ ; /* Skip interrupt flag*/
547+ if (interrupt_cell == 4 )
548+ index ++ ; /* Skip CPU affinity*/
549+ }
504550 }
505551 else {
506- TimerTable -> header .s_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
507- index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
508- TimerTable -> header .ns_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
509- index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
510- TimerTable -> header .virtual_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
511- index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
512- TimerTable -> header .el2_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
552+ if (num_interrupts >= 1 ) {
553+ TimerTable -> header .s_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
554+ index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
555+ }
556+ if (num_interrupts >= 2 ) {
557+ TimerTable -> header .ns_el1_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
558+ index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
559+ }
560+ if (num_interrupts >= 3 ) {
561+ TimerTable -> header .virtual_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
562+ index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
563+ }
564+ if (num_interrupts >= 4 ) {
565+ TimerTable -> header .el2_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
566+ index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
567+ }
568+ if (num_interrupts >= 5 ) {
569+ TimerTable -> header .el2_virt_timer_gsiv = fdt32_to_cpu (Pintr [index ++ ]);
570+ index += (interrupt_cell - 1 ); /* Skip interrupt flag, if available*/
571+ }
513572 }
573+
514574 /* Get Always on property of timer node*/
515575 Palways_on = (UINT32 * )fdt_getprop_namelen ((void * )dt_ptr , offset , "always-on" , 9 , & prop_len );
516576 if (Palways_on != NULL ) {
517577 TimerTable -> header .s_el1_timer_flag = TIMER_FLAG_ALWAYS_ON ;
518578 TimerTable -> header .ns_el1_timer_flag = TIMER_FLAG_ALWAYS_ON ;
519579 TimerTable -> header .el2_timer_flag = TIMER_FLAG_ALWAYS_ON ;
520580 TimerTable -> header .virtual_timer_flag = TIMER_FLAG_ALWAYS_ON ;
581+ TimerTable -> header .el2_virt_timer_flag = TIMER_FLAG_ALWAYS_ON ;
521582 }
522583 else
523- acs_print (ACS_PRINT_DEBUG , L" PROPERTY always-on not found\n" );
584+ acs_print (ACS_PRINT_DEBUG , L" PROPERTY always-on not found\n" );
524585
525586 /* Search for mem mapped timers*/
526587 for (i = 0 ; i < sizeof (memtimer_dt_arr )/MEMTIMER_COMPATIBLE_STR_LEN ; i ++ ) {
0 commit comments