Pull request

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE+ber27ys35W+dsvQfe+BBqr8OQ4FAl5xW7kACgkQfe+BBqr8
 OQ6x2w/9HAM9tyP65wMebkvvg29v6PeO65g81BOzdfcuyWhkZl0pWg6LjNfaN9a3
 xin2MDB9ODOug8kBICeCGEzuJ/qe3wcXEkjnK4uklSk4YZDBIzgfVnC4N+3/pkMr
 pvJM2GNHKk8PQI0YoBPZXwfvzN1CB03f0oaWokkpQq4XYLO6rltflPLwI33De5kx
 igPA7rfRAz12PxP5xzhvVWfaD54xc9pFoQ8SSxrnUqr+3OWfV6+xovE5F7e1O6vw
 x84rRod50tp4c9ABS0mY1kcdnFUKK1YXh+oRvtj9B5QbjYfZY+wvz8Iisgk3cB1s
 CtKTvQSvbvBkdghecX5hHmeSerVKxjjMR8tnoS9A0eaTjfOuum2eBqS0Cf51C61O
 UuMVHFVRyR8g+t0xcDbciPMGbS08UEVaXlibYU1tA8lr6EB1G4aHW1ZvdAsc/eeY
 WrDPb9+QaItT9yL5U43s3/ABFMbHwqyJwdDgNEmet5L89voSGY8VfhDj7wesoQv4
 rzCCeDnl1drFiKqiHSc0IrTc7ktpz7vpfh3mydaD52yj5/xmD/3fS5UpUk3kYDJp
 JrN9npjnsbuLhdI63TrJPXXzdFqSiRiHaNlmiPtKm8ER/NowwpO5BUPSNLK4HIBX
 QcgbcSjbdj1GgmmINPylzShyev9cBfigTks1uF1ln4XuN96S45Q=
 =Q+Rb
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/jnsnow/tags/ide-pull-request' into staging

Pull request

# gpg: Signature made Tue 17 Mar 2020 23:22:33 GMT
# gpg:                using RSA key F9B7ABDBBCACDF95BE76CBD07DEF8106AAFC390E
# gpg: Good signature from "John Snow (John Huston) <jsnow@redhat.com>" [full]
# Primary key fingerprint: FAEB 9711 A12C F475 812F  18F2 88A9 064D 1835 61EB
#      Subkey fingerprint: F9B7 ABDB BCAC DF95 BE76  CBD0 7DEF 8106 AAFC 390E

* remotes/jnsnow/tags/ide-pull-request:
  hw/ide: Remove unneeded inclusion of hw/ide.h
  hw/ide: Move MAX_IDE_DEVS define to hw/ide/internal.h
  hw/ide: Do ide_drive_get() within pci_ide_create_devs()
  hw/ide/pci.c: Coding style update to fix checkpatch errors
  hw/ide: Remove now unneded #include "hw/pci/pci.h" from hw/ide.h
  hw/ide: Get rid of piix4_init function
  hw/isa/piix4.c: Introduce variable to store devfn
  hw/ide: Get rid of piix3_init functions
  hd-geo-test: Clean up use of buf[] in create_qcow2_with_mbr()
  via-ide: always use legacy IRQ 14/15 routing
  via-ide: allow guests to write to PCI_CLASS_PROG
  via-ide: initialise IDE controller in legacy mode
  via-ide: ensure that PCI_INTERRUPT_LINE is hard-wired to its default value
  pci: Honour wmask when resetting PCI_INTERRUPT_LINE
  ide/via: Get rid of via_ide_init()
  via-ide: move registration of VMStateDescription to DeviceClass
  cmd646: remove unused pci_cmd646_ide_init() function
  dp264: use pci_create_simple() to initialise the cmd646 device
  cmd646: register vmstate_ide_pci VMStateDescription in DeviceClass
  cmd646: register cmd646_reset() function in DeviceClass

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-03-19 11:14:24 +00:00
commit ce73691e25
24 changed files with 61 additions and 127 deletions

View file

@ -15,7 +15,7 @@
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"
#include "hw/ide.h" #include "hw/ide/pci.h"
#include "hw/timer/i8254.h" #include "hw/timer/i8254.h"
#include "hw/isa/superio.h" #include "hw/isa/superio.h"
#include "hw/dma/i8257.h" #include "hw/dma/i8257.h"
@ -57,6 +57,7 @@ static void clipper_init(MachineState *machine)
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
AlphaCPU *cpus[4]; AlphaCPU *cpus[4];
PCIBus *pci_bus; PCIBus *pci_bus;
PCIDevice *pci_dev;
ISABus *isa_bus; ISABus *isa_bus;
qemu_irq rtc_irq; qemu_irq rtc_irq;
long size, i; long size, i;
@ -99,12 +100,8 @@ static void clipper_init(MachineState *machine)
isa_create_simple(isa_bus, TYPE_SMC37C669_SUPERIO); isa_create_simple(isa_bus, TYPE_SMC37C669_SUPERIO);
/* IDE disk setup. */ /* IDE disk setup. */
{ pci_dev = pci_create_simple(pci_bus, -1, "cmd646-ide");
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; pci_ide_create_devs(pci_dev);
ide_drive_get(hd, ARRAY_SIZE(hd));
pci_cmd646_ide_init(pci_bus, hd, 0);
}
/* Load PALcode. Given that this is not "real" cpu palcode, /* Load PALcode. Given that this is not "real" cpu palcode,
but one explicitly written for the emulation, we might as but one explicitly written for the emulation, we might as

View file

@ -5,7 +5,6 @@
#include "hw/pci/pci.h" #include "hw/pci/pci.h"
#include "hw/pci/pci_host.h" #include "hw/pci/pci_host.h"
#include "hw/ide.h"
#include "hw/boards.h" #include "hw/boards.h"
#include "hw/intc/i8259.h" #include "hw/intc/i8259.h"

View file

@ -13,7 +13,6 @@
#include "sysemu/reset.h" #include "sysemu/reset.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"
#include "hw/ide.h"
#include "hw/timer/i8254.h" #include "hw/timer/i8254.h"
#include "hw/char/serial.h" #include "hw/char/serial.h"
#include "hw/net/lasi_82596.h" #include "hw/net/lasi_82596.h"

View file

@ -38,7 +38,7 @@
#include "hw/pci/pci_ids.h" #include "hw/pci/pci_ids.h"
#include "hw/usb.h" #include "hw/usb.h"
#include "net/net.h" #include "net/net.h"
#include "hw/ide.h" #include "hw/ide/pci.h"
#include "hw/irq.h" #include "hw/irq.h"
#include "sysemu/kvm.h" #include "sysemu/kvm.h"
#include "hw/kvm/clock.h" #include "hw/kvm/clock.h"
@ -85,7 +85,6 @@ static void pc_init1(MachineState *machine,
int piix3_devfn = -1; int piix3_devfn = -1;
qemu_irq smi_irq; qemu_irq smi_irq;
GSIState *gsi_state; GSIState *gsi_state;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
BusState *idebus[MAX_IDE_BUS]; BusState *idebus[MAX_IDE_BUS];
ISADevice *rtc_state; ISADevice *rtc_state;
MemoryRegion *ram_memory; MemoryRegion *ram_memory;
@ -239,21 +238,22 @@ static void pc_init1(MachineState *machine,
pc_nic_init(pcmc, isa_bus, pci_bus); pc_nic_init(pcmc, isa_bus, pci_bus);
ide_drive_get(hd, ARRAY_SIZE(hd));
if (pcmc->pci_enabled) { if (pcmc->pci_enabled) {
PCIDevice *dev; PCIDevice *dev;
if (xen_enabled()) {
dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1); dev = pci_create_simple(pci_bus, piix3_devfn + 1,
} else { xen_enabled() ? "piix3-ide-xen" : "piix3-ide");
dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1); pci_ide_create_devs(dev);
}
idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0"); idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1"); idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state); pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
} }
#ifdef CONFIG_IDE_ISA #ifdef CONFIG_IDE_ISA
else { else {
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
int i; int i;
ide_drive_get(hd, ARRAY_SIZE(hd));
for (i = 0; i < MAX_IDE_BUS; i++) { for (i = 0; i < MAX_IDE_BUS; i++) {
ISADevice *dev; ISADevice *dev;
char busname[] = "ide.0"; char busname[] = "ide.0";

View file

@ -27,6 +27,7 @@
#include "hw/ide/ahci.h" #include "hw/ide/ahci.h"
#include "hw/ide/internal.h" #include "hw/ide/internal.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "hw/pci/pci.h"
#define AHCI_MEM_BAR_SIZE 0x1000 #define AHCI_MEM_BAR_SIZE 0x1000
#define AHCI_MAX_PORTS 32 #define AHCI_MAX_PORTS 32

View file

@ -207,9 +207,9 @@ static void cmd646_set_irq(void *opaque, int channel, int level)
cmd646_update_irq(pd); cmd646_update_irq(pd);
} }
static void cmd646_reset(void *opaque) static void cmd646_reset(DeviceState *dev)
{ {
PCIIDEState *d = opaque; PCIIDEState *d = PCI_IDE(dev);
unsigned int i; unsigned int i;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
@ -301,9 +301,6 @@ static void pci_cmd646_ide_realize(PCIDevice *dev, Error **errp)
ide_register_restart_cb(&d->bus[i]); ide_register_restart_cb(&d->bus[i]);
} }
g_free(irq); g_free(irq);
vmstate_register(VMSTATE_IF(dev), 0, &vmstate_ide_pci, d);
qemu_register_reset(cmd646_reset, d);
} }
static void pci_cmd646_ide_exitfn(PCIDevice *dev) static void pci_cmd646_ide_exitfn(PCIDevice *dev)
@ -317,18 +314,6 @@ static void pci_cmd646_ide_exitfn(PCIDevice *dev)
} }
} }
void pci_cmd646_ide_init(PCIBus *bus, DriveInfo **hd_table,
int secondary_ide_enabled)
{
PCIDevice *dev;
dev = pci_create(bus, -1, "cmd646-ide");
qdev_prop_set_uint32(&dev->qdev, "secondary", secondary_ide_enabled);
qdev_init_nofail(&dev->qdev);
pci_ide_create_devs(dev, hd_table);
}
static Property cmd646_ide_properties[] = { static Property cmd646_ide_properties[] = {
DEFINE_PROP_UINT32("secondary", PCIIDEState, secondary, 0), DEFINE_PROP_UINT32("secondary", PCIIDEState, secondary, 0),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
@ -339,6 +324,8 @@ static void cmd646_ide_class_init(ObjectClass *klass, void *data)
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
dc->reset = cmd646_reset;
dc->vmsd = &vmstate_ide_pci;
k->realize = pci_cmd646_ide_realize; k->realize = pci_cmd646_ide_realize;
k->exit = pci_cmd646_ide_exitfn; k->exit = pci_cmd646_ide_exitfn;
k->vendor_id = PCI_VENDOR_ID_CMD; k->vendor_id = PCI_VENDOR_ID_CMD;

View file

@ -476,19 +476,22 @@ const VMStateDescription vmstate_ide_pci = {
} }
}; };
void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table) /* hd_table must contain 4 block drivers */
void pci_ide_create_devs(PCIDevice *dev)
{ {
PCIIDEState *d = PCI_IDE(dev); PCIIDEState *d = PCI_IDE(dev);
DriveInfo *hd_table[2 * MAX_IDE_DEVS];
static const int bus[4] = { 0, 0, 1, 1 }; static const int bus[4] = { 0, 0, 1, 1 };
static const int unit[4] = { 0, 1, 0, 1 }; static const int unit[4] = { 0, 1, 0, 1 };
int i; int i;
ide_drive_get(hd_table, ARRAY_SIZE(hd_table));
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (hd_table[i] == NULL) if (hd_table[i]) {
continue;
ide_create_drive(d->bus + bus[i], unit[i], hd_table[i]); ide_create_drive(d->bus + bus[i], unit[i], hd_table[i]);
} }
} }
}
static const struct IDEDMAOps bmdma_ops = { static const struct IDEDMAOps bmdma_ops = {
.start_dma = bmdma_start_dma, .start_dma = bmdma_start_dma,

View file

@ -197,15 +197,6 @@ int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux)
return 0; return 0;
} }
PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
dev = pci_create_simple(bus, devfn, "piix3-ide-xen");
pci_ide_create_devs(dev, hd_table);
return dev;
}
static void pci_piix_ide_exitfn(PCIDevice *dev) static void pci_piix_ide_exitfn(PCIDevice *dev)
{ {
PCIIDEState *d = PCI_IDE(dev); PCIIDEState *d = PCI_IDE(dev);
@ -217,28 +208,7 @@ static void pci_piix_ide_exitfn(PCIDevice *dev)
} }
} }
/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */ /* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
dev = pci_create_simple(bus, devfn, "piix3-ide");
pci_ide_create_devs(dev, hd_table);
return dev;
}
/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX4, the IRQs and IOports are hardcoded */
PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
dev = pci_create_simple(bus, devfn, "piix4-ide");
pci_ide_create_devs(dev, hd_table);
return dev;
}
static void piix3_ide_class_init(ObjectClass *klass, void *data) static void piix3_ide_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
@ -266,6 +236,7 @@ static const TypeInfo piix3_ide_xen_info = {
.class_init = piix3_ide_class_init, .class_init = piix3_ide_class_init,
}; };
/* NOTE: for the PIIX4, the IRQs and IOports are hardcoded */
static void piix4_ide_class_init(ObjectClass *klass, void *data) static void piix4_ide_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);

View file

@ -113,10 +113,7 @@ static void via_ide_set_irq(void *opaque, int n, int level)
} }
level = (d->config[0x70] & 0x80) || (d->config[0x78] & 0x80); level = (d->config[0x70] & 0x80) || (d->config[0x78] & 0x80);
n = pci_get_byte(d->config + PCI_INTERRUPT_LINE); qemu_set_irq(isa_get_irq(NULL, 14 + n), level);
if (n) {
qemu_set_irq(isa_get_irq(NULL, n), level);
}
} }
static void via_ide_reset(DeviceState *dev) static void via_ide_reset(DeviceState *dev)
@ -167,9 +164,10 @@ static void via_ide_realize(PCIDevice *dev, Error **errp)
uint8_t *pci_conf = dev->config; uint8_t *pci_conf = dev->config;
int i; int i;
pci_config_set_prog_interface(pci_conf, 0x8f); /* native PCI ATA mode */ pci_config_set_prog_interface(pci_conf, 0x8a); /* legacy mode */
pci_set_long(pci_conf + PCI_CAPABILITY_LIST, 0x000000c0); pci_set_long(pci_conf + PCI_CAPABILITY_LIST, 0x000000c0);
dev->wmask[PCI_INTERRUPT_LINE] = 0xf; dev->wmask[PCI_INTERRUPT_LINE] = 0;
dev->wmask[PCI_CLASS_PROG] = 5;
memory_region_init_io(&d->data_bar[0], OBJECT(d), &pci_ide_data_le_ops, memory_region_init_io(&d->data_bar[0], OBJECT(d), &pci_ide_data_le_ops,
&d->bus[0], "via-ide0-data", 8); &d->bus[0], "via-ide0-data", 8);
@ -190,8 +188,6 @@ static void via_ide_realize(PCIDevice *dev, Error **errp)
bmdma_setup_bar(d); bmdma_setup_bar(d);
pci_register_bar(dev, 4, PCI_BASE_ADDRESS_SPACE_IO, &d->bmdma_bar); pci_register_bar(dev, 4, PCI_BASE_ADDRESS_SPACE_IO, &d->bmdma_bar);
vmstate_register(VMSTATE_IF(dev), 0, &vmstate_ide_pci, d);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
ide_bus_new(&d->bus[i], sizeof(d->bus[i]), DEVICE(d), i, 2); ide_bus_new(&d->bus[i], sizeof(d->bus[i]), DEVICE(d), i, 2);
ide_init2(&d->bus[i], qemu_allocate_irq(via_ide_set_irq, d, i)); ide_init2(&d->bus[i], qemu_allocate_irq(via_ide_set_irq, d, i));
@ -213,20 +209,13 @@ static void via_ide_exitfn(PCIDevice *dev)
} }
} }
void via_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
dev = pci_create_simple(bus, devfn, "via-ide");
pci_ide_create_devs(dev, hd_table);
}
static void via_ide_class_init(ObjectClass *klass, void *data) static void via_ide_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
dc->reset = via_ide_reset; dc->reset = via_ide_reset;
dc->vmsd = &vmstate_ide_pci;
k->realize = via_ide_realize; k->realize = via_ide_realize;
k->exit = via_ide_exitfn; k->exit = via_ide_exitfn;
k->vendor_id = PCI_VENDOR_ID_VIA; k->vendor_id = PCI_VENDOR_ID_VIA;

View file

@ -34,7 +34,7 @@
#include "hw/dma/i8257.h" #include "hw/dma/i8257.h"
#include "hw/timer/i8254.h" #include "hw/timer/i8254.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"
#include "hw/ide.h" #include "hw/ide/pci.h"
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "sysemu/reset.h" #include "sysemu/reset.h"
#include "sysemu/runstate.h" #include "sysemu/runstate.h"
@ -240,28 +240,25 @@ static void piix4_register_types(void)
type_init(piix4_register_types) type_init(piix4_register_types)
DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus)
I2CBus **smbus, size_t ide_buses)
{ {
size_t ide_drives = ide_buses * MAX_IDE_DEVS;
DriveInfo **hd;
PCIDevice *pci; PCIDevice *pci;
DeviceState *dev; DeviceState *dev;
int devfn = PCI_DEVFN(10, 0);
pci = pci_create_simple_multifunction(pci_bus, PCI_DEVFN(10, 0), pci = pci_create_simple_multifunction(pci_bus, devfn, true,
true, TYPE_PIIX4_PCI_DEVICE); TYPE_PIIX4_PCI_DEVICE);
dev = DEVICE(pci); dev = DEVICE(pci);
if (isa_bus) { if (isa_bus) {
*isa_bus = ISA_BUS(qdev_get_child_bus(dev, "isa.0")); *isa_bus = ISA_BUS(qdev_get_child_bus(dev, "isa.0"));
} }
hd = g_new(DriveInfo *, ide_drives); pci = pci_create_simple(pci_bus, devfn + 1, "piix4-ide");
ide_drive_get(hd, ide_drives); pci_ide_create_devs(pci);
pci_piix4_ide_init(pci_bus, hd, pci->devfn + 1);
g_free(hd); pci_create_simple(pci_bus, devfn + 2, "piix4-usb-uhci");
pci_create_simple(pci_bus, pci->devfn + 2, "piix4-usb-uhci");
if (smbus) { if (smbus) {
*smbus = piix4_pm_init(pci_bus, pci->devfn + 3, 0x1100, *smbus = piix4_pm_init(pci_bus, devfn + 3, 0x1100,
isa_get_irq(NULL, 9), NULL, 0, NULL); isa_get_irq(NULL, 9), NULL, 0, NULL);
} }

View file

@ -36,7 +36,7 @@
#include "audio/audio.h" #include "audio/audio.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "hw/ide.h" #include "hw/ide/pci.h"
#include "elf.h" #include "elf.h"
#include "hw/isa/vt82c686.h" #include "hw/isa/vt82c686.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"
@ -238,7 +238,7 @@ static void vt82c686b_southbridge_init(PCIBus *pci_bus, int slot, qemu_irq intc,
{ {
qemu_irq *i8259; qemu_irq *i8259;
ISABus *isa_bus; ISABus *isa_bus;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; PCIDevice *dev;
isa_bus = vt82c686b_isa_init(pci_bus, PCI_DEVFN(slot, 0)); isa_bus = vt82c686b_isa_init(pci_bus, PCI_DEVFN(slot, 0));
if (!isa_bus) { if (!isa_bus) {
@ -256,8 +256,8 @@ static void vt82c686b_southbridge_init(PCIBus *pci_bus, int slot, qemu_irq intc,
/* Super I/O */ /* Super I/O */
isa_create_simple(isa_bus, TYPE_VT82C686B_SUPERIO); isa_create_simple(isa_bus, TYPE_VT82C686B_SUPERIO);
ide_drive_get(hd, ARRAY_SIZE(hd)); dev = pci_create_simple(pci_bus, PCI_DEVFN(slot, 1), "via-ide");
via_ide_init(pci_bus, hd, PCI_DEVFN(slot, 1)); pci_ide_create_devs(dev);
pci_create_simple(pci_bus, PCI_DEVFN(slot, 2), "vt82c686b-usb-uhci"); pci_create_simple(pci_bus, PCI_DEVFN(slot, 2), "vt82c686b-usb-uhci");
pci_create_simple(pci_bus, PCI_DEVFN(slot, 3), "vt82c686b-usb-uhci"); pci_create_simple(pci_bus, PCI_DEVFN(slot, 3), "vt82c686b-usb-uhci");

View file

@ -1403,7 +1403,7 @@ void mips_malta_init(MachineState *machine)
pci_bus = gt64120_register(s->i8259); pci_bus = gt64120_register(s->i8259);
/* Southbridge */ /* Southbridge */
dev = piix4_create(pci_bus, &isa_bus, &smbus, MAX_IDE_BUS); dev = piix4_create(pci_bus, &isa_bus, &smbus);
/* Interrupt controller */ /* Interrupt controller */
qdev_connect_gpio_out_named(dev, "intr", 0, i8259_irq); qdev_connect_gpio_out_named(dev, "intr", 0, i8259_irq);

View file

@ -26,6 +26,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/mips/bios.h" #include "hw/mips/bios.h"
#include "hw/ide.h" #include "hw/ide.h"
#include "hw/ide/internal.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "elf.h" #include "elf.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"

View file

@ -302,8 +302,11 @@ static void pci_do_device_reset(PCIDevice *dev)
pci_word_test_and_clear_mask(dev->config + PCI_STATUS, pci_word_test_and_clear_mask(dev->config + PCI_STATUS,
pci_get_word(dev->wmask + PCI_STATUS) | pci_get_word(dev->wmask + PCI_STATUS) |
pci_get_word(dev->w1cmask + PCI_STATUS)); pci_get_word(dev->w1cmask + PCI_STATUS));
/* Some devices make bits of PCI_INTERRUPT_LINE read only */
pci_byte_test_and_clear_mask(dev->config + PCI_INTERRUPT_LINE,
pci_get_word(dev->wmask + PCI_INTERRUPT_LINE) |
pci_get_word(dev->w1cmask + PCI_INTERRUPT_LINE));
dev->config[PCI_CACHE_LINE_SIZE] = 0x0; dev->config[PCI_CACHE_LINE_SIZE] = 0x0;
dev->config[PCI_INTERRUPT_LINE] = 0x0;
for (r = 0; r < PCI_NUM_REGIONS; ++r) { for (r = 0; r < PCI_NUM_REGIONS; ++r) {
PCIIORegion *region = &dev->io_regions[r]; PCIIORegion *region = &dev->io_regions[r];
if (!region->size) { if (!region->size) {

View file

@ -62,7 +62,6 @@
#include "hw/char/escc.h" #include "hw/char/escc.h"
#include "hw/misc/macio/macio.h" #include "hw/misc/macio/macio.h"
#include "hw/ppc/openpic.h" #include "hw/ppc/openpic.h"
#include "hw/ide.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "hw/fw-path-provider.h" #include "hw/fw-path-provider.h"
#include "elf.h" #include "elf.h"

View file

@ -41,7 +41,6 @@
#include "hw/nvram/fw_cfg.h" #include "hw/nvram/fw_cfg.h"
#include "hw/char/escc.h" #include "hw/char/escc.h"
#include "hw/misc/macio/macio.h" #include "hw/misc/macio/macio.h"
#include "hw/ide.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "hw/fw-path-provider.h" #include "hw/fw-path-provider.h"
#include "elf.h" #include "elf.h"

View file

@ -37,7 +37,6 @@
#include "hw/boards.h" #include "hw/boards.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "hw/ide.h"
#include "hw/irq.h" #include "hw/irq.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "hw/rtc/mc146818rtc.h" #include "hw/rtc/mc146818rtc.h"

View file

@ -50,7 +50,6 @@
#include "hw/sparc/sparc64.h" #include "hw/sparc/sparc64.h"
#include "hw/nvram/fw_cfg.h" #include "hw/nvram/fw_cfg.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "hw/ide.h"
#include "hw/ide/pci.h" #include "hw/ide/pci.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "hw/fw-path-provider.h" #include "hw/fw-path-provider.h"
@ -563,7 +562,6 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
PCIBus *pci_bus, *pci_busA, *pci_busB; PCIBus *pci_bus, *pci_busA, *pci_busB;
PCIDevice *ebus, *pci_dev; PCIDevice *ebus, *pci_dev;
SysBusDevice *s; SysBusDevice *s;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
DeviceState *iommu, *dev; DeviceState *iommu, *dev;
FWCfgState *fw_cfg; FWCfgState *fw_cfg;
NICInfo *nd; NICInfo *nd;
@ -663,12 +661,10 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
qemu_macaddr_default_if_unset(&macaddr); qemu_macaddr_default_if_unset(&macaddr);
} }
ide_drive_get(hd, ARRAY_SIZE(hd));
pci_dev = pci_create(pci_busA, PCI_DEVFN(3, 0), "cmd646-ide"); pci_dev = pci_create(pci_busA, PCI_DEVFN(3, 0), "cmd646-ide");
qdev_prop_set_uint32(&pci_dev->qdev, "secondary", 1); qdev_prop_set_uint32(&pci_dev->qdev, "secondary", 1);
qdev_init_nofail(&pci_dev->qdev); qdev_init_nofail(&pci_dev->qdev);
pci_ide_create_devs(pci_dev, hd); pci_ide_create_devs(pci_dev);
/* Map NVRAM into I/O (ebus) space */ /* Map NVRAM into I/O (ebus) space */
nvram = m48t59_init(NULL, 0, 0, NVRAM_SIZE, 1968, 59); nvram = m48t59_init(NULL, 0, 0, NVRAM_SIZE, 1968, 59);

View file

@ -2,23 +2,14 @@
#define HW_IDE_H #define HW_IDE_H
#include "hw/isa/isa.h" #include "hw/isa/isa.h"
#include "hw/pci/pci.h"
#include "exec/memory.h" #include "exec/memory.h"
#define MAX_IDE_DEVS 2
/* ide-isa.c */ /* ide-isa.c */
ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq, ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
DriveInfo *hd0, DriveInfo *hd1); DriveInfo *hd0, DriveInfo *hd1);
/* ide-pci.c */ /* ide-pci.c */
void pci_cmd646_ide_init(PCIBus *bus, DriveInfo **hd_table,
int secondary_ide_enabled);
PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux); int pci_piix3_xen_ide_unplug(DeviceState *dev, bool aux);
void via_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
/* ide-mmio.c */ /* ide-mmio.c */
void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1); void mmio_ide_init_drives(DeviceState *dev, DriveInfo *hd0, DriveInfo *hd1);

View file

@ -27,6 +27,8 @@ typedef struct IDEDMAOps IDEDMAOps;
#define TYPE_IDE_BUS "IDE" #define TYPE_IDE_BUS "IDE"
#define IDE_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS) #define IDE_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)
#define MAX_IDE_DEVS 2
/* Bits of HD_STATUS */ /* Bits of HD_STATUS */
#define ERR_STAT 0x01 #define ERR_STAT 0x01
#define INDEX_STAT 0x02 #define INDEX_STAT 0x02

View file

@ -2,6 +2,7 @@
#define HW_IDE_PCI_H #define HW_IDE_PCI_H
#include "hw/ide/internal.h" #include "hw/ide/internal.h"
#include "hw/pci/pci.h"
#define BM_STATUS_DMAING 0x01 #define BM_STATUS_DMAING 0x01
#define BM_STATUS_ERROR 0x02 #define BM_STATUS_ERROR 0x02
@ -62,7 +63,7 @@ static inline IDEState *bmdma_active_if(BMDMAState *bmdma)
void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d); void bmdma_init(IDEBus *bus, BMDMAState *bm, PCIIDEState *d);
void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val); void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val);
extern MemoryRegionOps bmdma_addr_ioport_ops; extern MemoryRegionOps bmdma_addr_ioport_ops;
void pci_ide_create_devs(PCIDevice *dev, DriveInfo **hd_table); void pci_ide_create_devs(PCIDevice *dev);
extern const VMStateDescription vmstate_ide_pci; extern const VMStateDescription vmstate_ide_pci;
extern const MemoryRegionOps pci_ide_cmd_le_ops; extern const MemoryRegionOps pci_ide_cmd_le_ops;

View file

@ -27,6 +27,7 @@
#define MACIO_H #define MACIO_H
#include "hw/char/escc.h" #include "hw/char/escc.h"
#include "hw/pci/pci.h"
#include "hw/ide/internal.h" #include "hw/ide/internal.h"
#include "hw/intc/heathrow_pic.h" #include "hw/intc/heathrow_pic.h"
#include "hw/misc/macio/cuda.h" #include "hw/misc/macio/cuda.h"

View file

@ -68,7 +68,6 @@ extern PCIDevice *piix4_dev;
PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus); PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus);
DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus);
I2CBus **smbus, size_t ide_buses);
#endif #endif

View file

@ -421,7 +421,7 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
char *raw_path = strdup(template); char *raw_path = strdup(template);
char *qcow2_path = strdup(template); char *qcow2_path = strdup(template);
char cmd[100 + 2 * PATH_MAX]; char cmd[100 + 2 * PATH_MAX];
uint8_t buf[512]; uint8_t buf[512] = {};
int i, ret, fd, offset; int i, ret, fd, offset;
uint64_t qcow2_size = sectors * 512; uint64_t qcow2_size = sectors * 512;
uint8_t status, parttype, head, sector, cyl; uint8_t status, parttype, head, sector, cyl;
@ -457,8 +457,8 @@ static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
buf[offset + 0x6] = sector; buf[offset + 0x6] = sector;
buf[offset + 0x7] = cyl; buf[offset + 0x7] = cyl;
(*(uint32_t *)&buf[offset + 0x8]) = cpu_to_le32(mbr[i].start_sect); stl_le_p(&buf[offset + 0x8], mbr[i].start_sect);
(*(uint32_t *)&buf[offset + 0xc]) = cpu_to_le32(mbr[i].nr_sects); stl_le_p(&buf[offset + 0xc], mbr[i].nr_sects);
offset += 0x10; offset += 0x10;
} }