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