2019-08-16 Aditya Basu (mitthu
)
- About the driver
- Example Interaction via sysfs
- Only one CBDMA function gets registered by the driver.
- Also the driver only works with CBDMA devices on bus 0. This is to avoid dealing with scoped DRHDs when performing IOMMU passthru.
# Mount the device
bash-4.3$ mkdir -p /sys/cbdma
bash-4.3$ /bin/bind \#cbdma /sys/cbdma
bash-4.3$ cd /sys/cbdma/
# All files
bash-4.3$ ls
iommu ktest reset stats ucopy
# Display information about CBDMA
bash-4.3$ cat stats
Intel CBDMA [8086:2021] registered at 00:03.0
Driver Information:
mmio: 0xfffffff0000a0000
mmio_phy: 0xfebf0000
mmio_sz: 16384
total_channels: 1
desc_kaddr: 0xffff8001104c2000
desc_paddr: 0x00000001104c2000
desc_num: 1
ver: 0x33
status_kaddr: 0xffff80010c8d5960
status_paddr: 0x000000010c8d5960
status_value: 0x91c1420
PCIe Config Registers:
PCICMD: 0x406
PCISTS: 0x10
RID: 0x4
CB_BAR: 0xfebf0004
DEVSTS: 0x0
PMCSR: 0x8
DMAUNCERRSTS: 0x0
DMAUNCERRMSK: 0x0
DMAUNCERRSEV: 0x98
DMAUNCERRPTR: 0xa
DMAGLBERRPTR: 0x0
CHANERR_INT: 0x0
CHANERRMSK_INT: 0x60000
CHANERRSEV_INT: 0x10000
CHANERRPTR: 0x2
CHANNEL_0 MMIO Registers:
CHANCMD: 0x0
CBVER: 0x33 major=3 minor=3
CHANCTRL: 0x10c
CHANSTS: 0x3 [HALTED], desc_addr: 0x0000000000000000, raw: 0x3
CHAINADDR: 0x0000000000000000
CHANCMP: 0x0000000000000000
DMACOUNT: 0
CHANERR: 0x0
# Perform self-test (multiple runs)
bash-4.3$ cat ktest
cbdma: info: DMACOUNT = 1
Self-test Intel CBDMA [8086:2021] registered at 00:03.0
Channel Status: ACTIVE (raw: 0x0)
Copy Size: 64 (0x40)
srcfill: 2 (0x32)
dstfill: 0 (0x30)
src_str (after copy): 111111111111111111111111111111111111111111111111111111111111111
dst_str (after copy): 111111111111111111111111111111111111111111111111111111111111111
bash-4.3$ cat ktest
cbdma: info: DMACOUNT = 1
Self-test Intel CBDMA [8086:2021] registered at 00:03.0
Channel Status: ACTIVE (raw: 0x0)
Copy Size: 64 (0x40)
srcfill: 3 (0x33)
dstfill: 0 (0x30)
src_str (after copy): 222222222222222222222222222222222222222222222222222222222222222
dst_str (after copy): 222222222222222222222222222222222222222222222222222222222222222
# Reset the CBDMA
bash-4.3$ echo 1 >reset
cbdma: reset performed
bash-4.3$ cat reset
Status: No pending reset
Write '1' to perform reset!
# Performing DMA with the user-space companion program (with IOMMU in front)
# Note: This will not work with QEMU! Akaros should be running bare-metal.
bash-4.3$ echo 1 >iommu
bash-4.3$ cat iommu
IOMMU enabled = yes
Write '0' to disable or '1' to enable the IOMMU
bash-4.3$ ucbdma 00:03.0
got device: 00:04.0
Mappings for iommu@0xffff80007bebfce8
<empty>
Mappings for iommu@0xffff800009376ae8
pid = 72
device = 0:3.0
[user] page size: 4096 bytes
[user] src: 1111111111111111111
[user] dst: 0000000000000000000
[user] ucbdma: 0x100000000, size: 80 (or 0x50)
[user] desc->xref_size: 20
[user] desc->src_addr: 0x1000000b4
[user] desc->dest_addr: 0x1000000c8
[user] desc->next_desc_addr: 0x100000000
[user] ndesc: 1
[user] status: 0x0
[user] ucbdma ptr: 0x100000000
[kern] value from userspace: 0x0000000100000000
[kern] IOMMU = ON
[kern] ucbdma: user: 0x0000000100000000 kern: 0xffff8002929a4000 ndesc: 1
cbdma: info: DMACOUNT = 1
[user] ucbdma: 0x100000000, size: 80 (or 0x50)
[user] desc->xref_size: 20
[user] desc->src_addr: 0x1000000b4
[user] desc->dest_addr: 0x1000000c8
[user] desc->next_desc_addr: 0x100000000
[user] ndesc: 1
[user] status: 0x1b041003
[user] channel_status: 1b041003
[user] src: 1111111111111111111
[user] dst: 0000000000000000000