1014a9e22SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2014a9e22SJerin Jacob * Copyright(C) 2021 Marvell. 3014a9e22SJerin Jacob */ 4014a9e22SJerin Jacob 559ceaa72SHarman Kalra #include <dirent.h> 6b315581cSRakesh Kudurumalla #include <fcntl.h> 7b315581cSRakesh Kudurumalla #include <unistd.h> 8b315581cSRakesh Kudurumalla 9014a9e22SJerin Jacob #include "roc_api.h" 10014a9e22SJerin Jacob #include "roc_priv.h" 11014a9e22SJerin Jacob 12014a9e22SJerin Jacob struct roc_model *roc_model; 13014a9e22SJerin Jacob 14014a9e22SJerin Jacob /* RoC and CPU IDs and revisions */ 15014a9e22SJerin Jacob #define VENDOR_ARM 0x41 /* 'A' */ 16014a9e22SJerin Jacob #define VENDOR_CAVIUM 0x43 /* 'C' */ 17014a9e22SJerin Jacob 18014a9e22SJerin Jacob #define SOC_PART_CN10K 0xD49 19*966f57a6SHarman Kalra #define SOC_PART_CN20K 0xD8E 20014a9e22SJerin Jacob 21*966f57a6SHarman Kalra #define PART_206xx 0xA0 22fa4ac951SAshwin Sekhar T K #define PART_106xx 0xB9 23fa4ac951SAshwin Sekhar T K #define PART_105xx 0xBA 24fa4ac951SAshwin Sekhar T K #define PART_105xxN 0xBC 2559d0913dSRakesh Kudurumalla #define PART_103xx 0xBD 26fa4ac951SAshwin Sekhar T K #define PART_98xx 0xB1 27fa4ac951SAshwin Sekhar T K #define PART_96xx 0xB2 28fa4ac951SAshwin Sekhar T K #define PART_95xx 0xB3 29fa4ac951SAshwin Sekhar T K #define PART_95xxN 0xB4 30fa4ac951SAshwin Sekhar T K #define PART_95xxMM 0xB5 31014a9e22SJerin Jacob #define PART_95O 0xB6 32014a9e22SJerin Jacob 33014a9e22SJerin Jacob #define MODEL_IMPL_BITS 8 34014a9e22SJerin Jacob #define MODEL_IMPL_SHIFT 24 35014a9e22SJerin Jacob #define MODEL_IMPL_MASK ((1 << MODEL_IMPL_BITS) - 1) 36014a9e22SJerin Jacob #define MODEL_PART_BITS 12 37014a9e22SJerin Jacob #define MODEL_PART_SHIFT 4 38014a9e22SJerin Jacob #define MODEL_PART_MASK ((1 << MODEL_PART_BITS) - 1) 39014a9e22SJerin Jacob #define MODEL_MAJOR_BITS 4 40014a9e22SJerin Jacob #define MODEL_MAJOR_SHIFT 20 41014a9e22SJerin Jacob #define MODEL_MAJOR_MASK ((1 << MODEL_MAJOR_BITS) - 1) 42014a9e22SJerin Jacob #define MODEL_MINOR_BITS 4 43014a9e22SJerin Jacob #define MODEL_MINOR_SHIFT 0 44014a9e22SJerin Jacob #define MODEL_MINOR_MASK ((1 << MODEL_MINOR_BITS) - 1) 45014a9e22SJerin Jacob 4659ceaa72SHarman Kalra #define MODEL_CN10K_PART_SHIFT 8 4759ceaa72SHarman Kalra #define MODEL_CN10K_PASS_BITS 4 4859ceaa72SHarman Kalra #define MODEL_CN10K_PASS_MASK ((1 << MODEL_CN10K_PASS_BITS) - 1) 4959ceaa72SHarman Kalra #define MODEL_CN10K_MAJOR_BITS 2 5059ceaa72SHarman Kalra #define MODEL_CN10K_MAJOR_SHIFT 2 5159ceaa72SHarman Kalra #define MODEL_CN10K_MAJOR_MASK ((1 << MODEL_CN10K_MAJOR_BITS) - 1) 5259ceaa72SHarman Kalra #define MODEL_CN10K_MINOR_BITS 2 5359ceaa72SHarman Kalra #define MODEL_CN10K_MINOR_SHIFT 0 5459ceaa72SHarman Kalra #define MODEL_CN10K_MINOR_MASK ((1 << MODEL_CN10K_MINOR_BITS) - 1) 5559ceaa72SHarman Kalra 56014a9e22SJerin Jacob static const struct model_db { 57014a9e22SJerin Jacob uint32_t impl; 58014a9e22SJerin Jacob uint32_t part; 59014a9e22SJerin Jacob uint32_t major; 60014a9e22SJerin Jacob uint32_t minor; 61014a9e22SJerin Jacob uint64_t flag; 62014a9e22SJerin Jacob char name[ROC_MODEL_STR_LEN_MAX]; 63014a9e22SJerin Jacob } model_db[] = { 64*966f57a6SHarman Kalra {VENDOR_ARM, PART_206xx, 0, 0, ROC_MODEL_CN206xx_A0, "cn20ka_a0"}, 65fa4ac951SAshwin Sekhar T K {VENDOR_ARM, PART_106xx, 0, 0, ROC_MODEL_CN106xx_A0, "cn10ka_a0"}, 6680608c80SHarman Kalra {VENDOR_ARM, PART_106xx, 0, 1, ROC_MODEL_CN106xx_A1, "cn10ka_a1"}, 67782828bfSSrikanth Yalavarthi {VENDOR_ARM, PART_106xx, 1, 0, ROC_MODEL_CN106xx_B0, "cn10ka_b0"}, 68fa4ac951SAshwin Sekhar T K {VENDOR_ARM, PART_105xx, 0, 0, ROC_MODEL_CNF105xx_A0, "cnf10ka_a0"}, 697eeb4b44SHarman Kalra {VENDOR_ARM, PART_105xx, 0, 1, ROC_MODEL_CNF105xx_A1, "cnf10ka_a1"}, 70dd462f68SRahul Bhansali {VENDOR_ARM, PART_103xx, 0, 0, ROC_MODEL_CN103xx_A0, "cn10kb_a0"}, 71fa4ac951SAshwin Sekhar T K {VENDOR_ARM, PART_105xxN, 0, 0, ROC_MODEL_CNF105xxN_A0, "cnf10kb_a0"}, 721a5f5ef4SHarman Kalra {VENDOR_ARM, PART_105xxN, 1, 0, ROC_MODEL_CNF105xxN_B0, "cnf10kb_b0"}, 73fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_98xx, 0, 0, ROC_MODEL_CN98xx_A0, "cn98xx_a0"}, 746cf706ceSHarman Kalra {VENDOR_CAVIUM, PART_98xx, 0, 1, ROC_MODEL_CN98xx_A1, "cn98xx_a1"}, 75fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_96xx, 0, 0, ROC_MODEL_CN96xx_A0, "cn96xx_a0"}, 76fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_96xx, 0, 1, ROC_MODEL_CN96xx_B0, "cn96xx_b0"}, 77fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_96xx, 2, 0, ROC_MODEL_CN96xx_C0, "cn96xx_c0"}, 78fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_96xx, 2, 1, ROC_MODEL_CN96xx_C0, "cn96xx_c1"}, 79fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95xx, 0, 0, ROC_MODEL_CNF95xx_A0, "cnf95xx_a0"}, 80fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95xx, 1, 0, ROC_MODEL_CNF95xx_B0, "cnf95xx_b0"}, 81fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95xxN, 0, 0, ROC_MODEL_CNF95xxN_A0, "cnf95xxn_a0"}, 82fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95xxN, 0, 1, ROC_MODEL_CNF95xxN_A0, "cnf95xxn_a1"}, 8364e63c19STomasz Duszynski {VENDOR_CAVIUM, PART_95xxN, 1, 0, ROC_MODEL_CNF95xxN_B0, "cnf95xxn_b0"}, 84fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95O, 0, 0, ROC_MODEL_CNF95xxO_A0, "cnf95O_a0"}, 85fa4ac951SAshwin Sekhar T K {VENDOR_CAVIUM, PART_95xxMM, 0, 0, ROC_MODEL_CNF95xxMM_A0, 86fa4ac951SAshwin Sekhar T K "cnf95xxmm_a0"}}; 87014a9e22SJerin Jacob 8859ceaa72SHarman Kalra /* Detect if RVU device */ 8959ceaa72SHarman Kalra static bool 9059ceaa72SHarman Kalra is_rvu_device(unsigned long val) 91014a9e22SJerin Jacob { 9259ceaa72SHarman Kalra return (val == PCI_DEVID_CNXK_RVU_PF || val == PCI_DEVID_CNXK_RVU_VF || 9359ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_AF || 9459ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_AF_VF || 9559ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_NPA_PF || 9659ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_NPA_VF || 9759ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_SSO_TIM_PF || 9859ceaa72SHarman Kalra val == PCI_DEVID_CNXK_RVU_SSO_TIM_VF || 9959ceaa72SHarman Kalra val == PCI_DEVID_CN10K_RVU_CPT_PF || 10059ceaa72SHarman Kalra val == PCI_DEVID_CN10K_RVU_CPT_VF); 101014a9e22SJerin Jacob } 102014a9e22SJerin Jacob 10359ceaa72SHarman Kalra static int 10459ceaa72SHarman Kalra rvu_device_lookup(const char *dirname, uint32_t *part, uint32_t *pass) 10559ceaa72SHarman Kalra { 10659ceaa72SHarman Kalra char filename[PATH_MAX]; 10759ceaa72SHarman Kalra unsigned long val; 10859ceaa72SHarman Kalra 10959ceaa72SHarman Kalra /* Check if vendor id is cavium */ 11059ceaa72SHarman Kalra snprintf(filename, sizeof(filename), "%s/vendor", dirname); 11159ceaa72SHarman Kalra if (plt_sysfs_value_parse(filename, &val) < 0) 11259ceaa72SHarman Kalra goto error; 11359ceaa72SHarman Kalra 11459ceaa72SHarman Kalra if (val != PCI_VENDOR_ID_CAVIUM) 11559ceaa72SHarman Kalra goto error; 11659ceaa72SHarman Kalra 11759ceaa72SHarman Kalra /* Get device id */ 11859ceaa72SHarman Kalra snprintf(filename, sizeof(filename), "%s/device", dirname); 11959ceaa72SHarman Kalra if (plt_sysfs_value_parse(filename, &val) < 0) 12059ceaa72SHarman Kalra goto error; 12159ceaa72SHarman Kalra 12259ceaa72SHarman Kalra /* Check if device ID belongs to any RVU device */ 12359ceaa72SHarman Kalra if (!is_rvu_device(val)) 12459ceaa72SHarman Kalra goto error; 12559ceaa72SHarman Kalra 12659ceaa72SHarman Kalra /* Get subsystem_device id */ 12759ceaa72SHarman Kalra snprintf(filename, sizeof(filename), "%s/subsystem_device", dirname); 12859ceaa72SHarman Kalra if (plt_sysfs_value_parse(filename, &val) < 0) 12959ceaa72SHarman Kalra goto error; 13059ceaa72SHarman Kalra 13159ceaa72SHarman Kalra *part = val >> MODEL_CN10K_PART_SHIFT; 13259ceaa72SHarman Kalra 13359ceaa72SHarman Kalra /* Get revision for pass value*/ 13459ceaa72SHarman Kalra snprintf(filename, sizeof(filename), "%s/revision", dirname); 13559ceaa72SHarman Kalra if (plt_sysfs_value_parse(filename, &val) < 0) 13659ceaa72SHarman Kalra goto error; 13759ceaa72SHarman Kalra 13859ceaa72SHarman Kalra *pass = val & MODEL_CN10K_PASS_MASK; 13959ceaa72SHarman Kalra 14059ceaa72SHarman Kalra return 0; 14159ceaa72SHarman Kalra error: 14259ceaa72SHarman Kalra return -EINVAL; 143014a9e22SJerin Jacob } 144014a9e22SJerin Jacob 14559ceaa72SHarman Kalra /* Scans through all PCI devices, detects RVU device and returns 14659ceaa72SHarman Kalra * subsystem_device 14759ceaa72SHarman Kalra */ 14859ceaa72SHarman Kalra static int 14959ceaa72SHarman Kalra cn10k_part_pass_get(uint32_t *part, uint32_t *pass) 15059ceaa72SHarman Kalra { 15159ceaa72SHarman Kalra #define SYSFS_PCI_DEVICES "/sys/bus/pci/devices" 15259ceaa72SHarman Kalra char dirname[PATH_MAX]; 15359ceaa72SHarman Kalra struct dirent *e; 154a421b880SHanumanth Pothula int ret = -1; 15559ceaa72SHarman Kalra DIR *dir; 156014a9e22SJerin Jacob 15759ceaa72SHarman Kalra dir = opendir(SYSFS_PCI_DEVICES); 15859ceaa72SHarman Kalra if (dir == NULL) { 159f665790aSDavid Marchand plt_err("%s(): opendir failed: %s", __func__, 16059ceaa72SHarman Kalra strerror(errno)); 16159ceaa72SHarman Kalra return -errno; 16259ceaa72SHarman Kalra } 16359ceaa72SHarman Kalra 16459ceaa72SHarman Kalra while ((e = readdir(dir)) != NULL) { 16559ceaa72SHarman Kalra if (e->d_name[0] == '.') 16659ceaa72SHarman Kalra continue; 16759ceaa72SHarman Kalra 16859ceaa72SHarman Kalra snprintf(dirname, sizeof(dirname), "%s/%s", SYSFS_PCI_DEVICES, 16959ceaa72SHarman Kalra e->d_name); 17059ceaa72SHarman Kalra 17159ceaa72SHarman Kalra /* Lookup for rvu device and get part pass information */ 172a421b880SHanumanth Pothula ret = rvu_device_lookup(dirname, part, pass); 173a421b880SHanumanth Pothula if (!ret) 17459ceaa72SHarman Kalra break; 17559ceaa72SHarman Kalra } 17659ceaa72SHarman Kalra 17759ceaa72SHarman Kalra closedir(dir); 178a421b880SHanumanth Pothula return ret; 179014a9e22SJerin Jacob } 180014a9e22SJerin Jacob 181014a9e22SJerin Jacob static bool 182014a9e22SJerin Jacob populate_model(struct roc_model *model, uint32_t midr) 183014a9e22SJerin Jacob { 184a421b880SHanumanth Pothula uint32_t impl, major, part, minor, pass = 0; 185014a9e22SJerin Jacob bool found = false; 186014a9e22SJerin Jacob size_t i; 187014a9e22SJerin Jacob 188014a9e22SJerin Jacob impl = (midr >> MODEL_IMPL_SHIFT) & MODEL_IMPL_MASK; 189014a9e22SJerin Jacob part = (midr >> MODEL_PART_SHIFT) & MODEL_PART_MASK; 190014a9e22SJerin Jacob major = (midr >> MODEL_MAJOR_SHIFT) & MODEL_MAJOR_MASK; 191014a9e22SJerin Jacob minor = (midr >> MODEL_MINOR_SHIFT) & MODEL_MINOR_MASK; 192014a9e22SJerin Jacob 193*966f57a6SHarman Kalra /* Update part number from device-tree */ 194*966f57a6SHarman Kalra if (part == SOC_PART_CN10K || part == SOC_PART_CN20K) { 19559ceaa72SHarman Kalra if (cn10k_part_pass_get(&part, &pass)) 19659ceaa72SHarman Kalra goto not_found; 19759ceaa72SHarman Kalra /* 19859ceaa72SHarman Kalra * Pass value format: 19959ceaa72SHarman Kalra * Bits 0..1: minor pass 20059ceaa72SHarman Kalra * Bits 3..2: major pass 20159ceaa72SHarman Kalra */ 20259ceaa72SHarman Kalra minor = (pass >> MODEL_CN10K_MINOR_SHIFT) & 20359ceaa72SHarman Kalra MODEL_CN10K_MINOR_MASK; 20459ceaa72SHarman Kalra major = (pass >> MODEL_CN10K_MAJOR_SHIFT) & 20559ceaa72SHarman Kalra MODEL_CN10K_MAJOR_MASK; 20659ceaa72SHarman Kalra } 207014a9e22SJerin Jacob 208014a9e22SJerin Jacob for (i = 0; i < PLT_DIM(model_db); i++) 209014a9e22SJerin Jacob if (model_db[i].impl == impl && model_db[i].part == part && 210014a9e22SJerin Jacob model_db[i].major == major && model_db[i].minor == minor) { 211014a9e22SJerin Jacob model->flag = model_db[i].flag; 212014a9e22SJerin Jacob strncpy(model->name, model_db[i].name, 213014a9e22SJerin Jacob ROC_MODEL_STR_LEN_MAX - 1); 214014a9e22SJerin Jacob found = true; 215014a9e22SJerin Jacob break; 216014a9e22SJerin Jacob } 21759ceaa72SHarman Kalra not_found: 218014a9e22SJerin Jacob if (!found) { 219014a9e22SJerin Jacob model->flag = 0; 220014a9e22SJerin Jacob strncpy(model->name, "unknown", ROC_MODEL_STR_LEN_MAX - 1); 221040f0bdaSTomasz Duszynski plt_err("Invalid RoC model (impl=0x%x, part=0x%x, major=0x%x, minor=0x%x)", 222040f0bdaSTomasz Duszynski impl, part, major, minor); 223014a9e22SJerin Jacob } 224014a9e22SJerin Jacob 225014a9e22SJerin Jacob return found; 226014a9e22SJerin Jacob } 227014a9e22SJerin Jacob 228014a9e22SJerin Jacob static int 229014a9e22SJerin Jacob midr_get(unsigned long *val) 230014a9e22SJerin Jacob { 231014a9e22SJerin Jacob const char *file = 232014a9e22SJerin Jacob "/sys/devices/system/cpu/cpu0/regs/identification/midr_el1"; 233014a9e22SJerin Jacob int rc = UTIL_ERR_FS; 234014a9e22SJerin Jacob char buf[BUFSIZ]; 235014a9e22SJerin Jacob char *end = NULL; 236014a9e22SJerin Jacob FILE *f; 237014a9e22SJerin Jacob 238014a9e22SJerin Jacob if (val == NULL) 239014a9e22SJerin Jacob goto err; 240014a9e22SJerin Jacob f = fopen(file, "r"); 241014a9e22SJerin Jacob if (f == NULL) 242014a9e22SJerin Jacob goto err; 243014a9e22SJerin Jacob 244014a9e22SJerin Jacob if (fgets(buf, sizeof(buf), f) == NULL) 245014a9e22SJerin Jacob goto fclose; 246014a9e22SJerin Jacob 247014a9e22SJerin Jacob *val = strtoul(buf, &end, 0); 248014a9e22SJerin Jacob if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) 249014a9e22SJerin Jacob goto fclose; 250014a9e22SJerin Jacob 251014a9e22SJerin Jacob rc = 0; 252014a9e22SJerin Jacob fclose: 253014a9e22SJerin Jacob fclose(f); 254014a9e22SJerin Jacob err: 255014a9e22SJerin Jacob return rc; 256014a9e22SJerin Jacob } 257014a9e22SJerin Jacob 258014a9e22SJerin Jacob static void 259014a9e22SJerin Jacob detect_invalid_config(void) 260014a9e22SJerin Jacob { 261014a9e22SJerin Jacob #ifdef ROC_PLATFORM_CN9K 262014a9e22SJerin Jacob #ifdef ROC_PLATFORM_CN10K 263*966f57a6SHarman Kalra #ifdef ROC_PLATFORM_CN20K 264014a9e22SJerin Jacob PLT_STATIC_ASSERT(0); 265014a9e22SJerin Jacob #endif 266014a9e22SJerin Jacob #endif 267*966f57a6SHarman Kalra #endif 268014a9e22SJerin Jacob } 269014a9e22SJerin Jacob 270b89f023eSTomasz Duszynski static uint64_t 271b89f023eSTomasz Duszynski env_lookup_flag(const char *name) 272b89f023eSTomasz Duszynski { 273b89f023eSTomasz Duszynski unsigned int i; 274b89f023eSTomasz Duszynski struct { 275b89f023eSTomasz Duszynski const char *name; 276b89f023eSTomasz Duszynski uint64_t flag; 277b89f023eSTomasz Duszynski } envs[] = { 278b89f023eSTomasz Duszynski {"HW_PLATFORM", ROC_ENV_HW}, 279b89f023eSTomasz Duszynski {"EMUL_PLATFORM", ROC_ENV_EMUL}, 280b89f023eSTomasz Duszynski {"ASIM_PLATFORM", ROC_ENV_ASIM}, 281b89f023eSTomasz Duszynski }; 282b89f023eSTomasz Duszynski 283b89f023eSTomasz Duszynski for (i = 0; i < PLT_DIM(envs); i++) 284b89f023eSTomasz Duszynski if (!strncmp(envs[i].name, name, strlen(envs[i].name))) 285b89f023eSTomasz Duszynski return envs[i].flag; 286b89f023eSTomasz Duszynski 287b89f023eSTomasz Duszynski return 0; 288b89f023eSTomasz Duszynski } 289b89f023eSTomasz Duszynski 290b89f023eSTomasz Duszynski static void 291b89f023eSTomasz Duszynski of_env_get(struct roc_model *model) 292b89f023eSTomasz Duszynski { 293b89f023eSTomasz Duszynski const char *const path = "/proc/device-tree/soc@0/runplatform"; 294b89f023eSTomasz Duszynski uint64_t flag; 295b89f023eSTomasz Duszynski FILE *fp; 296b89f023eSTomasz Duszynski 297b315581cSRakesh Kudurumalla if (access(path, F_OK) != 0) { 298b315581cSRakesh Kudurumalla strncpy(model->env, "HW_PLATFORM", ROC_MODEL_STR_LEN_MAX - 1); 299b315581cSRakesh Kudurumalla model->flag |= ROC_ENV_HW; 300b315581cSRakesh Kudurumalla return; 301b315581cSRakesh Kudurumalla } 302b315581cSRakesh Kudurumalla 303b89f023eSTomasz Duszynski fp = fopen(path, "r"); 304b89f023eSTomasz Duszynski if (!fp) { 305b89f023eSTomasz Duszynski plt_err("Failed to open %s", path); 306b89f023eSTomasz Duszynski return; 307b89f023eSTomasz Duszynski } 308b89f023eSTomasz Duszynski 309b89f023eSTomasz Duszynski if (!fgets(model->env, sizeof(model->env), fp)) { 310b89f023eSTomasz Duszynski plt_err("Failed to read %s", path); 311b89f023eSTomasz Duszynski goto err; 312b89f023eSTomasz Duszynski } 313b89f023eSTomasz Duszynski 314b89f023eSTomasz Duszynski flag = env_lookup_flag(model->env); 315b89f023eSTomasz Duszynski if (flag == 0) { 316b89f023eSTomasz Duszynski plt_err("Unknown platform: %s", model->env); 317b89f023eSTomasz Duszynski goto err; 318b89f023eSTomasz Duszynski } 319b89f023eSTomasz Duszynski 320b89f023eSTomasz Duszynski model->flag |= flag; 321b89f023eSTomasz Duszynski err: 322b89f023eSTomasz Duszynski fclose(fp); 323b89f023eSTomasz Duszynski } 324b89f023eSTomasz Duszynski 325014a9e22SJerin Jacob int 326014a9e22SJerin Jacob roc_model_init(struct roc_model *model) 327014a9e22SJerin Jacob { 328014a9e22SJerin Jacob int rc = UTIL_ERR_PARAM; 329014a9e22SJerin Jacob unsigned long midr; 330014a9e22SJerin Jacob 331014a9e22SJerin Jacob detect_invalid_config(); 332014a9e22SJerin Jacob 333014a9e22SJerin Jacob if (!model) 334014a9e22SJerin Jacob goto err; 335014a9e22SJerin Jacob 336014a9e22SJerin Jacob rc = midr_get(&midr); 337014a9e22SJerin Jacob if (rc) 338014a9e22SJerin Jacob goto err; 339014a9e22SJerin Jacob 340014a9e22SJerin Jacob rc = UTIL_ERR_INVALID_MODEL; 341014a9e22SJerin Jacob if (!populate_model(model, midr)) 342014a9e22SJerin Jacob goto err; 343014a9e22SJerin Jacob 344b89f023eSTomasz Duszynski of_env_get(model); 345b89f023eSTomasz Duszynski 346014a9e22SJerin Jacob rc = 0; 347b89f023eSTomasz Duszynski plt_info("RoC Model: %s (%s)", model->name, model->env); 348014a9e22SJerin Jacob roc_model = model; 349014a9e22SJerin Jacob err: 350014a9e22SJerin Jacob return rc; 351014a9e22SJerin Jacob } 352