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. :)