@@ -149,7 +149,11 @@ void set_liodns(void)
static void fdt_fixup_liodn_tbl(void *blob, struct liodn_id_table *tbl, int sz)
{
- int i;
+ int i, j;
+ int fdt_liodn[8];
+ int *p = fdt_liodn;
+ char *p_compat = NULL;
+ phys_addr_t cmp_offset = 0;
for (i = 0; i < sz; i++) {
int off;
@@ -160,9 +164,19 @@ static void fdt_fixup_liodn_tbl(void *blob, struct liodn_id_table *tbl, int sz)
off = fdt_node_offset_by_compat_reg(blob,
tbl[i].compat, tbl[i].compat_offset);
if (off >= 0) {
+ if (p_compat != NULL) {
+ if (strcmp(tbl[i].compat, p_compat))
+ p = fdt_liodn;
+ else if (cmp_offset != tbl[i].compat_offset)
+ p = fdt_liodn;
+ }
+ for (j = 0; j < tbl[i].num_ids; j++)
+ *p++ = tbl[i].id[j];
off = fdt_setprop(blob, off, "fsl,liodn",
- &tbl[i].id[0],
- sizeof(u32) * tbl[i].num_ids);
+ fdt_liodn,
+ sizeof(u32) * (p - fdt_liodn));
+ p_compat = (char *)tbl[i].compat;
+ cmp_offset = tbl[i].compat_offset;
if (off > 0)
printf("WARNING unable to set fsl,liodn for "
"%s: %s\n",
@@ -63,10 +63,10 @@ struct liodn_id_table liodn_tbl[] = {
SET_DMA_LIODN(1, 197),
SET_DMA_LIODN(2, 198),
- SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0),
- SET_GUTS_LIODN(NULL, 200, rio2liodnr, 0),
- SET_GUTS_LIODN(NULL, 201, rio1maintliodnr, 0),
- SET_GUTS_LIODN(NULL, 202, rio2maintliodnr, 0),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 200, rio2liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 201, rio1maintliodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 202, rio2maintliodnr, 0xc0000),
};
int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
@@ -64,10 +64,10 @@ struct liodn_id_table liodn_tbl[] = {
SET_DMA_LIODN(1, 197),
SET_DMA_LIODN(2, 198),
- SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0),
- SET_GUTS_LIODN(NULL, 200, rio2liodnr, 0),
- SET_GUTS_LIODN(NULL, 201, rio1maintliodnr, 0),
- SET_GUTS_LIODN(NULL, 202, rio2maintliodnr, 0),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 200, rio2liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 201, rio1maintliodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 202, rio2maintliodnr, 0xc0000),
};
int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
@@ -53,9 +53,9 @@ struct liodn_id_table liodn_tbl[] = {
SET_DMA_LIODN(1, 196),
SET_DMA_LIODN(2, 197),
- SET_GUTS_LIODN("fsl,rapidio-delta", 198, rio1liodnr, 0),
- SET_GUTS_LIODN(NULL, 199, rio2liodnr, 0),
- SET_GUTS_LIODN(NULL, 200, rmuliodnr, 0),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 198, rio1liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio2liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 200, rio1maintliodnr, 0xc0000),
#ifdef CONFIG_SYS_DPAA_QBMAN
SET_QMAN_LIODN(31),
@@ -64,10 +64,10 @@ struct liodn_id_table liodn_tbl[] = {
SET_DMA_LIODN(1, 197),
SET_DMA_LIODN(2, 198),
- SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0),
- SET_GUTS_LIODN(NULL, 200, rio2liodnr, 0),
- SET_GUTS_LIODN(NULL, 201, rio1maintliodnr, 0),
- SET_GUTS_LIODN(NULL, 202, rio2maintliodnr, 0),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 199, rio1liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 200, rio2liodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 201, rio1maintliodnr, 0xc0000),
+ SET_GUTS_LIODN("fsl,rapidio-delta", 202, rio2maintliodnr, 0xc0000),
};
int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
Previous, U-boot did not set fsl,liodn for rapidio in device tree, which is needed by HV(hypervisor), and HV needs fsl,liodn of rapidio have more values, for ex for P4080, fsl,liodn = <198 199 200>; while P2040/P3041/P5020 has 4 LIODNs respectivelly. This patch using a generic mechanism which allow a device have mutilple liodns. Reported-and-tested-by: Diana CRACIUN <Diana.Craciun@freescale.com> Signed-off-by: Shaohui Xie <Shaohui.Xie@freescale.com> --- arch/powerpc/cpu/mpc85xx/liodn.c | 20 +++++++++++++++++--- arch/powerpc/cpu/mpc85xx/p2041_ids.c | 8 ++++---- arch/powerpc/cpu/mpc85xx/p3041_ids.c | 8 ++++---- arch/powerpc/cpu/mpc85xx/p4080_ids.c | 6 +++--- arch/powerpc/cpu/mpc85xx/p5020_ids.c | 8 ++++---- 5 files changed, 32 insertions(+), 18 deletions(-)