OSDev.org
https://forum.osdev.org/

Hard drive not firing IRQ in PCI compatibility mode
https://forum.osdev.org/viewtopic.php?f=1&t=33229
Page 1 of 1

Author:  xvi [ Wed Oct 10, 2018 8:52 am ]
Post subject:  Hard drive not firing IRQ in PCI compatibility mode

Hello everyone,

my IDE driver works qemu, but on real hardware I don't get an interrupt. The drive is connected via SATA cable and I've set the the SATA Mode in BIOS to "IDE".

I read the PCI configuration space where I found the SATA controller in IDE mode (bus: 0, device: 0x1f, function: 0x2) with following values:

Code:
Device ID       0x8c80
Vendor ID       0x8086
Status          0x2b0
Command         0x7
Class Code      0x1
Subclass        0x1
Prog IF         0x8f
Revision ID     0
Header Type     0
Bar0            0xf0b1
Bar1            0xf0a1
Bar2            0xf091
Bar3            0xf081
Bar4            0xf071
Bar5            0xf061
Interrupt pin   0x2
Interrupt Line  0xf

Prog IF has value 0x8F which means "PCI native mode controller, supports both channels switched to ISA compatibility mode, supports bus mastering", so
I changed its value to 0x8A (ISA Compatibility mode controller, supports both channels switched to PCI native mode, supports bus mastering) to enable ISA compatibility mode.

Now, I use these addresses for the driver:
First channel:
cmd: 0x1F0
cnl: 0x3F6
Second channel:
cmd: 0x170
cnl: 0x376

I followed the tutorial on PCI IDE [1] and ATA PIO [2] and found the drive on channel 0, drive 0 as ATA device. When trying to read I wait for BUSY bit to be cleared, set the drive/sector, wait for DRDY bit to be set, then send the command:

Code:
outb(cmd + COMMAND_REGISTER, 0x20); // COMMAND_REGISTER = 0x7

Now, I expect the interrupt 14 to happen, but it does not. The nIEN bit is cleared, the error register does not indicate any error, status register has value 0x58, command register also has value 0x58 (the same as in qemu).

Are there any other steps involved that I have missed?

I checked how linux handles this via lspci -v command. There, the sata controller is in PCI native mode (prog-if: 0x8f) and IRQ 19 is used so it seems IOAPIC is used? Do I also have to parse the MADT/APIC to get the mapping and use this instead of switching to PCI compatibility mode and use IRQ 14?

Thanks in advance!


[1] https://wiki.osdev.org/PCI_IDE_Controller
[2] https://wiki.osdev.org/ATA_PIO_Mode

Author:  Octocontrabass [ Thu Oct 11, 2018 2:35 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

Check the PIC ISR and IRR. Have they both received IRQ14? Are either waiting for you to acknowledge IRQ14 before they can send another IRQ14?

It's also possible the SATA controller supports the legacy IRQs but isn't connected to send them anywhere. You'll need to support the IOAPIC at some point, so now might be a good time to work that out.

Author:  xvi [ Fri Oct 12, 2018 3:51 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

I checked IRR and ISR, IRR is sometimes 0x1 (should be the keyboard driver, which is working with IRQs) and ISR is always 0x0.

Then I'll try IOAPIC at this point, thank you.

And just for understanding:
I've read the data sheet of the chipset I'm using (Intel H97), section 5.9 (8259 Programmable Interrupt Controllers (PIC))) mentions the following:
Quote:
The PCH incorporates the functionality of two 8259 interrupt controllers that provide system interrupts for the ISA compatible interrupts. These interrupts can include: system timer, keyboard controller, serial ports, parallel ports, floppy disk, mouse, and DMA channels. In addition, this interrupt controller can support the PCI based interrupts, by mapping the PCI interrupt onto the compatible ISA interrupt line. Each 8259 controller supports eight interrupts, numbered 0–7. Table 5-13 shows how the controllers are connected.

So this means, it is entirely chip dependant if some (legacy) functionality is available (e.g. SATA controller in IDE mode connected to legacy IRQs)?

Author:  Octocontrabass [ Fri Oct 12, 2018 4:16 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

xvi wrote:
I checked IRR and ISR, IRR is sometimes 0x1 (should be the keyboard driver, which is working with IRQs) and ISR is always 0x0.

You're checking both PICs, right?

xvi wrote:
So this means, it is entirely chip dependant if some (legacy) functionality is available (e.g. SATA controller in IDE mode connected to legacy IRQs)?

Yes. That datasheet makes it sound like the legacy IDE IRQs are connected, so I'm not sure why it's not working for you, unless the chipset requires some extra configuration to enable it.

Author:  xvi [ Fri Oct 12, 2018 9:14 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

Quote:
You're checking both PICs, right?

Yes. I read the registers as it is shown in the osdev wiki (8259 PIC).
Code:
outb(PIC1_CMD, ocw3);
outb(PIC2_CMD, ocw3);
return (inb(PIC2_CMD) << 8) | inb(PIC1_CMD);


Quote:
Yes. That datasheet makes it sound like the legacy IDE IRQs are connected, so I'm not sure why it's not working for you, unless the chipset requires some extra configuration to enable it.

So if there is any extra configuration to be done, is there any specific source to read? So far, I have read the data sheet of the chip I'm using, PCI IDE controller specification and the ATA-ATAPI 6 specification. There are some specific mentions regarding legacy IRQs in the PCI IDE specification that I have already tried, but with no effect. I can try that again, maybe I have missed something there.

Author:  Octocontrabass [ Sat Oct 13, 2018 1:04 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

You could try looking for a specification update for the chipset, but aside from that I don't know of any easily available documentation that would tell you what you need to know.

There's some more information for firmware developers that certainly covers everything you need, but Intel requires a NDA to see any of those documents.

Author:  xvi [ Sat Oct 13, 2018 5:41 am ]
Post subject:  Re: Hard drive not firing IRQ in PCI combabitility mode

Quote:
You could try looking for a specification update for the chipset, but aside from that I don't know of any easily available documentation that would tell you what you need to know.

There's some more information for firmware developers that certainly covers everything you need, but Intel requires a NDA to see any of those documents.

Okay, then I'll reread it again and if that does'nt work, I'll try IOAPIC.

Thank you very much for your help!

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/