Thread (12 messages) 12 messages, 2 authors, 2015-08-03

Re: [PATCH v2 3/5] pci: altera: Add Altera PCIe MSI driver

From: Marc Zyngier <hidden>
Date: 2015-08-03 10:53:45
Also in: linux-arm-kernel, linux-pci, lkml

On 03/08/15 11:37, Ley Foon Tan wrote:
On Fri, Jul 31, 2015 at 8:12 PM, Marc Zyngier [off-list ref] wrote:
quoted
On 31/07/15 11:15, Ley Foon Tan wrote:
quoted
This patch adds Altera PCIe MSI driver. This soft IP supports configurable
number of vectors, which is a dts parameter.
I've reviewed the initial drop of this code; basic courtesy would be to
keep me CCed on the follow-up series.
Will keep you in CC for the following revision. Sorry about this.
quoted
quoted
Signed-off-by: Ley Foon Tan <redacted>
---
 drivers/pci/host/Kconfig           |   7 +
 drivers/pci/host/Makefile          |   1 +
 drivers/pci/host/pcie-altera-msi.c | 324 +++++++++++++++++++++++++++++++++++++
 3 files changed, 332 insertions(+)
 create mode 100644 drivers/pci/host/pcie-altera-msi.c
[...]
quoted
quoted
+
+     msg->address_lo = lower_32_bits(addr);
+     msg->address_hi = upper_32_bits(addr);
+     msg->data = data->hwirq;
+
+     mask = msi_readl(msi, MSI_INTMASK);
+     mask |= 1 << data->hwirq;
+     msi_writel(msi, mask, MSI_INTMASK);
It feels a bit weird to unmask the interrupt when you compose the
message. I'd expect this to be done in the mask/unmask methods.
Do you refer to these 2 callbacks?
.irq_mask = pci_msi_mask_irq,
.irq_unmask = pci_msi_unmask_irq,

How about we move this INTMASK code above to altera_irq_domain_alloc()?
We have unmask code in altera_irq_domain_free() now.
Either you move the mask/unmask code to local irq_mask/irq_unmask
methods (and call pci_msi_(un)mask_irq from there), or you move it
entierely to alloc/free.

Some level of symmetry helps following what is going on in the code.

[...]
quoted
quoted
+static int altera_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
+                               unsigned int nr_irqs, void *args)
+{
+     struct altera_msi *msi = domain->host_data;
+     int bit;
+
+     mutex_lock(&msi->lock);
+
+     bit = find_first_zero_bit(msi->used, msi->num_of_vectors);
+     if (bit < msi->num_of_vectors)
+             set_bit(bit, msi->used);
+
+     mutex_unlock(&msi->lock);
+
+     if (bit < 0)
+             return bit;
How can "bit" be negative here? find_first_zero_bit returns an unsigned
long... You probably want to change the type of "bit" to reflect that.
Okay, will change to "unsigned long" type.
quoted
quoted
+     else if (bit >= msi->num_of_vectors)
Useless "else" anyway.
I think we still need to check for failing case, if we don't have
available unused bit.
This could be rewritten  as below:

bit = find_first_zero_bit(msi->used, msi->num_of_vectors);
if (bit < msi->num_of_vectors)
      set_bit(bit, msi->used);
else
      return -ENOSPC;
The more logical to write this is:

	if (bit >= msi->num_of_vectors)
		return -ENOSPC;

	set_bit(bit, msi->used);

which gets rid of the error case early and streamlines the normal case.
quoted
quoted
+             return -ENOSPC;
+
+     irq_domain_set_info(domain, virq, bit, &altera_msi_bottom_irq_chip,
+                         domain->host_data, handle_simple_irq,
+                         NULL, NULL);
+     set_irq_flags(virq, IRQF_VALID);
+
+     return 0;
+}
Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help