summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJesse Taube <[email protected]>2025-05-28 08:46:04 -0700
committerAnup Patel <[email protected]>2025-06-16 17:01:52 +0530
commit324021423d063702a5cb2d4207a3a9c4e999549f (patch)
tree661829a1c149a748f912383f8fa835063e36e419 /lib
parent03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca (diff)
lib: sbi: dbtr: Fix update_triggers to match SBI
OpenSBI implements sbi_dbtr_update_trig as `sbi_dbtr_update_trig(unsigned long trig_idx_base, unsigned long trig_idx_mask)` yet SBI v3.0-rc7 Chapter 19. Debug Triggers Extension [0] declares it as `sbi_debug_update_triggers(unsigned long trig_count)` Change update_triggers to match SBI. [0] https://github.com/riscv-non-isa/riscv-sbi-doc/tree/v3.0-rc7/src/ext-debug-triggers.adoc Fixes: 97f234f15c96 ("lib: sbi: Introduce the SBI debug triggers extension support") Signed-off-by: Jesse Taube <[email protected]> Reviewed-by: Himanshu Chauhan <[email protected]> Tested-by: Charlie Jenkins <[email protected]> Reviewed-by: Charlie Jenkins <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_dbtr.c32
-rw-r--r--lib/sbi/sbi_ecall_dbtr.c2
2 files changed, 20 insertions, 14 deletions
diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c
index 797cf256..a832c7f1 100644
--- a/lib/sbi/sbi_dbtr.c
+++ b/lib/sbi/sbi_dbtr.c
@@ -652,13 +652,9 @@ int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
}
int sbi_dbtr_update_trig(unsigned long smode,
- unsigned long trig_idx_base,
- unsigned long trig_idx_mask)
+ unsigned long trig_count)
{
- unsigned long trig_mask = trig_idx_mask << trig_idx_base;
- unsigned long idx = trig_idx_base;
- struct sbi_dbtr_data_msg *recv;
- unsigned long uidx = 0;
+ unsigned long trig_idx;
struct sbi_dbtr_trigger *trig;
union sbi_dbtr_shmem_entry *entry;
void *shmem_base = NULL;
@@ -673,18 +669,28 @@ int sbi_dbtr_update_trig(unsigned long smode,
shmem_base = hart_shmem_base(hs);
- for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) {
- trig = INDEX_TO_TRIGGER(idx);
+ if (trig_count >= hs->total_trigs)
+ return SBI_ERR_BAD_RANGE;
- if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
+ for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
+ sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
+ trig_idx = entry->id.idx;
+
+ if (trig_idx >= hs->total_trigs) {
+ sbi_hart_unmap_saddr();
return SBI_ERR_INVALID_PARAM;
+ }
+
+ trig = INDEX_TO_TRIGGER(trig_idx);
- entry = (shmem_base + uidx * sizeof(*entry));
- recv = &entry->data;
+ if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
+ sbi_hart_unmap_saddr();
+ return SBI_ERR_FAILED;
+ }
- trig->tdata2 = lle_to_cpu(recv->tdata2);
+ dbtr_trigger_setup(trig, &entry->data);
+ sbi_hart_unmap_saddr();
dbtr_trigger_enable(trig);
- uidx++;
}
return SBI_SUCCESS;
diff --git a/lib/sbi/sbi_ecall_dbtr.c b/lib/sbi/sbi_ecall_dbtr.c
index 9c496c42..40a437ee 100644
--- a/lib/sbi/sbi_ecall_dbtr.c
+++ b/lib/sbi/sbi_ecall_dbtr.c
@@ -43,7 +43,7 @@ static int sbi_ecall_dbtr_handler(unsigned long extid, unsigned long funcid,
ret = sbi_dbtr_enable_trig(regs->a0, regs->a1);
break;
case SBI_EXT_DBTR_TRIGGER_UPDATE:
- ret = sbi_dbtr_update_trig(smode, regs->a0, regs->a1);
+ ret = sbi_dbtr_update_trig(smode, regs->a0);
break;
case SBI_EXT_DBTR_TRIGGER_DISABLE:
ret = sbi_dbtr_disable_trig(regs->a0, regs->a1);