/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 Western Digital Corporation or its affiliates. * * Authors: * Atish Patra */ #include #include #include static inline char *sbi_platform_feature_id2string(unsigned long feature) { char *fstr = NULL; if (!feature) return NULL; switch (feature) { case SBI_PLATFORM_HAS_TIMER_VALUE: fstr = "timer"; break; case SBI_PLATFORM_HAS_HART_HOTPLUG: fstr = "hotplug"; break; case SBI_PLATFORM_HAS_MFAULTS_DELEGATION: fstr = "mfdeleg"; break; case SBI_PLATFORM_HAS_HART_SECONDARY_BOOT: fstr = "sec_boot"; break; default: break; } 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) { unsigned long features, feat = 1UL; char *temp; int offset = 0; if (!plat || !features_str || !nfstr) return SBI_EINVAL; features = sbi_platform_get_features(plat); do { if (features & feat) { temp = sbi_platform_feature_id2string(feat); if (temp) { sbi_snprintf(features_str + offset, nfstr, "%s,", temp); offset = offset + sbi_strlen(temp) + 1; } } feat = feat << 1; } while (feat <= SBI_PLATFORM_HAS_LAST_FEATURE); features_str[offset - 1] = '\0'; return 0; } /** * 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 i; if (!plat) return -1U; if (plat->hart_index2id) { for (i = 0; i < plat->hart_count; i++) { if (plat->hart_index2id[i] == hartid) return i; } return -1U; } return hartid; }