qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Qemu-devel] [PATCH 11/24] Add ali1543 super IO pci device.


From: Krumme, Chris
Subject: RE: [Qemu-devel] [PATCH 11/24] Add ali1543 super IO pci device.
Date: Thu, 19 Mar 2009 09:07:59 -0700

Hello Tristan,
 

> -----Original Message-----
> From: 
> address@hidden 
> [mailto:address@hidden
> rg] On Behalf Of Tristan Gingold
> Sent: Thursday, March 19, 2009 9:36 AM
> To: address@hidden
> Cc: Tristan Gingold
> Subject: [Qemu-devel] [PATCH 11/24] Add ali1543 super IO pci device.
> 
> This is a very partial implementation just enough for es40 firmware.
> 
> Signed-off-by: Tristan Gingold <address@hidden>
> ---
>  hw/ali1543.c |  133 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/pci.h     |    5 ++
>  hw/pci_ids.h |    3 +
>  3 files changed, 141 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..aca154f
> --- /dev/null
> +++ b/hw/ali1543.c
> @@ -0,0 +1,133 @@
> +/*
> + * 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 <time.h>
> +#include <sys/time.h>
> +#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"
> +
> +//#define DEBUG_CFG
> +

Your commit comment says this is a Super IO.

I think a bit of a comment here about the card, which devices are on the
card etc. would help people who don't have one laying around.

> +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 {
> +#ifdef DEBUG_CFG
> +     qemu_log("ali1543-cfg: write %02x to cfg reg %02x (addr=%x)\n",
> +              val, ali->cfg_index, addr);
> +#endif
> +    }
> +}
> +
> +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 {
> +#ifdef DEBUG_CFG
> +     qemu_log("ali1543-cfg: read from reg %02x\n", ali->cfg_index);
> +#endif
> +     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_AL);
> +    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_AL_M1533);

Is this an enhanced version of a 1533? Is this just a typo?

Thanks  Chris

> +    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 4f24895..b1c1035 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -254,4 +254,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
> diff --git a/hw/pci_ids.h b/hw/pci_ids.h
> index 427fcd5..4119ead 100644
> --- a/hw/pci_ids.h
> +++ b/hw/pci_ids.h
> @@ -70,6 +70,9 @@
>  #define PCI_VENDOR_ID_CMD                0x1095
>  #define PCI_DEVICE_ID_CMD_646            0x0646
>  
> +#define PCI_VENDOR_ID_AL                 0x10b9
> +#define PCI_DEVICE_ID_AL_M1533           0x1533
> +
>  #define PCI_VENDOR_ID_REALTEK            0x10ec
>  #define PCI_DEVICE_ID_REALTEK_8139       0x8139
>  
> -- 
> 1.6.2
> 
> 
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]