From: "Randy.Dunlap" <rddunlap@osdl.org>
To: jayalk@intworks.biz
Cc: gregkh@suse.de, linux-kernel@vger.kernel.org,
linux-pci@atrey.karlin.mff.cuni.cz
Subject: Re: [PATCH 2.6.11.2 1/1] PCI Allow OutOfRange PIRQ table address
Date: Wed, 16 Mar 2005 19:34:50 -0800 [thread overview]
Message-ID: <4238FADA.5090504@osdl.org> (raw)
In-Reply-To: <200503170124.j2H1O2Ar024405@intworks.biz>
jayalk@intworks.biz wrote:
> Hi Greg, PCI folk,
>
> I updated this to change pirq_table_addr to a long, and to add a warning
> msg if the PIRQ table wasn't found at the specified address, as per thread
> with Matthew Wilcox. Let me know if it's okay. Thanks.
>
> In our hardware situation, the BIOS is unable to store or generate it's PIRQ
> table in the F0000h-100000h standard range. This patch adds a pci kernel
> parameter, pirqaddr to allow the bootloader (or BIOS based loader) to inform
> the kernel where the PIRQ table got stored. A beneficial side-effect is that,
> if one's BIOS uses a static address each time for it's PIRQ table, then
> pirqaddr can be used to avoid the $pirq search through that address block each
> time at boot for normal PIRQ BIOSes.
>
> Signed-off-by: Jaya Kumar <jayalk@intworks.biz>
>
> diff -uprN -X dontdiff linux-2.6.11.2-vanilla/arch/i386/pci/common.c linux-2.6.11.2/arch/i386/pci/common.c
> --- linux-2.6.11.2-vanilla/arch/i386/pci/common.c 2005-03-10 16:31:25.000000000 +0800
> +++ linux-2.6.11.2/arch/i386/pci/common.c 2005-03-11 20:35:41.000000000 +0800
> @@ -25,6 +25,7 @@ unsigned int pci_probe = PCI_PROBE_BIOS
>
> int pci_routeirq;
> int pcibios_last_bus = -1;
> +unsigned long pirq_table_addr = 0;
Don't need to init above (or below) to 0.
> struct pci_bus *pci_root_bus = NULL;
> struct pci_raw_ops *raw_pci_ops;
>
> @@ -188,6 +189,9 @@ char * __devinit pcibios_setup(char *st
> } else if (!strcmp(str, "biosirq")) {
> pci_probe |= PCI_BIOS_IRQ_SCAN;
> return NULL;
> + } else if (!strncmp(str, "pirqaddr=", 9)) {
> + pirq_table_addr = simple_strtol(str+9, NULL, 0);
Use simple_strtoul().
> + return NULL;
> }
> #endif
> #ifdef CONFIG_PCI_DIRECT
> diff -uprN -X dontdiff linux-2.6.11.2-vanilla/arch/i386/pci/irq.c linux-2.6.11.2/arch/i386/pci/irq.c
> --- linux-2.6.11.2-vanilla/arch/i386/pci/irq.c 2005-03-10 16:31:25.000000000 +0800
> +++ linux-2.6.11.2/arch/i386/pci/irq.c 2005-03-11 20:40:28.000000000 +0800
> @@ -58,6 +58,35 @@ struct irq_router_handler {
> int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL;
>
> /*
> + * Check passed address for the PCI IRQ Routing Table signature
> + * and perform checksum verification.
> + */
> +
> +static inline struct irq_routing_table * __init pirq_check_routing_table(u8 *addr)
This doesn't need to be both inline and __init.
> +{
> + struct irq_routing_table *rt;
> + int i;
> + u8 sum;
> +
> + rt = (struct irq_routing_table *) addr;
> + if (rt->signature != PIRQ_SIGNATURE ||
> + rt->version != PIRQ_VERSION ||
> + rt->size % 16 ||
> + rt->size < sizeof(struct irq_routing_table))
> + return NULL;
> + sum = 0;
> + for(i=0; i<rt->size; i++)
Space after for: "for ("
Spaces around "<" would be nice for readability.
> + sum += addr[i];
> + if (!sum) {
> + DBG("PCI: Interrupt Routing Table found at 0x%p\n", rt);
> + return rt;
> + }
> + return NULL;
> +}
> +
> +
> +
> +/*
> * Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table.
> */
>
> @@ -65,21 +94,17 @@ static struct irq_routing_table * __init
> {
> u8 *addr;
> struct irq_routing_table *rt;
> - int i;
> - u8 sum;
>
> + if (pirq_table_addr) {
> + rt = pirq_check_routing_table((u8 *) __va(pirq_table_addr));
> + if (rt) {
> + return rt;
> + }
No braces when not needed for block of statements.
> + printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
> + }
> for(addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
> - rt = (struct irq_routing_table *) addr;
> - if (rt->signature != PIRQ_SIGNATURE ||
> - rt->version != PIRQ_VERSION ||
> - rt->size % 16 ||
> - rt->size < sizeof(struct irq_routing_table))
> - continue;
> - sum = 0;
> - for(i=0; i<rt->size; i++)
> - sum += addr[i];
> - if (!sum) {
> - DBG("PCI: Interrupt Routing Table found at 0x%p\n", rt);
> + rt = pirq_check_routing_table(addr);
> + if (rt) {
> return rt;
> }
> }
> diff -uprN -X dontdiff linux-2.6.11.2-vanilla/arch/i386/pci/pci.h linux-2.6.11.2/arch/i386/pci/pci.h
> --- linux-2.6.11.2-vanilla/arch/i386/pci/pci.h 2005-03-10 16:31:25.000000000 +0800
> +++ linux-2.6.11.2/arch/i386/pci/pci.h 2005-03-11 20:35:55.000000000 +0800
> @@ -27,6 +27,7 @@
> #define PCI_ASSIGN_ALL_BUSSES 0x4000
>
> extern unsigned int pci_probe;
> +extern unsigned long pirq_table_addr;
>
> /* pci-i386.c */
>
> diff -uprN -X dontdiff linux-2.6.11.2-vanilla/Documentation/kernel-parameters.txt linux-2.6.11.2/Documentation/kernel-parameters.txt
> --- linux-2.6.11.2-vanilla/Documentation/kernel-parameters.txt 2005-03-10 16:31:44.000000000 +0800
> +++ linux-2.6.11.2/Documentation/kernel-parameters.txt 2005-03-10 16:45:48.000000000 +0800
> @@ -967,6 +967,10 @@ running once the system is up.
> irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
> automatically to PCI devices. You can make the kernel
> exclude IRQs of your ISA cards this way.
> + pirqaddr=0xAAAAA [IA-32] Specify the physical address
> + of the PIRQ table (normally generated
> + by the BIOS) if it is outside the .
What is the trailing " . " here? (above)
> + F0000h-100000h range.
> lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
> if the kernel is unable to find your secondary buses
> and you want to tell it explicitly which ones they are.
> -
--
~Randy
next prev parent reply other threads:[~2005-03-17 3:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-17 1:24 [PATCH 2.6.11.2 1/1] PCI Allow OutOfRange PIRQ table address jayalk
2005-03-17 3:34 ` Randy.Dunlap [this message]
-- strict thread matches above, loose matches on Subject: below --
2005-03-22 4:20 jayalk
2005-03-17 6:50 jayalk
2005-03-17 6:36 jayalk
2005-03-17 1:16 jayalk
2005-03-10 13:29 jayalk
2005-03-10 13:42 ` Matthew Wilcox
2005-03-11 12:44 ` jayalk
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=4238FADA.5090504@osdl.org \
--to=rddunlap@osdl.org \
--cc=gregkh@suse.de \
--cc=jayalk@intworks.biz \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@atrey.karlin.mff.cuni.cz \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox