e10k Driver: non VF version works again
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 27 Feb 2017 13:36:22 +0000 (14:36 +0100)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 27 Feb 2017 13:36:22 +0000 (14:36 +0100)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

if/e10k_vf.if
usr/drivers/e10k/e10k_cdriver.c
usr/drivers/e10k/e10k_qdriver.c
usr/drivers/e10k/e10k_vf.c

index a4d046c..a75eb8f 100644 (file)
 interface e10k_vf "e10k VF/PF interface" {
          rpc get_mac_address(in uint8 vfn, out uint64 mac);
          rpc init_done(in uint8 vfn);
+      
+    /*****************************************************
+     * For devif interface
+     *****************************************************/
+      rpc request_vf_number(out uint8 vfn, out errval err);
+
+      // XXX: technically should not be in the VF interface
+      // since it is only used withouth VFs
+      rpc create_queue(in cap    tx,
+                       in cap    txhwb,
+                       in cap    rx,
+                       in uint32 rxbufsz,
+                       in int16  msix_intvec,
+                       in uint8  msix_intdest,
+                       in bool   use_irq,
+                       in bool   use_rsc,
+                       out int qid,
+                       out cap regs);
+
+      rpc destroy_queue(in int qid, out errval err);
 };
index 1c12b5d..957066e 100644 (file)
@@ -29,7 +29,7 @@
 #include "sleep.h"
 #include "helper.h"
 
-#define VTON_DCBOFF
+//#define VTON_DCBOFF TODO use if VFs are enabled
 //#define DCA_ENABLED
 
 //#define DEBUG(x...) printf("e10k: " x)
@@ -149,7 +149,7 @@ static void idc_write_queue_tails(struct e10k_binding *b);
 static void stop_device(void);
 
 static void device_init(void);
-static void queue_hw_init(uint8_t n);
+static void queue_hw_init(uint8_t n, bool set_tail);
 //static void queue_hw_stop(uint8_t n);
 static void interrupt_handler_msix(void* arg);
 //static void interrupt_handler_msix_b(void* arg);
@@ -163,7 +163,7 @@ static const char *service_name = "e10k";
 static int initialized = 0;
 static e10k_t *d = NULL;
 static struct capref *regframe;
-static bool msix = true;
+static bool msix = false;
 
 /** Specifies if RX/TX is currently enabled on the device. */
 static bool rxtx_enabled = false;
@@ -187,6 +187,8 @@ static uint32_t pci_device = PCI_DONT_CARE;
 static uint32_t pci_function = 0;
 static uint32_t pci_deviceid = E10K_PCI_DEVID;
 
+/* VFs alloacation data*/
+static bool vf_used[63];
 
 static void e10k_flt_ftqf_setup(int idx, struct e10k_filter* filter)
 {
@@ -576,6 +578,7 @@ static void device_init(void)
         e10k_vfta_vlan_flt_wrf(d, i, 0);
     for (i = 0; i < 128; i++)
         e10k_pfvlvfb_wr(d, i, 0);
+
     for (i = 0; i < 64; i++) {
 #ifdef VTON_DCBOFF
         e10k_pfvlvf_vi_en_wrf(d, i, 1);
@@ -668,22 +671,24 @@ static void device_init(void)
 
     e10k_mrqc_mrque_wrf(d, e10k_vrt_only);
     e10k_mtqc_rt_en_wrf(d, 0);
-
     e10k_mtqc_vt_en_wrf(d, 1);
     e10k_mtqc_num_tc_wrf(d, 1);
     e10k_pfvtctl_vt_en_wrf(d, 1);
 #else
-    for (i = 0; i < 8; i++) {
-        e10k_rxpbsize_size_wrf(d, i, 0x40);
-        e10k_txpbsize_size_wrf(d, i, 0x14);
-        e10k_txpbthresh_thresh_wrf(d, i, 0x14);
+    e10k_rxpbsize_size_wrf(d, 0, 0x200);
+    e10k_txpbsize_size_wrf(d, 0, 0xA0);
+    e10k_txpbthresh_thresh_wrf(d, 0, 0xA0);
+    for (i = 1; i < 8; i++) {
+        e10k_rxpbsize_size_wrf(d, i, 0x0);
+        e10k_txpbsize_size_wrf(d, i, 0x0);
+        e10k_txpbthresh_thresh_wrf(d, i, 0x0);
     }
 
-    e10k_mrqc_mrque_wrf(d, e10k_vrt_only);
-    e10k_mtqc_rt_en_wrf(d, 1);
-    e10k_mtqc_vt_en_wrf(d, 1);
-    e10k_mtqc_num_tc_wrf(d, 2);
-    e10k_pfvtctl_vt_en_wrf(d, 1);
+    e10k_mrqc_mrque_wrf(d, e10k_no_rss);
+    e10k_mtqc_rt_en_wrf(d, 0);
+    e10k_mtqc_vt_en_wrf(d, 0);
+    e10k_mtqc_num_tc_wrf(d, 0);
+    e10k_pfvtctl_vt_en_wrf(d, 0);
 #endif
     e10k_rtrup2tc_wr(d, 0);
     e10k_rttup2tc_wr(d, 0);
@@ -717,7 +722,7 @@ static void device_init(void)
     /* Causes ECC error (could be same problem as with l34timir (see e10k.dev) */
     for (i = 0; i < 128; i++) {
         e10k_rttdqsel_txdq_idx_wrf(d, i);
-       e10k_rttdt1c_wr(d, credit_refill[i]);   // Credit refill x 64 bytes
+        e10k_rttdt1c_wr(d, credit_refill[i]);   // Credit refill x 64 bytes
         e10k_rttbcnrc_wr(d, 0);
         if(tx_rate[i] != 0) {
             // Turn on rate scheduler for this queue and set rate factor
@@ -743,6 +748,7 @@ static void device_init(void)
 #ifdef VTON_DCBOFF
     e10k_rttdcs_tdpac_wrf(d, 0);
     e10k_rttdcs_vmpac_wrf(d, 1);        // Remember to set RTTDT1C >= MTU when this is 1
+
     e10k_rttdcs_tdrm_wrf(d, 0);
     e10k_rttdcs_bdpm_wrf(d, 1);
     e10k_rttdcs_bpbfsm_wrf(d, 0);
@@ -755,14 +761,15 @@ static void device_init(void)
     e10k_rttdcs_tdpac_wrf(d, 1);
     e10k_rttdcs_vmpac_wrf(d, 1);
     e10k_rttdcs_tdrm_wrf(d, 1);
+
     e10k_rttdcs_bdpm_wrf(d, 1);
     e10k_rttdcs_bpbfsm_wrf(d, 0);
     e10k_rttpcs_tppac_wrf(d, 1);
     e10k_rttpcs_tprm_wrf(d, 1);
     e10k_rttpcs_arbd_wrf(d, 0x004);
-    e10k_rtrpcs_rac_wrf(d, 1);
-    e10k_rtrpcs_rrm_wrf(d, 1);
 
+    e10k_rtrpcs_rac_wrf(d, 0);
+    e10k_rtrpcs_rrm_wrf(d, 1);
     e10k_sectxminifg_sectxdcb_wrf(d, 0x1f);
 #endif
 
@@ -820,7 +827,7 @@ static void device_init(void)
         // Restoring queues
         for (i = 0; i < 128; i++) {
             if (queues[i].enabled) {
-                queue_hw_init(i);
+                queue_hw_init(i, true);
             }
         }
 
@@ -831,7 +838,7 @@ static void device_init(void)
 }
 
 /** Initialize hardware queue n. */
-static void queue_hw_init(uint8_t n)
+static void queue_hw_init(uint8_t n, bool set_tail)
 {
     errval_t r;
     struct frame_identity frameid = { .base = 0, .bytes = 0 };
@@ -1048,8 +1055,9 @@ static void queue_hw_init(uint8_t n)
     // Some initialization stuff from BSD driver
     e10k_dca_txctrl_txdesc_wbro_wrf(d, n, 0);
 
-    idc_write_queue_tails(queues[n].binding);
-
+    if (set_tail) {
+        idc_write_queue_tails(queues[n].binding);
+    }
 }
 
 #ifndef LIBRARY
@@ -1158,10 +1166,6 @@ static void interrupt_handler(void* arg)
     }
 }
 
-
-
-
-
 /******************************************************************************/
 /* Management interface implemetation */
 
@@ -1303,7 +1307,7 @@ void cd_register_queue_memory(struct e10k_binding *b,
     queues[n].rx_va = rx_va;
     queues[n].txhwb_va = txhwb_va;
 
-    queue_hw_init(n);
+    queue_hw_init(n, true);
 
     if (b == NULL) {
         qd_queue_memory_registered(b);
@@ -1312,6 +1316,7 @@ void cd_register_queue_memory(struct e10k_binding *b,
     idc_queue_memory_registered(b);
 }
 
+
 /** Request from queue driver to initialize hardware queue. */
 void cd_set_interrupt_rate(struct e10k_binding *b,
                            uint8_t n,
@@ -1459,8 +1464,95 @@ static void get_mac_address_vf(struct e10k_vf_binding *b, uint8_t vfn)
     assert(err_is_ok(err));
 }
 
+static void request_vf_number(struct e10k_vf_binding *b)
+{
+    DEBUG("VF allocated\n");
+    errval_t err;
+    uint8_t vf_num = 255;
+    for (int i = 0; i < 64; i++) {
+        if (!vf_used[i]) {
+            vf_num = i;
+            break;
+        }
+    }
+
+    if (vf_num == 255){
+        //TODO better error
+        err = SFN_ERR_ALLOC_QUEUE;
+    } else {
+        err = SYS_ERR_OK;
+    }
+
+    err = b->tx_vtbl.request_vf_number_response(b, NOP_CONT, vf_num, err);
+    assert(err_is_ok(err));
+}
+
+
+/** Request from queue driver to initialize hardware queue. */
+static void create_queue(struct e10k_vf_binding *b,
+                         struct capref tx_frame,
+                         struct capref txhwb_frame,
+                         struct capref rx_frame,
+                         uint32_t rxbufsz,
+                         int16_t msix_intvec,
+                         uint8_t msix_intdest,
+                         bool use_irq,
+                         bool use_rsc)
+{
+    errval_t err;
+    // TODO: Make sure that rxbufsz is a power of 2 >= 1024
+
+    if (use_irq && msix_intvec != 0 && !msix) {
+        printf("e10k: Queue requests MSI-X, but MSI-X is not enabled "
+                " card driver. Ignoring queue\n");
+        return;
+    }
+
+    // allocate a queue
+    int n = -1;
+    for (int i = 0; i < 128; i++) {
+        if (!queues[i].enabled) {
+            queues[i].enabled = true;
+            n = i;
+            break;
+        }
+    }
+    
+    DEBUG("create queue(%"PRIu8")\n", n);
+
+    if (n == -1) {
+       err = b->tx_vtbl.create_queue_response(b, NOP_CONT, n, NULL_CAP);
+       assert(err_is_ok(err));
+    }
+
+    // Save state so we can restore the configuration in case we need to do a
+    // reset
+    
+    queues[n].tx_frame = tx_frame;
+    queues[n].txhwb_frame = txhwb_frame;
+    queues[n].rx_frame = rx_frame;
+    queues[n].tx_head = 0;
+    queues[n].rx_head = 0;
+    queues[n].rxbufsz = rxbufsz;
+    queues[n].msix_index = -1;
+    queues[n].msix_intvec = msix_intvec;
+    queues[n].msix_intdest = msix_intdest;
+    queues[n].use_irq = use_irq;
+    queues[n].use_rsc = use_rsc;
+
+    queue_hw_init(n, false);
+
+    err = b->tx_vtbl.create_queue_response(b, NOP_CONT, n, *regframe);
+    assert(err_is_ok(err));
+    
+    DEBUG("[%d] Queue int done\n", n);
+}
+
+
 static struct e10k_vf_rx_vtbl vf_rx_vtbl = {
     .get_mac_address_call = get_mac_address_vf,
+    .request_vf_number_call = request_vf_number,
+    .create_queue_call = create_queue,
     .init_done_call = init_done_vf,
 };
 
index 137097c..a54707a 100644 (file)
@@ -175,10 +175,10 @@ static bool use_interrupts = false;
 static bool use_rsc = false;
 
 /** Indicates whether MSI-X should be used */
-static bool use_msix = true;
+static bool use_msix = false;
 
 /** Indicates whether or the VT-d should be used for DMA remapping.*/
-static bool use_vtd = true; 
+static bool use_vtd = false; 
 
 /** Minimal delay between interrupts in us */
 static uint16_t interrupt_delay = 0;
@@ -577,6 +577,7 @@ static size_t check_for_new_packets(int num)
     // arrive faster than they can be processed.
     count = 0;
     pkt_cnt = 0;
+    
     while ((res = e10k_queue_get_rxbuf(q, &op, &len, &last, &flags)) == 0 ||
            pkt_cnt != 0)
     {
index 09cbc8d..adebfab 100644 (file)
@@ -18,7 +18,8 @@
 #include <barrelfish/debug.h>
 #include <ipv4/lwip/inet.h>
 #include <if/e10k_defs.h>
-
+#include <skb/skb.h>
+#include <acpi_client/acpi_client.h>
 #ifdef VF
 #    include <if/e10k_vf_defs.h>
 #    include <if/e10k_vf_rpcclient_defs.h>
@@ -30,8 +31,8 @@
 
 #define E10K_PCI_DEVID 0x10ed
 
-//#define DEBUG(x...) printf("e10k_vf: " x)
-#define DEBUG(x...) do {} while (0)
+#define DEBUG(x...) printf("e10k_vf: " x)
+//#define DEBUG(x...) do {} while (0)
 
 #define QUEUE_INTRX 0
 #define QUEUE_INTTX 1
@@ -134,7 +135,7 @@ uint64_t d_mac;
 static int initialized = 0;
 static e10k_vf_t *d = NULL;
 static struct capref *regframe;
-static bool msix = true;
+static bool msix = false;
 
 // Management of MSI-X vectors
 static struct bmallocator msix_alloc;
@@ -301,7 +302,7 @@ static void device_init(void)
 static void queue_hw_init(uint8_t n)
 {
     errval_t r;
-    struct frame_identity frameid = { .base = 0, .bits = 0 };
+    struct frame_identity frameid = { .base = 0, .bytes = 0 };
     uint64_t tx_phys, txhwb_phys, rx_phys;
     size_t tx_size, rx_size;
 
@@ -309,12 +310,12 @@ static void queue_hw_init(uint8_t n)
     r = invoke_frame_identify(queues[n].tx_frame, &frameid);
     assert(err_is_ok(r));
     tx_phys = frameid.base;
-    tx_size = 1 << frameid.bits;
+    tx_size = frameid.bytes;
 
     r = invoke_frame_identify(queues[n].rx_frame, &frameid);
     assert(err_is_ok(r));
     rx_phys = frameid.base;
-    rx_size = 1 << frameid.bits;
+    rx_size = frameid.bytes;
 
 
     DEBUG("tx.phys=%"PRIx64" tx.size=%"PRIu64"\n", tx_phys, tx_size);
@@ -794,11 +795,10 @@ static void pci_register(void)
         inthandler = NULL;
     }
 
-    r = pci_register_driver_irq(pci_init_card, PCI_CLASS_ETHERNET,
+    r = pci_register_driver_noirq(pci_init_card, PCI_CLASS_ETHERNET,
                                 PCI_DONT_CARE, PCI_DONT_CARE,
                                 PCI_VENDOR_INTEL, E10K_PCI_DEVID,
-                                pci_bus, pci_device, pci_function,
-                                inthandler, NULL);
+                                pci_bus, pci_device, pci_function);
     assert(err_is_ok(r));
 }
 
@@ -913,6 +913,25 @@ int e1000n_driver_init(int argc, char *argv[])
     DEBUG("Connecting to PF driver...\n");
     e10k_vf_client_connect();
 
+
+    errval_t err = skb_client_connect();
+    assert(err_is_ok(err));
+
+    int vtd_coherency;
+    err = skb_execute_query("vtd_enabled(0,C), write(vtd_coherency(C)).");
+    if (err_is_ok(err)) {
+        err = skb_read_output("vtd_coherency(%d)", &vtd_coherency);
+        assert(err_is_ok(err));
+    }
+
+    err = connect_to_acpi();
+       assert(err_is_ok(err));
+       err = vtd_create_domain(cap_vroot);
+       assert(err_is_ok(err));
+    DEBUG("Connecting to PF driver...\n");
+       err = vtd_domain_add_device(0, 7, 16, 0, cap_vroot);
+       assert(err_is_ok(err));
+
     pci_register();
 
     while (!initialized) {