mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00
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>
This commit is contained in:
@@ -523,16 +523,17 @@ int sbi_dbtr_read_trig(unsigned long smode,
|
|||||||
|
|
||||||
shmem_base = hart_shmem_base(hs);
|
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) {
|
for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
|
||||||
sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
|
|
||||||
xmit = &entry->data;
|
xmit = &entry->data;
|
||||||
trig = INDEX_TO_TRIGGER((_idx + trig_idx_base));
|
trig = INDEX_TO_TRIGGER((_idx + trig_idx_base));
|
||||||
xmit->tstate = cpu_to_lle(trig->state);
|
xmit->tstate = cpu_to_lle(trig->state);
|
||||||
xmit->tdata1 = cpu_to_lle(trig->tdata1);
|
xmit->tdata1 = cpu_to_lle(trig->tdata1);
|
||||||
xmit->tdata2 = cpu_to_lle(trig->tdata2);
|
xmit->tdata2 = cpu_to_lle(trig->tdata2);
|
||||||
xmit->tdata3 = cpu_to_lle(trig->tdata3);
|
xmit->tdata3 = cpu_to_lle(trig->tdata3);
|
||||||
sbi_hart_unmap_saddr();
|
|
||||||
}
|
}
|
||||||
|
sbi_hart_unmap_saddr();
|
||||||
|
|
||||||
return SBI_SUCCESS;
|
return SBI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -556,10 +557,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
|
|||||||
return SBI_ERR_NO_SHMEM;
|
return SBI_ERR_NO_SHMEM;
|
||||||
|
|
||||||
shmem_base = hart_shmem_base(hs);
|
shmem_base = hart_shmem_base(hs);
|
||||||
|
sbi_hart_map_saddr((unsigned long)shmem_base,
|
||||||
|
trig_count * sizeof(*entry));
|
||||||
|
|
||||||
/* Check requested triggers configuration */
|
/* Check requested triggers configuration */
|
||||||
for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
|
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);
|
recv = (struct sbi_dbtr_data_msg *)(&entry->data);
|
||||||
ctrl = recv->tdata1;
|
ctrl = recv->tdata1;
|
||||||
|
|
||||||
@@ -574,11 +576,11 @@ int sbi_dbtr_install_trig(unsigned long smode,
|
|||||||
sbi_hart_unmap_saddr();
|
sbi_hart_unmap_saddr();
|
||||||
return SBI_ERR_FAILED;
|
return SBI_ERR_FAILED;
|
||||||
}
|
}
|
||||||
sbi_hart_unmap_saddr();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hs->available_trigs < trig_count) {
|
if (hs->available_trigs < trig_count) {
|
||||||
*out = hs->available_trigs;
|
*out = hs->available_trigs;
|
||||||
|
sbi_hart_unmap_saddr();
|
||||||
return SBI_ERR_FAILED;
|
return SBI_ERR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,16 +592,15 @@ int sbi_dbtr_install_trig(unsigned long smode,
|
|||||||
*/
|
*/
|
||||||
trig = sbi_alloc_trigger();
|
trig = sbi_alloc_trigger();
|
||||||
|
|
||||||
sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
|
|
||||||
|
|
||||||
recv = (struct sbi_dbtr_data_msg *)(&entry->data);
|
recv = (struct sbi_dbtr_data_msg *)(&entry->data);
|
||||||
xmit = (struct sbi_dbtr_id_msg *)(&entry->id);
|
xmit = (struct sbi_dbtr_id_msg *)(&entry->id);
|
||||||
|
|
||||||
dbtr_trigger_setup(trig, recv);
|
dbtr_trigger_setup(trig, recv);
|
||||||
dbtr_trigger_enable(trig);
|
dbtr_trigger_enable(trig);
|
||||||
xmit->idx = cpu_to_lle(trig->index);
|
xmit->idx = cpu_to_lle(trig->index);
|
||||||
sbi_hart_unmap_saddr();
|
|
||||||
}
|
}
|
||||||
|
sbi_hart_unmap_saddr();
|
||||||
|
|
||||||
return SBI_SUCCESS;
|
return SBI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user