From: "Michael S. Tsirkin" <mst@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 4/6] pci: add helper to retrieve the 64-bit range
Date: Tue, 10 Sep 2013 20:28:00 +0300 [thread overview]
Message-ID: <20130910172800.GA3913@redhat.com> (raw)
In-Reply-To: <20130910190510.36f3fbc9@nial.usersys.redhat.com>
On Tue, Sep 10, 2013 at 07:05:10PM +0200, Igor Mammedov wrote:
> On Tue, 10 Sep 2013 16:50:41 +0300
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
>
> > On Tue, Sep 10, 2013 at 03:40:03PM +0200, Igor Mammedov wrote:
> > > On Wed, 4 Sep 2013 13:48:37 +0300
> > > "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > >
> > > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > > > ---
> > > > include/hw/pci/pci.h | 1 +
> > > > hw/pci/pci.c | 43 +++++++++++++++++++++++++++++++++++++++++++
> > > > 2 files changed, 44 insertions(+)
> > > >
> > > > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> > > > index 2374aa9..7be93ae 100644
> > > > --- a/include/hw/pci/pci.h
> > > > +++ b/include/hw/pci/pci.h
> > > > @@ -397,6 +397,7 @@ const char *pci_root_bus_path(PCIDevice *dev);
> > > > PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn);
> > > > int pci_qdev_find_device(const char *id, PCIDevice **pdev);
> > > > PCIBus *pci_get_bus_devfn(int *devfnp, PCIBus *root, const char *devaddr);
> > > > +void pci_bus_get_w64_range(PCIBus *bus, Range *range);
> > > >
> > > > int pci_parse_devaddr(const char *addr, int *domp, int *busp,
> > > > unsigned int *slotp, unsigned int *funcp);
> > > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > > > index 8c33352..d9f9bdf 100644
> > > > --- a/hw/pci/pci.c
> > > > +++ b/hw/pci/pci.c
> > > > @@ -2257,6 +2257,49 @@ void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque)
> > > > bus->iommu_opaque = opaque;
> > > > }
> > > >
> > > > +static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
> > > > +{
> > > > + Range *range = opaque;
> > > > + PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
> > > > + uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
> > > > + int r;
> > > > +
> > > > + if (!(cmd & PCI_COMMAND_MEMORY)) {
> > > > + return;
> > > > + }
> > > > +
> > > > + if (pc->is_bridge) {
> > > > + pcibus_t base = pci_bridge_get_base(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
> > > what guaranties that 'base' won't be below 4Gb
> >
> > Hmm, this needs some thought.
> >
> > > and be above '4Gb + above_4g_mem_size'?
> >
> > This one is harmless - guest will only hurt itself if
> > it misconfigures the bridge like this.
>
> start of w64 is hardcoded in QEMU and Seabios as (4Gb+above_4gb_ram_size),
> so maybe there is no need to update/modify it at all?
>
Well the point is to have QEMU obey whatever bios does.
seabios hardcodes the start of window but some other
firmware might not.
> >
> > > > + pcibus_t limit = pci_bridge_get_limit(dev, PCI_BASE_ADDRESS_MEM_PREFETCH);
> > > > +
> > > > + if (limit >= base) {
> > > > + Range pref_range;
> > > > + pref_range.begin = base;
> > > > + pref_range.end = limit + 1;
> > > > + range_extend(range, &pref_range);
> > > > + }
> > > > + }
> > > > + for (r = 0; r < PCI_NUM_REGIONS; ++r) {
> > > > + PCIIORegion *region = &dev->io_regions[r];
> > > > + Range region_range;
> > > > +
> > > > + if (!region->size ||
> > > > + (region->type & PCI_BASE_ADDRESS_SPACE_IO) ||
> > > > + !(region->type & PCI_BASE_ADDRESS_MEM_TYPE_64)) {
> > > > + continue;
> > > > + }
> > > > + region_range.begin = pci_get_quad(dev->config + pci_bar(dev, r));
> > > > + region_range.end = region_range.begin + region->size;
> > > > + range_extend(range, ®ion_range);
> > > > + }
> > > > +}
> > > > +
> > > > +void pci_bus_get_w64_range(PCIBus *bus, Range *range)
> > > > +{
> > > > + range->begin = range->end = 0;
> > > > + pci_for_each_device_under_bus(bus, pci_dev_get_w64, range);
> > > > +}
> > > > +
> > > > static const TypeInfo pci_device_type_info = {
> > > > .name = TYPE_PCI_DEVICE,
> > > > .parent = TYPE_DEVICE,
next prev parent reply other threads:[~2013-09-10 17:26 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-04 10:48 [Qemu-devel] [PATCH 0/6] pci: keep window properties up to date Michael S. Tsirkin
2013-09-04 10:48 ` [Qemu-devel] [PATCH 1/6] q35: make pci window address/size match guest cfg Michael S. Tsirkin
2013-09-10 13:37 ` Igor Mammedov
2013-09-10 13:46 ` Michael S. Tsirkin
2013-09-10 13:46 ` Igor Mammedov
2013-09-10 13:53 ` Michael S. Tsirkin
2013-09-10 14:09 ` Igor Mammedov
2013-09-10 14:16 ` Michael S. Tsirkin
2013-09-10 15:05 ` Igor Mammedov
2013-09-10 15:25 ` Michael S. Tsirkin
2013-09-04 10:48 ` [Qemu-devel] [PATCH 2/6] range: add Range to typedefs Michael S. Tsirkin
2013-09-04 10:48 ` [Qemu-devel] [PATCH 3/6] range: add min/max operations on ranges Michael S. Tsirkin
2013-09-10 9:35 ` Igor Mammedov
2013-09-10 12:51 ` Michael S. Tsirkin
2013-09-04 10:48 ` [Qemu-devel] [PATCH 4/6] pci: add helper to retrieve the 64-bit range Michael S. Tsirkin
2013-09-10 13:40 ` Igor Mammedov
2013-09-10 13:50 ` Michael S. Tsirkin
2013-09-10 17:05 ` Igor Mammedov
2013-09-10 17:28 ` Michael S. Tsirkin [this message]
2013-09-04 10:48 ` [Qemu-devel] [PATCH 5/6] q35: use 64 bit window programmed by guest Michael S. Tsirkin
2013-09-10 14:12 ` Igor Mammedov
2013-09-10 14:19 ` Michael S. Tsirkin
2013-09-04 10:48 ` [Qemu-devel] [PATCH 6/6] piix: " Michael S. Tsirkin
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=20130910172800.GA3913@redhat.com \
--to=mst@redhat.com \
--cc=imammedo@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.