mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 15:31:22 +01:00
lib: sbi: simplify inline function in sbi_dtbr.c
The inline function can simplify the code by setting some call restrictions. This ensures logical smoothness Signed-off-by: Xiang W <wxjstz@126.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -55,49 +55,29 @@ static unsigned long hart_state_ptr_offset;
|
|||||||
#error "Undefined XLEN"
|
#error "Undefined XLEN"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline bool sbi_dbtr_shmem_disabled(void)
|
/* must call with hs != NULL */
|
||||||
|
static inline bool sbi_dbtr_shmem_disabled(
|
||||||
|
struct sbi_dbtr_hart_triggers_state *hs)
|
||||||
{
|
{
|
||||||
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
|
||||||
|
|
||||||
hs = dbtr_get_hart_state_ptr(sbi_scratch_thishart_ptr());
|
|
||||||
|
|
||||||
if (!hs)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return (hs->shmem.phys_lo == SBI_DBTR_SHMEM_INVALID_ADDR &&
|
return (hs->shmem.phys_lo == SBI_DBTR_SHMEM_INVALID_ADDR &&
|
||||||
hs->shmem.phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR
|
hs->shmem.phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR
|
||||||
? true : false);
|
? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sbi_dbtr_disable_shmem(void)
|
/* must call with hs != NULL */
|
||||||
|
static inline void sbi_dbtr_disable_shmem(
|
||||||
|
struct sbi_dbtr_hart_triggers_state *hs)
|
||||||
{
|
{
|
||||||
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
|
||||||
|
|
||||||
hs = dbtr_get_hart_state_ptr(sbi_scratch_thishart_ptr());
|
|
||||||
|
|
||||||
if (!hs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
hs->shmem.phys_lo = SBI_DBTR_SHMEM_INVALID_ADDR;
|
hs->shmem.phys_lo = SBI_DBTR_SHMEM_INVALID_ADDR;
|
||||||
hs->shmem.phys_hi = SBI_DBTR_SHMEM_INVALID_ADDR;
|
hs->shmem.phys_hi = SBI_DBTR_SHMEM_INVALID_ADDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *hart_shmem_base(void)
|
/* must call with hs which is not disabled */
|
||||||
|
static inline void *hart_shmem_base(
|
||||||
|
struct sbi_dbtr_hart_triggers_state *hs)
|
||||||
{
|
{
|
||||||
unsigned long phys_hi, phys_lo;
|
return ((void *)(unsigned long)DBTR_SHMEM_MAKE_PHYS(
|
||||||
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
hs->shmem.phys_hi, hs->shmem.phys_lo));
|
||||||
|
|
||||||
hs = dbtr_get_hart_state_ptr(sbi_scratch_thishart_ptr());
|
|
||||||
if (!hs)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
phys_hi = hs->shmem.phys_hi;
|
|
||||||
phys_lo = hs->shmem.phys_lo;
|
|
||||||
|
|
||||||
if (phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR && phys_hi == phys_lo)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return ((void *)(unsigned long)DBTR_SHMEM_MAKE_PHYS(phys_hi, phys_lo));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbi_trigger_init(struct sbi_dbtr_trigger *trig,
|
static void sbi_trigger_init(struct sbi_dbtr_trigger *trig,
|
||||||
@@ -186,7 +166,7 @@ int sbi_dbtr_init(struct sbi_scratch *scratch, bool coldboot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* disable the shared memory */
|
/* disable the shared memory */
|
||||||
sbi_dbtr_disable_shmem();
|
sbi_dbtr_disable_shmem(hart_state);
|
||||||
|
|
||||||
/* Skip probing triggers if already probed */
|
/* Skip probing triggers if already probed */
|
||||||
if (hart_state->probed)
|
if (hart_state->probed)
|
||||||
@@ -278,15 +258,19 @@ int sbi_dbtr_setup_shmem(const struct sbi_domain *dom, unsigned long smode,
|
|||||||
return SBI_ERR_DENIED;
|
return SBI_ERR_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hart_state = dbtr_thishart_state_ptr();
|
||||||
|
if (!hart_state)
|
||||||
|
return SBI_ERR_FAILED;
|
||||||
|
|
||||||
/* call is to disable shared memory */
|
/* call is to disable shared memory */
|
||||||
if (shmem_phys_lo == SBI_DBTR_SHMEM_INVALID_ADDR
|
if (shmem_phys_lo == SBI_DBTR_SHMEM_INVALID_ADDR
|
||||||
&& shmem_phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR) {
|
&& shmem_phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR) {
|
||||||
sbi_dbtr_disable_shmem();
|
sbi_dbtr_disable_shmem(hart_state);
|
||||||
return SBI_SUCCESS;
|
return SBI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the shared memory must be disabled on this hart */
|
/* the shared memory must be disabled on this hart */
|
||||||
if (!sbi_dbtr_shmem_disabled())
|
if (!sbi_dbtr_shmem_disabled(hart_state))
|
||||||
return SBI_ERR_ALREADY_AVAILABLE;
|
return SBI_ERR_ALREADY_AVAILABLE;
|
||||||
|
|
||||||
/* lower physical address must be XLEN/8 bytes aligned */
|
/* lower physical address must be XLEN/8 bytes aligned */
|
||||||
@@ -298,10 +282,6 @@ int sbi_dbtr_setup_shmem(const struct sbi_domain *dom, unsigned long smode,
|
|||||||
SBI_DOMAIN_READ | SBI_DOMAIN_WRITE))
|
SBI_DOMAIN_READ | SBI_DOMAIN_WRITE))
|
||||||
return SBI_ERR_INVALID_ADDRESS;
|
return SBI_ERR_INVALID_ADDRESS;
|
||||||
|
|
||||||
hart_state = dbtr_thishart_state_ptr();
|
|
||||||
if (!hart_state)
|
|
||||||
return SBI_ERR_FAILED;
|
|
||||||
|
|
||||||
hart_state->shmem.phys_lo = shmem_phys_lo;
|
hart_state->shmem.phys_lo = shmem_phys_lo;
|
||||||
hart_state->shmem.phys_hi = shmem_phys_hi;
|
hart_state->shmem.phys_hi = shmem_phys_hi;
|
||||||
|
|
||||||
@@ -531,10 +511,10 @@ int sbi_dbtr_read_trig(unsigned long smode,
|
|||||||
trig_idx_base + trig_count >= hs->total_trigs)
|
trig_idx_base + trig_count >= hs->total_trigs)
|
||||||
return SBI_ERR_INVALID_PARAM;
|
return SBI_ERR_INVALID_PARAM;
|
||||||
|
|
||||||
if (sbi_dbtr_shmem_disabled())
|
if (sbi_dbtr_shmem_disabled(hs))
|
||||||
return SBI_ERR_NO_SHMEM;
|
return SBI_ERR_NO_SHMEM;
|
||||||
|
|
||||||
shmem_base = hart_shmem_base();
|
shmem_base = hart_shmem_base(hs);
|
||||||
|
|
||||||
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));
|
sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry));
|
||||||
@@ -561,11 +541,14 @@ int sbi_dbtr_install_trig(unsigned long smode,
|
|||||||
struct sbi_dbtr_trigger *trig;
|
struct sbi_dbtr_trigger *trig;
|
||||||
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
||||||
|
|
||||||
if (sbi_dbtr_shmem_disabled())
|
hs = dbtr_thishart_state_ptr();
|
||||||
|
if (!hs)
|
||||||
|
return SBI_ERR_FAILED;
|
||||||
|
|
||||||
|
if (sbi_dbtr_shmem_disabled(hs))
|
||||||
return SBI_ERR_NO_SHMEM;
|
return SBI_ERR_NO_SHMEM;
|
||||||
|
|
||||||
shmem_base = hart_shmem_base();
|
shmem_base = hart_shmem_base(hs);
|
||||||
hs = dbtr_thishart_state_ptr();
|
|
||||||
|
|
||||||
/* 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) {
|
||||||
@@ -673,11 +656,14 @@ int sbi_dbtr_update_trig(unsigned long smode,
|
|||||||
void *shmem_base = NULL;
|
void *shmem_base = NULL;
|
||||||
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
struct sbi_dbtr_hart_triggers_state *hs = NULL;
|
||||||
|
|
||||||
if (sbi_dbtr_shmem_disabled())
|
hs = dbtr_thishart_state_ptr();
|
||||||
|
if (!hs)
|
||||||
|
return SBI_ERR_FAILED;
|
||||||
|
|
||||||
|
if (sbi_dbtr_shmem_disabled(hs))
|
||||||
return SBI_ERR_NO_SHMEM;
|
return SBI_ERR_NO_SHMEM;
|
||||||
|
|
||||||
shmem_base = hart_shmem_base();
|
shmem_base = hart_shmem_base(hs);
|
||||||
hs = dbtr_thishart_state_ptr();
|
|
||||||
|
|
||||||
for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) {
|
for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) {
|
||||||
trig = INDEX_TO_TRIGGER(idx);
|
trig = INDEX_TO_TRIGGER(idx);
|
||||||
|
Reference in New Issue
Block a user