xref: /dpdk/drivers/common/cnxk/roc_model.c (revision 966f57a6232ea2efd83cb3d12053390384f645b9)
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