It's a 2.4.19 change, I call it a bug, but maybe they had some reason?
2.4.19 code: /* * Cyrix: nibble offset 0x5C */ static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) { return read_config_nybble(router, 0x5C, (pirq-1)^1); }
static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) { write_config_nybble(router, 0x5C, (pirq-1)^1, irq); return 1; }
2.4.17 code: /* * Cyrix: nibble offset 0x5C */ static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) { return read_config_nybble(router, 0x5C, pirq-1); }
static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) { write_config_nybble(router, 0x5C, pirq-1, irq); return 1; }
Note the ^1, which flips the low-order bit. I commented this ^1 out on 2.4.19 and everything works as it should. The error was consistent with an incorrect flipping of the low-order bit. I have no idea why this change would have been put into place, or if it was even tested.
I do know some geode BIOSes have screwed-up IRQ tables in flash, so maybe they were fixing a problem but doing it the wrong way. Not sure.
I know we have some Linux kernel guys on the list, forward to whoever needs to see this if you wish.
ron
"Ronald G. Minnich" rminnich@lanl.gov writes:
Note the ^1, which flips the low-order bit. I commented this ^1 out on 2.4.19 and everything works as it should. The error was consistent with an incorrect flipping of the low-order bit. I have no idea why this change would have been put into place, or if it was even tested.
I do know some geode BIOSes have screwed-up IRQ tables in flash, so maybe they were fixing a problem but doing it the wrong way. Not sure.
I know we have some Linux kernel guys on the list, forward to whoever needs to see this if you wish.
I think Alan Cox added this because all of his MediaGX/Geode boards have a buggered BIOS.
You'd better tell him that he's wrong. :-)
/Christer