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 <[email protected]> Reviewed-by: Jerin Jacob Kollanukkaran <[email protected]> --- drivers/common/cnxk/roc_model.c | 53 ++++++++++++++++++++++++++++++++- drivers/common/cnxk/roc_model.h | 29 ++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/drivers/common/cnxk/roc_model.c b/drivers/common/cnxk/roc_model.c index e5aeabe2e2..447dc6e8bc 100644 --- a/drivers/common/cnxk/roc_model.c +++ b/drivers/common/cnxk/roc_model.c @@ -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; diff --git a/drivers/common/cnxk/roc_model.h b/drivers/common/cnxk/roc_model.h index a54f435b46..3779a88bca 100644 --- a/drivers/common/cnxk/roc_model.h +++ b/drivers/common/cnxk/roc_model.h @@ -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 -- 2.25.1

