lib: sbi: Detect AIA CSRs at boot-time
authorAnup Patel <apatel@ventanamicro.com>
Tue, 6 Apr 2021 07:36:47 +0000 (13:06 +0530)
committerAnup Patel <anup@brainfault.org>
Tue, 15 Feb 2022 15:02:42 +0000 (20:32 +0530)
We extend HART feature detection to discover AIA CSRs at boot-time.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
include/sbi/sbi_hart.h
lib/sbi/sbi_hart.c

index d2db9d6..a83b45b 100644 (file)
@@ -24,9 +24,11 @@ enum sbi_hart_features {
        SBI_HART_HAS_SSCOFPMF = (1 << 3),
        /** HART has timer csr implementation in hardware */
        SBI_HART_HAS_TIME = (1 << 4),
+       /** HART has AIA local interrupt CSRs */
+       SBI_HART_HAS_AIA = (1 << 5),
 
        /** Last index of Hart features*/
-       SBI_HART_HAS_LAST_FEATURE = SBI_HART_HAS_TIME,
+       SBI_HART_HAS_LAST_FEATURE = SBI_HART_HAS_AIA,
 };
 
 struct sbi_scratch;
index 36908b1..e028540 100644 (file)
@@ -301,6 +301,9 @@ static inline char *sbi_hart_feature_id2string(unsigned long feature)
        case SBI_HART_HAS_TIME:
                fstr = "time";
                break;
+       case SBI_HART_HAS_AIA:
+               fstr = "aia";
+               break;
        default:
                break;
        }
@@ -524,6 +527,14 @@ __mhpm_skip:
        csr_read_allowed(CSR_TIME, (unsigned long)&trap);
        if (!trap.cause)
                hfeatures->features |= SBI_HART_HAS_TIME;
+
+       /* Detect if hart has AIA local interrupt CSRs */
+       csr_read_allowed(CSR_MTOPI, (unsigned long)&trap);
+       if (trap.cause)
+               goto __aia_skip;
+       hfeatures->features |= SBI_HART_HAS_AIA;
+__aia_skip:
+       return;
 }
 
 int sbi_hart_reinit(struct sbi_scratch *scratch)