提交 f2c85a2f 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging

post-2.1 bugfixes

A bunch of fixes that missed 2.1 by a small margin.
If we do 2.1.1, some of these would be good candidates,
added Cc qemu-stable as appropriate.
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>

# gpg: Signature made Thu 14 Aug 2014 17:07:25 BST using RSA key ID D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg:                 aka "Michael S. Tsirkin <mst@redhat.com>"

* remotes/mst/tags/for_upstream:
  pc: Get rid of pci-info leftovers
  e1000: use symbolic constants to init phy ctrl & status registers
  e1000: correctly handle phy_ctrl reserved & self-clearing bits
  ivshmem: fix building when debug mode is enabled
  acpi: align RSDP
  numa: show hex number in error message for consistency and prefix them with 0x
  pc-dimm: fix up error message
  pc-dimm: validate node property
  hw:i386: typo fix: MEMORY_HOPTLUG_DEVICE -> MEMORY_HOTPLUG_DEVICE
  hw/audio/intel-hda: Fix MSI capability address
  pc: Create 2.2 machine type
  pci: Use bus master address space for delivering MSI/MSI-X messages
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -187,6 +187,7 @@ struct IntelHDAState { ...@@ -187,6 +187,7 @@ struct IntelHDAState {
/* properties */ /* properties */
uint32_t debug; uint32_t debug;
uint32_t msi; uint32_t msi;
bool old_msi_addr;
}; };
#define TYPE_INTEL_HDA_GENERIC "intel-hda-generic" #define TYPE_INTEL_HDA_GENERIC "intel-hda-generic"
...@@ -1141,7 +1142,7 @@ static int intel_hda_init(PCIDevice *pci) ...@@ -1141,7 +1142,7 @@ static int intel_hda_init(PCIDevice *pci)
"intel-hda", 0x4000); "intel-hda", 0x4000);
pci_register_bar(&d->pci, 0, 0, &d->mmio); pci_register_bar(&d->pci, 0, 0, &d->mmio);
if (d->msi) { if (d->msi) {
msi_init(&d->pci, 0x50, 1, true, false); msi_init(&d->pci, d->old_msi_addr ? 0x50 : 0x60, 1, true, false);
} }
hda_codec_bus_init(DEVICE(pci), &d->codecs, sizeof(d->codecs), hda_codec_bus_init(DEVICE(pci), &d->codecs, sizeof(d->codecs),
...@@ -1236,6 +1237,7 @@ static const VMStateDescription vmstate_intel_hda = { ...@@ -1236,6 +1237,7 @@ static const VMStateDescription vmstate_intel_hda = {
static Property intel_hda_properties[] = { static Property intel_hda_properties[] = {
DEFINE_PROP_UINT32("debug", IntelHDAState, debug, 0), DEFINE_PROP_UINT32("debug", IntelHDAState, debug, 0),
DEFINE_PROP_UINT32("msi", IntelHDAState, msi, 1), DEFINE_PROP_UINT32("msi", IntelHDAState, msi, 1),
DEFINE_PROP_BOOL("old_msi_addr", IntelHDAState, old_msi_addr, false),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };
......
...@@ -1393,7 +1393,7 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt) ...@@ -1393,7 +1393,7 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
{ {
AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp); AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 1, bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
true /* fseg memory */); true /* fseg memory */);
memcpy(&rsdp->signature, "RSD PTR ", 8); memcpy(&rsdp->signature, "RSD PTR ", 8);
......
...@@ -302,7 +302,7 @@ DefinitionBlock ( ...@@ -302,7 +302,7 @@ DefinitionBlock (
/**************************************************************** /****************************************************************
* General purpose events * General purpose events
****************************************************************/ ****************************************************************/
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD, MethodObj)
Scope(\_GPE) { Scope(\_GPE) {
Name(_HID, "ACPI0006") Name(_HID, "ACPI0006")
...@@ -321,7 +321,7 @@ DefinitionBlock ( ...@@ -321,7 +321,7 @@ DefinitionBlock (
} }
Method(_E03) { Method(_E03) {
// Memory hotplug event // Memory hotplug event
\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD() \_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD()
} }
Method(_L04) { Method(_L04) {
} }
......
...@@ -8,7 +8,7 @@ static unsigned char AcpiDsdtAmlCode[] = { ...@@ -8,7 +8,7 @@ static unsigned char AcpiDsdtAmlCode[] = {
0x0, 0x0,
0x0, 0x0,
0x1, 0x1,
0x2e, 0x1f,
0x42, 0x42,
0x58, 0x58,
0x50, 0x50,
...@@ -31,9 +31,9 @@ static unsigned char AcpiDsdtAmlCode[] = { ...@@ -31,9 +31,9 @@ static unsigned char AcpiDsdtAmlCode[] = {
0x4e, 0x4e,
0x54, 0x54,
0x4c, 0x4c,
0x13, 0x28,
0x9, 0x5,
0x12, 0x10,
0x20, 0x20,
0x10, 0x10,
0x49, 0x49,
......
...@@ -1066,35 +1066,6 @@ typedef struct PcRomPciInfo { ...@@ -1066,35 +1066,6 @@ typedef struct PcRomPciInfo {
uint64_t w64_max; uint64_t w64_max;
} PcRomPciInfo; } PcRomPciInfo;
static void pc_fw_cfg_guest_info(PcGuestInfo *guest_info)
{
PcRomPciInfo *info;
Object *pci_info;
bool ambiguous = false;
if (!guest_info->has_pci_info || !guest_info->fw_cfg) {
return;
}
pci_info = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
g_assert(!ambiguous);
if (!pci_info) {
return;
}
info = g_malloc(sizeof *info);
info->w32_min = cpu_to_le64(object_property_get_int(pci_info,
PCI_HOST_PROP_PCI_HOLE_START, NULL));
info->w32_max = cpu_to_le64(object_property_get_int(pci_info,
PCI_HOST_PROP_PCI_HOLE_END, NULL));
info->w64_min = cpu_to_le64(object_property_get_int(pci_info,
PCI_HOST_PROP_PCI_HOLE64_START, NULL));
info->w64_max = cpu_to_le64(object_property_get_int(pci_info,
PCI_HOST_PROP_PCI_HOLE64_END, NULL));
/* Pass PCI hole info to guest via a side channel.
* Required so guest PCI enumeration does the right thing. */
fw_cfg_add_file(guest_info->fw_cfg, "etc/pci-info", info, sizeof *info);
}
typedef struct PcGuestInfoState { typedef struct PcGuestInfoState {
PcGuestInfo info; PcGuestInfo info;
Notifier machine_done; Notifier machine_done;
...@@ -1106,7 +1077,6 @@ void pc_guest_info_machine_done(Notifier *notifier, void *data) ...@@ -1106,7 +1077,6 @@ void pc_guest_info_machine_done(Notifier *notifier, void *data)
PcGuestInfoState *guest_info_state = container_of(notifier, PcGuestInfoState *guest_info_state = container_of(notifier,
PcGuestInfoState, PcGuestInfoState,
machine_done); machine_done);
pc_fw_cfg_guest_info(&guest_info_state->info);
acpi_setup(&guest_info_state->info); acpi_setup(&guest_info_state->info);
} }
......
...@@ -59,7 +59,6 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 }; ...@@ -59,7 +59,6 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 }; static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 }; static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
static bool has_pci_info;
static bool has_acpi_build = true; static bool has_acpi_build = true;
static int legacy_acpi_table_size; static int legacy_acpi_table_size;
static bool smbios_defaults = true; static bool smbios_defaults = true;
...@@ -166,7 +165,6 @@ static void pc_init1(MachineState *machine, ...@@ -166,7 +165,6 @@ static void pc_init1(MachineState *machine,
guest_info->has_acpi_build = has_acpi_build; guest_info->has_acpi_build = has_acpi_build;
guest_info->legacy_acpi_table_size = legacy_acpi_table_size; guest_info->legacy_acpi_table_size = legacy_acpi_table_size;
guest_info->has_pci_info = has_pci_info;
guest_info->isapc_ram_fw = !pci_enabled; guest_info->isapc_ram_fw = !pci_enabled;
guest_info->has_reserved_memory = has_reserved_memory; guest_info->has_reserved_memory = has_reserved_memory;
...@@ -340,7 +338,6 @@ static void pc_compat_1_7(MachineState *machine) ...@@ -340,7 +338,6 @@ static void pc_compat_1_7(MachineState *machine)
static void pc_compat_1_6(MachineState *machine) static void pc_compat_1_6(MachineState *machine)
{ {
pc_compat_1_7(machine); pc_compat_1_7(machine);
has_pci_info = false;
rom_file_has_mr = false; rom_file_has_mr = false;
has_acpi_build = false; has_acpi_build = false;
} }
...@@ -422,7 +419,6 @@ static void pc_init_pci_no_kvmclock(MachineState *machine) ...@@ -422,7 +419,6 @@ static void pc_init_pci_no_kvmclock(MachineState *machine)
static void pc_init_isa(MachineState *machine) static void pc_init_isa(MachineState *machine)
{ {
has_pci_info = false;
has_acpi_build = false; has_acpi_build = false;
smbios_defaults = false; smbios_defaults = false;
gigabyte_align = false; gigabyte_align = false;
...@@ -457,16 +453,28 @@ static void pc_xen_hvm_init(MachineState *machine) ...@@ -457,16 +453,28 @@ static void pc_xen_hvm_init(MachineState *machine)
.desc = "Standard PC (i440FX + PIIX, 1996)", \ .desc = "Standard PC (i440FX + PIIX, 1996)", \
.hot_add_cpu = pc_hot_add_cpu .hot_add_cpu = pc_hot_add_cpu
#define PC_I440FX_2_1_MACHINE_OPTIONS \ #define PC_I440FX_2_2_MACHINE_OPTIONS \
PC_I440FX_MACHINE_OPTIONS, \ PC_I440FX_MACHINE_OPTIONS, \
.default_machine_opts = "firmware=bios-256k.bin" .default_machine_opts = "firmware=bios-256k.bin"
static QEMUMachine pc_i440fx_machine_v2_2 = {
PC_I440FX_2_2_MACHINE_OPTIONS,
.name = "pc-i440fx-2.2",
.alias = "pc",
.init = pc_init_pci,
.is_default = 1,
};
#define PC_I440FX_2_1_MACHINE_OPTIONS PC_I440FX_2_2_MACHINE_OPTIONS
static QEMUMachine pc_i440fx_machine_v2_1 = { static QEMUMachine pc_i440fx_machine_v2_1 = {
PC_I440FX_2_1_MACHINE_OPTIONS, PC_I440FX_2_1_MACHINE_OPTIONS,
.name = "pc-i440fx-2.1", .name = "pc-i440fx-2.1",
.alias = "pc",
.init = pc_init_pci, .init = pc_init_pci,
.is_default = 1, .compat_props = (GlobalProperty[]) {
PC_COMPAT_2_1,
{ /* end of list */ }
},
}; };
#define PC_I440FX_2_0_MACHINE_OPTIONS PC_I440FX_2_1_MACHINE_OPTIONS #define PC_I440FX_2_0_MACHINE_OPTIONS PC_I440FX_2_1_MACHINE_OPTIONS
...@@ -903,6 +911,7 @@ static QEMUMachine xenfv_machine = { ...@@ -903,6 +911,7 @@ static QEMUMachine xenfv_machine = {
static void pc_machine_init(void) static void pc_machine_init(void)
{ {
qemu_register_pc_machine(&pc_i440fx_machine_v2_2);
qemu_register_pc_machine(&pc_i440fx_machine_v2_1); qemu_register_pc_machine(&pc_i440fx_machine_v2_1);
qemu_register_pc_machine(&pc_i440fx_machine_v2_0); qemu_register_pc_machine(&pc_i440fx_machine_v2_0);
qemu_register_pc_machine(&pc_i440fx_machine_v1_7); qemu_register_pc_machine(&pc_i440fx_machine_v1_7);
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
/* ICH9 AHCI has 6 ports */ /* ICH9 AHCI has 6 ports */
#define MAX_SATA_PORTS 6 #define MAX_SATA_PORTS 6
static bool has_pci_info;
static bool has_acpi_build = true; static bool has_acpi_build = true;
static bool smbios_defaults = true; static bool smbios_defaults = true;
static bool smbios_legacy_mode; static bool smbios_legacy_mode;
...@@ -150,7 +149,6 @@ static void pc_q35_init(MachineState *machine) ...@@ -150,7 +149,6 @@ static void pc_q35_init(MachineState *machine)
} }
guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size); guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
guest_info->has_pci_info = has_pci_info;
guest_info->isapc_ram_fw = false; guest_info->isapc_ram_fw = false;
guest_info->has_acpi_build = has_acpi_build; guest_info->has_acpi_build = has_acpi_build;
guest_info->has_reserved_memory = has_reserved_memory; guest_info->has_reserved_memory = has_reserved_memory;
...@@ -296,7 +294,6 @@ static void pc_compat_1_7(MachineState *machine) ...@@ -296,7 +294,6 @@ static void pc_compat_1_7(MachineState *machine)
static void pc_compat_1_6(MachineState *machine) static void pc_compat_1_6(MachineState *machine)
{ {
pc_compat_1_7(machine); pc_compat_1_7(machine);
has_pci_info = false;
rom_file_has_mr = false; rom_file_has_mr = false;
has_acpi_build = false; has_acpi_build = false;
} }
...@@ -348,15 +345,27 @@ static void pc_q35_init_1_4(MachineState *machine) ...@@ -348,15 +345,27 @@ static void pc_q35_init_1_4(MachineState *machine)
.desc = "Standard PC (Q35 + ICH9, 2009)", \ .desc = "Standard PC (Q35 + ICH9, 2009)", \
.hot_add_cpu = pc_hot_add_cpu .hot_add_cpu = pc_hot_add_cpu
#define PC_Q35_2_1_MACHINE_OPTIONS \ #define PC_Q35_2_2_MACHINE_OPTIONS \
PC_Q35_MACHINE_OPTIONS, \ PC_Q35_MACHINE_OPTIONS, \
.default_machine_opts = "firmware=bios-256k.bin" .default_machine_opts = "firmware=bios-256k.bin"
static QEMUMachine pc_q35_machine_v2_2 = {
PC_Q35_2_2_MACHINE_OPTIONS,
.name = "pc-q35-2.2",
.alias = "q35",
.init = pc_q35_init,
};
#define PC_Q35_2_1_MACHINE_OPTIONS PC_Q35_2_2_MACHINE_OPTIONS
static QEMUMachine pc_q35_machine_v2_1 = { static QEMUMachine pc_q35_machine_v2_1 = {
PC_Q35_2_1_MACHINE_OPTIONS, PC_Q35_2_1_MACHINE_OPTIONS,
.name = "pc-q35-2.1", .name = "pc-q35-2.1",
.alias = "q35",
.init = pc_q35_init, .init = pc_q35_init,
.compat_props = (GlobalProperty[]) {
PC_COMPAT_2_1,
{ /* end of list */ }
},
}; };
#define PC_Q35_2_0_MACHINE_OPTIONS PC_Q35_2_1_MACHINE_OPTIONS #define PC_Q35_2_0_MACHINE_OPTIONS PC_Q35_2_1_MACHINE_OPTIONS
...@@ -421,6 +430,7 @@ static QEMUMachine pc_q35_machine_v1_4 = { ...@@ -421,6 +430,7 @@ static QEMUMachine pc_q35_machine_v1_4 = {
static void pc_q35_machine_init(void) static void pc_q35_machine_init(void)
{ {
qemu_register_pc_machine(&pc_q35_machine_v2_2);
qemu_register_pc_machine(&pc_q35_machine_v2_1); qemu_register_pc_machine(&pc_q35_machine_v2_1);
qemu_register_pc_machine(&pc_q35_machine_v2_0); qemu_register_pc_machine(&pc_q35_machine_v2_0);
qemu_register_pc_machine(&pc_q35_machine_v1_7); qemu_register_pc_machine(&pc_q35_machine_v1_7);
......
...@@ -410,7 +410,7 @@ DefinitionBlock ( ...@@ -410,7 +410,7 @@ DefinitionBlock (
/**************************************************************** /****************************************************************
* General purpose events * General purpose events
****************************************************************/ ****************************************************************/
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD, MethodObj)
Scope(\_GPE) { Scope(\_GPE) {
Name(_HID, "ACPI0006") Name(_HID, "ACPI0006")
...@@ -425,7 +425,7 @@ DefinitionBlock ( ...@@ -425,7 +425,7 @@ DefinitionBlock (
} }
Method(_E03) { Method(_E03) {
// Memory hotplug event // Memory hotplug event
\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD() \_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_SCAN_METHOD()
} }
Method(_L04) { Method(_L04) {
} }
......
...@@ -39,10 +39,10 @@ ACPI_EXTRACT_ALL_CODE ssdm_mem_aml ...@@ -39,10 +39,10 @@ ACPI_EXTRACT_ALL_CODE ssdm_mem_aml
DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1) DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1)
{ {
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_CRS_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_CRS_METHOD, MethodObj)
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_STATUS_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_STATUS_METHOD, MethodObj)
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_OST_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_OST_METHOD, MethodObj)
External(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_PROXIMITY_METHOD, MethodObj) External(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_PROXIMITY_METHOD, MethodObj)
Scope(\_SB) { Scope(\_SB) {
/* v------------------ DO NOT EDIT ------------------v */ /* v------------------ DO NOT EDIT ------------------v */
...@@ -58,19 +58,19 @@ DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1) ...@@ -58,19 +58,19 @@ DefinitionBlock ("ssdt-mem.aml", "SSDT", 0x02, "BXPC", "CSSDT", 0x1)
Name(_HID, EISAID("PNP0C80")) Name(_HID, EISAID("PNP0C80"))
Method(_CRS, 0) { Method(_CRS, 0) {
Return(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_CRS_METHOD(_UID)) Return(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_CRS_METHOD(_UID))
} }
Method(_STA, 0) { Method(_STA, 0) {
Return(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_STATUS_METHOD(_UID)) Return(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_STATUS_METHOD(_UID))
} }
Method(_PXM, 0) { Method(_PXM, 0) {
Return(\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_PROXIMITY_METHOD(_UID)) Return(\_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_PROXIMITY_METHOD(_UID))
} }
Method(_OST, 3) { Method(_OST, 3) {
\_SB.PCI0.MEMORY_HOPTLUG_DEVICE.MEMORY_SLOT_OST_METHOD(_UID, Arg0, Arg1, Arg2) \_SB.PCI0.MEMORY_HOTPLUG_DEVICE.MEMORY_SLOT_OST_METHOD(_UID, Arg0, Arg1, Arg2)
} }
} }
} }
......
...@@ -120,7 +120,7 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1) ...@@ -120,7 +120,7 @@ DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1)
External(MEMORY_SLOT_NOTIFY_METHOD, MethodObj) External(MEMORY_SLOT_NOTIFY_METHOD, MethodObj)
Scope(\_SB.PCI0) { Scope(\_SB.PCI0) {
Device(MEMORY_HOPTLUG_DEVICE) { Device(MEMORY_HOTPLUG_DEVICE) {
Name(_HID, "PNP0A06") Name(_HID, "PNP0A06")
Name(_UID, "Memory hotplug resources") Name(_UID, "Memory hotplug resources")
......
...@@ -252,6 +252,12 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp) ...@@ -252,6 +252,12 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp)
error_setg(errp, "'" PC_DIMM_MEMDEV_PROP "' property is not set"); error_setg(errp, "'" PC_DIMM_MEMDEV_PROP "' property is not set");
return; return;
} }
if (dimm->node >= nb_numa_nodes) {
error_setg(errp, "'DIMM property " PC_DIMM_NODE_PROP " has value %"
PRIu32 "' which exceeds the number of numa nodes: %d",
dimm->node, nb_numa_nodes);
return;
}
} }
static MemoryRegion *pc_dimm_get_memory_region(PCDIMMDevice *dimm) static MemoryRegion *pc_dimm_get_memory_region(PCDIMMDevice *dimm)
......
...@@ -479,8 +479,8 @@ static void ivshmem_read(void *opaque, const uint8_t * buf, int flags) ...@@ -479,8 +479,8 @@ static void ivshmem_read(void *opaque, const uint8_t * buf, int flags)
"ivshmem.bar2", s->ivshmem_size, map_ptr); "ivshmem.bar2", s->ivshmem_size, map_ptr);
vmstate_register_ram(&s->ivshmem, DEVICE(s)); vmstate_register_ram(&s->ivshmem, DEVICE(s));
IVSHMEM_DPRINTF("guest h/w addr = %" PRIu64 ", size = %" PRIu64 "\n", IVSHMEM_DPRINTF("guest h/w addr = %p, size = %" PRIu64 "\n",
s->ivshmem_offset, s->ivshmem_size); map_ptr, s->ivshmem_size);
memory_region_add_subregion(&s->bar, 0, &s->ivshmem); memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
......
...@@ -186,21 +186,31 @@ e1000_link_up(E1000State *s) ...@@ -186,21 +186,31 @@ e1000_link_up(E1000State *s)
s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS; s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS;
} }
static bool
have_autoneg(E1000State *s)
{
return (s->compat_flags & E1000_FLAG_AUTONEG) &&
(s->phy_reg[PHY_CTRL] & MII_CR_AUTO_NEG_EN);
}
static void static void
set_phy_ctrl(E1000State *s, int index, uint16_t val) set_phy_ctrl(E1000State *s, int index, uint16_t val)
{ {
/* bits 0-5 reserved; MII_CR_[RESTART_AUTO_NEG,RESET] are self clearing */
s->phy_reg[PHY_CTRL] = val & ~(0x3f |
MII_CR_RESET |
MII_CR_RESTART_AUTO_NEG);
/* /*
* QEMU 1.3 does not support link auto-negotiation emulation, so if we * QEMU 1.3 does not support link auto-negotiation emulation, so if we
* migrate during auto negotiation, after migration the link will be * migrate during auto negotiation, after migration the link will be
* down. * down.
*/ */
if (!(s->compat_flags & E1000_FLAG_AUTONEG)) { if (have_autoneg(s) && (val & MII_CR_RESTART_AUTO_NEG)) {
return;
}
if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
e1000_link_down(s); e1000_link_down(s);
DBGOUT(PHY, "Start link auto negotiation\n"); DBGOUT(PHY, "Start link auto negotiation\n");
timer_mod(s->autoneg_timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500); timer_mod(s->autoneg_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + 500);
} }
} }
...@@ -223,13 +233,30 @@ static const char phy_regcap[0x20] = { ...@@ -223,13 +233,30 @@ static const char phy_regcap[0x20] = {
/* PHY_ID2 documented in 8254x_GBe_SDM.pdf, pp. 250 */ /* PHY_ID2 documented in 8254x_GBe_SDM.pdf, pp. 250 */
static const uint16_t phy_reg_init[] = { static const uint16_t phy_reg_init[] = {
[PHY_CTRL] = 0x1140, [PHY_CTRL] = MII_CR_SPEED_SELECT_MSB |
[PHY_STATUS] = 0x794d, /* link initially up with not completed autoneg */ MII_CR_FULL_DUPLEX |
[PHY_ID1] = 0x141, /* [PHY_ID2] configured per DevId, from e1000_reset() */ MII_CR_AUTO_NEG_EN,
[PHY_1000T_CTRL] = 0x0e00, [M88E1000_PHY_SPEC_CTRL] = 0x360,
[M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60, [PHY_AUTONEG_ADV] = 0xde1, [PHY_STATUS] = MII_SR_EXTENDED_CAPS |
[PHY_LP_ABILITY] = 0x1e0, [PHY_1000T_STATUS] = 0x3c00, MII_SR_LINK_STATUS | /* link initially up */
MII_SR_AUTONEG_CAPS |
/* MII_SR_AUTONEG_COMPLETE: initially NOT completed */
MII_SR_PREAMBLE_SUPPRESS |
MII_SR_EXTENDED_STATUS |
MII_SR_10T_HD_CAPS |
MII_SR_10T_FD_CAPS |
MII_SR_100X_HD_CAPS |
MII_SR_100X_FD_CAPS,
[PHY_ID1] = 0x141,
/* [PHY_ID2] configured per DevId, from e1000_reset() */
[PHY_AUTONEG_ADV] = 0xde1,
[PHY_LP_ABILITY] = 0x1e0,
[PHY_1000T_CTRL] = 0x0e00,
[PHY_1000T_STATUS] = 0x3c00,
[M88E1000_PHY_SPEC_CTRL] = 0x360,
[M88E1000_PHY_SPEC_STATUS] = 0xac00, [M88E1000_PHY_SPEC_STATUS] = 0xac00,
[M88E1000_EXT_PHY_SPEC_CTRL] = 0x0d60,
}; };
static const uint32_t mac_reg_init[] = { static const uint32_t mac_reg_init[] = {
...@@ -446,8 +473,9 @@ set_mdic(E1000State *s, int index, uint32_t val) ...@@ -446,8 +473,9 @@ set_mdic(E1000State *s, int index, uint32_t val)
} else { } else {
if (addr < NPHYWRITEOPS && phyreg_writeops[addr]) { if (addr < NPHYWRITEOPS && phyreg_writeops[addr]) {
phyreg_writeops[addr](s, index, data); phyreg_writeops[addr](s, index, data);
} else {
s->phy_reg[addr] = data;
} }
s->phy_reg[addr] = data;
} }
} }
s->mac_reg[MDIC] = val | E1000_MDIC_READY; s->mac_reg[MDIC] = val | E1000_MDIC_READY;
...@@ -848,14 +876,6 @@ receive_filter(E1000State *s, const uint8_t *buf, int size) ...@@ -848,14 +876,6 @@ receive_filter(E1000State *s, const uint8_t *buf, int size)
return 0; return 0;
} }
static bool
have_autoneg(E1000State *s)
{
return (s->compat_flags & E1000_FLAG_AUTONEG) &&
(s->phy_reg[PHY_CTRL] & MII_CR_AUTO_NEG_EN) &&
(s->phy_reg[PHY_CTRL] & MII_CR_RESTART_AUTO_NEG);
}
static void static void
e1000_set_link_status(NetClientState *nc) e1000_set_link_status(NetClientState *nc)
{ {
......
...@@ -291,7 +291,7 @@ void msi_notify(PCIDevice *dev, unsigned int vector) ...@@ -291,7 +291,7 @@ void msi_notify(PCIDevice *dev, unsigned int vector)
"notify vector 0x%x" "notify vector 0x%x"
" address: 0x%"PRIx64" data: 0x%"PRIx32"\n", " address: 0x%"PRIx64" data: 0x%"PRIx32"\n",
vector, msg.address, msg.data); vector, msg.address, msg.data);
stl_le_phys(&address_space_memory, msg.address, msg.data); stl_le_phys(&dev->bus_master_as, msg.address, msg.data);
} }
/* Normally called by pci_default_write_config(). */ /* Normally called by pci_default_write_config(). */
......
...@@ -439,7 +439,7 @@ void msix_notify(PCIDevice *dev, unsigned vector) ...@@ -439,7 +439,7 @@ void msix_notify(PCIDevice *dev, unsigned vector)
msg = msix_get_message(dev, vector); msg = msix_get_message(dev, vector);
stl_le_phys(&address_space_memory, msg.address, msg.data); stl_le_phys(&dev->bus_master_as, msg.address, msg.data);
} }
void msix_reset(PCIDevice *dev) void msix_reset(PCIDevice *dev)
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define ACPI_MEMORY_HOTPLUG_IO_LEN 24 #define ACPI_MEMORY_HOTPLUG_IO_LEN 24
#define ACPI_MEMORY_HOTPLUG_BASE 0x0a00 #define ACPI_MEMORY_HOTPLUG_BASE 0x0a00
#define MEMORY_HOPTLUG_DEVICE MHPD #define MEMORY_HOTPLUG_DEVICE MHPD
#define MEMORY_SLOTS_NUMBER MDNR #define MEMORY_SLOTS_NUMBER MDNR
#define MEMORY_HOTPLUG_IO_REGION HPMR #define MEMORY_HOTPLUG_IO_REGION HPMR
#define MEMORY_SLOT_ADDR_LOW MRBL #define MEMORY_SLOT_ADDR_LOW MRBL
......
...@@ -85,7 +85,6 @@ typedef struct PcPciInfo { ...@@ -85,7 +85,6 @@ typedef struct PcPciInfo {
#define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len" #define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len"
struct PcGuestInfo { struct PcGuestInfo {
bool has_pci_info;
bool isapc_ram_fw; bool isapc_ram_fw;
hwaddr ram_size, ram_size_below_4g; hwaddr ram_size, ram_size_below_4g;
unsigned apic_id_limit; unsigned apic_id_limit;
...@@ -300,7 +299,15 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t); ...@@ -300,7 +299,15 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
int e820_get_num_entries(void); int e820_get_num_entries(void);
bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
#define PC_COMPAT_2_1 \
{\
.driver = "intel-hda",\
.property = "old_msi_addr",\
.value = "on",\
}
#define PC_COMPAT_2_0 \ #define PC_COMPAT_2_0 \
PC_COMPAT_2_1, \
{\ {\
.driver = "virtio-scsi-pci",\ .driver = "virtio-scsi-pci",\
.property = "any_layout",\ .property = "any_layout",\
......
...@@ -210,8 +210,8 @@ void set_numa_nodes(void) ...@@ -210,8 +210,8 @@ void set_numa_nodes(void)
numa_total += numa_info[i].node_mem; numa_total += numa_info[i].node_mem;
} }
if (numa_total != ram_size) { if (numa_total != ram_size) {
error_report("total memory for NUMA nodes (%" PRIu64 ")" error_report("total memory for NUMA nodes (0x%" PRIx64 ")"
" should equal RAM size (" RAM_ADDR_FMT ")", " should equal RAM size (0x" RAM_ADDR_FMT ")",
numa_total, ram_size); numa_total, ram_size);
exit(1); exit(1);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册