Thread (17 messages) 17 messages, 3 authors, 2006-10-24

Re: [RFC/PATCH 3/7] Powerpc MSI ops layer

From: Jake Moilanen <hidden>
Date: 2006-10-24 13:45:16
Also in: lkml

On Tue, 2006-10-24 at 11:51 +1000, Michael Ellerman wrote:
On Tue, 2006-10-03 at 16:54 -0500, Jake Moilanen wrote:
quoted
On Fri, 2006-09-29 at 07:53 +1000, Michael Ellerman wrote:
quoted
Powerpc MSI ops layer.

Signed-off-by: Michael Ellerman <redacted>
---

 arch/powerpc/kernel/msi.c        |  347 +++++++++++++++++++++++++++++++++++++++
 include/asm-powerpc/machdep.h    |    6 
 include/asm-powerpc/msi.h        |  175 +++++++++++++++++++
 include/asm-powerpc/pci-bridge.h |    4 
 4 files changed, 532 insertions(+)

Index: to-merge/arch/powerpc/kernel/msi.c
===================================================================
--- /dev/null
+++ to-merge/arch/powerpc/kernel/msi.c
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2006 (C), Michael Ellerman, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <asm/msi.h>
+#include <asm/machdep.h>
+
+static struct ppc_msi_ops *get_msi_ops(struct pci_dev *pdev)
+{
+	if (ppc_md.get_msi_ops)
+		return ppc_md.get_msi_ops(pdev);
+	return NULL;
+}
+
+/* Activated by pci=nomsi on the command line. */
+static int no_msi;
+
+void pci_no_msi(void)
+{
+	no_msi = 1;
+}
+
+
+/* msi_info helpers */
+
+static struct pci_dn *get_pdn(struct pci_dev *pdev)
+{
+	struct device_node *dn;
+	struct pci_dn *pdn;
+
+	dn = pci_device_to_OF_node(pdev);
+	if (!dn) {
+		pr_debug("get_pdn: no dn found for %s\n", pci_name(pdev));
+		return NULL;
+	}
+
+	pdn = PCI_DN(dn);
+	if (!pdn) {
+		pr_debug("get_pdn: no pci_dn found for %s\n", pci_name(pdev));
+		return NULL;
+	}
+
+	return pdn;
+}
+
+static int alloc_msi_info(struct pci_dev *pdev, int num,
+			struct msix_entry *entries, int type)
+{
+	struct msi_info *info;
+	unsigned int entries_size;
+	struct pci_dn *pdn;
+
+	entries_size = sizeof(struct msix_entry) * num;
+
+	info = kzalloc(sizeof(struct msi_info) + entries_size, GFP_KERNEL);
Shouldn't you do a second kzalloc for info->entries, and not just add on
the size to the end?
We could, but I don't see why it's better. It's a little sneaky to tack
the entries on the end but I don't see a problem with it?

There is a bug in there that I don't set the entries pointer before
doing the memcpy, but I've fixed that - or is that what you meant ? :)
Yeah...I was just pointing out there was a bug.  :)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help