Bugfix in Xeon Phi DMA t
authorReto Achermann <acreto@student.ethz.ch>
Fri, 4 Jul 2014 08:39:21 +0000 (10:39 +0200)
committerStefan Kaestle <stefan.kaestle@inf.ethz.ch>
Wed, 20 Aug 2014 21:38:19 +0000 (23:38 +0200)
DMA not working from host side due to not correct address in the DRAR
register caused by treating the DRAR register as 64bit instead of two
32bit sized ones.

devices/xeon_phi/xeon_phi_dma.dev
usr/drivers/xeon_phi/dma/dma_channel.c

index 179ce21..dba38c1 100644 (file)
@@ -80,6 +80,7 @@ device xeon_phi_dma lsbfirst(addr base) "Intel Xeon Phi DMA System" {
      * Register Access: CRU
      * Number: 8
      */
+/*
     regarray drar rw addr(base, 0xA014) [8; 0x40] "DMA Descriptor Ring Attributes Register Lo" {
         _        6 "";
         base    30 "base address";
@@ -89,6 +90,36 @@ device xeon_phi_dma lsbfirst(addr base) "Intel Xeon Phi DMA System" {
         sysbit   1 "";
         _        5 "";
     };
+*/
+    
+    /*
+     * Protection Level: Ring 0
+     * Visibility: Host / Coprocessor
+     * Reset Dmain: GRPB_REset
+     * Register Access: CRU
+     * Number: 8
+     */
+    regarray drar_hi rw addr(base, 0xA018) [8; 0x40] "DMA Descriptor Ring Attributes Register Lo" {
+        base     4 "base address hi part";
+        _        2 "";  
+        size    15 "size of the descriptor ring";
+        page     5 "";
+        sysbit   1 "";
+        _        5 "";
+    };
+
+    /*
+     * Protection Level: Ring 0
+     * Visibility: Host / Coprocessor
+     * Reset Dmain: GRPB_REset
+     * Register Access: CRU
+     * Number: 8
+     */
+    regarray drar_lo rw addr(base, 0xA014) [8; 0x40] "DMA Descriptor Ring Attributes Register Lo" {
+        _        6 "";
+        base    26 "base address lo part";
+    };
+    
 
     /*
      * Protection Level: Ring 0
index 39d912c..303df26 100644 (file)
@@ -216,19 +216,24 @@ static errval_t xdma_channel_set_ring(struct xdma_channel *chan)
 
     xdma_channel_set_state(chan, XDMA_CHAN_STATE_DISABLED);
 
-    xeon_phi_dma_drar_t drar = 0x0;
+    xeon_phi_dma_drar_hi_t drar_hi = 0x0;
+    xeon_phi_dma_drar_lo_t drar_lo = 0x0;
 
-    drar = xeon_phi_dma_drar_size_insert(drar, chan->size >> 2);
+    uint16_t num_desc = chan->size >> xeon_phi_dma_drar_size_shift;
+
+    drar_hi = xeon_phi_dma_drar_hi_size_insert(drar_hi, num_desc);
 
     if (chan->owner == XDMA_CHAN_HOST_OWNED) {
-        drar = xeon_phi_dma_drar_sysbit_insert(drar, 0x1);
+        drar_hi = xeon_phi_dma_drar_hi_sysbit_insert(drar_hi, 0x1);
         uint32_t sysmem_page = (chan->ring.pbase >> XEON_PHI_SYSMEM_PAGE_BITS);
-        drar = xeon_phi_dma_drar_page_insert(drar, sysmem_page);
+        drar_hi = xeon_phi_dma_drar_hi_page_insert(drar_hi, sysmem_page);
+        drar_hi = xeon_phi_dma_drar_hi_base_insert(drar_hi, chan->ring.pbase >> 32);
     }
 
-    drar = xeon_phi_dma_drar_base_insert(drar, chan->ring.pbase >> 6);
+    drar_lo = xeon_phi_dma_drar_lo_base_insert(drar_lo, chan->ring.pbase >> 6);
 
-    xeon_phi_dma_drar_wr(chan->regs, chan->chanid, drar);
+    xeon_phi_dma_drar_lo_wr(chan->regs, chan->chanid, drar_lo);
+    xeon_phi_dma_drar_hi_wr(chan->regs, chan->chanid, drar_hi);
 
     chan->size = chan->ring.size;
 
@@ -481,7 +486,6 @@ errval_t xdma_channel_req_memcpy(struct xdma_channel *chan,
                 (uint64_t )dma_id,
                 chan->head);
 
-    assert(id);
     if (id) {
         *id = dma_id;
     }