From 03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca Mon Sep 17 00:00:00 2001 From: Xiang W Date: Wed, 14 May 2025 13:24:02 +0800 Subject: [PATCH] lib: sbi: Optimize saddr mapping in sbi_dbtr.c 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. Tested-by: Himanshu Chauhan Reviewed-by: Himanshu Chauhan Signed-off-by: Xiang W Link: https://lore.kernel.org/r/20250514052422.575551-1-wxjstz@126.com Signed-off-by: Anup Patel --- 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 cfb6b2a7..797cf256 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; }