cbdma: add documentation
authorAditya Basu <mitthu@google.com>
Sat, 17 Aug 2019 01:45:41 +0000 (21:45 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Aug 2019 16:39:09 +0000 (12:39 -0400)
Signed-off-by: Aditya Basu <mitthu@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
Documentation/cbdma.md [new file with mode: 0644]

diff --git a/Documentation/cbdma.md b/Documentation/cbdma.md
new file mode 100644 (file)
index 0000000..54a0426
--- /dev/null
@@ -0,0 +1,137 @@
+Intel CBDMA
+===========
+**2019-08-16** Aditya Basu (`mitthu`)
+
+Contents
+-------------------------------
++ About the driver
++ Example Interaction via sysfs
+
+About the driver
+-------------------------------
+* 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.
+
+Example Interaction via sysfs
+-------------------------------
+```bash
+# 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
+```