xref: /OK3568_Linux_fs/u-boot/arch/powerpc/cpu/mpc85xx/liodn.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2008-2011 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <linux/libfdt.h>
9*4882a593Smuzhiyun #include <fdt_support.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <asm/immap_85xx.h>
12*4882a593Smuzhiyun #include <asm/io.h>
13*4882a593Smuzhiyun #include <asm/processor.h>
14*4882a593Smuzhiyun #include <asm/fsl_portals.h>
15*4882a593Smuzhiyun #include <asm/fsl_liodn.h>
16*4882a593Smuzhiyun 
get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev,u32 * liodns,int liodn_offset)17*4882a593Smuzhiyun int get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev, u32 *liodns, int liodn_offset)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	liodns[0] = liodn_bases[dpaa_dev].id[0] + liodn_offset;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun 	if (liodn_bases[dpaa_dev].num_ids == 2)
22*4882a593Smuzhiyun 		liodns[1] = liodn_bases[dpaa_dev].id[1] + liodn_offset;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	return liodn_bases[dpaa_dev].num_ids;
25*4882a593Smuzhiyun }
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #ifdef CONFIG_SYS_SRIO
set_srio_liodn(struct srio_liodn_id_table * tbl,int size)28*4882a593Smuzhiyun static void set_srio_liodn(struct srio_liodn_id_table *tbl, int size)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	int i;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	for (i = 0; i < size; i++) {
33*4882a593Smuzhiyun 		unsigned long reg_off = tbl[i].reg_offset[0];
34*4882a593Smuzhiyun 		out_be32((u32 *)reg_off, tbl[i].id[0]);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 		if (tbl[i].num_ids == 2) {
37*4882a593Smuzhiyun 			reg_off = tbl[i].reg_offset[1];
38*4882a593Smuzhiyun 			out_be32((u32 *)reg_off, tbl[i].id[1]);
39*4882a593Smuzhiyun 		}
40*4882a593Smuzhiyun 	}
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun 
set_liodn(struct liodn_id_table * tbl,int size)44*4882a593Smuzhiyun static void set_liodn(struct liodn_id_table *tbl, int size)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	int i;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	for (i = 0; i < size; i++) {
49*4882a593Smuzhiyun 		u32 liodn;
50*4882a593Smuzhiyun 		if (tbl[i].num_ids == 2) {
51*4882a593Smuzhiyun 			liodn = (tbl[i].id[0] << 16) | tbl[i].id[1];
52*4882a593Smuzhiyun 		} else {
53*4882a593Smuzhiyun 			liodn = tbl[i].id[0];
54*4882a593Smuzhiyun 		}
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 		out_be32((volatile u32 *)(tbl[i].reg_offset), liodn);
57*4882a593Smuzhiyun 	}
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
set_fman_liodn(struct fman_liodn_id_table * tbl,int size)61*4882a593Smuzhiyun static void set_fman_liodn(struct fman_liodn_id_table *tbl, int size)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	int i;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	for (i = 0; i < size; i++) {
66*4882a593Smuzhiyun 		u32 liodn;
67*4882a593Smuzhiyun 		if (tbl[i].num_ids == 2)
68*4882a593Smuzhiyun 			liodn = (tbl[i].id[0] << 16) | tbl[i].id[1];
69*4882a593Smuzhiyun 		else
70*4882a593Smuzhiyun 			liodn = tbl[i].id[0];
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 		out_be32((volatile u32 *)(tbl[i].reg_offset), liodn);
73*4882a593Smuzhiyun 	}
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun #endif
76*4882a593Smuzhiyun 
setup_sec_liodn_base(void)77*4882a593Smuzhiyun static void setup_sec_liodn_base(void)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	ccsr_sec_t *sec = (void *)CONFIG_SYS_FSL_SEC_ADDR;
80*4882a593Smuzhiyun 	u32 base;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	if (!IS_E_PROCESSOR(get_svr()))
83*4882a593Smuzhiyun 		return;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	/* QILCR[QSLOM] */
86*4882a593Smuzhiyun 	sec_out32(&sec->qilcr_ms, 0x3ff<<16);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	base = (liodn_bases[FSL_HW_PORTAL_SEC].id[0] << 16) |
89*4882a593Smuzhiyun 		liodn_bases[FSL_HW_PORTAL_SEC].id[1];
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	sec_out32(&sec->qilcr_ls, base);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
setup_fman_liodn_base(enum fsl_dpaa_dev dev,struct fman_liodn_id_table * tbl,int size)95*4882a593Smuzhiyun static void setup_fman_liodn_base(enum fsl_dpaa_dev dev,
96*4882a593Smuzhiyun 				  struct fman_liodn_id_table *tbl, int size)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	int i;
99*4882a593Smuzhiyun 	ccsr_fman_t *fm;
100*4882a593Smuzhiyun 	u32 base;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	switch(dev) {
103*4882a593Smuzhiyun 	case FSL_HW_PORTAL_FMAN1:
104*4882a593Smuzhiyun 		fm = (void *)CONFIG_SYS_FSL_FM1_ADDR;
105*4882a593Smuzhiyun 		break;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #if (CONFIG_SYS_NUM_FMAN == 2)
108*4882a593Smuzhiyun 	case FSL_HW_PORTAL_FMAN2:
109*4882a593Smuzhiyun 		fm = (void *)CONFIG_SYS_FSL_FM2_ADDR;
110*4882a593Smuzhiyun 		break;
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun 	default:
113*4882a593Smuzhiyun 		printf("Error: Invalid device type to %s\n", __FUNCTION__);
114*4882a593Smuzhiyun 		return ;
115*4882a593Smuzhiyun 	}
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	base = (liodn_bases[dev].id[0] << 16) | liodn_bases[dev].id[0];
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	/* setup all bases the same */
120*4882a593Smuzhiyun 	for (i = 0; i < 32; i++) {
121*4882a593Smuzhiyun 		out_be32(&fm->fm_dma.fmdmplr[i], base);
122*4882a593Smuzhiyun 	}
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	/* update tbl to ... */
125*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
126*4882a593Smuzhiyun 		tbl[i].id[0] += liodn_bases[dev].id[0];
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun #endif
129*4882a593Smuzhiyun 
setup_pme_liodn_base(void)130*4882a593Smuzhiyun static void setup_pme_liodn_base(void)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_PME
133*4882a593Smuzhiyun 	ccsr_pme_t *pme = (void *)CONFIG_SYS_FSL_CORENET_PME_ADDR;
134*4882a593Smuzhiyun 	u32 base = (liodn_bases[FSL_HW_PORTAL_PME].id[0] << 16) |
135*4882a593Smuzhiyun 			liodn_bases[FSL_HW_PORTAL_PME].id[1];
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	out_be32(&pme->liodnbr, base);
138*4882a593Smuzhiyun #endif
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_RAID_ENGINE
setup_raide_liodn_base(void)142*4882a593Smuzhiyun static void setup_raide_liodn_base(void)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	struct ccsr_raide *raide = (void *)CONFIG_SYS_FSL_RAID_ENGINE_ADDR;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	/* setup raid engine liodn base for data/desc ; both set to 47 */
147*4882a593Smuzhiyun 	u32 base = (liodn_bases[FSL_HW_PORTAL_RAID_ENGINE].id[0] << 16) |
148*4882a593Smuzhiyun 			liodn_bases[FSL_HW_PORTAL_RAID_ENGINE].id[0];
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	out_be32(&raide->liodnbr, base);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_RMAN
set_rman_liodn(struct liodn_id_table * tbl,int size)155*4882a593Smuzhiyun static void set_rman_liodn(struct liodn_id_table *tbl, int size)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	int i;
158*4882a593Smuzhiyun 	struct ccsr_rman *rman = (void *)CONFIG_SYS_FSL_CORENET_RMAN_ADDR;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	for (i = 0; i < size; i++) {
161*4882a593Smuzhiyun 		/* write the RMan block number */
162*4882a593Smuzhiyun 		out_be32(&rman->mmitar, i);
163*4882a593Smuzhiyun 		/* write the liodn offset corresponding to the block */
164*4882a593Smuzhiyun 		out_be32((u32 *)(tbl[i].reg_offset), tbl[i].id[0]);
165*4882a593Smuzhiyun 	}
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
setup_rman_liodn_base(struct liodn_id_table * tbl,int size)168*4882a593Smuzhiyun static void setup_rman_liodn_base(struct liodn_id_table *tbl, int size)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	int i;
171*4882a593Smuzhiyun 	struct ccsr_rman *rman = (void *)CONFIG_SYS_FSL_CORENET_RMAN_ADDR;
172*4882a593Smuzhiyun 	u32 base = liodn_bases[FSL_HW_PORTAL_RMAN].id[0];
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	out_be32(&rman->mmliodnbr, base);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	/* update liodn offset */
177*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
178*4882a593Smuzhiyun 		tbl[i].id[0] += base;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun #endif
181*4882a593Smuzhiyun 
set_liodns(void)182*4882a593Smuzhiyun void set_liodns(void)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	/* setup general liodn offsets */
185*4882a593Smuzhiyun 	set_liodn(liodn_tbl, liodn_tbl_sz);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #ifdef CONFIG_SYS_SRIO
188*4882a593Smuzhiyun 	/* setup SRIO port liodns */
189*4882a593Smuzhiyun 	set_srio_liodn(srio_liodn_tbl, srio_liodn_tbl_sz);
190*4882a593Smuzhiyun #endif
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	/* setup SEC block liodn bases & offsets if we have one */
193*4882a593Smuzhiyun 	if (IS_E_PROCESSOR(get_svr())) {
194*4882a593Smuzhiyun 		set_liodn(sec_liodn_tbl, sec_liodn_tbl_sz);
195*4882a593Smuzhiyun 		setup_sec_liodn_base();
196*4882a593Smuzhiyun 	}
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	/* setup FMAN block(s) liodn bases & offsets if we have one */
199*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
200*4882a593Smuzhiyun 	set_fman_liodn(fman1_liodn_tbl, fman1_liodn_tbl_sz);
201*4882a593Smuzhiyun 	setup_fman_liodn_base(FSL_HW_PORTAL_FMAN1, fman1_liodn_tbl,
202*4882a593Smuzhiyun 				fman1_liodn_tbl_sz);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #if (CONFIG_SYS_NUM_FMAN == 2)
205*4882a593Smuzhiyun 	set_fman_liodn(fman2_liodn_tbl, fman2_liodn_tbl_sz);
206*4882a593Smuzhiyun 	setup_fman_liodn_base(FSL_HW_PORTAL_FMAN2, fman2_liodn_tbl,
207*4882a593Smuzhiyun 				fman2_liodn_tbl_sz);
208*4882a593Smuzhiyun #endif
209*4882a593Smuzhiyun #endif
210*4882a593Smuzhiyun 	/* setup PME liodn base */
211*4882a593Smuzhiyun 	setup_pme_liodn_base();
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_RAID_ENGINE
214*4882a593Smuzhiyun 	/* raid engine ccr addr code for liodn */
215*4882a593Smuzhiyun 	set_liodn(raide_liodn_tbl, raide_liodn_tbl_sz);
216*4882a593Smuzhiyun 	setup_raide_liodn_base();
217*4882a593Smuzhiyun #endif
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_RMAN
220*4882a593Smuzhiyun 	/* setup RMan liodn offsets */
221*4882a593Smuzhiyun 	set_rman_liodn(rman_liodn_tbl, rman_liodn_tbl_sz);
222*4882a593Smuzhiyun 	/* setup RMan liodn base */
223*4882a593Smuzhiyun 	setup_rman_liodn_base(rman_liodn_tbl, rman_liodn_tbl_sz);
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun #ifdef CONFIG_SYS_SRIO
fdt_fixup_srio_liodn(void * blob,struct srio_liodn_id_table * tbl)228*4882a593Smuzhiyun static void fdt_fixup_srio_liodn(void *blob, struct srio_liodn_id_table *tbl)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	int i, srio_off;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	/* search for srio node, if doesn't exist just return - nothing todo */
233*4882a593Smuzhiyun 	srio_off = fdt_node_offset_by_compatible(blob, -1, "fsl,srio");
234*4882a593Smuzhiyun 	if (srio_off < 0)
235*4882a593Smuzhiyun 		return ;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	for (i = 0; i < srio_liodn_tbl_sz; i++) {
238*4882a593Smuzhiyun 		int off, portid = tbl[i].portid;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 		off = fdt_node_offset_by_prop_value(blob, srio_off,
241*4882a593Smuzhiyun 			 "cell-index", &portid, 4);
242*4882a593Smuzhiyun 		if (off >= 0) {
243*4882a593Smuzhiyun 			off = fdt_setprop(blob, off, "fsl,liodn",
244*4882a593Smuzhiyun 				&tbl[i].id[0],
245*4882a593Smuzhiyun 				sizeof(u32) * tbl[i].num_ids);
246*4882a593Smuzhiyun 			if (off > 0)
247*4882a593Smuzhiyun 				printf("WARNING unable to set fsl,liodn for "
248*4882a593Smuzhiyun 					"fsl,srio port %d: %s\n",
249*4882a593Smuzhiyun 					portid, fdt_strerror(off));
250*4882a593Smuzhiyun 		} else {
251*4882a593Smuzhiyun 			debug("WARNING: couldn't set fsl,liodn for srio: %s.\n",
252*4882a593Smuzhiyun 				fdt_strerror(off));
253*4882a593Smuzhiyun 		}
254*4882a593Smuzhiyun 	}
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun #endif
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun #define CONFIG_SYS_MAX_PCI_EPS		8
259*4882a593Smuzhiyun 
fdt_fixup_pci_liodn_offsets(void * fdt,const char * compat,int ep_liodn_start)260*4882a593Smuzhiyun static void fdt_fixup_pci_liodn_offsets(void *fdt, const char *compat,
261*4882a593Smuzhiyun 					int ep_liodn_start)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun 	int off, pci_idx = 0, pci_cnt = 0, i, rc;
264*4882a593Smuzhiyun 	const uint32_t *base_liodn;
265*4882a593Smuzhiyun 	uint32_t liodn_offs[CONFIG_SYS_MAX_PCI_EPS + 1] = { 0 };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	/*
268*4882a593Smuzhiyun 	 * Count the number of pci nodes.
269*4882a593Smuzhiyun 	 * It's needed later when the interleaved liodn offsets are generated.
270*4882a593Smuzhiyun 	 */
271*4882a593Smuzhiyun 	off = fdt_node_offset_by_compatible(fdt, -1, compat);
272*4882a593Smuzhiyun 	while (off != -FDT_ERR_NOTFOUND) {
273*4882a593Smuzhiyun 		pci_cnt++;
274*4882a593Smuzhiyun 		off = fdt_node_offset_by_compatible(fdt, off, compat);
275*4882a593Smuzhiyun 	}
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	for (off = fdt_node_offset_by_compatible(fdt, -1, compat);
278*4882a593Smuzhiyun 	     off != -FDT_ERR_NOTFOUND;
279*4882a593Smuzhiyun 	     off = fdt_node_offset_by_compatible(fdt, off, compat)) {
280*4882a593Smuzhiyun 		base_liodn = fdt_getprop(fdt, off, "fsl,liodn", &rc);
281*4882a593Smuzhiyun 		if (!base_liodn) {
282*4882a593Smuzhiyun 			char path[64];
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 			if (fdt_get_path(fdt, off, path, sizeof(path)) < 0)
285*4882a593Smuzhiyun 				strcpy(path, "(unknown)");
286*4882a593Smuzhiyun 			printf("WARNING Could not get liodn of node %s: %s\n",
287*4882a593Smuzhiyun 			       path, fdt_strerror(rc));
288*4882a593Smuzhiyun 			continue;
289*4882a593Smuzhiyun 		}
290*4882a593Smuzhiyun 		for (i = 0; i < CONFIG_SYS_MAX_PCI_EPS; i++)
291*4882a593Smuzhiyun 			liodn_offs[i + 1] = ep_liodn_start +
292*4882a593Smuzhiyun 					i * pci_cnt + pci_idx - *base_liodn;
293*4882a593Smuzhiyun 		rc = fdt_setprop(fdt, off, "fsl,liodn-offset-list",
294*4882a593Smuzhiyun 				 liodn_offs, sizeof(liodn_offs));
295*4882a593Smuzhiyun 		if (rc) {
296*4882a593Smuzhiyun 			char path[64];
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 			if (fdt_get_path(fdt, off, path, sizeof(path)) < 0)
299*4882a593Smuzhiyun 				strcpy(path, "(unknown)");
300*4882a593Smuzhiyun 			printf("WARNING Unable to set fsl,liodn-offset-list for "
301*4882a593Smuzhiyun 			       "node %s: %s\n", path, fdt_strerror(rc));
302*4882a593Smuzhiyun 			continue;
303*4882a593Smuzhiyun 		}
304*4882a593Smuzhiyun 		pci_idx++;
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun 
fdt_fixup_liodn_tbl(void * blob,struct liodn_id_table * tbl,int sz)308*4882a593Smuzhiyun static void fdt_fixup_liodn_tbl(void *blob, struct liodn_id_table *tbl, int sz)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	int i;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	for (i = 0; i < sz; i++) {
313*4882a593Smuzhiyun 		int off;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 		if (tbl[i].compat == NULL)
316*4882a593Smuzhiyun 			continue;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 		off = fdt_node_offset_by_compat_reg(blob,
319*4882a593Smuzhiyun 				tbl[i].compat, tbl[i].compat_offset);
320*4882a593Smuzhiyun 		if (off >= 0) {
321*4882a593Smuzhiyun 			off = fdt_setprop(blob, off, "fsl,liodn",
322*4882a593Smuzhiyun 				&tbl[i].id[0],
323*4882a593Smuzhiyun 				sizeof(u32) * tbl[i].num_ids);
324*4882a593Smuzhiyun 			if (off > 0)
325*4882a593Smuzhiyun 				printf("WARNING unable to set fsl,liodn for "
326*4882a593Smuzhiyun 					"%s: %s\n",
327*4882a593Smuzhiyun 					tbl[i].compat, fdt_strerror(off));
328*4882a593Smuzhiyun 		} else {
329*4882a593Smuzhiyun 			debug("WARNING: could not set fsl,liodn for %s: %s.\n",
330*4882a593Smuzhiyun 					tbl[i].compat, fdt_strerror(off));
331*4882a593Smuzhiyun 		}
332*4882a593Smuzhiyun 	}
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
fdt_fixup_liodn_tbl_fman(void * blob,struct fman_liodn_id_table * tbl,int sz)336*4882a593Smuzhiyun static void fdt_fixup_liodn_tbl_fman(void *blob,
337*4882a593Smuzhiyun 				     struct fman_liodn_id_table *tbl,
338*4882a593Smuzhiyun 				     int sz)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun 	int i;
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	for (i = 0; i < sz; i++) {
343*4882a593Smuzhiyun 		int off;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 		if (tbl[i].compat == NULL)
346*4882a593Smuzhiyun 			continue;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 		/* Try the new compatible first.
349*4882a593Smuzhiyun 		 * If the node is missing, try the old.
350*4882a593Smuzhiyun 		 */
351*4882a593Smuzhiyun 		off = fdt_node_offset_by_compat_reg(blob,
352*4882a593Smuzhiyun 				tbl[i].compat[0], tbl[i].compat_offset);
353*4882a593Smuzhiyun 		if (off < 0)
354*4882a593Smuzhiyun 			off = fdt_node_offset_by_compat_reg(blob,
355*4882a593Smuzhiyun 					tbl[i].compat[1], tbl[i].compat_offset);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 		if (off >= 0) {
358*4882a593Smuzhiyun 			off = fdt_setprop(blob, off, "fsl,liodn",
359*4882a593Smuzhiyun 				&tbl[i].id[0],
360*4882a593Smuzhiyun 				sizeof(u32) * tbl[i].num_ids);
361*4882a593Smuzhiyun 			if (off > 0)
362*4882a593Smuzhiyun 				printf("WARNING unable to set fsl,liodn for FMan Port: %s\n",
363*4882a593Smuzhiyun 				       fdt_strerror(off));
364*4882a593Smuzhiyun 		} else {
365*4882a593Smuzhiyun 			debug("WARNING: could not set fsl,liodn for FMan Portport: %s.\n",
366*4882a593Smuzhiyun 			      fdt_strerror(off));
367*4882a593Smuzhiyun 		}
368*4882a593Smuzhiyun 	}
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun #endif
371*4882a593Smuzhiyun 
fdt_fixup_liodn(void * blob)372*4882a593Smuzhiyun void fdt_fixup_liodn(void *blob)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun #ifdef CONFIG_SYS_SRIO
375*4882a593Smuzhiyun 	fdt_fixup_srio_liodn(blob, srio_liodn_tbl);
376*4882a593Smuzhiyun #endif
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl(blob, liodn_tbl, liodn_tbl_sz);
379*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_FMAN
380*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl_fman(blob, fman1_liodn_tbl, fman1_liodn_tbl_sz);
381*4882a593Smuzhiyun #if (CONFIG_SYS_NUM_FMAN == 2)
382*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl_fman(blob, fman2_liodn_tbl, fman2_liodn_tbl_sz);
383*4882a593Smuzhiyun #endif
384*4882a593Smuzhiyun #endif
385*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl(blob, sec_liodn_tbl, sec_liodn_tbl_sz);
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_RAID_ENGINE
388*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl(blob, raide_liodn_tbl, raide_liodn_tbl_sz);
389*4882a593Smuzhiyun #endif
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun #ifdef CONFIG_SYS_DPAA_RMAN
392*4882a593Smuzhiyun 	fdt_fixup_liodn_tbl(blob, rman_liodn_tbl, rman_liodn_tbl_sz);
393*4882a593Smuzhiyun #endif
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	ccsr_pcix_t *pcix = (ccsr_pcix_t *)CONFIG_SYS_PCIE1_ADDR;
396*4882a593Smuzhiyun 	int pci_ver = pcix->ipver1 & 0xffff, liodn_base = 0;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	if (pci_ver >= 0x0204) {
399*4882a593Smuzhiyun 		if (pci_ver >= 0x0300)
400*4882a593Smuzhiyun 			liodn_base = 1024;
401*4882a593Smuzhiyun 		else
402*4882a593Smuzhiyun 			liodn_base = 256;
403*4882a593Smuzhiyun 	}
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	if (liodn_base) {
406*4882a593Smuzhiyun 		char compat[32];
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 		sprintf(compat, "fsl,qoriq-pcie-v%d.%d",
409*4882a593Smuzhiyun 			(pci_ver & 0xff00) >> 8, pci_ver & 0xff);
410*4882a593Smuzhiyun 		fdt_fixup_pci_liodn_offsets(blob, compat, liodn_base);
411*4882a593Smuzhiyun 		fdt_fixup_pci_liodn_offsets(blob, "fsl,qoriq-pcie", liodn_base);
412*4882a593Smuzhiyun 	}
413*4882a593Smuzhiyun }
414