xref: /openbmc/u-boot/arch/powerpc/cpu/mpc85xx/liodn.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2db977abfSKumar Gala /*
36b3a8d00SKumar Gala  * Copyright 2008-2011 Freescale Semiconductor, Inc.
4db977abfSKumar Gala  */
5db977abfSKumar Gala 
6db977abfSKumar Gala #include <common.h>
7b08c8c48SMasahiro Yamada #include <linux/libfdt.h>
8db977abfSKumar Gala #include <fdt_support.h>
9db977abfSKumar Gala 
10db977abfSKumar Gala #include <asm/immap_85xx.h>
11db977abfSKumar Gala #include <asm/io.h>
12db977abfSKumar Gala #include <asm/processor.h>
13db977abfSKumar Gala #include <asm/fsl_portals.h>
14db977abfSKumar Gala #include <asm/fsl_liodn.h>
15db977abfSKumar Gala 
get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev,u32 * liodns,int liodn_offset)16db977abfSKumar Gala int get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev, u32 *liodns, int liodn_offset)
17db977abfSKumar Gala {
18db977abfSKumar Gala 	liodns[0] = liodn_bases[dpaa_dev].id[0] + liodn_offset;
19db977abfSKumar Gala 
20db977abfSKumar Gala 	if (liodn_bases[dpaa_dev].num_ids == 2)
21db977abfSKumar Gala 		liodns[1] = liodn_bases[dpaa_dev].id[1] + liodn_offset;
22db977abfSKumar Gala 
23db977abfSKumar Gala 	return liodn_bases[dpaa_dev].num_ids;
24db977abfSKumar Gala }
25db977abfSKumar Gala 
26fd946040STimur Tabi #ifdef CONFIG_SYS_SRIO
set_srio_liodn(struct srio_liodn_id_table * tbl,int size)271a0c6421SKumar Gala static void set_srio_liodn(struct srio_liodn_id_table *tbl, int size)
281a0c6421SKumar Gala {
291a0c6421SKumar Gala 	int i;
301a0c6421SKumar Gala 
311a0c6421SKumar Gala 	for (i = 0; i < size; i++) {
321a0c6421SKumar Gala 		unsigned long reg_off = tbl[i].reg_offset[0];
331a0c6421SKumar Gala 		out_be32((u32 *)reg_off, tbl[i].id[0]);
341a0c6421SKumar Gala 
351a0c6421SKumar Gala 		if (tbl[i].num_ids == 2) {
361a0c6421SKumar Gala 			reg_off = tbl[i].reg_offset[1];
371a0c6421SKumar Gala 			out_be32((u32 *)reg_off, tbl[i].id[1]);
381a0c6421SKumar Gala 		}
391a0c6421SKumar Gala 	}
401a0c6421SKumar Gala }
41fd946040STimur Tabi #endif
421a0c6421SKumar Gala 
set_liodn(struct liodn_id_table * tbl,int size)43db977abfSKumar Gala static void set_liodn(struct liodn_id_table *tbl, int size)
44db977abfSKumar Gala {
45db977abfSKumar Gala 	int i;
46db977abfSKumar Gala 
47db977abfSKumar Gala 	for (i = 0; i < size; i++) {
48db977abfSKumar Gala 		u32 liodn;
49db977abfSKumar Gala 		if (tbl[i].num_ids == 2) {
50db977abfSKumar Gala 			liodn = (tbl[i].id[0] << 16) | tbl[i].id[1];
51db977abfSKumar Gala 		} else {
52db977abfSKumar Gala 			liodn = tbl[i].id[0];
53db977abfSKumar Gala 		}
54db977abfSKumar Gala 
55db977abfSKumar Gala 		out_be32((volatile u32 *)(tbl[i].reg_offset), liodn);
56db977abfSKumar Gala 	}
57db977abfSKumar Gala }
58db977abfSKumar Gala 
5997a8d010SIgal Liberman #ifdef CONFIG_SYS_DPAA_FMAN
set_fman_liodn(struct fman_liodn_id_table * tbl,int size)6097a8d010SIgal Liberman static void set_fman_liodn(struct fman_liodn_id_table *tbl, int size)
6197a8d010SIgal Liberman {
6297a8d010SIgal Liberman 	int i;
6397a8d010SIgal Liberman 
6497a8d010SIgal Liberman 	for (i = 0; i < size; i++) {
6597a8d010SIgal Liberman 		u32 liodn;
6697a8d010SIgal Liberman 		if (tbl[i].num_ids == 2)
6797a8d010SIgal Liberman 			liodn = (tbl[i].id[0] << 16) | tbl[i].id[1];
6897a8d010SIgal Liberman 		else
6997a8d010SIgal Liberman 			liodn = tbl[i].id[0];
7097a8d010SIgal Liberman 
7197a8d010SIgal Liberman 		out_be32((volatile u32 *)(tbl[i].reg_offset), liodn);
7297a8d010SIgal Liberman 	}
7397a8d010SIgal Liberman }
7497a8d010SIgal Liberman #endif
7597a8d010SIgal Liberman 
setup_sec_liodn_base(void)76db977abfSKumar Gala static void setup_sec_liodn_base(void)
77db977abfSKumar Gala {
78db977abfSKumar Gala 	ccsr_sec_t *sec = (void *)CONFIG_SYS_FSL_SEC_ADDR;
79db977abfSKumar Gala 	u32 base;
80db977abfSKumar Gala 
81db977abfSKumar Gala 	if (!IS_E_PROCESSOR(get_svr()))
82db977abfSKumar Gala 		return;
83db977abfSKumar Gala 
84db977abfSKumar Gala 	/* QILCR[QSLOM] */
85028dbb8dSRuchika Gupta 	sec_out32(&sec->qilcr_ms, 0x3ff<<16);
86db977abfSKumar Gala 
87db977abfSKumar Gala 	base = (liodn_bases[FSL_HW_PORTAL_SEC].id[0] << 16) |
88db977abfSKumar Gala 		liodn_bases[FSL_HW_PORTAL_SEC].id[1];
89db977abfSKumar Gala 
90028dbb8dSRuchika Gupta 	sec_out32(&sec->qilcr_ls, base);
91db977abfSKumar Gala }
92db977abfSKumar Gala 
93db977abfSKumar Gala #ifdef CONFIG_SYS_DPAA_FMAN
setup_fman_liodn_base(enum fsl_dpaa_dev dev,struct fman_liodn_id_table * tbl,int size)94db977abfSKumar Gala static void setup_fman_liodn_base(enum fsl_dpaa_dev dev,
9597a8d010SIgal Liberman 				  struct fman_liodn_id_table *tbl, int size)
96db977abfSKumar Gala {
97db977abfSKumar Gala 	int i;
98db977abfSKumar Gala 	ccsr_fman_t *fm;
99db977abfSKumar Gala 	u32 base;
100db977abfSKumar Gala 
101db977abfSKumar Gala 	switch(dev) {
102db977abfSKumar Gala 	case FSL_HW_PORTAL_FMAN1:
103db977abfSKumar Gala 		fm = (void *)CONFIG_SYS_FSL_FM1_ADDR;
104db977abfSKumar Gala 		break;
105db977abfSKumar Gala 
106db977abfSKumar Gala #if (CONFIG_SYS_NUM_FMAN == 2)
107db977abfSKumar Gala 	case FSL_HW_PORTAL_FMAN2:
108db977abfSKumar Gala 		fm = (void *)CONFIG_SYS_FSL_FM2_ADDR;
109db977abfSKumar Gala 		break;
110db977abfSKumar Gala #endif
111db977abfSKumar Gala 	default:
112db977abfSKumar Gala 		printf("Error: Invalid device type to %s\n", __FUNCTION__);
113db977abfSKumar Gala 		return ;
114db977abfSKumar Gala 	}
115db977abfSKumar Gala 
116db977abfSKumar Gala 	base = (liodn_bases[dev].id[0] << 16) | liodn_bases[dev].id[0];
117db977abfSKumar Gala 
118db977abfSKumar Gala 	/* setup all bases the same */
119db977abfSKumar Gala 	for (i = 0; i < 32; i++) {
120db977abfSKumar Gala 		out_be32(&fm->fm_dma.fmdmplr[i], base);
121db977abfSKumar Gala 	}
122db977abfSKumar Gala 
123db977abfSKumar Gala 	/* update tbl to ... */
124db977abfSKumar Gala 	for (i = 0; i < size; i++)
125db977abfSKumar Gala 		tbl[i].id[0] += liodn_bases[dev].id[0];
126db977abfSKumar Gala }
127db977abfSKumar Gala #endif
128db977abfSKumar Gala 
setup_pme_liodn_base(void)129db977abfSKumar Gala static void setup_pme_liodn_base(void)
130db977abfSKumar Gala {
131db977abfSKumar Gala #ifdef CONFIG_SYS_DPAA_PME
132db977abfSKumar Gala 	ccsr_pme_t *pme = (void *)CONFIG_SYS_FSL_CORENET_PME_ADDR;
133db977abfSKumar Gala 	u32 base = (liodn_bases[FSL_HW_PORTAL_PME].id[0] << 16) |
134db977abfSKumar Gala 			liodn_bases[FSL_HW_PORTAL_PME].id[1];
135db977abfSKumar Gala 
136db977abfSKumar Gala 	out_be32(&pme->liodnbr, base);
137db977abfSKumar Gala #endif
138db977abfSKumar Gala }
139db977abfSKumar Gala 
1406b3a8d00SKumar Gala #ifdef CONFIG_SYS_FSL_RAID_ENGINE
setup_raide_liodn_base(void)1416b3a8d00SKumar Gala static void setup_raide_liodn_base(void)
1426b3a8d00SKumar Gala {
1436b3a8d00SKumar Gala 	struct ccsr_raide *raide = (void *)CONFIG_SYS_FSL_RAID_ENGINE_ADDR;
1446b3a8d00SKumar Gala 
1456b3a8d00SKumar Gala 	/* setup raid engine liodn base for data/desc ; both set to 47 */
1466b3a8d00SKumar Gala 	u32 base = (liodn_bases[FSL_HW_PORTAL_RAID_ENGINE].id[0] << 16) |
1476b3a8d00SKumar Gala 			liodn_bases[FSL_HW_PORTAL_RAID_ENGINE].id[0];
1486b3a8d00SKumar Gala 
1496b3a8d00SKumar Gala 	out_be32(&raide->liodnbr, base);
1506b3a8d00SKumar Gala }
1516b3a8d00SKumar Gala #endif
1526b3a8d00SKumar Gala 
1534d28db8aSKumar Gala #ifdef CONFIG_SYS_DPAA_RMAN
set_rman_liodn(struct liodn_id_table * tbl,int size)1544d28db8aSKumar Gala static void set_rman_liodn(struct liodn_id_table *tbl, int size)
1554d28db8aSKumar Gala {
1564d28db8aSKumar Gala 	int i;
1574d28db8aSKumar Gala 	struct ccsr_rman *rman = (void *)CONFIG_SYS_FSL_CORENET_RMAN_ADDR;
1584d28db8aSKumar Gala 
1594d28db8aSKumar Gala 	for (i = 0; i < size; i++) {
1604d28db8aSKumar Gala 		/* write the RMan block number */
1614d28db8aSKumar Gala 		out_be32(&rman->mmitar, i);
1624d28db8aSKumar Gala 		/* write the liodn offset corresponding to the block */
1634d28db8aSKumar Gala 		out_be32((u32 *)(tbl[i].reg_offset), tbl[i].id[0]);
1644d28db8aSKumar Gala 	}
1654d28db8aSKumar Gala }
1664d28db8aSKumar Gala 
setup_rman_liodn_base(struct liodn_id_table * tbl,int size)1674d28db8aSKumar Gala static void setup_rman_liodn_base(struct liodn_id_table *tbl, int size)
1684d28db8aSKumar Gala {
1694d28db8aSKumar Gala 	int i;
1704d28db8aSKumar Gala 	struct ccsr_rman *rman = (void *)CONFIG_SYS_FSL_CORENET_RMAN_ADDR;
1714d28db8aSKumar Gala 	u32 base = liodn_bases[FSL_HW_PORTAL_RMAN].id[0];
1724d28db8aSKumar Gala 
1734d28db8aSKumar Gala 	out_be32(&rman->mmliodnbr, base);
1744d28db8aSKumar Gala 
1754d28db8aSKumar Gala 	/* update liodn offset */
1764d28db8aSKumar Gala 	for (i = 0; i < size; i++)
1774d28db8aSKumar Gala 		tbl[i].id[0] += base;
1784d28db8aSKumar Gala }
1794d28db8aSKumar Gala #endif
1804d28db8aSKumar Gala 
set_liodns(void)181db977abfSKumar Gala void set_liodns(void)
182db977abfSKumar Gala {
183db977abfSKumar Gala 	/* setup general liodn offsets */
184db977abfSKumar Gala 	set_liodn(liodn_tbl, liodn_tbl_sz);
185db977abfSKumar Gala 
186fd946040STimur Tabi #ifdef CONFIG_SYS_SRIO
1871a0c6421SKumar Gala 	/* setup SRIO port liodns */
1881a0c6421SKumar Gala 	set_srio_liodn(srio_liodn_tbl, srio_liodn_tbl_sz);
189fd946040STimur Tabi #endif
1901a0c6421SKumar Gala 
191db977abfSKumar Gala 	/* setup SEC block liodn bases & offsets if we have one */
192db977abfSKumar Gala 	if (IS_E_PROCESSOR(get_svr())) {
193db977abfSKumar Gala 		set_liodn(sec_liodn_tbl, sec_liodn_tbl_sz);
194db977abfSKumar Gala 		setup_sec_liodn_base();
195db977abfSKumar Gala 	}
196db977abfSKumar Gala 
197db977abfSKumar Gala 	/* setup FMAN block(s) liodn bases & offsets if we have one */
198db977abfSKumar Gala #ifdef CONFIG_SYS_DPAA_FMAN
19997a8d010SIgal Liberman 	set_fman_liodn(fman1_liodn_tbl, fman1_liodn_tbl_sz);
200db977abfSKumar Gala 	setup_fman_liodn_base(FSL_HW_PORTAL_FMAN1, fman1_liodn_tbl,
201db977abfSKumar Gala 				fman1_liodn_tbl_sz);
202db977abfSKumar Gala 
203db977abfSKumar Gala #if (CONFIG_SYS_NUM_FMAN == 2)
20497a8d010SIgal Liberman 	set_fman_liodn(fman2_liodn_tbl, fman2_liodn_tbl_sz);
205db977abfSKumar Gala 	setup_fman_liodn_base(FSL_HW_PORTAL_FMAN2, fman2_liodn_tbl,
206db977abfSKumar Gala 				fman2_liodn_tbl_sz);
207db977abfSKumar Gala #endif
208db977abfSKumar Gala #endif
209db977abfSKumar Gala 	/* setup PME liodn base */
210db977abfSKumar Gala 	setup_pme_liodn_base();
2116b3a8d00SKumar Gala 
2126b3a8d00SKumar Gala #ifdef CONFIG_SYS_FSL_RAID_ENGINE
2136b3a8d00SKumar Gala 	/* raid engine ccr addr code for liodn */
2146b3a8d00SKumar Gala 	set_liodn(raide_liodn_tbl, raide_liodn_tbl_sz);
2156b3a8d00SKumar Gala 	setup_raide_liodn_base();
2166b3a8d00SKumar Gala #endif
2174d28db8aSKumar Gala 
2184d28db8aSKumar Gala #ifdef CONFIG_SYS_DPAA_RMAN
2194d28db8aSKumar Gala 	/* setup RMan liodn offsets */
2204d28db8aSKumar Gala 	set_rman_liodn(rman_liodn_tbl, rman_liodn_tbl_sz);
2214d28db8aSKumar Gala 	/* setup RMan liodn base */
2224d28db8aSKumar Gala 	setup_rman_liodn_base(rman_liodn_tbl, rman_liodn_tbl_sz);
2234d28db8aSKumar Gala #endif
224db977abfSKumar Gala }
225db977abfSKumar Gala 
226fd946040STimur Tabi #ifdef CONFIG_SYS_SRIO
fdt_fixup_srio_liodn(void * blob,struct srio_liodn_id_table * tbl)2279c42ef61SKumar Gala static void fdt_fixup_srio_liodn(void *blob, struct srio_liodn_id_table *tbl)
2289c42ef61SKumar Gala {
2299c42ef61SKumar Gala 	int i, srio_off;
2309c42ef61SKumar Gala 
2319c42ef61SKumar Gala 	/* search for srio node, if doesn't exist just return - nothing todo */
2329c42ef61SKumar Gala 	srio_off = fdt_node_offset_by_compatible(blob, -1, "fsl,srio");
2339c42ef61SKumar Gala 	if (srio_off < 0)
2349c42ef61SKumar Gala 		return ;
2359c42ef61SKumar Gala 
2369c42ef61SKumar Gala 	for (i = 0; i < srio_liodn_tbl_sz; i++) {
2379c42ef61SKumar Gala 		int off, portid = tbl[i].portid;
2389c42ef61SKumar Gala 
2399c42ef61SKumar Gala 		off = fdt_node_offset_by_prop_value(blob, srio_off,
2409c42ef61SKumar Gala 			 "cell-index", &portid, 4);
2419c42ef61SKumar Gala 		if (off >= 0) {
2429c42ef61SKumar Gala 			off = fdt_setprop(blob, off, "fsl,liodn",
2439c42ef61SKumar Gala 				&tbl[i].id[0],
2449c42ef61SKumar Gala 				sizeof(u32) * tbl[i].num_ids);
2459c42ef61SKumar Gala 			if (off > 0)
2469c42ef61SKumar Gala 				printf("WARNING unable to set fsl,liodn for "
2479c42ef61SKumar Gala 					"fsl,srio port %d: %s\n",
2489c42ef61SKumar Gala 					portid, fdt_strerror(off));
2499c42ef61SKumar Gala 		} else {
2509c42ef61SKumar Gala 			debug("WARNING: couldn't set fsl,liodn for srio: %s.\n",
2519c42ef61SKumar Gala 				fdt_strerror(off));
2529c42ef61SKumar Gala 		}
2539c42ef61SKumar Gala 	}
2549c42ef61SKumar Gala }
255fd946040STimur Tabi #endif
2569c42ef61SKumar Gala 
25771cfcef6SLaurentiu Tudor #define CONFIG_SYS_MAX_PCI_EPS		8
25871cfcef6SLaurentiu Tudor 
fdt_fixup_pci_liodn_offsets(void * fdt,const char * compat,int ep_liodn_start)2598f9fe660SLaurentiu TUDOR static void fdt_fixup_pci_liodn_offsets(void *fdt, const char *compat,
2608f9fe660SLaurentiu TUDOR 					int ep_liodn_start)
26171cfcef6SLaurentiu Tudor {
26271cfcef6SLaurentiu Tudor 	int off, pci_idx = 0, pci_cnt = 0, i, rc;
26371cfcef6SLaurentiu Tudor 	const uint32_t *base_liodn;
26471cfcef6SLaurentiu Tudor 	uint32_t liodn_offs[CONFIG_SYS_MAX_PCI_EPS + 1] = { 0 };
26571cfcef6SLaurentiu Tudor 
26671cfcef6SLaurentiu Tudor 	/*
26771cfcef6SLaurentiu Tudor 	 * Count the number of pci nodes.
26871cfcef6SLaurentiu Tudor 	 * It's needed later when the interleaved liodn offsets are generated.
26971cfcef6SLaurentiu Tudor 	 */
27071cfcef6SLaurentiu Tudor 	off = fdt_node_offset_by_compatible(fdt, -1, compat);
27171cfcef6SLaurentiu Tudor 	while (off != -FDT_ERR_NOTFOUND) {
27271cfcef6SLaurentiu Tudor 		pci_cnt++;
27371cfcef6SLaurentiu Tudor 		off = fdt_node_offset_by_compatible(fdt, off, compat);
27471cfcef6SLaurentiu Tudor 	}
27571cfcef6SLaurentiu Tudor 
27671cfcef6SLaurentiu Tudor 	for (off = fdt_node_offset_by_compatible(fdt, -1, compat);
27771cfcef6SLaurentiu Tudor 	     off != -FDT_ERR_NOTFOUND;
27871cfcef6SLaurentiu Tudor 	     off = fdt_node_offset_by_compatible(fdt, off, compat)) {
27971cfcef6SLaurentiu Tudor 		base_liodn = fdt_getprop(fdt, off, "fsl,liodn", &rc);
28071cfcef6SLaurentiu Tudor 		if (!base_liodn) {
28171cfcef6SLaurentiu Tudor 			char path[64];
28271cfcef6SLaurentiu Tudor 
28371cfcef6SLaurentiu Tudor 			if (fdt_get_path(fdt, off, path, sizeof(path)) < 0)
28471cfcef6SLaurentiu Tudor 				strcpy(path, "(unknown)");
28571cfcef6SLaurentiu Tudor 			printf("WARNING Could not get liodn of node %s: %s\n",
28671cfcef6SLaurentiu Tudor 			       path, fdt_strerror(rc));
28771cfcef6SLaurentiu Tudor 			continue;
28871cfcef6SLaurentiu Tudor 		}
28971cfcef6SLaurentiu Tudor 		for (i = 0; i < CONFIG_SYS_MAX_PCI_EPS; i++)
2908f9fe660SLaurentiu TUDOR 			liodn_offs[i + 1] = ep_liodn_start +
29171cfcef6SLaurentiu Tudor 					i * pci_cnt + pci_idx - *base_liodn;
29271cfcef6SLaurentiu Tudor 		rc = fdt_setprop(fdt, off, "fsl,liodn-offset-list",
29371cfcef6SLaurentiu Tudor 				 liodn_offs, sizeof(liodn_offs));
29471cfcef6SLaurentiu Tudor 		if (rc) {
29571cfcef6SLaurentiu Tudor 			char path[64];
29671cfcef6SLaurentiu Tudor 
29771cfcef6SLaurentiu Tudor 			if (fdt_get_path(fdt, off, path, sizeof(path)) < 0)
29871cfcef6SLaurentiu Tudor 				strcpy(path, "(unknown)");
29971cfcef6SLaurentiu Tudor 			printf("WARNING Unable to set fsl,liodn-offset-list for "
30071cfcef6SLaurentiu Tudor 			       "node %s: %s\n", path, fdt_strerror(rc));
30171cfcef6SLaurentiu Tudor 			continue;
30271cfcef6SLaurentiu Tudor 		}
30371cfcef6SLaurentiu Tudor 		pci_idx++;
30471cfcef6SLaurentiu Tudor 	}
30571cfcef6SLaurentiu Tudor }
30671cfcef6SLaurentiu Tudor 
fdt_fixup_liodn_tbl(void * blob,struct liodn_id_table * tbl,int sz)307db977abfSKumar Gala static void fdt_fixup_liodn_tbl(void *blob, struct liodn_id_table *tbl, int sz)
308db977abfSKumar Gala {
309db977abfSKumar Gala 	int i;
310db977abfSKumar Gala 
311db977abfSKumar Gala 	for (i = 0; i < sz; i++) {
312db977abfSKumar Gala 		int off;
313db977abfSKumar Gala 
314db977abfSKumar Gala 		if (tbl[i].compat == NULL)
315db977abfSKumar Gala 			continue;
316db977abfSKumar Gala 
317db977abfSKumar Gala 		off = fdt_node_offset_by_compat_reg(blob,
318db977abfSKumar Gala 				tbl[i].compat, tbl[i].compat_offset);
319db977abfSKumar Gala 		if (off >= 0) {
320db977abfSKumar Gala 			off = fdt_setprop(blob, off, "fsl,liodn",
321db977abfSKumar Gala 				&tbl[i].id[0],
322db977abfSKumar Gala 				sizeof(u32) * tbl[i].num_ids);
323db977abfSKumar Gala 			if (off > 0)
324db977abfSKumar Gala 				printf("WARNING unable to set fsl,liodn for "
325db977abfSKumar Gala 					"%s: %s\n",
326db977abfSKumar Gala 					tbl[i].compat, fdt_strerror(off));
327db977abfSKumar Gala 		} else {
328db977abfSKumar Gala 			debug("WARNING: could not set fsl,liodn for %s: %s.\n",
329db977abfSKumar Gala 					tbl[i].compat, fdt_strerror(off));
330db977abfSKumar Gala 		}
331db977abfSKumar Gala 	}
332db977abfSKumar Gala }
333db977abfSKumar Gala 
33497a8d010SIgal Liberman #ifdef CONFIG_SYS_DPAA_FMAN
fdt_fixup_liodn_tbl_fman(void * blob,struct fman_liodn_id_table * tbl,int sz)33597a8d010SIgal Liberman static void fdt_fixup_liodn_tbl_fman(void *blob,
33697a8d010SIgal Liberman 				     struct fman_liodn_id_table *tbl,
33797a8d010SIgal Liberman 				     int sz)
33897a8d010SIgal Liberman {
33997a8d010SIgal Liberman 	int i;
34097a8d010SIgal Liberman 
34197a8d010SIgal Liberman 	for (i = 0; i < sz; i++) {
34297a8d010SIgal Liberman 		int off;
34397a8d010SIgal Liberman 
34497a8d010SIgal Liberman 		if (tbl[i].compat == NULL)
34597a8d010SIgal Liberman 			continue;
34697a8d010SIgal Liberman 
34797a8d010SIgal Liberman 		/* Try the new compatible first.
34897a8d010SIgal Liberman 		 * If the node is missing, try the old.
34997a8d010SIgal Liberman 		 */
35097a8d010SIgal Liberman 		off = fdt_node_offset_by_compat_reg(blob,
35197a8d010SIgal Liberman 				tbl[i].compat[0], tbl[i].compat_offset);
35297a8d010SIgal Liberman 		if (off < 0)
35397a8d010SIgal Liberman 			off = fdt_node_offset_by_compat_reg(blob,
35497a8d010SIgal Liberman 					tbl[i].compat[1], tbl[i].compat_offset);
35597a8d010SIgal Liberman 
35697a8d010SIgal Liberman 		if (off >= 0) {
35797a8d010SIgal Liberman 			off = fdt_setprop(blob, off, "fsl,liodn",
35897a8d010SIgal Liberman 				&tbl[i].id[0],
35997a8d010SIgal Liberman 				sizeof(u32) * tbl[i].num_ids);
36097a8d010SIgal Liberman 			if (off > 0)
36197a8d010SIgal Liberman 				printf("WARNING unable to set fsl,liodn for FMan Port: %s\n",
36297a8d010SIgal Liberman 				       fdt_strerror(off));
36397a8d010SIgal Liberman 		} else {
36497a8d010SIgal Liberman 			debug("WARNING: could not set fsl,liodn for FMan Portport: %s.\n",
36597a8d010SIgal Liberman 			      fdt_strerror(off));
36697a8d010SIgal Liberman 		}
36797a8d010SIgal Liberman 	}
36897a8d010SIgal Liberman }
36997a8d010SIgal Liberman #endif
37097a8d010SIgal Liberman 
fdt_fixup_liodn(void * blob)371db977abfSKumar Gala void fdt_fixup_liodn(void *blob)
372db977abfSKumar Gala {
373fd946040STimur Tabi #ifdef CONFIG_SYS_SRIO
3749c42ef61SKumar Gala 	fdt_fixup_srio_liodn(blob, srio_liodn_tbl);
375fd946040STimur Tabi #endif
3769c42ef61SKumar Gala 
377db977abfSKumar Gala 	fdt_fixup_liodn_tbl(blob, liodn_tbl, liodn_tbl_sz);
378db977abfSKumar Gala #ifdef CONFIG_SYS_DPAA_FMAN
37997a8d010SIgal Liberman 	fdt_fixup_liodn_tbl_fman(blob, fman1_liodn_tbl, fman1_liodn_tbl_sz);
380db977abfSKumar Gala #if (CONFIG_SYS_NUM_FMAN == 2)
38197a8d010SIgal Liberman 	fdt_fixup_liodn_tbl_fman(blob, fman2_liodn_tbl, fman2_liodn_tbl_sz);
382db977abfSKumar Gala #endif
383db977abfSKumar Gala #endif
384db977abfSKumar Gala 	fdt_fixup_liodn_tbl(blob, sec_liodn_tbl, sec_liodn_tbl_sz);
3856b3a8d00SKumar Gala 
3866b3a8d00SKumar Gala #ifdef CONFIG_SYS_FSL_RAID_ENGINE
3876b3a8d00SKumar Gala 	fdt_fixup_liodn_tbl(blob, raide_liodn_tbl, raide_liodn_tbl_sz);
3886b3a8d00SKumar Gala #endif
3894d28db8aSKumar Gala 
3904d28db8aSKumar Gala #ifdef CONFIG_SYS_DPAA_RMAN
3914d28db8aSKumar Gala 	fdt_fixup_liodn_tbl(blob, rman_liodn_tbl, rman_liodn_tbl_sz);
3924d28db8aSKumar Gala #endif
39371cfcef6SLaurentiu Tudor 
3948f9fe660SLaurentiu TUDOR 	ccsr_pcix_t *pcix = (ccsr_pcix_t *)CONFIG_SYS_PCIE1_ADDR;
3958f9fe660SLaurentiu TUDOR 	int pci_ver = pcix->ipver1 & 0xffff, liodn_base = 0;
3968f9fe660SLaurentiu TUDOR 
3978f9fe660SLaurentiu TUDOR 	if (pci_ver >= 0x0204) {
3988f9fe660SLaurentiu TUDOR 		if (pci_ver >= 0x0300)
3998f9fe660SLaurentiu TUDOR 			liodn_base = 1024;
4008f9fe660SLaurentiu TUDOR 		else
4018f9fe660SLaurentiu TUDOR 			liodn_base = 256;
4028f9fe660SLaurentiu TUDOR 	}
4038f9fe660SLaurentiu TUDOR 
4048f9fe660SLaurentiu TUDOR 	if (liodn_base) {
4058f9fe660SLaurentiu TUDOR 		char compat[32];
4068f9fe660SLaurentiu TUDOR 
4078f9fe660SLaurentiu TUDOR 		sprintf(compat, "fsl,qoriq-pcie-v%d.%d",
4088f9fe660SLaurentiu TUDOR 			(pci_ver & 0xff00) >> 8, pci_ver & 0xff);
4098f9fe660SLaurentiu TUDOR 		fdt_fixup_pci_liodn_offsets(blob, compat, liodn_base);
4108f9fe660SLaurentiu TUDOR 		fdt_fixup_pci_liodn_offsets(blob, "fsl,qoriq-pcie", liodn_base);
4118f9fe660SLaurentiu TUDOR 	}
412db977abfSKumar Gala }
413