Commit a028dd42 authored by Cédric Le Goater's avatar Cédric Le Goater Committed by David Gibson
Browse files

ppc/xics: introduce ICP DeviceRealize and DeviceReset handlers



This changes the ICP realize and reset handlers in DeviceRealize and
DeviceReset handlers. parent handlers are now called from the
inheriting classes which is a cleaner object pattern.

Signed-off-by: default avatarCédric Le Goater <clg@kaod.org>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 43f7868d
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -294,7 +294,6 @@ static const VMStateDescription vmstate_icp_server = {
static void icp_reset(void *dev)
{
    ICPState *icp = ICP(dev);
    ICPStateClass *icpc = ICP_GET_CLASS(icp);

    icp->xirr = 0;
    icp->pending_priority = 0xff;
@@ -302,16 +301,11 @@ static void icp_reset(void *dev)

    /* Make all outputs are deasserted */
    qemu_set_irq(icp->output, 0);

    if (icpc->reset) {
        icpc->reset(icp);
    }
}

static void icp_realize(DeviceState *dev, Error **errp)
{
    ICPState *icp = ICP(dev);
    ICPStateClass *icpc = ICP_GET_CLASS(dev);
    PowerPCCPU *cpu;
    CPUPPCState *env;
    Object *obj;
@@ -351,10 +345,6 @@ static void icp_realize(DeviceState *dev, Error **errp)
        return;
    }

    if (icpc->realize) {
        icpc->realize(icp, errp);
    }

    qemu_register_reset(icp_reset, dev);
    vmstate_register(NULL, icp->cs->cpu_index, &vmstate_icp_server, icp);
}
+27 −7
Original line number Diff line number Diff line
@@ -114,22 +114,38 @@ static int icp_set_kvm_state(ICPState *icp, int version_id)
    return 0;
}

static void icp_kvm_reset(ICPState *icp)
static void icp_kvm_reset(DeviceState *dev)
{
    icp_set_kvm_state(icp, 1);
    ICPStateClass *icpc = ICP_GET_CLASS(dev);

    icpc->parent_reset(dev);

    icp_set_kvm_state(ICP(dev), 1);
}

static void icp_kvm_realize(ICPState *icp, Error **errp)
static void icp_kvm_realize(DeviceState *dev, Error **errp)
{
    CPUState *cs = icp->cs;
    ICPState *icp = ICP(dev);
    ICPStateClass *icpc = ICP_GET_CLASS(icp);
    Error *local_err = NULL;
    CPUState *cs;
    KVMEnabledICP *enabled_icp;
    unsigned long vcpu_id = kvm_arch_vcpu_id(cs);
    unsigned long vcpu_id;
    int ret;

    if (kernel_xics_fd == -1) {
        abort();
    }

    icpc->parent_realize(dev, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

    cs = icp->cs;
    vcpu_id = kvm_arch_vcpu_id(cs);

    /*
     * If we are reusing a parked vCPU fd corresponding to the CPU
     * which was hot-removed earlier we don't have to renable
@@ -154,12 +170,16 @@ static void icp_kvm_realize(ICPState *icp, Error **errp)

static void icp_kvm_class_init(ObjectClass *klass, void *data)
{
    DeviceClass *dc = DEVICE_CLASS(klass);
    ICPStateClass *icpc = ICP_CLASS(klass);

    device_class_set_parent_realize(dc, icp_kvm_realize,
                                    &icpc->parent_realize);
    device_class_set_parent_reset(dc, icp_kvm_reset,
                                  &icpc->parent_reset);

    icpc->pre_save = icp_get_kvm_state;
    icpc->post_load = icp_set_kvm_state;
    icpc->realize = icp_kvm_realize;
    icpc->reset = icp_kvm_reset;
    icpc->synchronize_state = icp_synchronize_state;
}

+13 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
 */

#include "qemu/osdep.h"
#include "qapi/error.h"
#include "sysemu/sysemu.h"
#include "qemu/log.h"
#include "hw/ppc/xics.h"
@@ -158,9 +159,18 @@ static const MemoryRegionOps pnv_icp_ops = {
    },
};

static void pnv_icp_realize(ICPState *icp, Error **errp)
static void pnv_icp_realize(DeviceState *dev, Error **errp)
{
    ICPState *icp = ICP(dev);
    PnvICPState *pnv_icp = PNV_ICP(icp);
    ICPStateClass *icpc = ICP_GET_CLASS(icp);
    Error *local_err = NULL;

    icpc->parent_realize(dev, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

    memory_region_init_io(&pnv_icp->mmio, OBJECT(icp), &pnv_icp_ops,
                          icp, "icp-thread", 0x1000);
@@ -171,7 +181,8 @@ static void pnv_icp_class_init(ObjectClass *klass, void *data)
    DeviceClass *dc = DEVICE_CLASS(klass);
    ICPStateClass *icpc = ICP_CLASS(klass);

    icpc->realize = pnv_icp_realize;
    device_class_set_parent_realize(dc, pnv_icp_realize,
                                    &icpc->parent_realize);
    dc->desc = "PowerNV ICP";
}

+3 −2
Original line number Diff line number Diff line
@@ -65,10 +65,11 @@ typedef struct XICSFabric XICSFabric;
struct ICPStateClass {
    DeviceClass parent_class;

    void (*realize)(ICPState *icp, Error **errp);
    DeviceRealize parent_realize;
    DeviceReset parent_reset;

    void (*pre_save)(ICPState *icp);
    int (*post_load)(ICPState *icp, int version_id);
    void (*reset)(ICPState *icp);
    void (*synchronize_state)(ICPState *icp);
};