Commit 7b717336e2873fd6d9f178a12549eaa2367d14d0

Authored by ths
1 parent 6e473128

SMBus support for MIPS Malta.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2893 c046a42c-6fe2-441c-8c8c-71466251a162
Makefile.target
@@ -438,7 +438,7 @@ ifeq ($(TARGET_BASE_ARCH), mips) @@ -438,7 +438,7 @@ ifeq ($(TARGET_BASE_ARCH), mips)
438 VL_OBJS+= mips_r4k.o mips_malta.o mips_pica61.o 438 VL_OBJS+= mips_r4k.o mips_malta.o mips_pica61.o
439 VL_OBJS+= mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o 439 VL_OBJS+= mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o
440 VL_OBJS+= ide.o gt64xxx.o pckbd.o ps2.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o 440 VL_OBJS+= ide.o gt64xxx.o pckbd.o ps2.o fdc.o mc146818rtc.o usb-uhci.o acpi.o ds1225y.o
441 -VL_OBJS+= piix_pci.o parallel.o mixeng.o cirrus_vga.o $(SOUND_HW) $(AUDIODRV) 441 +VL_OBJS+= piix_pci.o smbus_eeprom.o parallel.o mixeng.o cirrus_vga.o $(SOUND_HW) $(AUDIODRV)
442 CPPFLAGS += -DHAS_AUDIO 442 CPPFLAGS += -DHAS_AUDIO
443 endif 443 endif
444 ifeq ($(TARGET_BASE_ARCH), sparc) 444 ifeq ($(TARGET_BASE_ARCH), sparc)
hw/acpi.c
@@ -24,7 +24,6 @@ @@ -24,7 +24,6 @@
24 #define PM_FREQ 3579545 24 #define PM_FREQ 3579545
25 25
26 #define ACPI_DBG_IO_ADDR 0xb044 26 #define ACPI_DBG_IO_ADDR 0xb044
27 -#define SMB_IO_BASE 0xb100  
28 27
29 typedef struct PIIX4PMState { 28 typedef struct PIIX4PMState {
30 PCIDevice dev; 29 PCIDevice dev;
@@ -451,11 +450,10 @@ static int pm_load(QEMUFile* f,void* opaque,int version_id) @@ -451,11 +450,10 @@ static int pm_load(QEMUFile* f,void* opaque,int version_id)
451 return 0; 450 return 0;
452 } 451 }
453 452
454 -i2c_bus *piix4_pm_init(PCIBus *bus, int devfn) 453 +i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base)
455 { 454 {
456 PIIX4PMState *s; 455 PIIX4PMState *s;
457 uint8_t *pci_conf; 456 uint8_t *pci_conf;
458 - uint32_t smb_io_base;  
459 457
460 s = (PIIX4PMState *)pci_register_device(bus, 458 s = (PIIX4PMState *)pci_register_device(bus,
461 "PM", sizeof(PIIX4PMState), 459 "PM", sizeof(PIIX4PMState),
@@ -486,7 +484,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn) @@ -486,7 +484,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn)
486 pci_conf[0x67] = (serial_hds[0] != NULL ? 0x08 : 0) | 484 pci_conf[0x67] = (serial_hds[0] != NULL ? 0x08 : 0) |
487 (serial_hds[1] != NULL ? 0x90 : 0); 485 (serial_hds[1] != NULL ? 0x90 : 0);
488 486
489 - smb_io_base = SMB_IO_BASE;  
490 pci_conf[0x90] = smb_io_base | 1; 487 pci_conf[0x90] = smb_io_base | 1;
491 pci_conf[0x91] = smb_io_base >> 8; 488 pci_conf[0x91] = smb_io_base >> 8;
492 pci_conf[0xd2] = 0x09; 489 pci_conf[0xd2] = 0x09;
hw/mips_malta.c
@@ -775,6 +775,10 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device, @@ -775,6 +775,10 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device,
775 int ret; 775 int ret;
776 mips_def_t *def; 776 mips_def_t *def;
777 qemu_irq *i8259; 777 qemu_irq *i8259;
  778 + int piix4_devfn;
  779 + uint8_t *eeprom_buf;
  780 + i2c_bus *smbus;
  781 + int i;
778 782
779 /* init CPUs */ 783 /* init CPUs */
780 if (cpu_model == NULL) { 784 if (cpu_model == NULL) {
@@ -843,10 +847,15 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device, @@ -843,10 +847,15 @@ void mips_malta_init (int ram_size, int vga_ram_size, int boot_device,
843 pci_bus = pci_gt64120_init(i8259); 847 pci_bus = pci_gt64120_init(i8259);
844 848
845 /* Southbridge */ 849 /* Southbridge */
846 - piix4_init(pci_bus, 80);  
847 - pci_piix3_ide_init(pci_bus, bs_table, 81, i8259);  
848 - usb_uhci_init(pci_bus, 82);  
849 - piix4_pm_init(pci_bus, 83); 850 + piix4_devfn = piix4_init(pci_bus, 80);
  851 + pci_piix3_ide_init(pci_bus, bs_table, piix4_devfn + 1, i8259);
  852 + usb_uhci_init(pci_bus, piix4_devfn + 2);
  853 + smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100);
  854 + eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */
  855 + for (i = 0; i < 8; i++) {
  856 + /* TODO: Populate SPD eeprom data. */
  857 + smbus_eeprom_device_init(smbus, 0x50 + i, eeprom_buf + (i * 256));
  858 + }
850 pit = pit_init(0x40, i8259[0]); 859 pit = pit_init(0x40, i8259[0]);
851 DMA_init(0); 860 DMA_init(0);
852 861
@@ -905,7 +905,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, @@ -905,7 +905,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device,
905 i2c_bus *smbus; 905 i2c_bus *smbus;
906 906
907 /* TODO: Populate SPD eeprom data. */ 907 /* TODO: Populate SPD eeprom data. */
908 - smbus = piix4_pm_init(pci_bus, piix3_devfn + 3); 908 + smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100);
909 for (i = 0; i < 8; i++) { 909 for (i = 0; i < 8; i++) {
910 smbus_eeprom_device_init(smbus, 0x50 + i, eeprom_buf + (i * 256)); 910 smbus_eeprom_device_init(smbus, 0x50 + i, eeprom_buf + (i * 256));
911 } 911 }
@@ -1132,7 +1132,7 @@ int pcspk_audio_init(AudioState *, qemu_irq *pic); @@ -1132,7 +1132,7 @@ int pcspk_audio_init(AudioState *, qemu_irq *pic);
1132 1132
1133 /* acpi.c */ 1133 /* acpi.c */
1134 extern int acpi_enabled; 1134 extern int acpi_enabled;
1135 -i2c_bus *piix4_pm_init(PCIBus *bus, int devfn); 1135 +i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base);
1136 void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr); 1136 void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
1137 void acpi_bios_init(void); 1137 void acpi_bios_init(void);
1138 1138