All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Wong <kernel-AAfBIQCtFhbR7s880joybQ@public.gmane.org>
To: Andrew de Quincey <adq_dvb-fmPXVN3awWJAJAzL26g0SA@public.gmane.org>
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	Andew Grover
	<andrew.grover-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH] Drop back to extended IRQ resource type
Date: Tue, 2 Sep 2003 08:48:20 -0700	[thread overview]
Message-ID: <20030902154820.GA961@gambit.implode.net> (raw)
In-Reply-To: <200308301956.41007.adq_dvb-fmPXVN3awWJAJAzL26g0SA@public.gmane.org>

The patch does appear to give the card an IRQ, but it does not appear to
be valid.  Doesn't the IRQ only go up to 24 on a single APIC processor?
The IRQ of 27 does not get registered in /proc/interrupts either.

           CPU0
  0:     401852          XT-PIC  timer
  1:       2680    IO-APIC-edge  i8042
  2:          0          XT-PIC  cascade
  8:          4    IO-APIC-edge  rtc
  9:          0   IO-APIC-level  acpi
 12:       3251    IO-APIC-edge  i8042
 14:       1096    IO-APIC-edge  ide0
 15:         11    IO-APIC-edge  ide1
 18:          0   IO-APIC-level  EMU10K1
 22:   17386129   IO-APIC-level  eth0
NMI:          0
LOC:     401701
ERR:          0
MIS:          0


With the patch applied (using 2.6.0-test4):

02:00.0 VGA compatible controller: nVidia Corporation NV15 [GeForce2 -
nForce GPU] (rev b1) (prog-if 00 [VGA])
        Subsystem: nVidia Corporation: Unknown device 0c11
        Flags: bus master, 66Mhz, medium devsel, latency 32, IRQ 27
        Memory at e5000000 (32-bit, non-prefetchable) [size=16M]
        Memory at e8000000 (32-bit, prefetchable) [size=128M]
        Expansion ROM at e7ff0000 [disabled] [size=64K]
        Capabilities: [60] Power Management version 2
        Capabilities: [44] AGP version 2.0

Without patch (2.4.22, also exhibited on 2.6.0-test4)
02:00.0 VGA compatible controller: nVidia Corporation NV15 [GeForce2 -
nForce GPU] (rev b1) (prog-if 00 [VGA])
        Subsystem: nVidia Corporation: Unknown device 0c11
        Flags: bus master, 66Mhz, medium devsel, latency 32, IRQ -19
        Memory at e5000000 (32-bit, non-prefetchable) [size=16M]
        Memory at e8000000 (32-bit, prefetchable) [size=128M]
        Expansion ROM at e7ff0000 [disabled] [size=64K]
        Capabilities: [60] Power Management version 2
        Capabilities: [44] AGP version 2.0


On Sat, Aug 30, 2003 at 07:56:41PM +0100, Andrew de Quincey wrote:
> On Friday 29 Aug 2003 5:50 am, John Wong wrote:
> > On the nForce original with the onboard GeForce2 video, the BIOS does
> > assign IRQ 11 to the onboard video, however, Linux does not.  Setting
> > acpi=off and pci=noirq does not fix the problem.  I have a nForce2 board
> > without onboard video and ACPI/IO-APIC etc all work fine.
> 
> Hi, the attached patch should resolve this issue. Originally, if an IRQ is 
> <=15, the code always used a standard IRQ descriptor when calling the _SRS 
> method. 
> 
> However, certain BIOSes always expect an extended IRQ descriptor, and fail 
> when passed a standard one. This patch drops back to an extended descriptor 
> if a set with a standard one fails... you'll still see the BUFFER LIMIT 
> message, but you should now see it saying "Retrying with extended IRQ 
> descriptor".. and hopefully succeeding the second time.

> 
> --- linux-2.4.22.orig/drivers/acpi/pci_link.c	2003-08-25 12:44:41.000000000 +0100
> +++ linux-2.4.22/drivers/acpi/pci_link.c	2003-08-30 18:54:35.000000000 +0100
> @@ -290,7 +290,8 @@
>  	struct acpi_buffer	buffer = {sizeof(resource)+1, &resource};
>  	int			i = 0;
>  	int			valid = 0;
> -
> +	int			resource_type = 0;
> +   
>  	ACPI_FUNCTION_TRACE("acpi_pci_link_set");
>  
>  	if (!link || !irq)
> @@ -313,12 +314,23 @@
>  		}
>  	}
>  
> +	/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
> +	 * an extended one */
> +	if (irq <= 15) {
> +		resource_type = ACPI_RSTYPE_IRQ;
> +	} else {
> +		resource_type = ACPI_RSTYPE_EXT_IRQ;
> +	}
> +
> +retry_programming:
> +   
>  	memset(&resource, 0, sizeof(resource));
>  
>  	/* NOTE: PCI interrupts are always level / active_low / shared. But not all
>  	   interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for 
>  	   parameters */
> -	if (irq <= 15) {
> +	switch(resource_type) {
> +	case ACPI_RSTYPE_IRQ:
>  		resource.res.id = ACPI_RSTYPE_IRQ;
>  		resource.res.length = sizeof(struct acpi_resource);
>  		resource.res.data.irq.edge_level = link->irq.edge_level;
> @@ -326,8 +338,9 @@
>  		resource.res.data.irq.shared_exclusive = ACPI_SHARED;
>  		resource.res.data.irq.number_of_interrupts = 1;
>  		resource.res.data.irq.interrupts[0] = irq;
> -	}
> -	else {
> +		break;
> +	   
> +	case ACPI_RSTYPE_EXT_IRQ:
>  		resource.res.id = ACPI_RSTYPE_EXT_IRQ;
>  		resource.res.length = sizeof(struct acpi_resource);
>  		resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
> @@ -337,11 +350,22 @@
>  		resource.res.data.extended_irq.number_of_interrupts = 1;
>  		resource.res.data.extended_irq.interrupts[0] = irq;
>  		/* ignore resource_source, it's optional */
> +		break;
>  	}
>  	resource.end.id = ACPI_RSTYPE_END_TAG;
>  
>  	/* Attempt to set the resource */
>  	status = acpi_set_current_resources(link->handle, &buffer);
> +   
> +
> +	/* if we failed and IRQ <= 15, try again with an extended descriptor */
> +	if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) {
> +                resource_type = ACPI_RSTYPE_EXT_IRQ;
> +                printk(PREFIX "Retrying with extended IRQ descriptor\n");
> +                goto retry_programming;
> +	}
> +  
> +	/* check for total failure */
>  	if (ACPI_FAILURE(status)) {
>  		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
>  		return_VALUE(-ENODEV);

> 
> --- linux-2.6.0-test4.orig/drivers/acpi/pci_link.c	2003-08-23 00:52:08.000000000 +0100
> +++ linux-2.6.0-test4/drivers/acpi/pci_link.c	2003-08-30 18:54:39.000000000 +0100
> @@ -294,6 +294,7 @@
>  	struct acpi_buffer	buffer = {sizeof(resource)+1, &resource};
>  	int			i = 0;
>  	int			valid = 0;
> +	int			resource_type = 0;
>  
>  	ACPI_FUNCTION_TRACE("acpi_pci_link_set");
>  
> @@ -317,20 +318,32 @@
>  		}
>  	}
>  
> +	/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
> +	 * an extended one */
> +	if (irq <= 15) {
> +		resource_type = ACPI_RSTYPE_IRQ;
> +	} else {
> +		resource_type = ACPI_RSTYPE_EXT_IRQ;
> +	}
> +
> +retry_programming:
> +   
>  	memset(&resource, 0, sizeof(resource));
>  
>  	/* NOTE: PCI interrupts are always level / active_low / shared. But not all
>  	   interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for 
>  	   parameters */
> -	if (irq <= 15) {
> +	switch(resource_type) {
> +	case ACPI_RSTYPE_IRQ:
>  		resource.res.id = ACPI_RSTYPE_IRQ;
>  		resource.res.length = sizeof(struct acpi_resource);
>  		resource.res.data.irq.edge_level = link->irq.edge_level;
>  		resource.res.data.irq.active_high_low = link->irq.active_high_low;
>  		resource.res.data.irq.number_of_interrupts = 1;
>  		resource.res.data.irq.interrupts[0] = irq;
> -	}
> -	else {
> +		break;
> +	   
> +	case ACPI_RSTYPE_EXT_IRQ:
>  		resource.res.id = ACPI_RSTYPE_EXT_IRQ;
>  		resource.res.length = sizeof(struct acpi_resource);
>  		resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
> @@ -339,11 +352,21 @@
>  		resource.res.data.extended_irq.number_of_interrupts = 1;
>  		resource.res.data.extended_irq.interrupts[0] = irq;
>  		/* ignore resource_source, it's optional */
> +		break;
>  	}
>  	resource.end.id = ACPI_RSTYPE_END_TAG;
>  
>  	/* Attempt to set the resource */
>  	status = acpi_set_current_resources(link->handle, &buffer);
> +
> +	/* if we failed and IRQ <= 15, try again with an extended descriptor */
> +	if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) {
> +                resource_type = ACPI_RSTYPE_EXT_IRQ;
> +                printk(PREFIX "Retrying with extended IRQ descriptor\n");
> +                goto retry_programming;
> +	}
> +  
> +	/* check for total failure */
>  	if (ACPI_FAILURE(status)) {
>  		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
>  		return_VALUE(-ENODEV);
> @@ -458,14 +481,14 @@
>  		irq = link->irq.possible[0];
>  	}
>  
> -		/* 
> -		 * Select the best IRQ.  This is done in reverse to promote 
> -		 * the use of IRQs 9, 10, 11, and >15.
> -		 */
> -		for (i=(link->irq.possible_count-1); i>0; i--) {
> -			if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
> -				irq = link->irq.possible[i];
> -		}
> +	/* 
> +	 * Select the best IRQ.  This is done in reverse to promote 
> +	 * the use of IRQs 9, 10, 11, and >15.
> +	 */
> +	for (i=(link->irq.possible_count-1); i>0; i--) {
> +		if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
> +			irq = link->irq.possible[i];
> +	}
>  
>  	/* Attempt to enable the link device at this IRQ. */
>  	if (acpi_pci_link_set(link, irq)) {



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf

  parent reply	other threads:[~2003-09-02 15:48 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-08-29  4:50 PCI IRQ routing strangeness with 2.4.22 on A7N266-VM (original nForce) John Wong
     [not found] ` <20030829045032.GA688-XxA8UMA2PDBPKbTXaf03yKxOck334EZe@public.gmane.org>
2003-08-30 12:02   ` Andrew de Quincey
2003-08-30 18:56   ` [PATCH] Drop back to extended IRQ resource type Andrew de Quincey
     [not found]     ` <200308301956.41007.adq_dvb-fmPXVN3awWJAJAzL26g0SA@public.gmane.org>
2003-09-02 15:48       ` John Wong [this message]
     [not found]         ` <20030902154820.GA961-XxA8UMA2PDBPKbTXaf03yKxOck334EZe@public.gmane.org>
2003-09-02 16:52           ` Andrew de Quincey
2003-09-02 16:53           ` Andrew de Quincey
     [not found]             ` <200309021753.36646.adq_dvb-fmPXVN3awWJAJAzL26g0SA@public.gmane.org>
2003-09-02 16:23               ` John Wong
     [not found]                 ` <20030902162312.GA1011-XxA8UMA2PDBPKbTXaf03yKxOck334EZe@public.gmane.org>
2003-09-02 17:31                   ` Andrew de Quincey

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=20030902154820.GA961@gambit.implode.net \
    --to=kernel-aafbiqctfhbr7s880joybq@public.gmane.org \
    --cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=adq_dvb-fmPXVN3awWJAJAzL26g0SA@public.gmane.org \
    --cc=andrew.grover-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.