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