[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-users] Enabling SMMU for a bare metal guest
On Wed, Jun 22, 2016 at 12:11:53PM -0400, Jarvis Roach wrote: > Hi Julien, > > Thanks for taking a look, and please excuse any faux paus of mailing list > etiquette I am about to commit... > > > On Wed, Jun 22, 2016 at 10:43 AM, Julien Grall <julien.grall@xxxxxxx> wrote: > > > Hello Jarvis, > > > > I have CCed Edgar who did the bring of Xen on Xilinx Zinqmp > > > > > > On 21/06/16 15:40, Jarvis Roach wrote: > > > >> I've been working on passing an ethernet controller through to a bare > >> metal guest running on an Xilinx Z US+ MPSoC platform. I got it working, > >> but only by using the system's physical address (PA) for DMA buffers and > >> descriptors instead of using the guest's intermediate physical address > >> (IPA), aka guest phyiscal address. > >> > >> I am aware of Julien's presentation on passthrough, and I am successful > >> in passing the ethernet device through to a Linux guest, but when I > >> follow the same steps for my bare metal guest, the IPA->PA translation > >> doesn't seem to be happening. I would expect that if the SMMU was active > >> for that ethernet controller then a) using PA for DMA buffers and > >> descriptors should result in a translation fault, and b) using IPA for > >> the same would work, neither of which is true. > >> > > > > Can you provide the guest configuration you are using? > > > I'll start with the revelant snippets. Please let me know if you'd like to > see the entire files. > > Relevant xen.dts: > > smmu@fd800000 { > compatible = "arm,mmu-500"; > reg = <0x0 0xfd800000 0x0 0x20000>; > #global-interrupts = <0x1>; > interrupt-parent = <0x1>; > interrupts = <0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b > 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 > 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 0x0 0x9b 0x4 > 0x0 0x9b 0x4>; > mmu-masters = <&ser1 0x876 &ttc1 0x877 &gem3 0x878>; Hi Jarvis, These don't look correct. These are the GEM master-ids: &gem0 0x874 &gem1 0x875 &gem2 0x876 &gem3 0x877 The serial ports and ttc timers are not DMA capable and shouldn't be listed there. Also these master-ids are tied to a device in HW, it's not possible to edit/change these in SW or DTS at choice. Here's a list the DTS in linux: mmu-masters = < &gem0 0x874 &gem1 0x875 &gem2 0x876 &gem3 0x877 &usb0 0x860 &usb1 0x861 &qspi 0x873 &lpd_dma_chan1 0x868 &lpd_dma_chan2 0x869 &lpd_dma_chan3 0x86a &lpd_dma_chan4 0x86b &lpd_dma_chan5 0x86c &lpd_dma_chan6 0x86d &lpd_dma_chan7 0x86e &lpd_dma_chan8 0x86f &fpd_dma_chan1 0x14e8 &fpd_dma_chan2 0x14e9 &fpd_dma_chan3 0x14ea &fpd_dma_chan4 0x14eb &fpd_dma_chan5 0x14ec &fpd_dma_chan6 0x14ed &fpd_dma_chan7 0x14ee &fpd_dma_chan8 0x14ef &sdhci0 0x870 &sdhci1 0x871 &nand0 0x872>; Best regards, Edgar > > }; > . > . > . > gem3:ethernet@ff0e0000 { > #stream-id-cells = <0x1>; > compatible = "cdns,gem"; > status = "disabled"; > interrupt-parent = <0x1>; > interrupts = <0x0 0x3f 0x4 0x0 0x3f 0x4>; > reg = <0x0 0xff0e0000 0x1000>; > clock-names = "pclk", "hclk", "tx_clk"; > #address-cells = <0x1>; > #size-cells = <0x0>; > jumbo-max-len = <0x2800>; > jumbo-supported; > clocks = <0x3 0x3 0x3>; > phy-mode = "rgmii-id"; > xlnx,ptp-enet-clock = <0x0>; > local-mac-address = [00 0a 35 00 22 01]; > phy-handle = <0x4>; > xen,passthrough = <0x1>; > linux,phandle = <0x12>; > phandle = <0x12>; > > phy@21 { > reg = <0x15>; > ti,rx-internal-delay = <0x8>; > ti,tx-internal-delay = <0xa>; > ti,fifo-depth = <0x1>; > linux,phandle = <0x4>; > phandle = <0x4>; > }; > }; > > > > Guest configuration: > > name = "bare1" > kernel = "bare.img" > memory = 8 > vcpus = 1 > cpus = [1] > > dtdev = [ "/amba/serial@ff010000", "/amba/ethernet@ff0e0000", > "/amba/timer@ff110000" ] > #device_tree = "partial.dtb" > irqs = [ 54, 95, 68, 69, 70 ] > iomem = [ "0xff010,1", "0xff0e0,1", "0xff110,1" ] > > > Is the partial.dtb only for the guest's benefit? I had assumed that was the > case, and since my guest didn't speak device-tree I left it out initially, > but I did go back and try it with a partial just in case there was some > addtional configuration triggered by the presence of it in the .cfg file > without any apparent change in behavior. > > > >> It seems to me that there is something extra is being done by, or for, > >> the Linux guest that isn't done by, or for, my bare metal guest that > >> enables the SMMU for that ethernet controller. I haven't been able to > >> figure what that something extra is by searching the internet, reading > >> through the available documentation, or digging into the code. Any help > >> (better search terms, useful URLs, detailed description of the what's > >> supposed to happen for guests generically or what actually happens for a > >> Linux guest, a working bare metal example, etc) would be appreciated. > >> > > > > The SMMU is configured with Stage-2 page table and not exposed to the > > guest. I am not aware of any configuration required in the guest, except > > having a working network driver. > > > > > "Working" can be a tricky term to nail down. The driver "works", as in I > can telnet/ping/nc to my target if I pass in PAs instead of IPAs to the > DMA, but maybe "working" involves some step that the PV-aware Linux guest > is doing that I'm not; that something occurs as a by-product of Linux guest > behavior, like maybe a page grant that occurs as part of a DMA buffer > allocation, that completes the SMMU configuration, but I haven't been able > to find anything like yet. If there's any documentation on what guests > should be doing in this regard I'd welcome a reference to it. > > > > > Regards, > > > > -- > > Julien Grall > > > > Thanks again for your time and attention. > > -J _______________________________________________ Xen-users mailing list Xen-users@xxxxxxxxxxxxx http://lists.xen.org/xen-users
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |