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: 97f234f15c ("lib: sbi: Introduce the SBI debug triggers extension support")
Signed-off-by: Jesse Taube <jesse@rivosinc.com>
Reviewed-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
Tested-by: Charlie Jenkins <charlie@rivosinc.com>
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Link: https://lore.kernel.org/r/20250528154604.571815-1-jesse@rivosinc.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Jesse Taube
2025-05-28 08:46:04 -07:00
committed by Anup Patel
parent 03f44e6b82
commit 324021423d
3 changed files with 21 additions and 16 deletions

View File

@@ -115,8 +115,7 @@ int sbi_dbtr_uninstall_trig(unsigned long trig_idx_base,
int sbi_dbtr_enable_trig(unsigned long trig_idx_base, int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
unsigned long trig_idx_mask); unsigned long trig_idx_mask);
int sbi_dbtr_update_trig(unsigned long smode, int sbi_dbtr_update_trig(unsigned long smode,
unsigned long trig_idx_base, unsigned long trig_count);
unsigned long trig_idx_mask);
int sbi_dbtr_disable_trig(unsigned long trig_idx_base, int sbi_dbtr_disable_trig(unsigned long trig_idx_base,
unsigned long trig_idx_mask); unsigned long trig_idx_mask);

View File

@@ -652,13 +652,9 @@ int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
} }
int sbi_dbtr_update_trig(unsigned long smode, int sbi_dbtr_update_trig(unsigned long smode,
unsigned long trig_idx_base, unsigned long trig_count)
unsigned long trig_idx_mask)
{ {
unsigned long trig_mask = trig_idx_mask << trig_idx_base; unsigned long trig_idx;
unsigned long idx = trig_idx_base;
struct sbi_dbtr_data_msg *recv;
unsigned long uidx = 0;
struct sbi_dbtr_trigger *trig; struct sbi_dbtr_trigger *trig;
union sbi_dbtr_shmem_entry *entry; union sbi_dbtr_shmem_entry *entry;
void *shmem_base = NULL; void *shmem_base = NULL;
@@ -673,18 +669,28 @@ int sbi_dbtr_update_trig(unsigned long smode,
shmem_base = hart_shmem_base(hs); shmem_base = hart_shmem_base(hs);
for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) { if (trig_count >= hs->total_trigs)
trig = INDEX_TO_TRIGGER(idx); 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; return SBI_ERR_INVALID_PARAM;
}
entry = (shmem_base + uidx * sizeof(*entry)); trig = INDEX_TO_TRIGGER(trig_idx);
recv = &entry->data;
trig->tdata2 = lle_to_cpu(recv->tdata2); if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
sbi_hart_unmap_saddr();
return SBI_ERR_FAILED;
}
dbtr_trigger_setup(trig, &entry->data);
sbi_hart_unmap_saddr();
dbtr_trigger_enable(trig); dbtr_trigger_enable(trig);
uidx++;
} }
return SBI_SUCCESS; return SBI_SUCCESS;

View File

@@ -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); ret = sbi_dbtr_enable_trig(regs->a0, regs->a1);
break; break;
case SBI_EXT_DBTR_TRIGGER_UPDATE: 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; break;
case SBI_EXT_DBTR_TRIGGER_DISABLE: case SBI_EXT_DBTR_TRIGGER_DISABLE:
ret = sbi_dbtr_disable_trig(regs->a0, regs->a1); ret = sbi_dbtr_disable_trig(regs->a0, regs->a1);