ppc4xx: Pass PCIe root-complex/endpoint configuration to Linux via the fdt
The PCIe root-complex/endpoint setup as configured via the "pcie_mode" environment variable will now get passed to the Linux kernel by setting the device_type property of the PCIe device tree node. For normal root- complex configuration it will keep its defaults value of "pci" and for endpoint configuration it will get changed to "pci-endpoint". Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
@@ -31,9 +31,46 @@
|
||||
#include <libfdt.h>
|
||||
#include <libfdt_env.h>
|
||||
#include <fdt_support.h>
|
||||
#include <asm/4xx_pcie.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* Fixup all PCIe nodes by setting the device_type property
|
||||
* to "pci-endpoint" instead is "pci" for endpoint ports.
|
||||
* This property will get checked later by the Linux driver
|
||||
* to properly configure the PCIe port in Linux (again).
|
||||
*/
|
||||
void fdt_pcie_setup(void *blob)
|
||||
{
|
||||
const char *compat = "ibm,plb-pciex";
|
||||
const char *prop = "device_type";
|
||||
const char *prop_val = "pci-endpoint";
|
||||
const u32 *port;
|
||||
int no;
|
||||
int rc;
|
||||
|
||||
/* Search first PCIe node */
|
||||
no = fdt_node_offset_by_compatible(blob, -1, compat);
|
||||
while (no != -FDT_ERR_NOTFOUND) {
|
||||
port = fdt_getprop(blob, no, "port", NULL);
|
||||
if (port == NULL) {
|
||||
printf("WARNING: could not find port property\n");
|
||||
} else {
|
||||
if (is_end_point(*port)) {
|
||||
rc = fdt_setprop(blob, no, prop, prop_val,
|
||||
strlen(prop_val) + 1);
|
||||
if (rc < 0)
|
||||
printf("WARNING: could not set %s for %s: %s.\n",
|
||||
prop, compat, fdt_strerror(rc));
|
||||
}
|
||||
}
|
||||
|
||||
/* Jump to next PCIe node */
|
||||
no = fdt_node_offset_by_compatible(blob, no, compat);
|
||||
}
|
||||
}
|
||||
|
||||
void ft_cpu_setup(void *blob, bd_t *bd)
|
||||
{
|
||||
sys_info_t sys_info;
|
||||
@@ -60,5 +97,10 @@ void ft_cpu_setup(void *blob, bd_t *bd)
|
||||
* Note: aliases in the dts are required for this
|
||||
*/
|
||||
fdt_fixup_ethernet(blob, bd);
|
||||
|
||||
/*
|
||||
* Fixup all available PCIe nodes by setting the device_type property
|
||||
*/
|
||||
fdt_pcie_setup(blob);
|
||||
}
|
||||
#endif /* CONFIG_OF_LIBFDT */
|
||||
|
||||
Reference in New Issue
Block a user