qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/2] via-ide: Also emulate non 100% native mode


From: BALATON Zoltan
Subject: Re: [PATCH 2/2] via-ide: Also emulate non 100% native mode
Date: Wed, 4 Mar 2020 01:22:02 +0100 (CET)
User-agent: Alpine 2.22 (BSF 395 2020-01-19)

On Tue, 3 Mar 2020, Mark Cave-Ayland wrote:
On 02/03/2020 21:40, BALATON Zoltan wrote:
I had a quick look at the schematics linked from the page above, and they 
confirm
that the VIA IDE interface is connected directly to IRQs 14 and 15 and not to 
the PCI
interrupt pins.

Where did you see that? What I got from trying to look this up in the 
schematics was
that VT8231 has two pins named IRQ14 and IRQ15 (but described as Primary and
Secondary Channel Interrupt Request in doc) where the interrupt lines of the 
two IDE
ports/channels are connected but how they are routed within the chip after that 
was
not clear. The chip doc says that in native mode the interrupt should be 
configurable
and use a single interrupt for both channels and in legacy mode they use the 
usual 14
and 15 but this is not what guest drivers expect so I think not how really 
works on
PegasosII. It is true however that connection to PCI interrupts aren't 
mentioned so
it always uses ISA IRQ numbers, it just depends on legacy vs. native mode which 
line
is raised. But that was never really a question for VT8231 and maybe only CMD646
could have such interconnection with PCI interrupts. (Proabable reason is that
via-ide is part of a southbridge chip where it has connections to ISA bus while
CMD646 is a PCI IDE controller but I could be wrong as my knowledge is limited 
about
these.)

Presumably the VIA southbridge has its own internal pair of cascaded 8259s so 
the IRQ
line from the drive is connected to IRQ14/15 as per an typical ISA PC. You can 
see
this in the "Common Hardware Reference Platform: I/O Device Reference" PDF 
section 4.1.

Yes the VIA southbridge chip integrates all usual PC devices including PICs so these may have connection internally. I haven't checked these docs before but now I think another chapter in the doc you referenced and its companion "Common Hardware Reference Platform: A System Architecture" may explain the unusal combination of PCI like io regs with legacy interrupts the Pegasos2 seems to have. In the I/O Device Reference, chapter 11 about IDE says that the device must be addressed only with PCI I/O addresses where io addresses are completely relocatable and that when OpenFirmware passes control to the OS IDE must be configured as a PCI device. So this probably means io addresses coming from PCI BARs. But the CHRP System Architecture, chapter 9.2 about ISA devices says that "ISA devices included in a PCI part must route their interrupt signals to the legacy interrupt controller" and this is what the Pegasos2 seems to do. This may be a misinterpretation of the spec because elsewhere (I've lost the exact reference and have no time to find it again) it also says something about native devices must be using OpenPIC but Pegasos2 does not have OpenPIC so that part surely cannot apply anyway.

So on that basis the best explanation as to what is happening is the
comment in the link you provided here:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/arch/powerpc/platforms/chrp/pci.c?h=v4.14.172#n353


/* Pegasos2 firmware version 20040810 configures the built-in IDE controller
* in legacy mode, but sets the PCI registers to PCI native mode.
* The chip can only operate in legacy mode, so force the PCI class into legacy
* mode as well. The same fixup must be done to the class-code property in
* the IDE node /pci@80000000/ide@C,1
*/

I'm not sure that it makes much sense that the firmware configures the chip one 
way
then puts info about a different way in the device tree. There could be bugs 
but this
is not likely. Especially because I see in traces that the firmware does try to
configure the device in native mode. These are the first few accesses of the 
firmware
to via-ide:

But that is exactly what is happening! The comment above clearly indicates the
firmware incorrectly sets the IDE controller in native mode which is in exact
agreement with the trace you provide below. And in fact if you look at

I may be reading the comment wrong but to me that says that "firmware configures IDE in _legacy_ mode" whereas the trace shows it actually configures it in _native_ mode which is complying to the CHRP doc above. But since it cannot comply to the "native devices using OpenPIC" part it probably tries to apply the "ISA devices embedded in PCI" part and locks IRQ to 14 and 15. Or it just wants to avoid sharing IRQs as much as possible and the designers decided they will use IRQ14 and 15 for IDE.

https://www.powerdeveloper.org/platforms/pegasos/devicetree you can see the 
nvramrc
hack that was released in order to fix the device tree to boot Linux which 
alters the
class-code and sets interrupts to 14 (which I believe is invalid, but seemingly 
good
enough here).

Isn't this the same fixup that newer Linux kernels already include? Maybe this was needed before Linux properly supported Pegasos2 but later kernels will do this anyway. This does not give us any new info we did not have before I think maybe just easier to see all fixups in one place.

pci_cfg_write via-ide 12:1 @0x9 <- 0xf
pci_cfg_write via-ide 12:1 @0x40 <- 0xb
pci_cfg_write via-ide 12:1 @0x41 <- 0xf2
pci_cfg_write via-ide 12:1 @0x43 <- 0x35
pci_cfg_write via-ide 12:1 @0x44 <- 0x18
pci_cfg_write via-ide 12:1 @0x45 <- 0x1c
pci_cfg_write via-ide 12:1 @0x46 <- 0xc0
pci_cfg_write via-ide 12:1 @0x50 <- 0x17171717
pci_cfg_write via-ide 12:1 @0x54 <- 0x14
pci_cfg_read via-ide 12:1 @0x0 -> 0x5711106
pci_cfg_read via-ide 12:1 @0x0 -> 0x5711106
pci_cfg_read via-ide 12:1 @0x8 -> 0x1018f06
pci_cfg_read via-ide 12:1 @0xc -> 0x0
pci_cfg_read via-ide 12:1 @0x2c -> 0x11001af4
pci_cfg_read via-ide 12:1 @0x3c -> 0x10e
pci_cfg_read via-ide 12:1 @0x4 -> 0x2800080
pci_cfg_read via-ide 12:1 @0x3c -> 0x10e
pci_cfg_write via-ide 12:1 @0x3c <- 0x109

The very first write is to turn on native mode, so I think it's not about what 
the
firmware does but something about how hardware is wired on Pegasos II or the 
VT8231
chip itself that only allows legacy interrupts instead of 100% native mode for 
IDE.

Given that the DT is wrong, then we should assume that all OSs would have to
compensate for this in the same way as Linux, and therefore this should be 
handled
automatically.

AFAICT this then only leaves the question: why does the firmware set
PCI_INTERRUPT_LINE to 9, which is presumably why you are seeing problems running
MorphOS under QEMU.

Linux does try to handle both true native mode and half-native mode. It only 
uses
half-native mode if finds IRQ14 on Pegasos, otherwise skips Pegasos specific 
fixup
and uses true native mode setup. I don't know what MorphOS does but I think it 
justs
knows that Pegasos2 has this quirk and does not look at the device tree at all.

Could it be that setting prog-if to 0x8a legacy mode also resets 
PCI_INTERRUPT_LINE
to 14? You should be able to confirm this easily on real hardware using the 
Forth
config-* words on the IDE node and reading the prog-if byte before and after.

I don't have direct access to real hardware and would also need to come up with 
some
Forth to verify that but given the above trace that the firmware does before we 
can
enter any Forth we would likely find @0x9 = 0x8f and @0x3c = 0x0e because after
booting Linux we see 0x8a and 0x0e and Linux only touches the two mode bits.

Again to summarise: this is a known bug in Pegasos2 firmware and the VIA is a
standard chip, so let's try and figure out exactly what is happening using a 
real
firmware and emulate that behaviour in QEMU. This should then make all guests 
happy,
regardless of architecture, without requiring the introduction of feature bits 
or
risk of introducing other incompatibilities.

I think I've already done that with this patch (within the limits possible in QEMU). The Pegasos2 seems to always use IRQ14 and 15 even when IDE is set to native mode (which the firmware does immediately, I'm using a real firmware to test) and all guests are happy with this. This behaviour is confirmed by excpectations of AmigaOS and MorphOS drivers and also Linux comments (although those comments may get the reason wrong, they confirm the behaviour). I'm not sure how real hardware implements this behaviour and also not sure if it's a bug in the firmware or rather a peculiar design choice for Pegasos2. But that probably does not matter for the fact that it's how it works which is all we need to emulate it.

Also consider that QEMU via-ide is only emulating native mode of the chip because we can't switch between the two modes so it's either legacy only or native only because all other implemented controllers are either ISA or native PCI so QEMU does not have way to deregister ISA IDE and PCI code does not have way to use io BARs despite not being enabled via PCI config which could be needed to use them when device is in legacy mode. Previously via-ide was emulating legacy only and that worked with Linux but not with anything else. I'm not planning to rewrite large parts of the IDE and PCI code to allow switching back and forth which is not even needed. Unless you know a better way to implement this I think the proposed patch is achieving this with minimal changes. I don't see a need to more exactly emulate some kind of hardware bug or peculiar design choices of a board than what's needed to make clients happy and boot.

Is this series good enough now to be merged or are any changes needed? I'd like to not miss the deadline for the freeze and get this delayed for months for not good reason because I'm not sure when will I have time to work on it again.

Regards,
BALATON Zoltan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]