qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Re: [PATCH V6 13/32] pci_host: consolidate pci config addre


From: Michael S. Tsirkin
Subject: [Qemu-devel] Re: [PATCH V6 13/32] pci_host: consolidate pci config address access.
Date: Tue, 3 Nov 2009 15:45:12 +0200
User-agent: Mutt/1.5.19 (2009-01-05)

On Fri, Oct 30, 2009 at 09:21:07PM +0900, Isaku Yamahata wrote:
> consolidate pci_config address access into pci_host.c
> 
> Signed-off-by: Isaku Yamahata <address@hidden>
> ---
>  hw/apb_pci.c     |   43 +---------------------
>  hw/grackle_pci.c |   45 +---------------------
>  hw/pci_host.c    |  108 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/pci_host.h    |    3 +
>  hw/piix_pci.c    |   15 +-------
>  hw/ppce500_pci.c |   34 +----------------
>  hw/prep_pci.c    |   15 +-------
>  hw/unin_pci.c    |   81 ++--------------------------------------
>  8 files changed, 121 insertions(+), 223 deletions(-)
> 
> diff --git a/hw/apb_pci.c b/hw/apb_pci.c
> index 560617a..3999879 100644
> --- a/hw/apb_pci.c
> +++ b/hw/apb_pci.c
> @@ -54,46 +54,6 @@ typedef struct APBState {
>      PCIHostState host_state;
>  } APBState;
>  
> -static void pci_apb_config_writel (void *opaque, target_phys_addr_t addr,
> -                                         uint32_t val)
> -{
> -    APBState *s = opaque;
> -
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -    APB_DPRINTF("config_writel addr " TARGET_FMT_plx " val %x\n", addr,
> -                val);
> -    s->host_state.config_reg = val;
> -}
> -
> -static uint32_t pci_apb_config_readl (void *opaque,
> -                                            target_phys_addr_t addr)
> -{
> -    APBState *s = opaque;
> -    uint32_t val;
> -
> -    val = s->host_state.config_reg;
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -    APB_DPRINTF("config_readl addr " TARGET_FMT_plx " val %x\n", addr,
> -                val);
> -    return val;
> -}
> -
> -static CPUWriteMemoryFunc * const pci_apb_config_write[] = {
> -    &pci_apb_config_writel,
> -    &pci_apb_config_writel,
> -    &pci_apb_config_writel,
> -};
> -
> -static CPUReadMemoryFunc * const pci_apb_config_read[] = {
> -    &pci_apb_config_readl,
> -    &pci_apb_config_readl,
> -    &pci_apb_config_readl,
> -};
> -
>  static void apb_config_writel (void *opaque, target_phys_addr_t addr,
>                                 uint32_t val)
>  {
> @@ -275,8 +235,7 @@ static int pci_pbm_init_device(SysBusDevice *dev)
>                                            pci_apb_iowrite, s);
>      sysbus_init_mmio(dev, 0x10000ULL, pci_ioport);
>      /* mem_config  */
> -    pci_mem_config = cpu_register_io_memory(pci_apb_config_read,
> -                                            pci_apb_config_write, s);
> +    pci_mem_config = pci_host_config_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x10ULL, pci_mem_config);
>      /* mem_data */
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
> diff --git a/hw/grackle_pci.c b/hw/grackle_pci.c
> index 8407cd2..58dcd11 100644
> --- a/hw/grackle_pci.c
> +++ b/hw/grackle_pci.c
> @@ -43,45 +43,6 @@ typedef struct GrackleState {
>      PCIHostState host_state;
>  } GrackleState;
>  
> -static void pci_grackle_config_writel (void *opaque, target_phys_addr_t addr,
> -                                       uint32_t val)
> -{
> -    GrackleState *s = opaque;
> -
> -    GRACKLE_DPRINTF("config_writel addr " TARGET_FMT_plx " val %x\n", addr,
> -                    val);
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -    s->host_state.config_reg = val;
> -}
> -
> -static uint32_t pci_grackle_config_readl (void *opaque, target_phys_addr_t 
> addr)
> -{
> -    GrackleState *s = opaque;
> -    uint32_t val;
> -
> -    val = s->host_state.config_reg;
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -    GRACKLE_DPRINTF("config_readl addr " TARGET_FMT_plx " val %x\n", addr,
> -                    val);
> -    return val;
> -}
> -
> -static CPUWriteMemoryFunc * const pci_grackle_config_write[] = {
> -    &pci_grackle_config_writel,
> -    &pci_grackle_config_writel,
> -    &pci_grackle_config_writel,
> -};
> -
> -static CPUReadMemoryFunc * const pci_grackle_config_read[] = {
> -    &pci_grackle_config_readl,
> -    &pci_grackle_config_readl,
> -    &pci_grackle_config_readl,
> -};
> -
>  /* Don't know if this matches real hardware, but it agrees with OHW.  */
>  static int pci_grackle_map_irq(PCIDevice *pci_dev, int irq_num)
>  {
> @@ -147,8 +108,7 @@ static int pci_grackle_init_device(SysBusDevice *dev)
>  
>      s = FROM_SYSBUS(GrackleState, dev);
>  
> -    pci_mem_config = cpu_register_io_memory(pci_grackle_config_read,
> -                                            pci_grackle_config_write, s);
> +    pci_mem_config = pci_host_config_register_io_memory(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
> @@ -167,8 +127,7 @@ static int pci_dec_21154_init_device(SysBusDevice *dev)
>  
>      s = FROM_SYSBUS(GrackleState, dev);
>  
> -    pci_mem_config = cpu_register_io_memory(pci_grackle_config_read,
> -                                            pci_grackle_config_write, s);
> +    pci_mem_config = pci_host_config_register_io_memory(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
> diff --git a/hw/pci_host.c b/hw/pci_host.c
> index 45da1e7..6009e37 100644
> --- a/hw/pci_host.c
> +++ b/hw/pci_host.c
> @@ -32,6 +32,114 @@ do { printf("pci_host_data: " fmt , ## __VA_ARGS__); } 
> while (0)
>  #define PCI_DPRINTF(fmt, ...)
>  #endif
>  
> +static void pci_host_config_writel(void *opaque, target_phys_addr_t addr,
> +                                   uint32_t val)
> +{
> +    PCIHostState *s = opaque;
> +
> +#ifdef TARGET_WORDS_BIGENDIAN
> +    val = bswap32(val);
> +#endif

I know you just copied it, but isn't this just
        val = le32_to_cpu(val);

?

> +    PCI_DPRINTF("%s addr " TARGET_FMT_plx " val %"PRIx32"\n",
> +                __func__, addr, val);
> +    s->config_reg = val;
> +}
> +
> +static uint32_t pci_host_config_readl(void *opaque, target_phys_addr_t addr)
> +{
> +    PCIHostState *s = opaque;
> +    uint32_t val = s->config_reg;
> +
> +#ifdef TARGET_WORDS_BIGENDIAN
> +    val = bswap32(val);
> +#endif

same here.

> +    PCI_DPRINTF("%s addr " TARGET_FMT_plx " val %"PRIx32"\n",
> +                __func__, addr, val);
> +    return val;
> +}
> +
> +static CPUWriteMemoryFunc * const pci_host_config_write[] = {
> +    &pci_host_config_writel,
> +    &pci_host_config_writel,
> +    &pci_host_config_writel,
> +};
> +
> +static CPUReadMemoryFunc * const pci_host_config_read[] = {
> +    &pci_host_config_readl,
> +    &pci_host_config_readl,
> +    &pci_host_config_readl,
> +};
> +
> +int pci_host_config_register_io_memory(PCIHostState *s)
> +{
> +    return cpu_register_io_memory(pci_host_config_read,
> +                                  pci_host_config_write, s);
> +}
> +
> +static void pci_host_config_writel_noswap(void *opaque,
> +                                          target_phys_addr_t addr,
> +                                          uint32_t val)
> +{
> +    PCIHostState *s = opaque;
> +
> +    PCI_DPRINTF("%s addr " TARGET_FMT_plx " val %"PRIx32"\n",
> +                __func__, addr, val);
> +    s->config_reg = val;
> +}
> +
> +static uint32_t pci_host_config_readl_noswap(void *opaque,
> +                                             target_phys_addr_t addr)
> +{
> +    PCIHostState *s = opaque;
> +    uint32_t val = s->config_reg;
> +
> +    PCI_DPRINTF("%s addr " TARGET_FMT_plx " val %"PRIx32"\n",
> +                __func__, addr, val);
> +    return val;
> +}
> +
> +static CPUWriteMemoryFunc * const pci_host_config_write_noswap[] = {
> +    &pci_host_config_writel_noswap,
> +    &pci_host_config_writel_noswap,
> +    &pci_host_config_writel_noswap,
> +};
> +
> +static CPUReadMemoryFunc * const pci_host_config_read_noswap[] = {
> +    &pci_host_config_readl_noswap,
> +    &pci_host_config_readl_noswap,
> +    &pci_host_config_readl_noswap,
> +};
> +
> +int pci_host_config_register_io_memory_noswap(PCIHostState *s)

This name is clearly too long,
as a result when you use it you run over the 80 character
limit. Let's not fix it, let's make name shorter.
io_memory -> memory?

> +{
> +    return cpu_register_io_memory(pci_host_config_read_noswap,
> +                                  pci_host_config_write_noswap, s);
> +}

Do you happen to know whether no swap is really needed?  I suspect some
of these places really only happen to work because everyone uses intel,
so they simply would not work on ppc host.

> +
> +static void pci_host_config_writel_ioport(void *opaque,
> +                                          uint32_t addr, uint32_t val)
> +{
> +    PCIHostState *s = opaque;
> +
> +    PCI_DPRINTF("%s addr %"PRIx32 " val %"PRIx32"\n", __func__, addr, val);
> +    s->config_reg = val;
> +}
> +
> +static uint32_t pci_host_config_readl_ioport(void *opaque, uint32_t addr)
> +{
> +    PCIHostState *s = opaque;
> +    uint32_t val = s->config_reg;
> +
> +    PCI_DPRINTF("%s addr %"PRIx32" val %"PRIx32"\n", __func__, addr, val);
> +    return val;
> +}
> +
> +void pci_host_config_register_ioport(pio_addr_t ioport, PCIHostState *s)
> +{
> +    register_ioport_write(ioport, 4, 4, pci_host_config_writel_ioport, s);
> +    register_ioport_read(ioport, 4, 4, pci_host_config_readl_ioport, s);
> +}
> +
>  #define PCI_ADDR_T      target_phys_addr_t
>  #define PCI_HOST_SUFFIX _mmio
>  
> diff --git a/hw/pci_host.h b/hw/pci_host.h
> index 92a35f9..e5e877f 100644
> --- a/hw/pci_host.h
> +++ b/hw/pci_host.h
> @@ -37,9 +37,12 @@ typedef struct {
>  } PCIHostState;
>  
>  /* for mmio */
> +int pci_host_config_register_io_memory(PCIHostState *s);
> +int pci_host_config_register_io_memory_noswap(PCIHostState *s);
>  int pci_host_data_register_io_memory(PCIHostState *s);
>  
>  /* for ioio */
> +void pci_host_config_register_ioport(pio_addr_t ioport, PCIHostState *s);
>  void pci_host_data_register_ioport(pio_addr_t ioport, PCIHostState *s);
>  
>  #endif /* PCI_HOST_H */
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index 866348d..bf0005e 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -44,18 +44,6 @@ struct PCII440FXState {
>      PIIX3State *piix3;
>  };
>  
> -static void i440fx_addr_writel(void* opaque, uint32_t addr, uint32_t val)
> -{
> -    I440FXState *s = opaque;
> -    s->config_reg = val;
> -}
> -
> -static uint32_t i440fx_addr_readl(void* opaque, uint32_t addr)
> -{
> -    I440FXState *s = opaque;
> -    return s->config_reg;
> -}
> -
>  static void piix3_set_irq(void *opaque, int irq_num, int level);
>  
>  /* return the global irq number corresponding to a given device irq
> @@ -192,8 +180,7 @@ static int i440fx_pcihost_initfn(SysBusDevice *dev)
>  {
>      I440FXState *s = FROM_SYSBUS(I440FXState, dev);
>  
> -    register_ioport_write(0xcf8, 4, 4, i440fx_addr_writel, s);
> -    register_ioport_read(0xcf8, 4, 4, i440fx_addr_readl, s);
> +    pci_host_config_register_ioport(0xcf8, s);
>  
>      pci_host_data_register_ioport(0xcfc, s);
>      return 0;
> diff --git a/hw/ppce500_pci.c b/hw/ppce500_pci.c
> index 7c8cdad..223de3a 100644
> --- a/hw/ppce500_pci.c
> +++ b/hw/ppce500_pci.c
> @@ -84,37 +84,6 @@ struct PPCE500PCIState {
>  
>  typedef struct PPCE500PCIState PPCE500PCIState;
>  
> -static uint32_t pcie500_cfgaddr_readl(void *opaque, target_phys_addr_t addr)
> -{
> -    PPCE500PCIState *pci = opaque;
> -
> -    pci_debug("%s: (addr:" TARGET_FMT_plx ") -> value:%x\n", __func__, addr,
> -              pci->pci_state.config_reg);
> -    return pci->pci_state.config_reg;
> -}
> -
> -static CPUReadMemoryFunc * const pcie500_cfgaddr_read[] = {
> -    &pcie500_cfgaddr_readl,
> -    &pcie500_cfgaddr_readl,
> -    &pcie500_cfgaddr_readl,
> -};
> -
> -static void pcie500_cfgaddr_writel(void *opaque, target_phys_addr_t addr,
> -                                  uint32_t value)
> -{
> -    PPCE500PCIState *controller = opaque;
> -
> -    pci_debug("%s: value:%x -> (addr:" TARGET_FMT_plx ")\n", __func__, value,
> -              addr);
> -    controller->pci_state.config_reg = value & ~0x3;
> -}
> -
> -static CPUWriteMemoryFunc * const pcie500_cfgaddr_write[] = {
> -    &pcie500_cfgaddr_writel,
> -    &pcie500_cfgaddr_writel,
> -    &pcie500_cfgaddr_writel,
> -};
> -
>  static uint32_t pci_reg_read4(void *opaque, target_phys_addr_t addr)
>  {
>      PPCE500PCIState *pci = opaque;
> @@ -324,8 +293,7 @@ PCIBus *ppce500_pci_init(qemu_irq pci_irqs[4], 
> target_phys_addr_t registers)
>      controller->pci_dev = d;
>  
>      /* CFGADDR */
> -    index = cpu_register_io_memory(pcie500_cfgaddr_read,
> -                                   pcie500_cfgaddr_write, controller);
> +    index = 
> pci_host_config_register_io_memory_noswap(&controller->pci_state);
>      if (index < 0)
>          goto free;
>      cpu_register_physical_memory(registers + PCIE500_CFGADDR, 4, index);
> diff --git a/hw/prep_pci.c b/hw/prep_pci.c
> index 5a5b3da..a338f81 100644
> --- a/hw/prep_pci.c
> +++ b/hw/prep_pci.c
> @@ -28,18 +28,6 @@
>  
>  typedef PCIHostState PREPPCIState;
>  
> -static void pci_prep_addr_writel(void* opaque, uint32_t addr, uint32_t val)
> -{
> -    PREPPCIState *s = opaque;
> -    s->config_reg = val;
> -}
> -
> -static uint32_t pci_prep_addr_readl(void* opaque, uint32_t addr)
> -{
> -    PREPPCIState *s = opaque;
> -    return s->config_reg;
> -}
> -
>  static inline uint32_t PPC_PCIIO_config(target_phys_addr_t addr)
>  {
>      int i;
> @@ -139,8 +127,7 @@ PCIBus *pci_prep_init(qemu_irq *pic)
>      s->bus = pci_register_bus(NULL, "pci",
>                                prep_set_irq, prep_map_irq, pic, 0, 4);
>  
> -    register_ioport_write(0xcf8, 4, 4, pci_prep_addr_writel, s);
> -    register_ioport_read(0xcf8, 4, 4, pci_prep_addr_readl, s);
> +    pci_host_config_register_ioport(0xcf8, s);
>  
>      pci_host_data_register_ioport(0xcfc, s);
>  
> diff --git a/hw/unin_pci.c b/hw/unin_pci.c
> index 6b8f98b..a9a62fd 100644
> --- a/hw/unin_pci.c
> +++ b/hw/unin_pci.c
> @@ -41,74 +41,6 @@ typedef struct UNINState {
>      PCIHostState host_state;
>  } UNINState;
>  
> -static void pci_unin_main_config_writel (void *opaque, target_phys_addr_t 
> addr,
> -                                         uint32_t val)
> -{
> -    UNINState *s = opaque;
> -
> -    UNIN_DPRINTF("config_writel addr " TARGET_FMT_plx " val %x\n", addr, 
> val);
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -
> -    s->host_state.config_reg = val;
> -}
> -
> -static uint32_t pci_unin_main_config_readl (void *opaque,
> -                                            target_phys_addr_t addr)
> -{
> -    UNINState *s = opaque;
> -    uint32_t val;
> -
> -    val = s->host_state.config_reg;
> -#ifdef TARGET_WORDS_BIGENDIAN
> -    val = bswap32(val);
> -#endif
> -    UNIN_DPRINTF("config_readl addr " TARGET_FMT_plx " val %x\n", addr, val);
> -
> -    return val;
> -}
> -
> -static CPUWriteMemoryFunc * const pci_unin_main_config_write[] = {
> -    &pci_unin_main_config_writel,
> -    &pci_unin_main_config_writel,
> -    &pci_unin_main_config_writel,
> -};
> -
> -static CPUReadMemoryFunc * const pci_unin_main_config_read[] = {
> -    &pci_unin_main_config_readl,
> -    &pci_unin_main_config_readl,
> -    &pci_unin_main_config_readl,
> -};
> -
> -static void pci_unin_config_writel (void *opaque, target_phys_addr_t addr,
> -                                    uint32_t val)
> -{
> -    UNINState *s = opaque;
> -
> -    s->host_state.config_reg = val;
> -}
> -
> -static uint32_t pci_unin_config_readl (void *opaque,
> -                                       target_phys_addr_t addr)
> -{
> -    UNINState *s = opaque;
> -
> -    return s->host_state.config_reg;
> -}
> -
> -static CPUWriteMemoryFunc * const pci_unin_config_write[] = {
> -    &pci_unin_config_writel,
> -    &pci_unin_config_writel,
> -    &pci_unin_config_writel,
> -};
> -
> -static CPUReadMemoryFunc * const pci_unin_config_read[] = {
> -    &pci_unin_config_readl,
> -    &pci_unin_config_readl,
> -    &pci_unin_config_readl,
> -};
> -
>  /* Don't know if this matches real hardware, but it agrees with OHW.  */
>  static int pci_unin_map_irq(PCIDevice *pci_dev, int irq_num)
>  {
> @@ -152,10 +84,8 @@ static int pci_unin_main_init_device(SysBusDevice *dev)
>      /* Uninorth main bus */
>      s = FROM_SYSBUS(UNINState, dev);
>  
> -    pci_mem_config = cpu_register_io_memory(pci_unin_main_config_read,
> -                                            pci_unin_main_config_write, s);
> +    pci_mem_config = pci_host_config_register_io_memory(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
> -
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
>  
> @@ -174,8 +104,7 @@ static int pci_dec_21154_init_device(SysBusDevice *dev)
>      s = FROM_SYSBUS(UNINState, dev);
>  
>      // XXX: s = &pci_bridge[2];
> -    pci_mem_config = cpu_register_io_memory(pci_unin_config_read,
> -                                            pci_unin_config_write, s);
> +    pci_mem_config = 
> pci_host_config_register_io_memory_noswap(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
> @@ -190,8 +119,7 @@ static int pci_unin_agp_init_device(SysBusDevice *dev)
>      /* Uninorth AGP bus */
>      s = FROM_SYSBUS(UNINState, dev);
>  
> -    pci_mem_config = cpu_register_io_memory(pci_unin_config_read,
> -                                            pci_unin_config_write, s);
> +    pci_mem_config = 
> pci_host_config_register_io_memory_noswap(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
> @@ -206,8 +134,7 @@ static int pci_unin_internal_init_device(SysBusDevice 
> *dev)
>      /* Uninorth internal bus */
>      s = FROM_SYSBUS(UNINState, dev);
>  
> -    pci_mem_config = cpu_register_io_memory(pci_unin_config_read,
> -                                            pci_unin_config_write, s);
> +    pci_mem_config = 
> pci_host_config_register_io_memory_noswap(&s->host_state);
>      pci_mem_data = pci_host_data_register_io_memory(&s->host_state);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_config);
>      sysbus_init_mmio(dev, 0x1000, pci_mem_data);
> -- 
> 1.6.0.2




reply via email to

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