From: Christoph Hellwig <hch@lst.de>
To: Max Gurtovoy <maxg@mellanox.com>
Cc: linux-pci@vger.kernel.org, hch@lst.de, fbarrat@linux.ibm.com,
clsoto@us.ibm.com, idanw@mellanox.com, aneela@mellanox.com,
shlomin@mellanox.com
Subject: Re: [PATCH 2/2] powerpc/powernv: Enable and setup PCI P2P
Date: Fri, 17 Apr 2020 09:02:38 +0200 [thread overview]
Message-ID: <20200417070238.GC18880@lst.de> (raw)
In-Reply-To: <20200416165725.206741-2-maxg@mellanox.com>
> +#ifdef CONFIG_PCI_P2PDMA
> +int64_t opal_pci_set_p2p(uint64_t phb_init, uint64_t phb_target,
> + uint64_t desc, uint16_t pe_number);
> +#endif
There should be no need for the ifdef here.
> + /*
> + * Configuring the initiator's PHB requires to adjust its
> + * TVE#1 setting. Since the same device can be an initiator
> + * several times for different target devices, we need to keep
> + * a reference count to know when we can restore the default
> + * bypass setting on its TVE#1 when disabling. Opal is not
> + * tracking PE states, so we add a reference count on the PE
> + * in linux.
> + *
> + * For the target, the configuration is per PHB, so we keep a
> + * target reference count on the PHB.
> + */
This could be shortened a bit by using up the whole 80 lines available
in source files.
> + mutex_lock(&p2p_mutex);
> +
> + if (desc & OPAL_PCI_P2P_ENABLE) {
> + /* always go to opal to validate the configuration */
> + rc = opal_pci_set_p2p(phb_init->opal_id, phb_target->opal_id,
> + desc, pe_init->pe_number);
> +
> + if (rc != OPAL_SUCCESS) {
> + rc = -EIO;
> + goto out;
> + }
> +
> + pe_init->p2p_initiator_count++;
> + phb_target->p2p_target_count++;
> + } else {
> + if (!pe_init->p2p_initiator_count ||
> + !phb_target->p2p_target_count) {
> + rc = -EINVAL;
> + goto out;
> + }
> +
> + if (--pe_init->p2p_initiator_count == 0)
> + pnv_pci_ioda2_set_bypass(pe_init, true);
> +
> + if (--phb_target->p2p_target_count == 0) {
> + rc = opal_pci_set_p2p(phb_init->opal_id,
> + phb_target->opal_id, desc,
> + pe_init->pe_number);
> + if (rc != OPAL_SUCCESS) {
> + rc = -EIO;
> + goto out;
> + }
> + }
> + }
> + rc = 0;
> +out:
> + mutex_unlock(&p2p_mutex);
> + return rc;
> +}
The enable and disable path shares almost no code, why not split it into
two functions?
> +static bool pnv_pci_controller_owns_addr(struct pci_controller *hose,
> + phys_addr_t addr, size_t size)
> +{
> + struct resource *r;
> + int i;
> +
> + /*
> + * it seems safe to assume the full range is under the same
> + * PHB, so we can ignore the size
Capitalize the first character in a multi-line comment, and use up the
whole 80 chars.
> + */
> + for (i = 0; i < 3; i++) {
Replace the magic 3 with ARRAY_SIZE(hose->mem_resources) ?
> + r = &hose->mem_resources[i];
Move the r declaration here and initialize it on the same line.
> + if (r->flags && (addr >= r->start) && (addr < r->end))
No need for the inner braces.
> + return true;
> + }
> + return false;
> +}
> +
> +/*
> + * find the phb owning a mmio address if not owned locally
> + */
> +static struct pnv_phb *pnv_pci_find_owning_phb(struct pci_dev *pdev,
> + phys_addr_t addr, size_t size)
> +{
> + struct pci_controller *hose = pci_bus_to_host(pdev->bus);
> + struct pnv_phb *phb;
> +
> + /* fast path */
> + if (pnv_pci_controller_owns_addr(hose, addr, size))
> + return NULL;
Maybe open code the pci_bus_to_host(pdev->bus) call here, as we just
overwrite host in the list iteration?
> +
> + list_for_each_entry(hose, &hose_list, list_node) {
> + phb = hose->private_data;
Move the ohb declaration here and initialize it on the same line.
> + if (phb->type != PNV_PHB_NPU_NVLINK &&
> + phb->type != PNV_PHB_NPU_OCAPI) {
> + if (pnv_pci_controller_owns_addr(hose, addr, size))
> + return phb;
> + }
> + }
> + return NULL;
> +}
> +
> +static int pnv_pci_dma_map_resource(struct pci_dev *pdev,
> + phys_addr_t phys_addr, size_t size,
> + enum dma_data_direction dir)
> +{
> + struct pnv_phb *target_phb;
> + int rc;
> + u64 desc;
> +
> + target_phb = pnv_pci_find_owning_phb(pdev, phys_addr, size);
> + if (target_phb) {
Return early here for the !target_phb case?
> + desc = OPAL_PCI_P2P_ENABLE;
> + if (dir == DMA_TO_DEVICE)
> + desc |= OPAL_PCI_P2P_STORE;
> + else if (dir == DMA_FROM_DEVICE)
> + desc |= OPAL_PCI_P2P_LOAD;
> + else if (dir == DMA_BIDIRECTIONAL)
> + desc |= OPAL_PCI_P2P_LOAD | OPAL_PCI_P2P_STORE;
Seems like this could be split into a little helper.
> + rc = pnv_pci_ioda_set_p2p(pdev, target_phb, desc);
> + if (rc) {
> + dev_err(&pdev->dev, "Failed to setup PCI peer-to-peer for address %llx: %d\n",
> + phys_addr, rc);
> + return rc;
> + }
No need for this printk, the callers should already deal with mapping
failures.
next prev parent reply other threads:[~2020-04-17 7:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-16 16:57 [PATCH 1/2] powerpc/dma: Define map/unmap mmio resource callbacks Max Gurtovoy
2020-04-16 16:57 ` [PATCH 2/2] powerpc/powernv: Enable and setup PCI P2P Max Gurtovoy
2020-04-17 7:02 ` Christoph Hellwig [this message]
2020-04-17 11:16 ` Max Gurtovoy
2020-04-17 14:04 ` Oliver O'Halloran
2020-04-19 11:46 ` Max Gurtovoy
2020-04-17 6:55 ` [PATCH 1/2] powerpc/dma: Define map/unmap mmio resource callbacks Christoph Hellwig
2020-04-19 10:14 ` Max Gurtovoy
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=20200417070238.GC18880@lst.de \
--to=hch@lst.de \
--cc=aneela@mellanox.com \
--cc=clsoto@us.ibm.com \
--cc=fbarrat@linux.ibm.com \
--cc=idanw@mellanox.com \
--cc=linux-pci@vger.kernel.org \
--cc=maxg@mellanox.com \
--cc=shlomin@mellanox.com \
/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.