ppc/pnv: enable only one LPC bus
The default LPC bus of a multichip system is on chip 0. It's recognized by the firmware (skiboot) using a "primary" property in the device tree. We introduce a pnv_chip_lpc_offset() routine to locate the LPC node of a chip and set the property directly from the machine level. Signed-off-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
4d1df88b63
commit
5a7e14a274
22
hw/ppc/pnv.c
22
hw/ppc/pnv.c
@ -255,6 +255,18 @@ static void powernv_populate_icp(PnvChip *chip, void *fdt, uint32_t pir,
|
|||||||
g_free(reg);
|
g_free(reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pnv_chip_lpc_offset(PnvChip *chip, void *fdt)
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
name = g_strdup_printf("/xscom@%" PRIx64 "/isa@%x",
|
||||||
|
(uint64_t) PNV_XSCOM_BASE(chip), PNV_XSCOM_LPC_BASE);
|
||||||
|
offset = fdt_path_offset(fdt, name);
|
||||||
|
g_free(name);
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static void powernv_populate_chip(PnvChip *chip, void *fdt)
|
static void powernv_populate_chip(PnvChip *chip, void *fdt)
|
||||||
{
|
{
|
||||||
PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
|
PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
|
||||||
@ -264,6 +276,16 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
|
|||||||
|
|
||||||
pnv_xscom_populate(chip, fdt, 0);
|
pnv_xscom_populate(chip, fdt, 0);
|
||||||
|
|
||||||
|
/* The default LPC bus of a multichip system is on chip 0. It's
|
||||||
|
* recognized by the firmware (skiboot) using a "primary"
|
||||||
|
* property.
|
||||||
|
*/
|
||||||
|
if (chip->chip_id == 0x0) {
|
||||||
|
int lpc_offset = pnv_chip_lpc_offset(chip, fdt);
|
||||||
|
|
||||||
|
_FDT((fdt_setprop(fdt, lpc_offset, "primary", NULL, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < chip->nr_cores; i++) {
|
for (i = 0; i < chip->nr_cores; i++) {
|
||||||
PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
|
PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
|
||||||
|
|
||||||
|
@ -92,14 +92,6 @@ enum {
|
|||||||
#define LPC_HC_REGS_OPB_SIZE 0x00001000
|
#define LPC_HC_REGS_OPB_SIZE 0x00001000
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: the "primary" cell should only be added on chip 0. This is
|
|
||||||
* how skiboot chooses the default LPC controller on multichip
|
|
||||||
* systems.
|
|
||||||
*
|
|
||||||
* It would be easly done if we can change the populate() interface to
|
|
||||||
* replace the PnvXScomInterface parameter by a PnvChip one
|
|
||||||
*/
|
|
||||||
static int pnv_lpc_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
|
static int pnv_lpc_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
|
||||||
{
|
{
|
||||||
const char compat[] = "ibm,power8-lpc\0ibm,lpc";
|
const char compat[] = "ibm,power8-lpc\0ibm,lpc";
|
||||||
@ -119,7 +111,6 @@ static int pnv_lpc_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
|
|||||||
_FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
|
_FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
|
||||||
_FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2)));
|
_FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2)));
|
||||||
_FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
|
_FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
|
||||||
_FDT((fdt_setprop(fdt, offset, "primary", NULL, 0)));
|
|
||||||
_FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
|
_FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user