qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] fsl-imx6: Swap Ethernet interrupt defines


From: Guenter Roeck
Subject: Re: [Qemu-devel] [PATCH] fsl-imx6: Swap Ethernet interrupt defines
Date: Thu, 8 Mar 2018 06:47:45 -0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0

On 03/08/2018 02:50 AM, Peter Maydell wrote:
On 7 March 2018 at 17:37, Guenter Roeck <address@hidden> wrote:
The sabrelite machine model used by qemu-system-arm is based on the
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
controller which is supported in QEMU using the imx_fec.c module
(actually called imx.enet for this model.)

The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
imx.enet device like this:

  #define FSL_IMX6_ENET_MAC_1588_IRQ 118
  #define FSL_IMX6_ENET_MAC_IRQ 119

According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
interrupts are as follows.

150 ENET MAC 0 IRQ
151 ENET MAC 0 1588 Timer interrupt

where

150 - 32 == 118
151 - 32 == 119

In other words, the vector definitions in the fsl-imx6.h file are reversed.

This results in lost interrupt warnings when running recent (v4.15+) Linux
kernels, and the Ethernet interface will fail to probe.

Note that applying this patch will cause problems with older Linux kernels:
The Ethernet interface will fail to probe with Linux v4.9 and earlier.
Linux v4.1 and earlier will crash. This is a Linux kernel problem, not a
qemu problem: the Linux kernel only worked by accident since it requested
both interrupts.

So do the works-by-accident kernels fail on QEMU because
we don't emulate some bit of the ethernet device ?
Ideally we could fix that so we could boot newer kernels
without breaking the old ones...


As mentioned, older versions of Linux assign both interrupt lines instead of one
to the Ethernet interrupt handler. After applying this patch, this causes the 
probe
function to fail. This in turn results in 4.1 and earlier to crash, This is 
fixed
by applying upstream commit 32cba57ba7 to those kernels. I asked upstream 
maintainers
to apply this patch to 3.18.y and 4.1.y.

The wrong interrupt problem is solved in Linux with upstream commit 
4c8777892e80b,
as I pointed out in bugzilla. With this patch applied, older versions of Linux 
(4.9
and older) work with qemu, both with and without this patch. What I don't know 
is if
older versions of Linux still work on real hardware with 4c8777892e80b applied.

I don't know if a fix working for all versions of Linux is even possible. 
Creating both
interrupts might be an option, but would likely cause other problems since some 
versions
of Linux would handle the same interrupt twice, while others expect the second 
interrupt
to be associated with the timer.

Guenter



reply via email to

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