Skip to content

Commit 10b9bd4

Browse files
Merge pull request #8 from ajayswar-s/DT_Change
Handle EL2 virt interrupt for DT build
2 parents 13183c4 + d64d53e commit 10b9bd4

2 files changed

Lines changed: 92 additions & 40 deletions

File tree

pal/uefi_acpi/src/pal_timer_wd.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,6 @@ pal_timer_platform_override(TIMER_INFO_TABLE *TimerTable)
5151
TimerTable->gt_info[0].gsiv[0] = PLATFORM_OVERRIDE_PLATFORM_TIMER_GSIV;
5252
}
5353

54-
//GTDT does not have this information yet.
55-
if (PLATFORM_OVERRIDE_EL2_VIR_TIMER_GSIV) {
56-
TimerTable->header.el2_virt_timer_gsiv = PLATFORM_OVERRIDE_EL2_VIR_TIMER_GSIV;
57-
}
58-
5954
}
6055

6156
/**
@@ -149,12 +144,8 @@ pal_timer_create_info_table(TIMER_INFO_TABLE *TimerTable)
149144
virtualpl2 = &(gGtdtHdr->PlatformTimerOffset);
150145
TimerTable->header.el2_virt_timer_gsiv = *(++virtualpl2);
151146
TimerTable->header.el2_virt_timer_flag = *(++virtualpl2);
152-
if (TimerTable->header.el2_virt_timer_gsiv == 0) {
147+
if (TimerTable->header.el2_virt_timer_gsiv == 0)
153148
acs_print(ACS_PRINT_DEBUG, L" GTDT don't have el2 virt timer info\n");
154-
acs_print(ACS_PRINT_DEBUG, L" using bsa recommended value 28\n");
155-
TimerTable->header.el2_virt_timer_gsiv = PLATFORM_OVERRIDE_EL2_VIR_TIMER_GSIV;
156-
}
157-
158149
}
159150
else
160151
pal_timer_platform_override(TimerTable);

pal/uefi_dt/src/pal_timer_wd.c

Lines changed: 91 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)