All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH 12/23] pci: 64bit bar support.
Date: Tue, 6 Oct 2009 11:43:06 +0200	[thread overview]
Message-ID: <20091006094306.GA8899@redhat.com> (raw)
In-Reply-To: <20091006093830.GB32367%yamahata@valinux.co.jp>

On Tue, Oct 06, 2009 at 06:38:30PM +0900, Isaku Yamahata wrote:
> On Mon, Oct 05, 2009 at 02:06:30PM +0200, Michael S. Tsirkin wrote:
> > On Mon, Oct 05, 2009 at 07:06:52PM +0900, Isaku Yamahata wrote:
> > > implemented pci 64bit bar support.
> > > 
> > > Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> > > ---
> > >  hw/pci.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++--------
> > >  hw/pci.h |    2 ++
> > >  2 files changed, 48 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/hw/pci.c b/hw/pci.c
> > > index 21565f5..09a6816 100644
> > > --- a/hw/pci.c
> > > +++ b/hw/pci.c
> > > @@ -395,6 +395,13 @@ int pci_unregister_device(PCIDevice *pci_dev)
> > >      return 0;
> > >  }
> > >  
> > > +static inline int pci_bar_is_mem64(const PCIIORegion *r)
> > > +{
> > > +    return !(r->type & PCI_ADDRESS_SPACE_IO) &&
> > > +        (r->type & PCI_ADDRESS_SPACE_MEM_TYPE_MASK) ==
> > > +        PCI_ADDRESS_SPACE_MEM_TYPE_64;
> > > +}
> > > +
> > 
> > why are we checking PCI_ADDRESS_SPACE_IO? Let's not.
> 
> Because bar handling logic for io bar and 32bit memory bar is same.
> For example, pci_register_bar() does.

Yes, but 64 bit handling does not care about this: if you see a 64 bit
bar, you can handle it as 64 bit.  No need to check the I/O bit.

> 
> > >  void pci_register_bar(PCIDevice *pci_dev, int region_num,
> > >                              pcibus_t size, int type,
> > >                              PCIMapIORegionFunc *map_func)
> > > @@ -427,8 +434,13 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
> > >          addr = 0x10 + region_num * 4;
> > >      }
> > >      pci_set_long(pci_dev->config + addr, type);
> > > -    pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
> > > -    pci_set_long(pci_dev->cmask + addr, 0xffffffff);
> > > +    if (pci_bar_is_mem64(r)) {
> > > +        pci_set_quad(pci_dev->wmask + addr, wmask);
> > > +        pci_set_quad(pci_dev->cmask + addr, ~0ULL);
> > > +    } else {
> > > +        pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
> > > +        pci_set_long(pci_dev->cmask + addr, 0xffffffff);
> > > +    }
> > >  }
> > >  
> > >  static void pci_update_mappings(PCIDevice *d)
> > > @@ -462,7 +474,11 @@ static void pci_update_mappings(PCIDevice *d)
> > >                  }
> > >              } else {
> > >                  if (cmd & PCI_COMMAND_MEMORY) {
> > > -                    new_addr = pci_get_long(d->config + config_ofs);
> > > +                    if (pci_bar_is_mem64(r)) {
> > > +                        new_addr = pci_get_quad(d->config + config_ofs);
> > > +                    } else {
> > > +                        new_addr = pci_get_long(d->config + config_ofs);
> > > +                    }
> > >                      /* the ROM slot has a specific enable bit */
> > >                      if (i == PCI_ROM_SLOT && !(new_addr & 1))
> > >                          goto no_mem_map;
> > > @@ -473,11 +489,24 @@ static void pci_update_mappings(PCIDevice *d)
> > >                         mappings, we handle specific values as invalid
> > >                         mappings. */
> > >                      if (last_addr <= new_addr || new_addr == 0 ||
> > > -                        last_addr == PCI_BAR_UNMAPPED ||
> > > +                        last_addr == PCI_BAR_UNMAPPED) {
> > > +                        new_addr = PCI_BAR_UNMAPPED;
> > > +                    }
> > >  
> > > -                        /* keep old behaviour
> > > -                         * without this, PC ide doesn't work well. */
> > > -                        last_addr >= UINT32_MAX) {
> > > +                    /*
> > > +                     * work around: without this, PC ide and other devices
> > > +                     * don't work well.
> > > +                     * OS writes all 1 bits to 32 BAR to find its size
> > 
> > Isn't memory disabled then? PCI spec says it should be ...
> > 
> > > +                     * resulting in setting UINT32_MAX - alignemnt,
> > 
> > typo
> > 
> > > +                     * and then OS sets the BAR to where they really want
> > > +                     * the BAR to sit.
> > > +                     * On the other hand, there are some important areas
> > > +                     * blow 4G on i386/x86_64. So setting BAR over those area
> > 
> > typo
> > 
> > > +                     * below 4G causes troubles.
> > > +                     * We work around the issues by prohibitting BAR
> > 
> > typo.
> > 
> > > +                     * from sitting right blow 4G.
> > 
> > typo
> > 
> > > +                     */
> > > +                    if (!pci_bar_is_mem64(r) && last_addr >= UINT32_MAX) {
> > >                          new_addr = PCI_BAR_UNMAPPED;
> > >                      }
> > >                  } else {
> > > @@ -736,7 +765,16 @@ static void pci_info_device(PCIDevice *d)
> > >                  monitor_printf(mon, "I/O at 0x%04"FMT_PCIBUS" [0x%04"FMT_PCIBUS"].\n",
> > >                                 r->addr, r->addr + r->size - 1);
> > >              } else {
> > > -                monitor_printf(mon, "32 bit memory at 0x%08"FMT_PCIBUS" [0x%08"FMT_PCIBUS"].\n",
> > > +                const char *type = pci_bar_is_mem64(r)? "64 bit": "32 bit";
> > > +                const char *prefetch = "";
> > > +
> > > +                if (r->type & PCI_ADDRESS_SPACE_MEM_PREFETCH) {
> > > +                    prefetch = " prefetchable";
> > > +                }
> > > +
> > > +                monitor_printf(mon, "%s%s memory at "
> > > +                               "0x%08"FMT_PCIBUS" [0x%08"FMT_PCIBUS"].\n",
> > > +                               type, prefetch,
> > >                                 r->addr, r->addr + r->size - 1);
> > >              }
> > >          }
> > > diff --git a/hw/pci.h b/hw/pci.h
> > > index cbf80c0..b65ce03 100644
> > > --- a/hw/pci.h
> > > +++ b/hw/pci.h
> > > @@ -84,6 +84,8 @@ typedef int PCIUnregisterFunc(PCIDevice *pci_dev);
> > >  
> > >  #define PCI_ADDRESS_SPACE_MEM		0x00
> > >  #define PCI_ADDRESS_SPACE_IO		0x01
> > > +#define PCI_ADDRESS_SPACE_MEM_TYPE_MASK 0x06
> > > +#define PCI_ADDRESS_SPACE_MEM_TYPE_64   0x04    /* 64 bit address */
> > 
> > something wrong with text alignment here. pls align with tabs as the
> > rest of surrounding code does.
> > 
> > And I thought we were switching to names from pci_regs.h?
> > 
> > >  #define PCI_ADDRESS_SPACE_MEM_PREFETCH	0x08
> > >  
> > >  typedef struct PCIIORegion {
> > 
> 
> -- 
> yamahata

  reply	other threads:[~2009-10-06  9:45 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 [this message]
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   ` [Qemu-devel] " Michael S. Tsirkin
2009-10-06  9:50     ` 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=20091006094306.GA8899@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.