| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Having a DOM-U guest with 1:1 mapping in the second stage MMU.
 > I cannot see any issues with the driver. Can you paste the device tree as dom0
> sees it? You can access it from /proc/device-tree (you can convert it to dts
> with dtc -I fs -O dts). And also the host device tree?
> 
> We should see something like the following (this example is taken from a 
> Xilinx
> ZynqMP):
> 
> 1) host device tree
> 
>         serial@ff000000 {
>                 u-boot,dm-pre-reloc;
>                 compatible = "cdns,uart-r1p12", "xlnx,xuartps";
>                 status = "okay";
>                 interrupt-parent = <0x4>;
>                 interrupts = <0x0 0x15 0x4>;
>                 reg = <0x0 0xff000000 0x0 0x1000>;
>                 clock-names = "uart_clk", "pclk";
>                 power-domains = <0x26 0x21>;
>                 clocks = <0x3 0x38 0x3 0x1f>;
>                 pinctrl-names = "default";
>                 pinctrl-0 = <0x37>;
>                 cts-override;
>                 device_type = "serial";
>                 port-number = <0x0>;
>         };
> 
> 
> 2) dom0 device tree
> 
>     The node is missing
> 
> 
> The key is that dom0 should not see the UART node in device tree at all.
> 
> If Dom0 is seeing the node, then it is a problem with Xen that somehow is not
> hiding it (see "Skip nodes used by Xen" under
> xen/arch/arm/domain_build.c:handle_node)
> 
> If Dom0 is *not* seeing the node, that what is the underlying device tree node
> that the dom0 driver is using to bring up /dev/ttyLF0?
> 
I looked under /proc/device-tree and Dom0 actually sees the node corresponding
to the serial device. That means Xen is not hiding it. 
I've pasted the host device tree at [0] and the Dom0 device tree at [1]
[0] https://pastebin.com/ir7VkfES
[1] https://pastebin.com/UqRDycHF
So this is the device in the host device tree:
    uart0:serial@401C8000 {
        compatible = "fsl,s32-linflexuart";
        reg = <0x0 0x401C8000 0x0 0x3000>;
        interrupts = <0 82 1>;
        clocks = <&clks S32GEN1_CLK_LIN_BAUD>,
                <&clks S32GEN1_CLK_LIN>;
        clock-names = "lin", "ipg";
        dmas = <&edma0 0 4>,
                <&edma0 0 3>;
        dma-names = "rx", "tx";
    };
And this is the device in the Dom0 device tree:
    serial@401C8000 {
        clock-names = "lin\0ipg";
        interrupts = <0x00 0x52 0x01>;
        clocks = <0x04 0x2a 0x04 0x2b>;
        dma-names = "rx\0tx";
        compatible = "fsl,s32-linflexuart";
        reg = <0x00 0x401c8000 0x00 0x3000>;
        dmas = <0x0e 0x00 0x04 0x0e 0x00 0x03>;
    };
From this story I figured out something else: that I was not passing to Xen's
bootargs "console=dtuart dtuart=serial0". Maybe that's why Xen is not hiding
the node from Dom0 (serial0 is an alias to uart0).
So I went on and I added that to bootargs. And now my Xen boot stops here
(DEBUG print on):
...
...
(XEN) fixed up name for siul2_reg@0x4401170C -> siul2_reg
(XEN) fixed up name for siul2_reg@0x4401174C -> siul2_reg
(XEN) fixed up name for usbmisc@44064200 -> usbmisc
(XEN) fixed up name for usb@44064000 -> usb
(XEN) fixed up name for memory_DDR0@80000000 -> memory_DDR0
(XEN) fixed up name for memory_DDR1@c0000000 -> memory_DDR1
(XEN) fixed up name for memory_DDR2@880000000 -> memory_DDR2
(XEN)  <- unflatten_device_tree()
(XEN) adding DT alias:can0: stem=can id=0 node=/flexcan@401B4000
(XEN) adding DT alias:can1: stem=can id=1 node=/flexcan@401BE000
(XEN) adding DT alias:can2: stem=can id=2 node=/flexcan@402A8000
(XEN) adding DT alias:can3: stem=can id=3 node=/flexcan@402B2000
(XEN) adding DT alias:serial0: stem=serial id=0 node=/serial@401C8000
(XEN) adding DT alias:serial1: stem=serial id=1 node=/serial@401CC000
(XEN) adding DT alias:serial2: stem=serial id=2 node=/serial@402BC000
(XEN) Platform: Generic System
(XEN) Looking for dtuart at "serial0", options ""
(XEN) DT: ** translation for device /serial@401C8000 **
(XEN) DT: bus is default (na=2, ns=2) on /
(XEN) DT: translating address:<3> 00000000<3> 401c8000<3>
(XEN) DT: reached root node
(XEN) dt_device_get_raw_irq: dev=/serial@401C8000, index=0
(XEN)  intspec=0 intlen=3
(XEN)  intsize=3 intlen=3
(XEN) dt_irq_map_raw: par=/interrupt-controller@50800000,intspec=[0x00000000 
0x00000052...],ointsize=3
(XEN) dt_irq_map_raw: ipar=/interrupt-controller@50800000, size=3
(XEN)  -> addrsize=2
(XEN)  -> got it� 
I started debugging and I found out that it hangs in:
console_init_preirq() -> __putstr(xen_banner()) -> sercon_puts() -> 
serial_puts() -> __serial_putc(),
where it spins at line 178:         
        /* Synchronous finite-capacity transmitter. */
        while ( !(n = port->driver->tx_ready(port)) )
            cpu_relax();
 
Which is a bit strange, considering that my serial device is asynchronous,
I think it should not get there. But it gets on that "else" branch because
port->txbuf is actually NULL at line 120 when it performs the check, and
it does not enter the branch for asynchronous transmitters.
Thanks,
Andrei Cherechesu,
NXP Semiconductors
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |