From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Li8GF-0006Ut-PA for qemu-devel@nongnu.org; Fri, 13 Mar 2009 10:21:20 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Li8G6-0006LT-Oq for qemu-devel@nongnu.org; Fri, 13 Mar 2009 10:21:16 -0400 Received: from [199.232.76.173] (port=50622 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Li8G5-0006L5-QX for qemu-devel@nongnu.org; Fri, 13 Mar 2009 10:21:09 -0400 Received: from mel.act-europe.fr ([212.99.106.210]:53560) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Li8G4-0002UE-OD for qemu-devel@nongnu.org; Fri, 13 Mar 2009 10:21:09 -0400 From: Tristan Gingold Date: Fri, 13 Mar 2009 15:20:30 +0100 Message-Id: <1236954043-91856-12-git-send-email-gingold@adacore.com> In-Reply-To: <1236954043-91856-11-git-send-email-gingold@adacore.com> References: <1236954043-91856-1-git-send-email-gingold@adacore.com> <1236954043-91856-2-git-send-email-gingold@adacore.com> <1236954043-91856-3-git-send-email-gingold@adacore.com> <1236954043-91856-4-git-send-email-gingold@adacore.com> <1236954043-91856-5-git-send-email-gingold@adacore.com> <1236954043-91856-6-git-send-email-gingold@adacore.com> <1236954043-91856-7-git-send-email-gingold@adacore.com> <1236954043-91856-8-git-send-email-gingold@adacore.com> <1236954043-91856-9-git-send-email-gingold@adacore.com> <1236954043-91856-10-git-send-email-gingold@adacore.com> <1236954043-91856-11-git-send-email-gingold@adacore.com> Subject: [Qemu-devel] [PATCH 11/24] Add ali1543 super IO pci device. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Tristan Gingold This is a very partial implementation just enough for es40 firmware. Signed-off-by: Tristan Gingold --- hw/ali1543.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/pci.h | 8 ++++ 2 files changed, 135 insertions(+), 0 deletions(-) create mode 100644 hw/ali1543.c diff --git a/hw/ali1543.c b/hw/ali1543.c new file mode 100644 index 0000000..2bdb696 --- /dev/null +++ b/hw/ali1543.c @@ -0,0 +1,127 @@ +/* + * QEMU Ali 1543c emulation + * + * Copyright (c) 2009 AdaCore + * + * Written by Tristan Gingold. + * + * This work is licensed under the GNU GPL license version 2 or later. + * + */ +#include +#include +#include "hw.h" +#include "net.h" +#include "sysemu.h" +#include "devices.h" +#include "boards.h" +#include "pc.h" +#include "isa.h" +#include "qemu-char.h" +#include "pci.h" + +struct ali1543_t { + PCIDevice pci; + + qemu_irq *irq; /* Upstream handler. */ + PITState *pit; + qemu_irq *i8259; + + /* Configuration. */ + enum cfg_state { CFG_SNOOP, CFG_51, CFG_EN } cfg_state; + unsigned char cfg_index; +}; + +static void ali_cfg_write(void *opaque, uint32_t addr, uint32_t val) +{ + ali1543_t *ali = opaque; + + if ((addr & 1) == 0) { + switch (ali->cfg_state) { + case CFG_SNOOP: + if (val == 0x51) + ali->cfg_state = CFG_51; + else + qemu_log("ali1543-cfg: write %02x to cfg_port\n", val); + break; + case CFG_51: + if (val == 0x23) + ali->cfg_state = CFG_EN; + else { + qemu_log("ali1543-cfg: write %02x to cfg_port (51)\n", val); + ali->cfg_state = CFG_SNOOP; + } + break; + case CFG_EN: + ali->cfg_index = val; + break; + } + } + else { + qemu_log("ali1543-cfg: write %02x to cfg reg %02x (addr=%x)\n", + val, ali->cfg_index, addr); + } +} + +static uint32_t ali_cfg_read(void *opaque, uint32_t addr) +{ + ali1543_t *ali = opaque; + + if ((addr & 1) == 0) { + if (ali->cfg_state != CFG_EN) { + qemu_log("ali1543-cfg: read fromcfg_port\n"); + return 0; + } + else + return ali->cfg_index; + } + else { + qemu_log("ali1543-cfg: read from reg %02x\n", ali->cfg_index); + return 0; + } +} + +ali1543_t *ali1543_init (PCIBus *bus, int devfn, qemu_irq irq) +{ + ali1543_t *ali; + uint8_t *pci_conf; + + ali = (ali1543_t*)pci_register_device(bus, "Ali1543", sizeof(ali1543_t), + devfn, NULL, NULL); + + pci_conf = ali->pci.config; + + pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_ALI); + pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_ALI1543); + pci_conf[0x08] = 0xc3; // Revision + pci_config_set_class(pci_conf, PCI_CLASS_BRIDGE_ISA); + pci_conf[0x2c] = 0; // Subsystem + pci_conf[0x2d] = 0; + pci_conf[0x2e] = 0; + pci_conf[0x2f] = 0; + + register_ioport_read(0x370, 2, 1, ali_cfg_read, ali); + register_ioport_write(0x370, 2, 1, ali_cfg_write, ali); + + ali->i8259 = i8259_init(irq); + + /* serial_init already handles NULL CharDriverState but this code adds + a more useful label. */ + if (serial_hds[0] == NULL) + serial_hds[0] = qemu_chr_open("com1", "nul", NULL); + if (serial_hds[1] == NULL) + serial_hds[1] = qemu_chr_open("com2", "nul", NULL); + + serial_init(0x3f8, ali->i8259[4], 115200, serial_hds[0]); + serial_init(0x2f8, ali->i8259[3], 115200, serial_hds[1]); + ali->pit = pit_init(0x40, ali->i8259[0]); + pcspk_init(ali->pit); + DMA_init(0); + + return ali; +} + +qemu_irq ali1543_get_irq(ali1543_t *c, int n) +{ + return c->i8259[n]; +} diff --git a/hw/pci.h b/hw/pci.h index b955f39..f474d58 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -83,6 +83,9 @@ extern target_phys_addr_t pci_mem_base; #define PCI_VENDOR_ID_CMD 0x1095 #define PCI_DEVICE_ID_CMD_646 0x0646 +#define PCI_VENDOR_ID_ALI 0x10b9 +#define PCI_DEVICE_ID_ALI1543 0x1533 + #define PCI_VENDOR_ID_REALTEK 0x10ec #define PCI_DEVICE_ID_REALTEK_RTL8029 0x8029 #define PCI_DEVICE_ID_REALTEK_8139 0x8139 @@ -314,4 +317,9 @@ PCIBus *pci_apb_init(target_phys_addr_t special_base, PCIBus *sh_pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, qemu_irq *pic, int devfn_min, int nirq); +/* ali1543.c */ +typedef struct ali1543_t ali1543_t; +ali1543_t *ali1543_init (PCIBus *bus, int devfn, qemu_irq irq); +qemu_irq ali1543_get_irq(ali1543_t *c, int n); + #endif -- 1.6.2