lib: sbi: simplify inline function in sbi_dtbr.c
authorXiang W <wxjstz@126.com>
Fri, 3 May 2024 13:53:38 +0000 (21:53 +0800)
committerAnup Patel <anup@brainfault.org>
Mon, 13 May 2024 11:20:49 +0000 (16:50 +0530)
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>
lib/sbi/sbi_dbtr.c

index 6950378bd340b15b46a88006321574dee3b142d6..9c92af6a59f53563487441762d409e332465daf2 100644 (file)
@@ -55,49 +55,29 @@ static unsigned long hart_state_ptr_offset;
 #error "Undefined XLEN"
 #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 &&
                hs->shmem.phys_hi == SBI_DBTR_SHMEM_INVALID_ADDR
                ? 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_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;
-       struct sbi_dbtr_hart_triggers_state *hs = NULL;
-
-       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));
+       return ((void *)(unsigned long)DBTR_SHMEM_MAKE_PHYS(
+                       hs->shmem.phys_hi, hs->shmem.phys_lo));
 }
 
 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 */
-       sbi_dbtr_disable_shmem();
+       sbi_dbtr_disable_shmem(hart_state);
 
        /* Skip probing triggers if already 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;
        }
 
+       hart_state = dbtr_thishart_state_ptr();
+       if (!hart_state)
+               return SBI_ERR_FAILED;
+
        /* call is to disable shared memory */
        if (shmem_phys_lo == 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;
        }
 
        /* 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;
 
        /* 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))
                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_hi = shmem_phys_hi;
 
@@ -531,10 +511,10 @@ int sbi_dbtr_read_trig(unsigned long smode,
            trig_idx_base + trig_count >= hs->total_trigs)
                return SBI_ERR_INVALID_PARAM;
 
-       if (sbi_dbtr_shmem_disabled())
+       if (sbi_dbtr_shmem_disabled(hs))
                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) {
                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_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;
 
-       shmem_base = hart_shmem_base();
-       hs = dbtr_thishart_state_ptr();
+       shmem_base = hart_shmem_base(hs);
 
        /* Check requested triggers configuration */
        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;
        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;
 
-       shmem_base = hart_shmem_base();
-       hs = dbtr_thishart_state_ptr();
+       shmem_base = hart_shmem_base(hs);
 
        for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) {
                trig = INDEX_TO_TRIGGER(idx);