common/cnxk: add helpers for reading runplatform

Add helper functions that allow one to check platform
ROC is running on. Platform type is retrieved from device
tree attribute runplatform which is updated by EBF accordingly.

Signed-off-by: Tomasz Duszynski <tduszynski@marvell.com>
Reviewed-by: Jerin Jacob <jerinj@marvell.com>
This commit is contained in:
Tomasz Duszynski 2021-10-01 22:24:56 +02:00 committed by Jerin Jacob
parent 3d1cd3a803
commit b89f023e54
2 changed files with 81 additions and 1 deletions

View File

@ -178,6 +178,55 @@ detect_invalid_config(void)
#endif
}
static uint64_t
env_lookup_flag(const char *name)
{
unsigned int i;
struct {
const char *name;
uint64_t flag;
} envs[] = {
{"HW_PLATFORM", ROC_ENV_HW},
{"EMUL_PLATFORM", ROC_ENV_EMUL},
{"ASIM_PLATFORM", ROC_ENV_ASIM},
};
for (i = 0; i < PLT_DIM(envs); i++)
if (!strncmp(envs[i].name, name, strlen(envs[i].name)))
return envs[i].flag;
return 0;
}
static void
of_env_get(struct roc_model *model)
{
const char *const path = "/proc/device-tree/soc@0/runplatform";
uint64_t flag;
FILE *fp;
fp = fopen(path, "r");
if (!fp) {
plt_err("Failed to open %s", path);
return;
}
if (!fgets(model->env, sizeof(model->env), fp)) {
plt_err("Failed to read %s", path);
goto err;
}
flag = env_lookup_flag(model->env);
if (flag == 0) {
plt_err("Unknown platform: %s", model->env);
goto err;
}
model->flag |= flag;
err:
fclose(fp);
}
int
roc_model_init(struct roc_model *model)
{
@ -197,8 +246,10 @@ roc_model_init(struct roc_model *model)
if (!populate_model(model, midr))
goto err;
of_env_get(model);
rc = 0;
plt_info("RoC Model: %s", model->name);
plt_info("RoC Model: %s (%s)", model->name, model->env);
roc_model = model;
err:
return rc;

View File

@ -23,10 +23,15 @@ struct roc_model {
#define ROC_MODEL_CN106xx_A0 BIT_ULL(20)
#define ROC_MODEL_CNF105xx_A0 BIT_ULL(21)
#define ROC_MODEL_CNF105xxN_A0 BIT_ULL(22)
/* Following flags describe platform code is running on */
#define ROC_ENV_HW BIT_ULL(61)
#define ROC_ENV_EMUL BIT_ULL(62)
#define ROC_ENV_ASIM BIT_ULL(63)
uint64_t flag;
#define ROC_MODEL_STR_LEN_MAX 128
char name[ROC_MODEL_STR_LEN_MAX];
char env[ROC_MODEL_STR_LEN_MAX];
} __plt_cache_aligned;
#define ROC_MODEL_CN96xx_Ax (ROC_MODEL_CN96xx_A0 | ROC_MODEL_CN96xx_B0)
@ -158,6 +163,30 @@ roc_model_is_cnf10kb_a0(void)
return roc_model->flag & ROC_MODEL_CNF105xxN_A0;
}
static inline bool
roc_env_is_hw(void)
{
return roc_model->flag & ROC_ENV_HW;
}
static inline bool
roc_env_is_emulator(void)
{
return roc_model->flag & ROC_ENV_EMUL;
}
static inline bool
roc_env_is_asim(void)
{
return roc_model->flag & ROC_ENV_ASIM;
}
static inline const char *
roc_env_get(void)
{
return roc_model->env;
}
int roc_model_init(struct roc_model *model);
#endif