On Tue, Jan 26, 2021 at 10:22 PM Stefano Stabellini <sstabell...@kernel.org>
wrote:

> On Tue, 26 Jan 2021, Jukka Kaartinen wrote:
> > On Tue, Jan 26, 2021 at 2:54 AM Stefano Stabellini <
> sstabell...@kernel.org> wrote:
> >       On Sat, 23 Jan 2021, Jukka Kaartinen wrote:
> >       > Thanks for the response!
> >       >
> >       > On Sat, Jan 23, 2021 at 2:27 AM Stefano Stabellini <
> sstabell...@kernel.org> wrote:
> >       >       + xen-devel, Roman,
> >       >
> >       >
> >       >       On Fri, 22 Jan 2021, Jukka Kaartinen wrote:
> >       >       > Hi Stefano,
> >       >       > I'm Jukka Kaartinen a SW developer working on enabling
> hypervisors on mobile platforms. One of our HW that we use on
> >       >       development is
> >       >       > Raspberry Pi 4B. I wonder if you could help me a bit :).
> >       >       >
> >       >       > I'm trying to enable the GPU with Xen + Raspberry Pi for
> >       >       dom0.
> https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=232323#p1797605
> >       >       >
> >       >       > I got so far that GPU drivers are loaded (v3d & vc4)
> without errors. But now Xen returns error when X is starting:
> >       >       > (XEN) traps.c:1986:d0v1 HSR=0x93880045
> pc=0x00007f97b14e70 gva=0x7f7f817000 gpa=0x0000401315d000
> >       >       >  I tried to debug what causes this and looks
> like find_mmio_handler cannot find handler.
> >       >       > (See more here:
> https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=232323&start=25#p1801691
> )
> >       >       >
> >       >       > Any ideas why the handler is not found?
> >       >
> >       >
> >       >       Hi Jukka,
> >       >
> >       >       I am glad to hear that you are interested in Xen on
> RaspberryPi :-)  I
> >       >       haven't tried the GPU yet, I have been using the serial
> only.
> >       >       Roman, did you ever get the GPU working?
> >       >
> >       >
> >       >       The error is a data abort error: Linux is trying to access
> an address
> >       >       which is not mapped to dom0. The address seems to be
> 0x401315d000. It is
> >       >       a pretty high address; I looked in device tree but
> couldn't spot it.
> >       >
> >       >       >From the HSR (the syndrom register) it looks like it is a
> translation
> >       >       fault at EL1 on stage1. As if the Linux address mapping
> was wrong.
> >       >       Anyone has any ideas how this could happen? Maybe a
> reserved-memory
> >       >       misconfiguration?
> >       >
> >       > I had issues with loading the driver in the first place.
> Apparently swiotlb is used, maybe it can cause this. I also tried to
> >       enable CMA.
> >       > config.txt:
> >       > dtoverlay=vc4-fkms-v3d,cma=320M@0x0-0x40000000
> >       > gpu_mem=128
> >
> >       Also looking at your other reply and the implementation of
> >       vc4_bo_create, it looks like this is a CMA problem.
> >
> >       It would be good to run a test with the swiotlb-xen disabled:
> >
> >       diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
> >       index 467fa225c3d0..2bdd12785d14 100644
> >       --- a/arch/arm/xen/mm.c
> >       +++ b/arch/arm/xen/mm.c
> >       @@ -138,8 +138,7 @@ void xen_destroy_contiguous_region(phys_addr_t
> pstart, unsigned int order)
> >        static int __init xen_mm_init(void)
> >        {
> >               struct gnttab_cache_flush cflush;
> >       -       if (!xen_initial_domain())
> >       -               return 0;
> >       +       return 0;
> >               xen_swiotlb_init(1, false);
> >
> >               cflush.op = 0;
> >
> > With this change the kernel is not booting up. (btw. I'm using USB SSD
> for my OS.)
> > [    0.071081] bcm2835-dma fe007000.dma: Unable to set DMA mask
> > [    0.076277] bcm2835-dma fe007b00.dma: Unable to set DMA mask
> > (XEN) physdev.c:16:d0v0 PHYSDEVOP cmd=25: not implemented
> > (XEN) physdev.c:16:d0v0 PHYSDEVOP cmd=15: not implemented
> > [    0.592695] pci 0000:00:00.0: Failed to add - passthrough or
> MSI/MSI-X might fail!
> > (XEN) physdev.c:16:d0v0 PHYSDEVOP cmd=15: not implemented
> > [    0.606819] pci 0000:01:00.0: Failed to add - passthrough or
> MSI/MSI-X might fail!
> > [    1.212820] usb 1-1: device descriptor read/64, error 18
> > [    1.452815] usb 1-1: device descriptor read/64, error 18
> > [    1.820813] usb 1-1: device descriptor read/64, error 18
> > [    2.060815] usb 1-1: device descriptor read/64, error 18
> > [    2.845548] usb 1-1: device descriptor read/8, error -61
> > [    2.977603] usb 1-1: device descriptor read/8, error -61
> > [    3.237530] usb 1-1: device descriptor read/8, error -61
> > [    3.369585] usb 1-1: device descriptor read/8, error -61
> > [    3.480765] usb usb1-port1: unable to enumerate USB device
> >
> > Traces stop here. I could try with a memory card. Maybe it makes a
> difference.
>
> This is very surprising. Disabling swiotlb-xen should make things better
> not worse. The only reason I can think of why it could make things worse
> is if Linux runs out of low memory. Julien's patch
> 437b0aa06a014ce174e24c0d3530b3e9ab19b18b for Xen should have addressed
> that issue though. Julien, any ideas?
>
I really don't know if this is a problem but in the
allocate_memory_11  arch_get_dma_bitsize is called. That should return the
platform->dma_bitsize but at the early stage of boot platform is not
initialized so default 32 is returned. I tried changing the hard code from
32 -> 30 but it didn't make any difference.

static void __init allocate_memory_11(struct domain *d,
                                      struct kernel_info *kinfo)
{
    const unsigned int min_low_order =
        get_order_from_bytes(min_t(paddr_t, dom0_mem, MB(128)));
    const unsigned int min_order = get_order_from_bytes(MB(4));
    struct page_info *pg;
    unsigned int order = get_allocation_size(kinfo->unassigned_mem);
    int i;

    bool lowmem = true;
    unsigned int lowmem_bitsize = min(32U, *arch_get_dma_bitsize*());

also here the place where static dma_bitsize is set is not called for dom0


void __init end_boot_allocator(void)
{
....
    if ( !dma_bitsize && (num_online_nodes() > 1) )
        dma_bitsize = arch_get_dma_bitsize();


and will lead alloc_domheap_pages not to use dma_bitsize since it is not
set.
struct page_info *alloc_domheap_pages(
    struct domain *d, unsigned int order, unsigned int memflags)
{

uses static: dma_bitsize and currently is not set for raspberry pi.


>
> >       It is going to be fine just to boot Dom0 and DomUs without PV
> drivers.
> >       Also, can you post the device tree that you are using here? Just
> in case
> >       there is an issue with Xen parsing any possible /reserved-memory
> nodes
> >       with CMA info that need to be passed on to Dom0.
> >
> > Here is the device dumped from command line:
> > dtc -I fs /proc/device-tree
> >
> https://drive.google.com/file/d/17u18dJHxRfbGZMtRXIwtLVZZfMj9KwN-/view?usp=sharing
>
> There is a reserved-memory node:
>
>         reserved-memory {
>                 #address-cells = <0x02>;
>                 #size-cells = <0x01>;
>                 ranges;
>                 phandle = <0x3f>;
>
>                 linux,cma {
>                         linux,cma-default;
>                         alloc-ranges = <0x00 0x00 0x30000000>;
>                         compatible = "shared-dma-pool";
>                         size = <0x10000000>;
>                         phandle = <0x40>;
>                         reusable;
>                 };
>         };
>
> But in theory Xen should be able to export it to Dom0. It would be worth
> verifying that by running the same dtc -I fs /proc/device-tree in dom0 (in
> the dom0 configuration that can finish booting of course) you get the
> same reserved-memory node.
>
Actually the device-tree is exported from the dom0.



> There is also another suspicious node here:
>
>         axi {
>                 vc_mem {
>                         reg = <0x3eb00000 0x3ff00000 0xc0000000>;
>                 };
>         };
>
> Which doesn't seem device tree exactly compliant and maybe GPU related.
> But again, Xen would probably export it as is to Dom0.
>
>
>
> >       >       > p.s.
> >       >       > While testing I found issue with Xen master branch and
> your patch: xen/rpi4: implement watchdog-based reset
> >       >       >
> >       >       > Looks like black listing the bcm2835-pm
> >       >       > @@ -37,12 +41,69 @@ static const struct dt_device_match
> rpi4_blacklist_dev[] __initconst =
> >       >       >       * The aux peripheral also shares a page with the
> aux UART.
> >       >       >       */
> >       >       >      DT_MATCH_COMPATIBLE("brcm,bcm2835-aux"),
> >       >       > +    /* Special device used for rebooting */
> >       >       > +    DT_MATCH_COMPATIBLE("brcm,bcm2835-pm"),
> >       >       >
> >       >       > will prevent v3d driver to locate phandle. I think it
> will use the same resource:
> >       >       >   pm: watchdog@7e100000 {
> >       >       >       compatible = "brcm,bcm2835-pm",
> "brcm,bcm2835-pm-wdt";
> >       >       > #power-domain-cells = <1>;
> >       >       > #reset-cells = <1>;
> >       >       > reg = <0x7e100000 0x114>,
> >       >       >      <0x7e00a000 0x24>,
> >       >       >      <0x7ec11000 0x20>;
> >       >       > clocks = <&clocks BCM2835_CLOCK_V3D>,
> >       >       > <&clocks BCM2835_CLOCK_PERI_IMAGE>,
> >       >       > <&clocks BCM2835_CLOCK_H264>,
> >       >       > <&clocks BCM2835_CLOCK_ISP>;
> >       >       > clock-names = "v3d", "peri_image", "h264", "isp";
> >       >       > system-power-controller;
> >       >       >
> >       >       > };
> >       >
> >       >       Yeah, I imagine it could be possible. Can you post the
> error message you
> >       >       are seeing from the v3d driver?
> >       >
> >       > This is the error:
> >       > [    0.069682] OF: /v3dbus/v3d@7ec04000: could not find phandle
> >       > [    0.074828] OF: /v3dbus/v3d@7ec04000: could not find phandle
> >       > v3d driver is not loaded.



-- 
Br,
Jukka Kaartinen

Reply via email to