aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/pci.c62
1 files changed, 48 insertions, 14 deletions
diff --git a/hw/pci.c b/hw/pci.c
index 2d13dfc41c..d5b8d4f444 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -255,21 +255,49 @@ void pci_default_write_config(PCIDevice *d,
addr = address;
for(i = 0; i < len; i++) {
/* default read/write accesses */
- switch(addr) {
+ switch(d->config[0x0e]) {
case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0e:
- case 0x3d:
- can_write = 0;
+ case 0x80:
+ switch(addr) {
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0e:
+ case 0x10 ... 0x27: /* base */
+ case 0x30 ... 0x33: /* rom */
+ case 0x3d:
+ can_write = 0;
+ break;
+ default:
+ can_write = 1;
+ break;
+ }
break;
default:
- can_write = 1;
+ case 0x01:
+ switch(addr) {
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0e:
+ case 0x38 ... 0x3b: /* rom */
+ case 0x3d:
+ can_write = 0;
+ break;
+ default:
+ can_write = 1;
+ break;
+ }
break;
}
if (can_write) {
@@ -986,10 +1014,10 @@ static void pci_bios_init_device(PCIDevice *d)
int i, pin, pic_irq, vendor_id, device_id;
class = pci_config_readw(d, PCI_CLASS_DEVICE);
+ vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
+ device_id = pci_config_readw(d, PCI_DEVICE_ID);
switch(class) {
case 0x0101:
- vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
- device_id = pci_config_readw(d, PCI_DEVICE_ID);
if (vendor_id == 0x8086 && device_id == 0x7010) {
/* PIIX3 IDE */
pci_config_writew(d, PCI_COMMAND, PCI_COMMAND_IO);
@@ -1006,6 +1034,12 @@ static void pci_bios_init_device(PCIDevice *d)
/* VGA: map frame buffer to default Bochs VBE address */
pci_set_io_region_addr(d, 0, 0xE0000000);
break;
+ case 0xff00:
+ if (vendor_id == 0x0106b && device_id == 0x0017) {
+ /* macio bridge */
+ pci_set_io_region_addr(d, 0, 0x80800000);
+ }
+ break;
default:
/* default memory mappings */
for(i = 0; i < PCI_NUM_REGIONS; i++) {