mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 15:37:23 +00:00
44262327aa
This patch adds changes necessary to move functionality present in PowerPC folders with ARM architectures that have DPAA1 QBMan hardware - Create new board/freescale/common/fsl_portals.c to house shared device tree fixups for DPAA1 devices with ARM and PowerPC cores - Add new header file to top includes directory to allow files in both architectures to grab the function prototypes - Port inhibit_portals() from PowerPC to ARM. This function is used in setup to disable interrupts on all QMan and BMan portals. It is needed because the interrupts are enabled by default for all portals including unused/uninitialised portals. When the kernel attempts to go to deep sleep the unused portals prevent it from doing so Signed-off-by: Ahmed Mansour <ahmed.mansour@nxp.com> Reviewed-by: York Sun <york.sun@nxp.com>
75 lines
1.6 KiB
C
75 lines
1.6 KiB
C
/*
|
|
* Copyright 2008-2011 Freescale Semiconductor, Inc.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <libfdt.h>
|
|
#include <fdt_support.h>
|
|
|
|
#include <asm/processor.h>
|
|
#include <asm/io.h>
|
|
|
|
#include <asm/fsl_portals.h>
|
|
#include <asm/fsl_liodn.h>
|
|
|
|
/* Update portal containter to match LAW setup of portal in phy map */
|
|
void fdt_portal(void *blob, const char *compat, const char *container,
|
|
u64 addr, u32 size)
|
|
{
|
|
int off;
|
|
|
|
off = fdt_node_offset_by_compatible(blob, -1, compat);
|
|
if (off < 0)
|
|
return ;
|
|
|
|
off = fdt_parent_offset(blob, off);
|
|
/* if non-zero assume we have a container */
|
|
if (off > 0) {
|
|
char buf[60];
|
|
const char *p, *name;
|
|
u32 *range;
|
|
int len;
|
|
|
|
/* fixup ranges */
|
|
range = fdt_getprop_w(blob, off, "ranges", &len);
|
|
if (range == NULL) {
|
|
printf("ERROR: container for %s has no ranges", compat);
|
|
return ;
|
|
}
|
|
|
|
range[0] = 0;
|
|
if (len == 16) {
|
|
range[1] = addr >> 32;
|
|
range[2] = addr & 0xffffffff;
|
|
range[3] = size;
|
|
} else {
|
|
range[1] = addr & 0xffffffff;
|
|
range[2] = size;
|
|
}
|
|
fdt_setprop_inplace(blob, off, "ranges", range, len);
|
|
|
|
/* fixup the name */
|
|
name = fdt_get_name(blob, off, &len);
|
|
p = memchr(name, '@', len);
|
|
|
|
if (p)
|
|
len = p - name;
|
|
|
|
/* if we are given a container name check it
|
|
* against what we found, if it doesnt match exit out */
|
|
if (container && (memcmp(container, name, len))) {
|
|
printf("WARNING: container names didn't match %s %s\n",
|
|
container, name);
|
|
return ;
|
|
}
|
|
|
|
memcpy(&buf, name, len);
|
|
len += sprintf(&buf[len], "@%llx", addr);
|
|
fdt_set_name(blob, off, buf);
|
|
return ;
|
|
}
|
|
|
|
printf("ERROR: %s isn't in a container. Not supported\n", compat);
|
|
}
|