public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
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

  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