mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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
2 changed files with 22 additions and 9 deletions
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
/* 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++) {
|
||||
PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
|
||||
|
||||
|
|
|
@ -92,14 +92,6 @@ enum {
|
|||
#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)
|
||||
{
|
||||
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_cell(fdt, offset, "#address-cells", 2)));
|
||||
_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))));
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue