[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 |