mirror of https://gitee.com/openkylin/qemu.git
spapr: Expose the name of the interrupt controller node
This will be needed by PHB hotplug in order to access the "phandle" property of the interrupt controller node. Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: Greg Kurz <groug@kaod.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <155059668867.1466090.6339199751719123386.stgit@bahia.lab.toulouse-stg.fr.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
6cead90c5c
commit
743ed566c1
|
@ -317,6 +317,9 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
|
|||
/* Map all regions */
|
||||
spapr_xive_map_mmio(xive);
|
||||
|
||||
xive->nodename = g_strdup_printf("interrupt-controller@%" PRIx64,
|
||||
xive->tm_base + XIVE_TM_USER_PAGE * (1 << TM_SHIFT));
|
||||
|
||||
qemu_register_reset(spapr_xive_reset, dev);
|
||||
}
|
||||
|
||||
|
@ -1448,7 +1451,6 @@ void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
|
|||
cpu_to_be32(7), /* start */
|
||||
cpu_to_be32(0xf8), /* count */
|
||||
};
|
||||
gchar *nodename;
|
||||
|
||||
/* Thread Interrupt Management Area : User (ring 3) and OS (ring 2) */
|
||||
timas[0] = cpu_to_be64(xive->tm_base +
|
||||
|
@ -1458,10 +1460,7 @@ void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
|
|||
XIVE_TM_OS_PAGE * (1ull << TM_SHIFT));
|
||||
timas[3] = cpu_to_be64(1ull << TM_SHIFT);
|
||||
|
||||
nodename = g_strdup_printf("interrupt-controller@%" PRIx64,
|
||||
xive->tm_base + XIVE_TM_USER_PAGE * (1 << TM_SHIFT));
|
||||
_FDT(node = fdt_add_subnode(fdt, 0, nodename));
|
||||
g_free(nodename);
|
||||
_FDT(node = fdt_add_subnode(fdt, 0, xive->nodename));
|
||||
|
||||
_FDT(fdt_setprop_string(fdt, node, "device_type", "power-ivpe"));
|
||||
_FDT(fdt_setprop(fdt, node, "reg", timas, sizeof(timas)));
|
||||
|
|
|
@ -254,7 +254,7 @@ void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
|
|||
};
|
||||
int node;
|
||||
|
||||
_FDT(node = fdt_add_subnode(fdt, 0, "interrupt-controller"));
|
||||
_FDT(node = fdt_add_subnode(fdt, 0, XICS_NODENAME));
|
||||
|
||||
_FDT(fdt_setprop_string(fdt, node, "device_type",
|
||||
"PowerPC-External-Interrupt-Presentation"));
|
||||
|
|
|
@ -230,6 +230,11 @@ static void spapr_irq_reset_xics(sPAPRMachineState *spapr, Error **errp)
|
|||
/* TODO: create the KVM XICS device */
|
||||
}
|
||||
|
||||
static const char *spapr_irq_get_nodename_xics(sPAPRMachineState *spapr)
|
||||
{
|
||||
return XICS_NODENAME;
|
||||
}
|
||||
|
||||
#define SPAPR_IRQ_XICS_NR_IRQS 0x1000
|
||||
#define SPAPR_IRQ_XICS_NR_MSIS \
|
||||
(XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI)
|
||||
|
@ -249,6 +254,7 @@ sPAPRIrq spapr_irq_xics = {
|
|||
.post_load = spapr_irq_post_load_xics,
|
||||
.reset = spapr_irq_reset_xics,
|
||||
.set_irq = spapr_irq_set_irq_xics,
|
||||
.get_nodename = spapr_irq_get_nodename_xics,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -384,6 +390,11 @@ static void spapr_irq_set_irq_xive(void *opaque, int srcno, int val)
|
|||
xive_source_set_irq(&spapr->xive->source, srcno, val);
|
||||
}
|
||||
|
||||
static const char *spapr_irq_get_nodename_xive(sPAPRMachineState *spapr)
|
||||
{
|
||||
return spapr->xive->nodename;
|
||||
}
|
||||
|
||||
/*
|
||||
* XIVE uses the full IRQ number space. Set it to 8K to be compatible
|
||||
* with XICS.
|
||||
|
@ -407,6 +418,7 @@ sPAPRIrq spapr_irq_xive = {
|
|||
.post_load = spapr_irq_post_load_xive,
|
||||
.reset = spapr_irq_reset_xive,
|
||||
.set_irq = spapr_irq_set_irq_xive,
|
||||
.get_nodename = spapr_irq_get_nodename_xive,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -541,6 +553,11 @@ static void spapr_irq_set_irq_dual(void *opaque, int srcno, int val)
|
|||
spapr_irq_current(spapr)->set_irq(spapr, srcno, val);
|
||||
}
|
||||
|
||||
static const char *spapr_irq_get_nodename_dual(sPAPRMachineState *spapr)
|
||||
{
|
||||
return spapr_irq_current(spapr)->get_nodename(spapr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Define values in sync with the XIVE and XICS backend
|
||||
*/
|
||||
|
@ -561,7 +578,8 @@ sPAPRIrq spapr_irq_dual = {
|
|||
.cpu_intc_create = spapr_irq_cpu_intc_create_dual,
|
||||
.post_load = spapr_irq_post_load_dual,
|
||||
.reset = spapr_irq_reset_dual,
|
||||
.set_irq = spapr_irq_set_irq_dual
|
||||
.set_irq = spapr_irq_set_irq_dual,
|
||||
.get_nodename = spapr_irq_get_nodename_dual,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -691,4 +709,5 @@ sPAPRIrq spapr_irq_xics_legacy = {
|
|||
.cpu_intc_create = spapr_irq_cpu_intc_create_xics,
|
||||
.post_load = spapr_irq_post_load_xics,
|
||||
.set_irq = spapr_irq_set_irq_xics,
|
||||
.get_nodename = spapr_irq_get_nodename_xics,
|
||||
};
|
||||
|
|
|
@ -47,6 +47,7 @@ typedef struct sPAPRIrq {
|
|||
int (*post_load)(sPAPRMachineState *spapr, int version_id);
|
||||
void (*reset)(sPAPRMachineState *spapr, Error **errp);
|
||||
void (*set_irq)(void *opaque, int srcno, int val);
|
||||
const char *(*get_nodename)(sPAPRMachineState *spapr);
|
||||
} sPAPRIrq;
|
||||
|
||||
extern sPAPRIrq spapr_irq_xics;
|
||||
|
|
|
@ -26,6 +26,9 @@ typedef struct sPAPRXive {
|
|||
XiveENDSource end_source;
|
||||
hwaddr end_base;
|
||||
|
||||
/* DT */
|
||||
gchar *nodename;
|
||||
|
||||
/* Routing table */
|
||||
XiveEAS *eat;
|
||||
uint32_t nr_irqs;
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
#include "hw/ppc/spapr.h"
|
||||
|
||||
#define XICS_NODENAME "interrupt-controller"
|
||||
|
||||
void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
|
||||
uint32_t phandle);
|
||||
int xics_kvm_init(sPAPRMachineState *spapr, Error **errp);
|
||||
|
|
Loading…
Reference in New Issue