Skip to content

Commit

Permalink
cpu/apic: drop icc bus/bridge
Browse files Browse the repository at this point in the history
After CPU hotplug has been converted to BUS-less hot-plug infrastructure,
the only function ICC bus performs is to propagate reset to LAPICs. However
LAPIC could be reset by registering its reset handler after all device are
initialized.
Do so and drop ~30LOC of not needed anymore ICCBus related code.

Signed-off-by: Chen Fan <[email protected]>
Signed-off-by: Zhu Guihua <[email protected]>
Reviewed-by: Igor Mammedov <[email protected]>
Signed-off-by: Eduardo Habkost <[email protected]>
  • Loading branch information
Chen Fan authored and ehabkost committed Oct 2, 2015
1 parent ae50c55 commit 46232aa
Show file tree
Hide file tree
Showing 7 changed files with 14 additions and 46 deletions.
19 changes: 4 additions & 15 deletions hw/i386/pc.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@
#include "qemu/error-report.h"
#include "hw/acpi/acpi.h"
#include "hw/acpi/cpu_hotplug.h"
#include "hw/cpu/icc_bus.h"
#include "hw/boards.h"
#include "hw/pci/pci_host.h"
#include "acpi-build.h"
Expand Down Expand Up @@ -1052,23 +1051,16 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
}

static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
DeviceState *icc_bridge, Error **errp)
Error **errp)
{
X86CPU *cpu = NULL;
Error *local_err = NULL;

if (icc_bridge == NULL) {
error_setg(&local_err, "Invalid icc-bridge value");
goto out;
}

cpu = cpu_x86_create(cpu_model, &local_err);
if (local_err != NULL) {
goto out;
}

qdev_set_parent_bus(DEVICE(cpu), qdev_get_child_bus(icc_bridge, "icc"));

object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);

Expand All @@ -1085,7 +1077,6 @@ static const char *current_cpu_model;

void pc_hot_add_cpu(const int64_t id, Error **errp)
{
DeviceState *icc_bridge;
X86CPU *cpu;
int64_t apic_id = x86_cpu_apic_id_from_index(id);
Error *local_err = NULL;
Expand Down Expand Up @@ -1114,17 +1105,15 @@ void pc_hot_add_cpu(const int64_t id, Error **errp)
return;
}

icc_bridge = DEVICE(object_resolve_path_type("icc-bridge",
TYPE_ICC_BRIDGE, NULL));
cpu = pc_new_cpu(current_cpu_model, apic_id, icc_bridge, &local_err);
cpu = pc_new_cpu(current_cpu_model, apic_id, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
}
object_unref(OBJECT(cpu));
}

void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
void pc_cpus_init(const char *cpu_model)
{
int i;
X86CPU *cpu = NULL;
Expand All @@ -1150,7 +1139,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)

for (i = 0; i < smp_cpus; i++) {
cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i),
icc_bridge, &error);
&error);
if (error) {
error_report_err(error);
exit(1);
Expand Down
9 changes: 1 addition & 8 deletions hw/i386/pc_piix.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
#include "hw/kvm/clock.h"
#include "sysemu/sysemu.h"
#include "hw/sysbus.h"
#include "hw/cpu/icc_bus.h"
#include "sysemu/arch_init.h"
#include "sysemu/block-backend.h"
#include "hw/i2c/smbus.h"
Expand Down Expand Up @@ -98,7 +97,6 @@ static void pc_init1(MachineState *machine,
MemoryRegion *ram_memory;
MemoryRegion *pci_memory;
MemoryRegion *rom_memory;
DeviceState *icc_bridge;
PcGuestInfo *guest_info;
ram_addr_t lowmem;

Expand Down Expand Up @@ -141,11 +139,7 @@ static void pc_init1(MachineState *machine,
exit(1);
}

icc_bridge = qdev_create(NULL, TYPE_ICC_BRIDGE);
object_property_add_child(qdev_get_machine(), "icc-bridge",
OBJECT(icc_bridge), NULL);

pc_cpus_init(machine->cpu_model, icc_bridge);
pc_cpus_init(machine->cpu_model);

if (kvm_enabled() && kvmclock_enabled) {
kvmclock_create();
Expand Down Expand Up @@ -226,7 +220,6 @@ static void pc_init1(MachineState *machine,
if (pci_enabled) {
ioapic_init_gsi(gsi_state, "i440fx");
}
qdev_init_nofail(icc_bridge);

pc_register_ferr_irq(gsi[13]);

Expand Down
9 changes: 1 addition & 8 deletions hw/i386/pc_q35.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
#include "hw/ide/pci.h"
#include "hw/ide/ahci.h"
#include "hw/usb.h"
#include "hw/cpu/icc_bus.h"
#include "qemu/error-report.h"
#include "migration/migration.h"

Expand Down Expand Up @@ -83,7 +82,6 @@ static void pc_q35_init(MachineState *machine)
int i;
ICH9LPCState *ich9_lpc;
PCIDevice *ahci;
DeviceState *icc_bridge;
PcGuestInfo *guest_info;
ram_addr_t lowmem;
DriveInfo *hd[MAX_SATA_PORTS];
Expand Down Expand Up @@ -130,11 +128,7 @@ static void pc_q35_init(MachineState *machine)
exit(1);
}

icc_bridge = qdev_create(NULL, TYPE_ICC_BRIDGE);
object_property_add_child(qdev_get_machine(), "icc-bridge",
OBJECT(icc_bridge), NULL);

pc_cpus_init(machine->cpu_model, icc_bridge);
pc_cpus_init(machine->cpu_model);
pc_acpi_init("q35-acpi-dsdt.aml");

kvmclock_create();
Expand Down Expand Up @@ -236,7 +230,6 @@ static void pc_q35_init(MachineState *machine)
if (pci_enabled) {
ioapic_init_gsi(gsi_state, "q35");
}
qdev_init_nofail(icc_bridge);

pc_register_ferr_irq(gsi[13]);

Expand Down
5 changes: 2 additions & 3 deletions hw/intc/apic_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,13 +419,12 @@ static Property apic_properties_common[] = {

static void apic_common_class_init(ObjectClass *klass, void *data)
{
ICCDeviceClass *idc = ICC_DEVICE_CLASS(klass);
DeviceClass *dc = DEVICE_CLASS(klass);

dc->vmsd = &vmstate_apic_common;
dc->reset = apic_reset_common;
dc->props = apic_properties_common;
idc->realize = apic_common_realize;
dc->realize = apic_common_realize;
/*
* Reason: APIC and CPU need to be wired up by
* x86_cpu_apic_create()
Expand All @@ -435,7 +434,7 @@ static void apic_common_class_init(ObjectClass *klass, void *data)

static const TypeInfo apic_common_type = {
.name = TYPE_APIC_COMMON,
.parent = TYPE_ICC_DEVICE,
.parent = TYPE_DEVICE,
.instance_size = sizeof(APICCommonState),
.class_size = sizeof(APICCommonClass),
.class_init = apic_common_class_init,
Expand Down
7 changes: 4 additions & 3 deletions include/hw/i386/apic_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

#include "cpu.h"
#include "exec/memory.h"
#include "hw/cpu/icc_bus.h"
#include "qemu/timer.h"

/* APIC Local Vector Table */
Expand Down Expand Up @@ -135,7 +134,7 @@ typedef struct APICCommonState APICCommonState;

typedef struct APICCommonClass
{
ICCDeviceClass parent_class;
DeviceClass parent_class;

DeviceRealize realize;
void (*set_base)(APICCommonState *s, uint64_t val);
Expand All @@ -150,7 +149,9 @@ typedef struct APICCommonClass
} APICCommonClass;

struct APICCommonState {
ICCDevice busdev;
/*< private >*/
DeviceState parent_obj;
/*< public >*/

MemoryRegion io_memory;
X86CPU *cpu;
Expand Down
2 changes: 1 addition & 1 deletion include/hw/i386/pc.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ bool pc_machine_is_smm_enabled(PCMachineState *pcms);
void pc_register_ferr_irq(qemu_irq irq);
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);

void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
void pc_cpus_init(const char *cpu_model);
void pc_hot_add_cpu(const int64_t id, Error **errp);
void pc_acpi_init(const char *default_dsdt);

Expand Down
9 changes: 1 addition & 8 deletions target-i386/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@

#include "sysemu/sysemu.h"
#include "hw/qdev-properties.h"
#include "hw/cpu/icc_bus.h"
#ifndef CONFIG_USER_ONLY
#include "exec/address-spaces.h"
#include "hw/xen/xen.h"
Expand Down Expand Up @@ -2736,7 +2735,6 @@ static void mce_init(X86CPU *cpu)
#ifndef CONFIG_USER_ONLY
static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
{
DeviceState *dev = DEVICE(cpu);
APICCommonState *apic;
const char *apic_type = "apic";

Expand All @@ -2746,11 +2744,7 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
apic_type = "xen-apic";
}

cpu->apic_state = qdev_try_create(qdev_get_parent_bus(dev), apic_type);
if (cpu->apic_state == NULL) {
error_setg(errp, "APIC device '%s' could not be created", apic_type);
return;
}
cpu->apic_state = DEVICE(object_new(apic_type));

object_property_add_child(OBJECT(cpu), "apic",
OBJECT(cpu->apic_state), NULL);
Expand Down Expand Up @@ -3161,7 +3155,6 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)

xcc->parent_realize = dc->realize;
dc->realize = x86_cpu_realizefn;
dc->bus_type = TYPE_ICC_BUS;
dc->props = x86_cpu_properties;

xcc->parent_reset = cc->reset;
Expand Down

0 comments on commit 46232aa

Please sign in to comment.