lib: sbi: Improve get_feature_str() implementation and usage
authorAnup Patel <anup.patel@wdc.com>
Sun, 10 May 2020 06:06:14 +0000 (11:36 +0530)
committerAnup Patel <anup@brainfault.org>
Tue, 19 May 2020 03:49:34 +0000 (09:19 +0530)
We do following improvements for get_feature_str():
1. We should return "none" from get_feature_str() no features
   available instead of sbi_boot_prints() explicitly handling
   failure.
2. We don't need to return failure (just like misa_xlen())
   because we are returning "none" for no features and we are
   truncating output when space is not available.
3. Based on 1 and 2, the sbi_boot_prints() can be further
   simplified.
4. No need for two char[] in sbi_boot_prints()

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
include/sbi/sbi_hart.h
include/sbi/sbi_platform.h
lib/sbi/sbi_hart.c
lib/sbi/sbi_init.c
lib/sbi/sbi_platform.c

index cdcd865..a624dfd 100644 (file)
@@ -43,7 +43,7 @@ int  sbi_hart_pmp_check_addr(struct sbi_scratch *scratch, unsigned long daddr,
                             unsigned long attr);
 bool sbi_hart_has_feature(u32 hartid, unsigned long feature);
 unsigned long sbi_hart_get_features(u32 hartid);
-int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr);
+void sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr);
 
 void __attribute__((noreturn)) sbi_hart_hang(void);
 
index dd25aa1..8087148 100644 (file)
@@ -244,10 +244,9 @@ u32 sbi_platform_hart_index(const struct sbi_platform *plat, u32 hartid);
  *                    updated
  * @param nfstr length of the features_str. The feature string will be truncated
  *             if nfstr is not long enough.
- * @return the features value currently set for the given platform
  */
-int sbi_platform_get_features_str(const struct sbi_platform *plat,
-                                 char *features_str, int nfstr);
+void sbi_platform_get_features_str(const struct sbi_platform *plat,
+                                  char *features_str, int nfstr);
 
 /**
  * Get name of the platform
index 2a284fd..f101395 100644 (file)
@@ -270,18 +270,20 @@ static inline char *sbi_hart_feature_id2string(unsigned long feature)
  *                    updated
  * @param nfstr length of the features_str. The feature string will be truncated
  *             if nfstr is not long enough.
- * @return the features value currently set for the given platform
  */
-int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr)
+void sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr)
 {
        unsigned long features, feat = 1UL;
        char *temp;
        int offset = 0;
 
-       if (!features_str || !nfstr)
-               return SBI_EINVAL;
+       if (!features_str || nfstr <= 0)
+               return;
+       sbi_memset(features_str, 0, nfstr);
 
        features = sbi_hart_get_features(hartid);
+       if (!features)
+               goto done;
 
        do {
                if (features & feat) {
@@ -295,9 +297,11 @@ int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr)
                feat = feat << 1;
        } while (feat <= SBI_HART_HAS_LAST_FEATURE);
 
-       features_str[offset - 1] = '\0';
-
-       return 0;
+done:
+       if (offset)
+               features_str[offset - 1] = '\0';
+       else
+               sbi_strncpy(features_str, "none", nfstr);
 }
 
 static void sbi_hart_set_feature(u32 hartid, unsigned long feature)
index f892582..bbf9ac1 100644 (file)
 
 static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
 {
-       int xlen, ret;
-       char str[64];
-       int max_fstr_len = 128;
-       char features[128];
+       int xlen;
+       char str[128];
        const struct sbi_platform *plat = sbi_platform_ptr(scratch);
 
 #ifdef OPENSBI_VERSION_GIT
@@ -56,35 +54,26 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
                sbi_printf("Error %d getting MISA XLEN\n", xlen);
                sbi_hart_hang();
        }
-       misa_string(xlen, str, sizeof(str));
 
        /* Platform details */
        sbi_printf("Platform Name          : %s\n", sbi_platform_name(plat));
        sbi_printf("Platform HART Count    : %u\n",
                   sbi_platform_hart_count(plat));
-
-       sbi_memset(features, 0, max_fstr_len);
-       ret = sbi_platform_get_features_str(plat, features, max_fstr_len);
-       if (!ret)
-               sbi_printf("Platform Features      : %s\n", features);
-       else
-               sbi_printf("Platform Features      : %s\n", "none");
+       sbi_platform_get_features_str(plat, str, sizeof(str));
+       sbi_printf("Platform Features      : %s\n", str);
 
        /* Boot HART details */
        sbi_printf("Boot HART ID           : %u\n", hartid);
+       misa_string(xlen, str, sizeof(str));
        sbi_printf("Boot HART ISA          : %s\n", str);
-
-       sbi_memset(features, 0, max_fstr_len);
-       ret = sbi_hart_get_features_str(hartid, features, max_fstr_len);
-       if (!ret)
-               sbi_printf("BOOT HART Features     : %s\n", features);
-       else
-               sbi_printf("BOOT HART Features     : %s\n", "none");
+       sbi_hart_get_features_str(hartid, str, sizeof(str));
+       sbi_printf("BOOT HART Features     : %s\n", str);
 
        /* Firmware details */
        sbi_printf("Firmware Base          : 0x%lx\n", scratch->fw_start);
        sbi_printf("Firmware Size          : %d KB\n",
                   (u32)(scratch->fw_size / 1024));
+
        /* Generic details */
        sbi_printf("Runtime SBI Version    : %d.%d\n",
                   sbi_ecall_version_major(), sbi_ecall_version_minor());
index 1912512..568d956 100644 (file)
@@ -38,27 +38,20 @@ static inline char *sbi_platform_feature_id2string(unsigned long feature)
        return fstr;
 }
 
-/**
- * Get the platform features in string format
- *
- * @param plat pointer to struct sbi_platform
- * @param features_str pointer to a char array where the features string will be
- *                    updated
- * @param nfstr length of the features_str. The feature string will be truncated
- *             if nfstr is not long enough.
- * @return the features value currently set for the given platform
- */
-int sbi_platform_get_features_str(const struct sbi_platform *plat,
-                                               char *features_str, int nfstr)
+void sbi_platform_get_features_str(const struct sbi_platform *plat,
+                                  char *features_str, int nfstr)
 {
        unsigned long features, feat = 1UL;
        char *temp;
        int offset = 0;
 
        if (!plat || !features_str || !nfstr)
-               return SBI_EINVAL;
+               return;
+       sbi_memset(features_str, 0, nfstr);
 
        features = sbi_platform_get_features(plat);
+       if (!features)
+               goto done;
 
        do {
                if (features & feat) {
@@ -72,21 +65,14 @@ int sbi_platform_get_features_str(const struct sbi_platform *plat,
                feat = feat << 1;
        } while (feat <= SBI_PLATFORM_HAS_LAST_FEATURE);
 
-       features_str[offset - 1] = '\0';
-
-       return 0;
+done:
+       if (offset)
+               features_str[offset - 1] = '\0';
+       else
+               sbi_strncpy(features_str, "none", nfstr);
 }
 
-/**
- * Get HART index for the given HART
- *
- * @param plat pointer to struct sbi_platform
- * @param hartid HART ID
- *
- * @return 0 <= value < hart_count for valid HART otherwise -1U
- */
-u32 sbi_platform_hart_index(const struct sbi_platform *plat,
-                                         u32 hartid)
+u32 sbi_platform_hart_index(const struct sbi_platform *plat, u32 hartid)
 {
        u32 i;