forked from Mirrors/opensbi
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:
@@ -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);
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user