RE: [PATCH] bug in VIA PCI IRQ routing

From: Aleksey Gorelov
Date: Mon May 23 2005 - 14:55:29 EST




>-----Original Message-----
>From: Ondrej Zary [mailto:linux@xxxxxxxxxxxxxxxxxxxx]
>Sent: Monday, May 23, 2005 11:25 AM
>To: Aleksey Gorelov
>Cc: Karsten Keil; linux-kernel@xxxxxxxxxxxxxxx; Andrew Morton;
>jgarzik@xxxxxxxxx
>Subject: Re: [PATCH] bug in VIA PCI IRQ routing
>
>Aleksey Gorelov wrote:
>>>-----Original Message-----
>>>From: Karsten Keil [mailto:kkeil@xxxxxxx]
>>>Sent: Monday, May 23, 2005 5:59 AM
>>>To: linux-kernel@xxxxxxxxxxxxxxx
>>>Cc: Andrew Morton; Aleksey Gorelov
>>>Subject: [PATCH] bug in VIA PCI IRQ routing
>>>
>>>Hi,
>>>
>>>during certification of some systems with VIA 82C586_0 chipset
>>>we found that the PCI IRQ routing of PIRQD line goes wrong and
>>>the system
>>>will get stuck because of unacknowledged IRQs.
>>>It seems that the special case for PIRQD (pirq 4) is not
>needed for all
>>>VIA versions. With this patch, the IRQ routing on these systems works
>>>again (It did work with older 2.4 kernel versions prior the
>>>PIRQD change)
>>
>>
>> Does anybody have 82C586 datasheet to verify 0x57 register ?
>> For all I can say, both 82C686 & 8231 DO need special handling for
>> PIRQD,
>> since PIRQD routing is setup via bits 7-4 in 0x57 (see
>datasheets from
>> VIA
>> website). It seems like 82C586 might be different...
>>
>> Aleks.
>>
>
>This is from 82C586B datasheet (the 82C586A datasheet shows the same
>register layout):
>
>Note: The definitions of the fields of the following three
>registers were incorrectly documented in some earlier
>revisions of this document. The silicon has not changed
>and the following definition should be used for all silicon
>revisions:
>
>Offset 55 - PNP IRQ Routing 1
>....................................... RW
>These bits control routing for external IRQ inputs MIRQ0-1.
>7-4 PIRQD# Routing (see PnP IRQ routing table)
>3-0 MIRQ0 Routing (see PnP IRQ routing table)
>
>Offset 56 - PNP IRQ Routing 2
>....................................... RW
>7-4 PIRQA# Routing (see PnP IRQ routing table)
>3-0 PIRQB# Routing (see PnP IRQ routing table)
>
>Offset 57 - PNP IRQ Routing 3
>....................................... RW
>7-4 PIRQC# Routing (see PnP IRQ routing table)
>3-0 MIRQ1 Routing (see PnP IRQ routing table)
>
>Note: these bits must be set to 0 if Rx48[4]=1 and
>Rx59[1]=1 (input IRQ8# on MIRQ1 pin 106)
>
>PnP IRQ Routing Table
>0000 Disabled................................................. default
>0001 IRQ1
>0010 Reserved
>0011 IRQ3
>0100 IRQ4
>0101 IRQ5
>0110 IRQ6
>0111 IRQ7
>1000 Reserved
>1001 IRQ9
>1010 IRQ10
>1011 IRQ11
>1100 IRQ12
>1101 Reserved
>1110 IRQ14
>1111 IRQ15

Hmm, this is way different.

Karsten,

could you please verify if attached patch works for you ?
Another unknown C596 south bridge. I wonder if it the same as 586, or
closer to 686 ?

Aleks.

>
>
>>
>>>diff -urN linux-2.6.12-rc4-git7.org/arch/i386/pci/irq.c
>>>linux-2.6.12-rc4-git7/arch/i386/pci/irq.c
>>>--- linux-2.6.12-rc4-git7.org/arch/i386/pci/irq.c
>>>2005-05-23 13:35:48.562759583 +0200
>>>+++ linux-2.6.12-rc4-git7/arch/i386/pci/irq.c 2005-05-23
>>>13:41:47.349473060 +0200
>>>@@ -26,6 +26,7 @@
>>>
>>>static int broken_hp_bios_irq9;
>>>static int acer_tm360_irqrouting;
>>>+static int via_pirq_patch_value = 5;
>>>
>>>static struct irq_routing_table *pirq_table;
>>>
>>>@@ -217,12 +218,12 @@
>>> */
>>>static int pirq_via_get(struct pci_dev *router, struct
>>>pci_dev *dev, int pirq)
>>>{
>>>- return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
>>>+ return read_config_nybble(router, 0x55, pirq == 4 ?
>>>via_pirq_patch_value : pirq);
>>>}
>>>
>>>static int pirq_via_set(struct pci_dev *router, struct
>>>pci_dev *dev, int pirq, int irq)
>>>{
>>>- write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
>>>+ write_config_nybble(router, 0x55, pirq == 4 ?
>>>via_pirq_patch_value : pirq, irq);
>>> return 1;
>>>}
>>>
>>>@@ -512,6 +513,7 @@
>>> switch(device)
>>> {
>>> case PCI_DEVICE_ID_VIA_82C586_0:
>>>+ via_pirq_patch_value = 4;
>>> case PCI_DEVICE_ID_VIA_82C596:
>>> case PCI_DEVICE_ID_VIA_82C686:
>>> case PCI_DEVICE_ID_VIA_8231:
>>>
>>>--
>>>Karsten Keil
>>>SuSE Labs
>>>ISDN development
>>>
>>
>>
>> -
>> To unsubscribe from this list: send the line "unsubscribe
>linux-kernel" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>>
>
>
>--
>Ondrej Zary
>

Attachment: via.patch
Description: via.patch