[PATCH v2] lib: sbi: Optimize saddr mapping in sbi_dbtr.c
Anup Patel
anup at brainfault.org
Mon Jun 16 04:41:23 PDT 2025
On Wed, May 14, 2025 at 10:54 AM Xiang W <wxjstz at 126.com> wrote:
>
> The original implementation mapped saddr individually for each entry.
> The updated code now maps saddr for all entries in a single operation.
> This change reduces the number of PMP (Physical Memory Protection)
> operations, improving efficiency and performance.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>
Included Himanshu's Reviewed-by and Tested-by at the time
of merging this patch.
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> changes in v2:
> - Fixed a type conversion error
> ---
> lib/sbi/sbi_dbtr.c | 15 ++++++++-------
> 1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c
> index f0e91285..b018e7cb 100644
> --- a/lib/sbi/sbi_dbtr.c
> +++ b/lib/sbi/sbi_dbtr.c
> @@ -523,16 +523,17 @@ int sbi_dbtr_read_trig(unsigned long smode,
>
> shmem_base = hart_shmem_base(hs);
>
> + sbi_hart_map_saddr((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
> for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> - sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
> xmit = &entry->data;
> trig = INDEX_TO_TRIGGER((_idx + trig_idx_base));
> xmit->tstate = cpu_to_lle(trig->state);
> xmit->tdata1 = cpu_to_lle(trig->tdata1);
> xmit->tdata2 = cpu_to_lle(trig->tdata2);
> xmit->tdata3 = cpu_to_lle(trig->tdata3);
> - sbi_hart_unmap_saddr();
> }
> + sbi_hart_unmap_saddr();
>
> return SBI_SUCCESS;
> }
> @@ -556,10 +557,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
> return SBI_ERR_NO_SHMEM;
>
> shmem_base = hart_shmem_base(hs);
> + sbi_hart_map_saddr((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
>
> /* Check requested triggers configuration */
> for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> - sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
> recv = (struct sbi_dbtr_data_msg *)(&entry->data);
> ctrl = recv->tdata1;
>
> @@ -574,11 +576,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
> sbi_hart_unmap_saddr();
> return SBI_ERR_FAILED;
> }
> - sbi_hart_unmap_saddr();
> }
>
> if (hs->available_trigs < trig_count) {
> *out = hs->available_trigs;
> + sbi_hart_unmap_saddr();
> return SBI_ERR_FAILED;
> }
>
> @@ -590,16 +592,15 @@ int sbi_dbtr_install_trig(unsigned long smode,
> */
> trig = sbi_alloc_trigger();
>
> - sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
> -
> recv = (struct sbi_dbtr_data_msg *)(&entry->data);
> xmit = (struct sbi_dbtr_id_msg *)(&entry->id);
>
> dbtr_trigger_setup(trig, recv);
> dbtr_trigger_enable(trig);
> xmit->idx = cpu_to_lle(trig->index);
> - sbi_hart_unmap_saddr();
> +
> }
> + sbi_hart_unmap_saddr();
>
> return SBI_SUCCESS;
> }
> --
> 2.47.2
>
More information about the opensbi
mailing list