diff options
author | Xiang W <wxjstz@126.com> | 2025-05-14 13:24:02 +0800 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2025-06-16 16:53:50 +0530 |
commit | 03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca (patch) | |
tree | dc4ceaf143f18157b7c313cc5c6ccacc1e9a9f96 | |
parent | 033e0e2353ddab76039e62b46c9f77e178bac689 (diff) | |
download | opensbi-03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca.zip opensbi-03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca.tar.gz opensbi-03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca.tar.bz2 |
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 <hchauhan@ventanamicro.com>
Reviewed-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Signed-off-by: Xiang W <wxjstz@126.com>
Link: https://lore.kernel.org/r/20250514052422.575551-1-wxjstz@126.com
Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r-- | lib/sbi/sbi_dbtr.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c index cfb6b2a..797cf25 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; } |