From: Bjorn Helgaas <helgaas@kernel.org>
To: Keith Busch <keith.busch@intel.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
x86@kernel.org, linux-pci@vger.kernel.org,
Jiang Liu <jiang.liu@linux.intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Dan Williams <dan.j.williams@intel.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Bryan Veal <bryan.e.veal@intel.com>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
Martin Mares <mj@ucw.cz>,
Jon Derrick <jonathan.derrick@intel.com>
Subject: Re: [PATCHv6 5/7] x86/pci: Initial commit for new VMD device driver
Date: Thu, 17 Dec 2015 12:14:48 -0600 [thread overview]
Message-ID: <20151217181448.GF23549@localhost> (raw)
In-Reply-To: <1449523949-21898-6-git-send-email-keith.busch@intel.com>
On Mon, Dec 07, 2015 at 02:32:27PM -0700, Keith Busch wrote:
> The Intel Volume Management Device (VMD) is an integrated endpoint on the
> platform's PCIe root complex that acts as a host bridge to a secondary
> PCIe domain. BIOS can reassign one or more root ports to appear within
> a VMD domain instead of the primary domain. The immediate benefit is
> that additional PCI-e domains allow more than 256 buses in a system by
> letting bus number be reused across different domains.
> +/*
> + * VMD h/w converts posted config writes to non-posted. The read-back in this
> + * function forces the completion so it returns only after the config space was
> + * written, as expected.
This comment sounds backwards:
posted writes don't wait for completion
non-posted writes do wait for completion
If the hardware converts to non-posted writes, you shouldn't need a
read-back. It seems like you would need the read-back if the hardware
converted non-posted to posted.
> + */
> +static int vmd_pci_write(struct pci_bus *bus, unsigned int devfn, int reg,
> + int len, u32 value)
> +{
> + int ret = 0;
> + unsigned long flags;
> + struct vmd_dev *vmd = vmd_from_bus(bus);
> + char __iomem *addr = vmd->cfgbar + (bus->number << 20) +
> + (devfn << 12) + reg;
> +
> + if ((addr - vmd->cfgbar) + len >= resource_size(&vmd->dev->resource[0]))
> + return -EFAULT;
> +
> + spin_lock_irqsave(&vmd->cfg_lock, flags);
> + switch (len) {
> + case 1:
> + writeb(value, addr);
> + readb(addr);
> + break;
> + case 2:
> + writew(value, addr);
> + readw(addr);
> + break;
> + case 4:
> + writel(value, addr);
> + readl(addr);
> + break;
> + default:
> + ret = -EINVAL;
> + break;
> + }
> + spin_unlock_irqrestore(&vmd->cfg_lock, flags);
> + return ret;
> +}
> +static int vmd_probe(struct pci_dev *dev, const struct pci_device_id *id)
> +{
> + struct vmd_dev *vmd;
> + int i, err;
> +
> + if (resource_size(&dev->resource[0]) < (1 << 20))
> + return -ENOMEM;
> +
> + vmd = devm_kzalloc(&dev->dev, sizeof(*vmd), GFP_KERNEL);
> + if (!vmd)
> + return -ENOMEM;
> +
> + vmd->dev = dev;
> + err = pcim_enable_device(dev);
> + if (err < 0)
> + return err;
> +
> + vmd->cfgbar = pcim_iomap(dev, 0, 0);
> + if (!vmd->cfgbar)
> + return -ENOMEM;
> +
> + pci_set_master(dev);
> + if (dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(64)) &&
> + dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(32)))
> + return -ENODEV;
> +
> + vmd->msix_count = pci_msix_vec_count(dev);
> + if (vmd->msix_count < 0)
> + return -ENODEV;
> +
> + vmd->irqs = devm_kcalloc(&dev->dev, vmd->msix_count, sizeof(*vmd->irqs),
> + GFP_KERNEL);
> + if (!vmd->irqs)
> + return -ENOMEM;
> +
> + vmd->msix_entries = devm_kcalloc(&dev->dev, vmd->msix_count,
> + sizeof(*vmd->msix_entries), GFP_KERNEL);
> + if(!vmd->msix_entries)
> + return -ENOMEM;
> + for (i = 0; i < vmd->msix_count; i++)
> + vmd->msix_entries[i].entry = i;
> +
> + vmd->msix_count = pci_enable_msix_range(vmd->dev, vmd->msix_entries, 1,
> + vmd->msix_count);
> + if (vmd->msix_count < 0)
> + return vmd->msix_count;
> +
> + for (i = 0; i < vmd->msix_count; i++) {
> + INIT_LIST_HEAD(&vmd->irqs[i].irq_list);
> + vmd->irqs[i].vmd_vector = vmd->msix_entries[i].vector;
> + vmd->irqs[i].index = i;
> +
> + err = devm_request_irq(&dev->dev, vmd->irqs[i].vmd_vector,
> + vmd_irq, 0, "vmd", &vmd->irqs[i]);
> + if (err)
> + return err;
> + }
> + spin_lock_init(&vmd->cfg_lock);
> + pci_set_drvdata(dev, vmd);
Seems like it might be nice to have something in dmesg that would connect
this PCI device to the new PCI domain. It's a new, unusual topology and a
hint might help everybody understand what's going on.
> + err = vmd_enable_domain(vmd);
> + if (err)
> + return err;
> + return 0;
> +}
Bjorn
next prev parent reply other threads:[~2015-12-17 18:14 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-07 21:32 [PATCHv6 0/7] Driver for new "VMD" device Keith Busch
2015-12-07 21:32 ` [PATCHv6 1/7] msi: Relax msi_domain_alloc() to support parentless MSI irqdomains Keith Busch
2015-12-07 21:32 ` [PATCHv6 2/7] pci: child bus alloc fix on constrained resource Keith Busch
2015-12-17 17:27 ` Bjorn Helgaas
2015-12-17 17:57 ` Keith Busch
2015-12-17 17:41 ` Bjorn Helgaas
2015-12-07 21:32 ` [PATCHv6 3/7] Export msi and irq functions for module use Keith Busch
2015-12-07 21:32 ` [PATCHv6 4/7] x86-pci: allow pci domain specific dma ops Keith Busch
2015-12-07 21:32 ` [PATCHv6 5/7] x86/pci: Initial commit for new VMD device driver Keith Busch
2015-12-17 18:14 ` Bjorn Helgaas [this message]
2015-12-17 18:25 ` Keith Busch
2015-12-07 21:32 ` [PATCHv6 6/7] aer_inject: Use 32 bit int type domains Keith Busch
2015-12-17 17:46 ` Bjorn Helgaas
2015-12-17 18:16 ` Keith Busch
2015-12-07 21:32 ` [PATCHv5 7/7] pciutils: Allow 32-bit domains Keith Busch
2015-12-12 23:00 ` Andy Shevchenko
2015-12-17 17:15 ` Bjorn Helgaas
2015-12-17 17:34 ` Keith Busch
2015-12-17 18:26 ` Bjorn Helgaas
2016-01-03 14:11 ` Martin Mares
2016-01-04 22:29 ` Keith Busch
2016-01-11 19:19 ` Martin Mares
2015-12-08 12:15 ` [PATCHv6 0/7] Driver for new "VMD" device Thomas Gleixner
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=20151217181448.GF23549@localhost \
--to=helgaas@kernel.org \
--cc=bhelgaas@google.com \
--cc=bryan.e.veal@intel.com \
--cc=dan.j.williams@intel.com \
--cc=hpa@zytor.com \
--cc=jiang.liu@linux.intel.com \
--cc=jonathan.derrick@intel.com \
--cc=keith.busch@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=mj@ucw.cz \
--cc=tglx@linutronix.de \
--cc=x86@kernel.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.