[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] cmdline: How to connect a SD card to a specific SD cont
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-block] 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.
>
signature.asc
Description: OpenPGP digital signature