qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] cmdline: How to connect a SD card to a specific SD cont


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-devel] cmdline: How to connect a SD card to a specific SD controller?
Date: Tue, 29 May 2018 20:08:22 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0

On 05/28/2018 01:30 AM, Philippe Mathieu-Daudé wrote:
> Hi,
> 
> I'd like to connect a specific SD card to a specific SDHCI from command
> line, and I'm getting a bit lost with command line options.
> 
> I'm using an updated version of this patch, but this is not relevant to
> this thread:
> http://lists.nongnu.org/archive/html/qemu-devel/2018-05/msg01914.html
> 
> In the following example, I'd like to connect an UHS-I enabled SD card
> to the first SHDCI of the Exynos4210 board (Nuri).
> 
> I tried:
> 
> $ ./arm-softmmu/qemu-system-arm -M nuri \
>   -device sd-card,id=sd0,uhs=1 \
>   -drive if=sd,id=sd0,driver=null-co,size=4G \
>   -monitor stdio -S

Peter suggested on IRC to use:

  -drive if=none,id=mydrive,... -device sd-card,...,drive=mydrive

which indeed works enough for my tests:

  $ ./arm-softmmu/qemu-system-arm -M nuri \
    -drive if=none,id=mydrive,driver=null-co,size=4G \
    -device sd-card,id=sd0,uhs=1,drive=mydrive \
    -monitor stdio -S

The same issues are still here but don't bother:

(qemu) info qtree
bus: main-system-bus
  type System
  dev: generic-sdhci, id ""
    gpio-out "sysbus-irq" 1
    sd-spec-version = 2 (0x2)
    uhs = 0 (0x0)
    capareg = 99090560 (0x5e80080)
    maxcurr = 0 (0x0)
    pending-insert-quirk = false
    dma = ""
    mmio 0000000012540000/0000000000000100
    bus: sd-bus
      type sdhci-bus
      dev: sd-card, id "sd0"
        drive = "mydrive"
        spi = false
        uhs = 1 (0x1)
      dev: sd-card, id ""
        drive = ""
        spi = false
        uhs = 0 (0x0)

        ^---- 2 cards

> But then the QTree looks unexpected:
> 
> (qemu) info qtree
> bus: main-system-bus
>   type System
>   dev: generic-sdhci, id ""
>     gpio-out "sysbus-irq" 1
>     sd-spec-version = 2 (0x2)
>     uhs = 0 (0x0)
>     capareg = 99090560 (0x5e80080)
>     maxcurr = 0 (0x0)
>     pending-insert-quirk = false
>     dma = ""
>     mmio 0000000012540000/0000000000000100
>     bus: sd-bus
>       type sdhci-bus
>       dev: sd-card, id "sd0"
>         drive = ""
>         spi = false
>         uhs = 1 (0x1)
>       dev: sd-card, id ""
>         drive = ""
>         spi = false
>         uhs = 0 (0x0)
> 
>       ^---- 2 cards
> 
>   dev: generic-sdhci, id ""
>     gpio-out "sysbus-irq" 1
>     sd-spec-version = 2 (0x2)
>     uhs = 0 (0x0)
>     capareg = 99090560 (0x5e80080)
>     maxcurr = 0 (0x0)
>     pending-insert-quirk = false
>     dma = ""
>     mmio 0000000012530000/0000000000000100
>     bus: sd-bus
>       type sdhci-bus
>       dev: sd-card, id ""
>         drive = ""
>         spi = false
>         uhs = 0 (0x0)
>   dev: generic-sdhci, id ""
>     gpio-out "sysbus-irq" 1
>     sd-spec-version = 2 (0x2)
>     uhs = 0 (0x0)
>     capareg = 99090560 (0x5e80080)
>     maxcurr = 0 (0x0)
>     pending-insert-quirk = false
>     dma = ""
>     mmio 0000000012520000/0000000000000100
>     bus: sd-bus
>       type sdhci-bus
>       dev: sd-card, id ""
>         drive = ""
>         spi = false
>         uhs = 0 (0x0)
>   dev: generic-sdhci, id ""
>     gpio-out "sysbus-irq" 1
>     sd-spec-version = 2 (0x2)
>     uhs = 0 (0x0)
>     capareg = 99090560 (0x5e80080)
>     maxcurr = 0 (0x0)
>     pending-insert-quirk = false
>     dma = ""
>     mmio 0000000012510000/0000000000000100
>     bus: sd-bus
>       type sdhci-bus
>       dev: sd-card, id ""
>         drive = "sd0"
> 
>         ^------- drive is here
> 
>         spi = false
>         uhs = 0 (0x0)
> 
> in hw/sd/core.c we have:
> 
> static SDState *get_card(SDBus *sdbus)
> {
>     /* We only ever have one child on the bus so just return it */
>     BusChild *kid = QTAILQ_FIRST(&sdbus->qbus.children);
> 
>     if (!kid) {
>         return NULL;
>     }
>     return SD_CARD(kid->child);
> }
> 
> Spec v1 allow multiple cards per bus but Spec v2 (and up) restrict to 1
> per bus.
> 
> 
> in exynos4210_init() we have:
> 
>         di = drive_get(IF_SD, 0, n);
>         blk = di ? blk_by_legacy_dinfo(di) : NULL;
>         carddev = qdev_create(qdev_get_child_bus(dev, "sd-bus"),
> TYPE_SD_CARD);
> 
> so there are no restriction in connecting various slaves to the same bus.
> 
> I also wonder about this drive_get(), is this an outdated API?
> 
> Only used in 3 boards:
> 
> $ git grep 'drive_get(IF_SD'
> hw/arm/exynos4210.c:397:        di = drive_get(IF_SD, 0, n);
> hw/arm/omap1.c:3990:    dinfo = drive_get(IF_SD, 0, 0);
> hw/arm/omap2.c:2489:    dinfo = drive_get(IF_SD, 0, 0);
> hw/arm/pxa2xx.c:2098:    dinfo = drive_get(IF_SD, 0, 0);
> hw/arm/pxa2xx.c:2222:    dinfo = drive_get(IF_SD, 0, 0);
> 
> versus drive_get_next() used in others:
> 
> hw/arm/mcimx7d-sabre.c:70:        di = drive_get_next(IF_SD);
> hw/arm/raspi.c:200:    di = drive_get_next(IF_SD);
> hw/arm/xilinx_zynq.c:269:        di = drive_get_next(IF_SD);
> hw/arm/xlnx-zcu102.c:114:        DriveInfo *di = drive_get_next(IF_SD);
> hw/sd/milkymist-memcard.c:279:    dinfo = drive_get_next(IF_SD);
> hw/sd/pl181.c:508:    dinfo = drive_get_next(IF_SD);
> hw/sd/ssi-sd.c:254:    dinfo = drive_get_next(IF_SD);
> 
> Now trying with the PC machine:
> 
> $ x86_64-softmmu/qemu-system-x86_64 -M pc \
>   -device sdhci-pci,id=sdhci1 \
>   -device sdhci-pci,id=sdhci2,sd-spec-version=3,uhs=2 \
>   -device sd-card,id=sdcard0 \
>   -device sd-card,uhs=1,id=sdcard1 \
>   -monitor stdio -S
> 
> (qemu) info qtree
> bus: main-system-bus
>   type System
>   dev: i440FX-pcihost, id ""
>     bus: pci.0
>       type PCI
>       dev: sdhci-pci, id "sdhci2"
>         sd-spec-version = 3 (0x3)
>         uhs = 2 (0x2)
>         capareg = 91763892 (0x57834b4)
>         maxcurr = 0 (0x0)
>         addr = 05.0
>         romfile = ""
>         rombar = 1 (0x1)
>         multifunction = false
>         command_serr_enable = true
>         x-pcie-lnksta-dllla = true
>         x-pcie-extcap-init = true
>         class Class 0805, addr 00:05.0, pci id 1b36:0007 (sub 1af4:1100)
>         bar 0: mem at 0xffffffffffffffff [0xfe]
>         bus: sd-bus
>           type sdhci-bus
>           dev: sd-card, id "sdcard1"
>             drive = ""
>             spi = false
>             uhs = 1 (0x1)
>           dev: sd-card, id "sdcard0"
>             drive = ""
>             spi = false
>             uhs = 0 (0x0)
> 
>           ^--- 2 cards...
> 
>       dev: sdhci-pci, id "sdhci1"
>         sd-spec-version = 2 (0x2)
>         uhs = 0 (0x0)
>         capareg = 91763892 (0x57834b4)
>         maxcurr = 0 (0x0)
>         addr = 04.0
>         romfile = ""
>         rombar = 1 (0x1)
>         multifunction = false
>         command_serr_enable = true
>         x-pcie-lnksta-dllla = true
>         x-pcie-extcap-init = true
>         class Class 0805, addr 00:04.0, pci id 1b36:0007 (sub 1af4:1100)
>         bar 0: mem at 0xffffffffffffffff [0xfe]
>         bus: sd-bus
>           type sdhci-bus
> 
>         ^--- no card
> 
> And trying the -drive option:
> 
> $ x86_64-softmmu/qemu-system-x86_64 -M pc \
>   -device sdhci-pci,id=sdhci1 \
>   -device sdhci-pci,id=sdhci2,sd-spec-version=3,uhs=2 \
>   -device sd-card,id=sdcard0 \
>   -device sd-card,uhs=1,id=sdcard1 \
>   -drive if=sd,id=sd0,driver=null-co,size=2G \
>   -drive if=sd,id=sd1,driver=null-co,size=4G
> qemu-system-x86_64: -drive if=sd,id=sd0,driver=null-co,size=2G: machine
> type does not support if=sd,bus=0,unit=0
> qemu-system-x86_64: -drive if=sd,id=sd1,driver=null-co,size=4G: machine
> type does not support if=sd,bus=0,unit=1
> 
> How can I create the card with UHS-I enabled and connect it to the 2nd
> SDHCI?
> 
> Thanks!
> 
> Phil.
> 

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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