From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 14/23] pci: factor out the logic to get pci device from address.
Date: Mon, 5 Oct 2009 14:45:33 +0200 [thread overview]
Message-ID: <20091005124533.GD30799@redhat.com> (raw)
In-Reply-To: <1254737223-16129-15-git-send-email-yamahata@valinux.co.jp>
On Mon, Oct 05, 2009 at 07:06:54PM +0900, Isaku Yamahata wrote:
> factor out conversion logic from io port address into bus+dev+func
> with bit shift operation and conversion bus+dev+func into pci device.
> They will be used later by pcie support.
> This patch also eliminates the logic duplication.
Please split removing logic duplication into separate patch.
It might be applicable already, while express stuff needs more work IMO.
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
> hw/pci.c | 83 ++++++++++++++++++++++++++++++++++---------------------------
> 1 files changed, 46 insertions(+), 37 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 6ddd256..5f808ff 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -629,44 +629,25 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
> pci_update_mappings(d);
> }
>
> -void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
> +static void pci_data_write_common(PCIDevice *pci_dev,
> + uint32_t config_addr, uint32_t val, int len)
So as I said in the previous comment, pci express should just be able to
use pci code directly, instead of reusing this low-level stuff.
All you need to do is range-check address and ignore extended registers.
> {
> - PCIBus *s = opaque;
> - PCIDevice *pci_dev;
> - int config_addr, bus_num;
> -
> -#if 0
> - PCI_DPRINTF("pci_data_write: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
> - addr, val, len);
> -#endif
> - bus_num = (addr >> 16) & 0xff;
> - s = pci_find_bus(s, bus_num);
> - if (!s)
> - return;
> - pci_dev = s->devices[(addr >> 8) & 0xff];
> + assert(len == 1 || len == 2 || len == 4);
> if (!pci_dev)
> return;
> - config_addr = addr & 0xff;
> - PCI_DPRINTF("pci_config_write: %s: "
> - "addr=%02x val=%08"PRI32x" len=%d\n",
> - pci_dev->name, config_addr, val, len);
> +
> + PCI_DPRINTF("%s: %s: addr=%02"PRIx32" val=%08"PRI32x" len=%d\n",
> + __func__, pci_dev->name, config_addr, val, len);
> pci_dev->config_write(pci_dev, config_addr, val, len);
> }
>
> -uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
> +static uint32_t pci_data_read_common(PCIDevice *pci_dev,
> + uint32_t config_addr, int len)
> {
> - PCIBus *s = opaque;
> - PCIDevice *pci_dev;
> - int config_addr, bus_num;
> uint32_t val;
>
> - bus_num = (addr >> 16) & 0xff;
> - s = pci_find_bus(s, bus_num);
> - if (!s)
> - goto fail;
> - pci_dev = s->devices[(addr >> 8) & 0xff];
> + assert(len == 1 || len == 2 || len == 4);
> if (!pci_dev) {
> - fail:
> switch(len) {
> case 1:
> val = 0xff;
> @@ -679,21 +660,49 @@ uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
> val = 0xffffffff;
> break;
> }
> - goto the_end;
> + } else {
> + val = pci_dev->config_read(pci_dev, config_addr, len);
> + PCI_DPRINTF("%s: %s: addr=%02"PRIx32" val=%08"PRIx32" len=%d\n",
> + __func__, pci_dev->name, config_addr, val, len);
> }
> - config_addr = addr & 0xff;
> - val = pci_dev->config_read(pci_dev, config_addr, len);
> - PCI_DPRINTF("pci_config_read: %s: "
> - "addr=%02x val=%08"PRIx32" len=%d\n",
> - pci_dev->name, config_addr, val, len);
> - the_end:
> +
> #if 0
> - PCI_DPRINTF("pci_data_read: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
> - addr, val, len);
> + PCI_DPRINTF("%s: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
> + __func__, addr, val, len);
> #endif
move to real pci_data_read?
> return val;
> }
>
> +static inline PCIDevice *pci_addr_to_dev(PCIBus *bus, uint32_t addr)
> +{
> + uint8_t bus_num = (addr >> 16) & 0xff;
> + uint8_t devfn = (addr >> 8) & 0xff;
> + return pci_find_device(bus, bus_num, PCI_SLOT(devfn), PCI_FUNC(devfn));
> +}
> +
> +static inline uint32_t pci_addr_to_config(uint32_t addr)
> +{
> + return addr & 0xff;
> +}
> +
> +void pci_data_write(void *opaque, uint32_t addr, uint32_t val, int len)
> +{
> + PCIBus *s = opaque;
> +#if 0
> + PCI_DPRINTF("pci_data_write: addr=%08"PRIx32" val=%08"PRIx32" len=%d\n",
> + addr, val, len);
> +#endif
> +
> + pci_data_write_common(pci_addr_to_dev(s, addr), pci_addr_to_config(addr),
> + val, len);
For pci express, there's extended register number in bits 11:8
so what we should do here IMO is check these bits and
ignore if they are not 0.
> +}
> +
> +uint32_t pci_data_read(void *opaque, uint32_t addr, int len)
> +{
> + PCIBus *s = opaque;
For pci express, there's extended register number in bits 11:8
so what we should do here IMO is check these bits and
return 0 if not 0.
> + return pci_data_read_common(pci_addr_to_dev(s, addr),
> + pci_addr_to_config(addr), len);
> +}
> /***********************************************************/
> /* generic PCI irq support */
>
> --
> 1.6.0.2
next prev parent reply other threads:[~2009-10-05 12:47 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-05 10:06 [Qemu-devel] [PATCH v4 00/23] pci: various pci clean up and pci express support Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 01/23] pci: fix PCI_DPRINTF() wrt variadic macro Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 02/23] pci: use appropriate PRIs in PCI_DPRINTF() for portability Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 03/23] pci: introduce constant PCI_NUM_PINS for the number of interrupt pins, 4 Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 04/23] pci: use the symbolic constant, PCI_ROM_ADDRESS_ENABLE instead of 1 Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 05/23] pci: use PCI_SLOT() and PCI_FUNC() Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 06/23] pci: define a constant to represent a unmapped bar and use it Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 07/23] pci: helper functions to access PCIDevice::config Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 08/23] pci: use helper functions to access pci config space Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 09/23] pci: introduce pcibus_t to represent pci bus address/size instead of uint32_t Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 10/23] pci: introduce FMT_PCIBUS for printf format for pcibus_t Isaku Yamahata
2009-10-05 13:41 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 11/23] pci: typedef pcibus_t as uint64_t instead of uint32_t Isaku Yamahata
2009-10-05 20:18 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 12/23] pci: 64bit bar support Isaku Yamahata
2009-10-05 12:06 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-06 9:38 ` Isaku Yamahata
2009-10-06 9:43 ` Michael S. Tsirkin
2009-10-05 12:47 ` Michael S. Tsirkin
2009-10-06 9:42 ` Isaku Yamahata
2009-10-06 9:47 ` Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 13/23] pci: make pci configuration transaction more accurate Isaku Yamahata
2009-10-05 12:26 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 14/23] pci: factor out the logic to get pci device from address Isaku Yamahata
2009-10-05 12:45 ` Michael S. Tsirkin [this message]
2009-10-06 9:50 ` [Qemu-devel] " Isaku Yamahata
2009-10-06 10:23 ` Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 15/23] pci_host.h: split non-inline static function in pci_host.h into pci_host.c Isaku Yamahata
2009-10-05 14:35 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 14:37 ` Michael S. Tsirkin
2009-10-05 10:06 ` [Qemu-devel] [PATCH 16/23] pci: pcie host and mmcfg support Isaku Yamahata
2009-10-05 11:01 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-06 8:48 ` Isaku Yamahata
2009-10-06 9:30 ` Michael S. Tsirkin
2009-10-05 11:41 ` Michael S. Tsirkin
2009-10-06 10:02 ` Isaku Yamahata
2009-10-06 10:57 ` Michael S. Tsirkin
2009-10-06 13:21 ` Michael S. Tsirkin
2009-10-07 2:25 ` Isaku Yamahata
2009-10-07 12:17 ` Michael S. Tsirkin
2009-10-07 11:30 ` Akio Takebe
2009-10-05 10:06 ` [Qemu-devel] [PATCH 17/23] pci: fix pci_default_write_config() Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 18/23] pci: add helper functions for pci config write function Isaku Yamahata
2009-10-05 10:06 ` [Qemu-devel] [PATCH 19/23] pci: use helper function in pci_default_write_config() Isaku Yamahata
2009-10-05 10:07 ` [Qemu-devel] [PATCH 20/23] pci: make bar update function aware of pci bridge Isaku Yamahata
2009-10-05 11:59 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-09 3:27 ` Isaku Yamahata
2009-10-10 20:20 ` Michael S. Tsirkin
2009-10-13 15:14 ` Isaku Yamahata
2009-10-13 15:22 ` Michael S. Tsirkin
2009-10-05 10:07 ` [Qemu-devel] [PATCH 21/23] pci/brdige: qdevfy and initialize secondary bus and subordinate bus Isaku Yamahata
2009-10-05 13:49 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 14:58 ` Michael S. Tsirkin
2009-10-05 10:07 ` [Qemu-devel] [PATCH 22/23] pci: initialize wmask according to pci header type Isaku Yamahata
2009-10-05 14:09 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 10:07 ` [Qemu-devel] [PATCH 23/23] pci/monitor: print out bridge's filtering values and so on Isaku Yamahata
2009-10-05 14:24 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-05 10:14 ` [Qemu-devel] Re: [PATCH v4 00/23] pci: various pci clean up and pci express support Michael S. Tsirkin
2009-10-05 13:34 ` Michael S. Tsirkin
2009-10-07 2:30 ` Isaku Yamahata
2009-10-06 14:40 ` Michael S. Tsirkin
2009-10-07 2:29 ` Isaku Yamahata
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091005124533.GD30799@redhat.com \
--to=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yamahata@valinux.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.