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