cbdma: add documentation
Signed-off-by: Aditya Basu <mitthu@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/Documentation/cbdma.md b/Documentation/cbdma.md
new file mode 100644
index 0000000..54a0426
--- /dev/null
+++ b/Documentation/cbdma.md
@@ -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
+```