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