diff mbox series

[RFC,v2,4/4] lib: sbi: add SBI_EXT_PMU_IRQ_CLEAR

Message ID 20240109104500.2080121-5-cleger@rivosinc.com
State Changes Requested
Headers show
Series Add support for Supervisor Software Events extension | expand

Commit Message

Clément Léger Jan. 9, 2024, 10:44 a.m. UTC
Now that we have sse support for such interrupt, the IRQ can only be
cleared by the SBI. In some cases in S-mode OS, it might be needed to
clear the pending IRQ. Add SBI_EXT_PMU_IRQ_CLEAR ecall to clear such
IRQ.

NOTE: this is temporary until the counter delegation support from Atish
lands in Linux/OpenSBI.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
---
 include/sbi/sbi_ecall_interface.h | 1 +
 include/sbi/sbi_pmu.h             | 2 ++
 lib/sbi/sbi_ecall_pmu.c           | 3 +++
 3 files changed, 6 insertions(+)

Comments

Anup Patel Jan. 11, 2024, 11:12 a.m. UTC | #1
On Tue, Jan 9, 2024 at 4:15 PM Clément Léger <cleger@rivosinc.com> wrote:
>
> Now that we have sse support for such interrupt, the IRQ can only be
> cleared by the SBI. In some cases in S-mode OS, it might be needed to
> clear the pending IRQ. Add SBI_EXT_PMU_IRQ_CLEAR ecall to clear such
> IRQ.
>
> NOTE: this is temporary until the counter delegation support from Atish
> lands in Linux/OpenSBI.

Why not clear the PMU IRQ when supervisor software completes the
PMU SSE event ?

Regards,
Anup

>
> Signed-off-by: Clément Léger <cleger@rivosinc.com>
> ---
>  include/sbi/sbi_ecall_interface.h | 1 +
>  include/sbi/sbi_pmu.h             | 2 ++
>  lib/sbi/sbi_ecall_pmu.c           | 3 +++
>  3 files changed, 6 insertions(+)
>
> diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
> index a5f3edf..3815b42 100644
> --- a/include/sbi/sbi_ecall_interface.h
> +++ b/include/sbi/sbi_ecall_interface.h
> @@ -105,6 +105,7 @@
>  #define SBI_EXT_PMU_COUNTER_FW_READ    0x5
>  #define SBI_EXT_PMU_COUNTER_FW_READ_HI 0x6
>  #define SBI_EXT_PMU_SNAPSHOT_SET_SHMEM 0x7
> +#define SBI_EXT_PMU_IRQ_CLEAR          0x8
>
>  /** General pmu event codes specified in SBI PMU extension */
>  enum sbi_pmu_hw_generic_events_t {
> diff --git a/include/sbi/sbi_pmu.h b/include/sbi/sbi_pmu.h
> index c5b4e51..6bed6c9 100644
> --- a/include/sbi/sbi_pmu.h
> +++ b/include/sbi/sbi_pmu.h
> @@ -153,4 +153,6 @@ int sbi_pmu_ctr_incr_fw(enum sbi_pmu_fw_event_code_id fw_id);
>
>  void sbi_pmu_ovf_irq(struct sbi_trap_regs *regs);
>
> +void sbi_pmu_irq_clear(void);
> +
>  #endif
> diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c
> index 40a63a6..5b55eb5 100644
> --- a/lib/sbi/sbi_ecall_pmu.c
> +++ b/lib/sbi/sbi_ecall_pmu.c
> @@ -73,6 +73,9 @@ static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid,
>         case SBI_EXT_PMU_COUNTER_STOP:
>                 ret = sbi_pmu_ctr_stop(regs->a0, regs->a1, regs->a2);
>                 break;
> +       case SBI_EXT_PMU_IRQ_CLEAR:
> +               sbi_pmu_irq_clear();
> +               break;
>         case SBI_EXT_PMU_SNAPSHOT_SET_SHMEM:
>                 /* fallthrough as OpenSBI doesn't support snapshot yet */
>         default:
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
Clément Léger Jan. 12, 2024, 8:09 a.m. UTC | #2
On 11/01/2024 12:12, Anup Patel wrote:
> On Tue, Jan 9, 2024 at 4:15 PM Clément Léger <cleger@rivosinc.com> wrote:
>>
>> Now that we have sse support for such interrupt, the IRQ can only be
>> cleared by the SBI. In some cases in S-mode OS, it might be needed to
>> clear the pending IRQ. Add SBI_EXT_PMU_IRQ_CLEAR ecall to clear such
>> IRQ.
>>
>> NOTE: this is temporary until the counter delegation support from Atish
>> lands in Linux/OpenSBI.
> 
> Why not clear the PMU IRQ when supervisor software completes the
> PMU SSE event ?

Hi Anup,

Yeah indeed, I think I did that at a time when I did not had SSE events
callbacks on SBI side. I'll fix that and remove this.

Clément

> 
> Regards,
> Anup
> 
>>
>> Signed-off-by: Clément Léger <cleger@rivosinc.com>
>> ---
>>  include/sbi/sbi_ecall_interface.h | 1 +
>>  include/sbi/sbi_pmu.h             | 2 ++
>>  lib/sbi/sbi_ecall_pmu.c           | 3 +++
>>  3 files changed, 6 insertions(+)
>>
>> diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
>> index a5f3edf..3815b42 100644
>> --- a/include/sbi/sbi_ecall_interface.h
>> +++ b/include/sbi/sbi_ecall_interface.h
>> @@ -105,6 +105,7 @@
>>  #define SBI_EXT_PMU_COUNTER_FW_READ    0x5
>>  #define SBI_EXT_PMU_COUNTER_FW_READ_HI 0x6
>>  #define SBI_EXT_PMU_SNAPSHOT_SET_SHMEM 0x7
>> +#define SBI_EXT_PMU_IRQ_CLEAR          0x8
>>
>>  /** General pmu event codes specified in SBI PMU extension */
>>  enum sbi_pmu_hw_generic_events_t {
>> diff --git a/include/sbi/sbi_pmu.h b/include/sbi/sbi_pmu.h
>> index c5b4e51..6bed6c9 100644
>> --- a/include/sbi/sbi_pmu.h
>> +++ b/include/sbi/sbi_pmu.h
>> @@ -153,4 +153,6 @@ int sbi_pmu_ctr_incr_fw(enum sbi_pmu_fw_event_code_id fw_id);
>>
>>  void sbi_pmu_ovf_irq(struct sbi_trap_regs *regs);
>>
>> +void sbi_pmu_irq_clear(void);
>> +
>>  #endif
>> diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c
>> index 40a63a6..5b55eb5 100644
>> --- a/lib/sbi/sbi_ecall_pmu.c
>> +++ b/lib/sbi/sbi_ecall_pmu.c
>> @@ -73,6 +73,9 @@ static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid,
>>         case SBI_EXT_PMU_COUNTER_STOP:
>>                 ret = sbi_pmu_ctr_stop(regs->a0, regs->a1, regs->a2);
>>                 break;
>> +       case SBI_EXT_PMU_IRQ_CLEAR:
>> +               sbi_pmu_irq_clear();
>> +               break;
>>         case SBI_EXT_PMU_SNAPSHOT_SET_SHMEM:
>>                 /* fallthrough as OpenSBI doesn't support snapshot yet */
>>         default:
>> --
>> 2.43.0
>>
>>
>> --
>> opensbi mailing list
>> opensbi@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/opensbi
diff mbox series

Patch

diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
index a5f3edf..3815b42 100644
--- a/include/sbi/sbi_ecall_interface.h
+++ b/include/sbi/sbi_ecall_interface.h
@@ -105,6 +105,7 @@ 
 #define SBI_EXT_PMU_COUNTER_FW_READ	0x5
 #define SBI_EXT_PMU_COUNTER_FW_READ_HI	0x6
 #define SBI_EXT_PMU_SNAPSHOT_SET_SHMEM	0x7
+#define SBI_EXT_PMU_IRQ_CLEAR		0x8
 
 /** General pmu event codes specified in SBI PMU extension */
 enum sbi_pmu_hw_generic_events_t {
diff --git a/include/sbi/sbi_pmu.h b/include/sbi/sbi_pmu.h
index c5b4e51..6bed6c9 100644
--- a/include/sbi/sbi_pmu.h
+++ b/include/sbi/sbi_pmu.h
@@ -153,4 +153,6 @@  int sbi_pmu_ctr_incr_fw(enum sbi_pmu_fw_event_code_id fw_id);
 
 void sbi_pmu_ovf_irq(struct sbi_trap_regs *regs);
 
+void sbi_pmu_irq_clear(void);
+
 #endif
diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c
index 40a63a6..5b55eb5 100644
--- a/lib/sbi/sbi_ecall_pmu.c
+++ b/lib/sbi/sbi_ecall_pmu.c
@@ -73,6 +73,9 @@  static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid,
 	case SBI_EXT_PMU_COUNTER_STOP:
 		ret = sbi_pmu_ctr_stop(regs->a0, regs->a1, regs->a2);
 		break;
+	case SBI_EXT_PMU_IRQ_CLEAR:
+		sbi_pmu_irq_clear();
+		break;
 	case SBI_EXT_PMU_SNAPSHOT_SET_SHMEM:
 		/* fallthrough as OpenSBI doesn't support snapshot yet */
 	default: