Removed old KNC devices Added: Xeon Phi Boot Devices Added: Xeon Phi host driver...
authorReto Achermann <acreto@student.ethz.ch>
Thu, 24 Apr 2014 16:25:41 +0000 (18:25 +0200)
committerStefan Kaestle <stefan.kaestle@inf.ethz.ch>
Wed, 20 Aug 2014 13:46:08 +0000 (15:46 +0200)
18 files changed:
devices/Hakefile
devices/knc_dbox.dev [deleted file]
devices/knc_sbox.dev [deleted file]
devices/virtio/virtio_blk.dev [new file with mode: 0644]
devices/virtio/virtio_mmio.dev [new file with mode: 0644]
devices/xeon_phi/xeon_phi_boot.dev [new file with mode: 0644]
devices/xeon_phi/xeon_phi_serial.dev [new file with mode: 0644]
kernel/Hakefile
kernel/arch/k1om/serial.c
kernel/include/serial.h
lib/virtio/Hakefile [new file with mode: 0644]
usr/block_server/Hakefile
usr/bulk_transfer_passthrough/Hakefile
usr/drivers/xeon_phi/Hakefile
usr/drivers/xeon_phi/boot.c [new file with mode: 0644]
usr/drivers/xeon_phi/main.c
usr/drivers/xeon_phi/serial.c [new file with mode: 0644]
usr/drivers/xeon_phi/xeon_phi.h [new file with mode: 0644]

index d945e67..f5e3846 100644 (file)
            "omap/omap44xx_sysctrl_padconf_core",
            "omap/omap44xx_sysctrl_padconf_wkup",
            "omap/omap44xx_usbconf",
-           "omap/omap44xx_usbtllhs_config"
+           "omap/omap44xx_usbtllhs_config",
+           "virtio/virtio_blk",
+           "virtio/virtio_mmio",
+           "xeon_phi/xeon_phi_serial",
+           "xeon_phi/xeon_phi_boot", 
+           "xeon_phi/xeon_phi_apic"
          ], arch <- allArchitectures
 ] ++
 
diff --git a/devices/knc_dbox.dev b/devices/knc_dbox.dev
deleted file mode 100644 (file)
index 9e6cb63..0000000
+++ /dev/null
@@ -1,1390 +0,0 @@
-/*
- * Copyright (c) 2008, ETH Zurich. All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-/*
- * e1000.dev
- *
- * DESCRIPTION: Intel e1000 family Gigabit Ethernet NICs
- * 
- * Numbers in comments refer to the Intel PCIe GbE Controllers Open
- * Source Software Development Manual, 631xESB / 632xESB, 82563EB /
- * 82564EB, 82571EB / 82572EI & 82573E / 82573V / 82573L. 
- * 316080-003, Revison 1.2, September 2007
- */
-
-device e1000 lsbfirst ( addr base ) "Intel e1000 Gigabit Ethernet" {
-
-  /************************************
-   * General registers
-   ***********************************/
-
-  // 13.3.1
-  constants linkspeed "Link speed" {
-    mb10       = 0b00 "10Mb/s";
-    mb100      = 0b01 "100Mb/s";
-    mb1000     = 0b10 "1Gb/s";
-    mb_notused = 0b11 "1Gb/s";
-  };
-
-  register ctrl rw addr(base, 0x0000) "Device control" {
-    fd         1 "full-duplex";
-    _          1 mbz;
-    gio_md     1 "GIO master disable";
-    lrst       1 "Link reset";
-    _          1 mbz;
-    asde       1 "Auto-Speed Detection Enable";
-    slu                1 "Set link up";
-    ilos       1 "Invert Loss-of-Signal (LOS)";
-    speed      2 type(linkspeed) "Speed selection";
-    _          1 mbz;
-    frcspd     1 "Force speed";
-    frcdplx    1 "Force duplex";
-    _          5 mbz;
-    sdp0_data  1 "SDP0 data value, or dock/undock status";
-    sdp1_data  1 "SDP1 data value";
-    advd3wuc   1 "D3cold wakeup capability";
-    en_phy_pwr_mgmt 1 "PHY Power-Management Enable";
-    sdp0_iodir 1 "SDP0 pin I/O directionality";
-    sdp1_iodir 1 "SDP1 pin I/O directionality";
-    _          2 mbz;
-    rst                1 "Device reset";
-    rfce       1 "Receive flow control enable";
-    tfce       1 "Transmit flow control enable";
-    _          1 mbz;
-    vme                1 "VLAN mode enable";
-    phy_rst    1 "PHY reset";
-  };
-
-  // 82546 rev 3
-  register ctrldup rw addr(base, 0x0004) "Device Control Duplicate (Shadow)" {
-    fd          1 "full-duplex";
-    _           1 mbz;
-    gio_md      1 "GIO master disable";
-    lrst        1 "Link reset";
-    _           1 mbz;
-    asde        1 "Auto-Speed Detection Enable";
-    slu         1 "Set link up";
-    ilos        1 "Invert Loss-of-Signal (LOS)";
-    speed       2 type(linkspeed) "Speed selection";
-    _           1 mbz;
-    frcspd      1 "Force speed";
-    frcdplx     1 "Force duplex";
-    _           5 mbz;
-    sdp0_data   1 "SDP0 data value, or dock/undock status";
-    sdp1_data   1 "SDP1 data value";
-    advd3wuc    1 "D3cold wakeup capability";
-    en_phy_pwr_mgmt 1 "PHY Power-Management Enable";
-    sdp0_iodir  1 "SDP0 pin I/O directionality";
-    sdp1_iodir  1 "SDP1 pin I/O directionality";
-    _           2 mbz;
-    rst         1 "Device reset";
-    rfce        1 "Receive flow control enable";
-    tfce        1 "Transmit flow control enable";
-    _           1 mbz;
-    vme         1 "VLAN mode enable";
-    phy_rst     1 "PHY reset";
-  };
-
-  constants lanid "LAN ID" {
-    lan_a       = 0b00 "LAN A";
-    lan_b       = 0b01 "LAN B";
-    lan_not_u1  = 0b10 "LAN ID not used";
-    lan_not_u2  = 0b11 "LAN ID not used";
-  };
-  constants mac_mask "LAN MAC MASK" {
-    lan_b_mask  = 0x0100 "LAN B mask";
-  };
-
-  // 13.3.2 
-  register status ro addr(base, 0x0008) "Device status" {
-    fd         1 "Link full duplex configuration";
-    lu         1 "Link up";
-    func_id    2 "Function ID";
-    txoff      1 "Transmission paused";
-    tbimode    1 "TBI mode";
-    speed      2 type(linkspeed) "Link speed setting";
-    asdv       2 type(linkspeed) "Auto speed detection value";
-    phyra      1 "PHY reset asserted"; 
-    pci66      1 "PCI Bus speed indication";
-    bus64      1 "PCI Bus Width indication";
-    pcix_mode   1 "PCI-X Mode indication";
-    pcixspd     2 "PCI-X Bus Speed Indication";
-    _          3 mbz;
-    gio_mes     1 "GIO master enable status";
-    _          12 mbz;
-  };
-
-  // 13.3.3
-  constants flashenable "Flash write enable control" {
-    flash_erase                = 0b00 "Flash erase";
-    flash_wr_disable   = 0b01 "Flash writes discarded";
-    flash_wr_enable    = 0b10 "Flash writed enabled";
-  };
-
-  constants eeaddrsize "EEPROM address size" {
-    bits8or9   = 0 "8- and 9-bit";
-    bits16     = 1 "16-bit";
-  };
-
-  constants nvmtype "Non-volatile memory type" {
-    eeprom     = 0b00 "EEPROM";
-    saflash    = 0b01 "Stand-alone Flash";
-    spiflash   = 0b10 "Shared SPI Flash";
-    sio                = 0b11 "SIO";
-  };
-
-  register eecd rw addr(base, 0x0010) "EEPROM/Flash control" {
-    ee_sk      1 "Clock input to EEPROM";
-    ee_cs      1 "Chip select to EEPROM";
-    ee_di      1 "Data input to EEPROM";
-    ee_do      1 "Data output bit from EEPROM";
-    fwe                2 type(flashenable) "Flash write enable control";
-    ee_req     1 "Request EEPROM access";
-    ee_gnt     1 "Grant EEPROM access";
-    ee_pres    1 "EEPROM present";
-    ee_size_n  1 "EEPROM size for NM93C46 compatible EEPROM" ;
-    ee_size_m   1 "EEPROM size for Microwire EEPROMs";
-    _           2 mbz;
-    ee_type     1 "EEPROM Type. (82541xx and 82547GI/EI)";
-    _          18 mbz;
-  };
-
-  // 13.3.4
-  // NM93C46 compatible EEPROMs
-  register eerd_nm rw addr(base, 0x0014) "EEPROM read" {
-    start       1 "Start read";  
-    _           3 mbz;
-    done        1 ro "Read done";
-    _           3 mbz;
-    addr        8 "Read address";
-    data        16 "Read data";
-  };
-
-  register eerd_ms rw also addr(base, 0x0014) "EEPROM read 82541xx and 82547GI/EI" {
-    start       1 "Start read";
-    done        1 ro "Read done";
-    addr        14 "Read address";
-    data        16 "Read data";   
-  };
-
-
-  // 13.3.5
-  constants linkmode "Link mode" {
-    glci       = 0b00 "Direct coper or GLCI";
-    l82573     = 0b10 "Must be set for 82573E/V/L";
-    serdes     = 0b11 "Internal SerDes (TBI) or SerDes mode";
-  };
-  register ctrlext rw addr(base, 0x0018) "Extended device control" {
-    _          2 mbz;
-    sdp2_gpien 1 "General-purpose interrupt detection for SDP2";
-    sdp3_gpien 1 "General-purpose interrupt detection for SDP3";
-    _          2;
-    sdp2_data  1 "SDP2 data value";
-    sdp3_data  1 "SDP3 data value";
-    _          2 mbz;
-    sdp2_iodir  1 "SDP2 pin directionality";
-    sdp3_iodir  1 "SDP3 pin directionality";
-    asdchk     1 "Auto-speed-detection check";
-    ee_rst     1 "EEPROM reset";
-    _          1 mbz;
-    spd_byps   1 "Speed select bypass";
-    _          1;
-    rodis      1 "Relaxed ordering disabled";
-    serdeslpe  1 "SERDES low power enable";
-    dmadge     1 "DMA dynamic gating enable";
-    phypde     1 "PHY power down enable";
-    _          1;
-    link_mode  2 type(linkmode) "Link mode";
-    pb_paren   1 "Packet buffer parity error detection enable";
-    df_paren   1 "Descriptor FIFO parity error detection enable";
-    _          1 mbz;
-    iame       1 "Interrupt acknowledge auto-mask enable";
-    drv_load   1 "Driver loaded";
-    int_tca    1 "Timers clear enable";
-    host_paren  1 "Host data FIFO parity enable";
-    _          1;
-  };
-
-  // 13.3.6
-  register fla rw addr(base, 0x001c) "Flash access" {
-    fl_sk      1 "Clock input to Flash";
-    fl_ce      1 "Chip select to Flash";
-    fl_si      1 "Data input to Flash";
-    fl_so      1 "Data output bit from Flash";
-    fl_req     1 "Request Flash access";
-    fl_gnt     1 "Grant Flash access";
-    fl_addr_sz  1 "Flash address size";
-    _          2;
-    sw_wr_done  1 "Last write done";
-    rd_status  1 "Flash status";
-    _          5;
-    ide_bo     14 "Base address of IDE Boot expansion ROM";
-    fl_busy    1 "Flash busy";
-    fl_er      1 "Flash erase command";
-  };
-
-  // 13.3.7
-  constants phyop "PHY register opcode" {
-    mdi_write  = 0b01 "MDI Write";
-    mdi_read   = 0b10 "MDI Read";
-  };
-  register mdic rw addr(base, 0x0020) "MDI control" {
-    data       16 "Data";
-    regadd     5  "PHY register address";
-    phyadd     5  "PHY address";
-    op         2 type(phyop) "Opcode";
-    r          1 "Ready bit";
-    i          1 "Interript enable";
-    e          1 "Error";
-    _          1 mbz;
-  };
-  
-  // 13.3.8
-  // There are a lot of PHY registers, all accessed through the MDIC.
-  // We don't yet list them here. 
-
-  // 13.3.10
-  register serdesctl rw addr(base, 0x0024) "SERDES ANA" {
-    data       8 "Data to SerDes";
-    addr       8 "Address to SerDes";
-    _          15;
-    done       1 "Done";
-  };
-
-  // 13.3.11-12
-  constants fca "Flow control address" {
-    fca_lo     = 0x0c28001;
-    fca_hi     = 0x0000100;
-  };
-  register fcal rw addr(base, 0x0028) "Flow control address low" type(uint32);
-  register fcah rw addr(base, 0x002C) "Flow control address low" type(uint32);
-  
-  // 13.3.13
-  constants fctval "Flow control type" {
-    fct_val = 0x0008808;
-  };
-  register fct rw addr(base, 0x0030) "Flow control type" type(uint32);
-  
-  // 13.3.14
-  register kumctrlsta rw addr(base, 0x0034) "GLCI control and status" {
-    data       16 "Data";
-    offset     5  "Offset of internal register";
-    ren                1  "Read enable (1=read)";
-    _          10;
-  };
-
-  // 13.3.15
-  constants vet_val "VLAN ether type value" {
-    vlan_type  = 0x0008100;
-  };
-  register vet rw addr(base, 0x0038) "VLAN Ether type" type(uint32);
-  
-  // 13.3.16
-  register mdphya rw addr(base, 0x003c) "MDC/MDIO PHY address" {
-    phya       5 "PHY address";
-    _          27;
-  };
-
-  // 13.3.17
-  register ufuse3 ro addr(base, 0x00f0) "ULT Fuse register 3" {
-    drred      15 "Data RAM redundancy fuses";
-    crred      13 "Code RAM redundancy fuses";
-    enad       1  "Enable Data RAM redundancy fuses";
-    enac       1  "Enable Code RAM redundancy fuses";
-    _          2; 
-  };
-  
-  // 13.3.18
-  register fcttv rw addr(base, 0x0170) "Flow control transmit timer value" {
-    ttv                16 "Transmit timer value";
-    _          16 mbz;
-  };
-  
-  // 13.3.19
-  register txcw rw addr(base, 0x0178) "Transmit config word" {
-    _          5 mbz;
-    txcw_fd    1 "TXCW full-duplex";
-    txcw_hd    1 "TXCW half-duplex";
-    txcw_pause 2 "TXCW pause";
-    _          3 mbz;
-    txcw_rfi   2 "TXCW remote fault indication";
-    _          1 mbz;
-    txcw_npr   1 "TXCW next page request";
-    _          14 mbz;
-    txconfig   1 "Transmit config control bit";
-    ane                1 "Auto-negotiation enable";
-  };
-
-  // 13.3.20
-  register rxcw ro addr(base, 0x0180) "Receive config word" {
-    _          5 mbz;
-    rxcw_fd    1 "RXCW full-duplex";
-    rxcw_hd    1 "RXCW half-duplex";
-    rxcw_pause 2 "RXCW pause";
-    _          3 mbz;
-    rxcw_rfi   2 "RXCW remote fault indication";
-    _          1 mbz;
-    rxcw_npr   1 "RXCW next page request";
-    _          10 mbz;
-    nc         1 "Carrier sense indicator";
-    inv                1 "Invalid symbol during config process";
-    chg                1 "Change to RXCW indication";
-    rxconfig   1 "Reception indication";
-    sync       1 "Lost bit sync indication";
-    anc                1 "Auto-negotiation complete";
-  };
-  
-  // 13.3.21
-  constants ledmode "LED output mode" {
-    link_10_100                = 0b0000 "Either 10 or 100 Mbs link established";
-    link_100_1000      = 0b0001 "Either 100 or 1000 Mbs link established";
-    link_up            = 0b0010 "Any speed link established";
-    filter_activity    = 0b0011 "Packets passing MAC filtering";
-    link_activity      = 0b0100 "No transmit or receive activity";
-    link_10            = 0b0101 "10 Mbs link established";
-    link_100           = 0b0110 "100 Mbs link established";
-    link_1000          = 0b0111 "1000 Mbs link established";
-    full_duplex                = 0b1001 "Link configured for full-duplex";
-    collision          = 0b1010 "Collision is observed";
-    activity           = 0b1011 "Link established and packets sent or revd";
-    bus_size           = 0b1100 "Controller detects 1 PCIe lane conn.";
-    paused             = 0b1101 "Transmitter is flow controlled";
-    led_on             = 0b1110 "Always on";
-    led_off            = 0b1111 "Always off";
-  };
-  constants blmode "LED blink mode" {
-    ms200              = 0 "200ms on, 200ms off";
-    ms83               = 1 "83ms on, 83 ms off";
-  };
-  register ledctl rw addr(base, 0x0e00) "LED control" {
-    led0_mode  4 type(ledmode) "LED0/LINK# mode";
-    _          1 mbz;
-    global_blink_mode 1 type(blmode) "Global blink mode";
-    led0_ivrt  1 "LED0 invert";
-    led0_blink 1 "LED0 blink";
-
-    led1_mode  4 type(ledmode) "LED1/LINK# mode";
-    _          1 mbz;
-    led1_blink_mode 1 type(blmode) "Global blink mode";
-    led1_ivrt  1 "LED1 invert";
-    led1_blink 1 "LED1 blink";
-
-    led2_mode  4 type(ledmode) "LED2/LINK# mode";
-    _          1 mbz;
-    led2_blink_mode 1 type(blmode) "Global blink mode";
-    led2_ivrt  1 "LED2 invert";
-    led2_blink 1 "LED2 blink";
-
-    led3_mode  4 type(ledmode) "LED3/LINK# mode";
-    _          1 mbz;
-    led3_blink_mode 1 type(blmode) "Global blink mode";
-    led3_ivrt  1 "LED3 invert";
-    led3_blink 1 "LED3 blink";
-  };    
-
-  // 13.3.22 
-  register extcnf_ctrl rw addr(base, 0x0f00) "Extended config control" {
-    _          1 mbz;
-    phy_we     1 "PHY write enable";
-    dud_en     1 "Extended dock/undock configuration enable";
-    _          1;
-    dock_own   1 "Dock config owner";
-    mdio_swown 1 "MDIO software ownership";
-    mdio_hwown 1 "MDIO hoftware ownership";
-    _          9;
-    ecp                12 "Extended configuration pointer";
-    _          4;
-  };
-
-  // 13.3.23
-  register extcnf_size rw addr(base, 0x0f08) "Extended config size" {
-    phy_len    8 "Extended PHY configuration area length";
-    dock_len   8 "Extended dock configuration area length";
-    _          8 mbz;
-    _          8;
-  };
-  
-  // 13.3.24
-  register pba rw addr(base, 0x1000) "Packet buffer allocation" {
-    rxa                16 "Rx packet buffer allocation in KB";
-    txa                16 "Tx packet buffer allocation in KB";
-  };
-  
-  // 13.3.25
-  register eemngctl rw addr(base, 0x1010) "MNG EEPROM control" {
-    _          18;
-    crg_done   1 "MNG configuration cycle done";
-    _          13;
-  };
-
-  // 13.3.26
-  register sw_fw_sync rw addr(base, 0x5b5c) "Software/firmware sync" {
-    sw_eep_sm  1 "EEPROM access owned by software";
-    sw_phy_sm0 1 "PHY 0 access owned by software";
-    sw_phy_sm1  1 "PHY 1 access owned by software";
-    sw_mac_csr_sm 1 "Shared CSR access owned by software";
-    _          12;
-    fw_eep_sm  1 "EEPROM access owned by firmware";
-    fw_phy_sm0 1 "PHY 0 access owned by firmware";
-    fw_phy_sm1  1 "PHY 1 access owned by firmware";
-    fw_mac_csr_sm 1 "Shared CSR access owned by firmware";
-    _          12;
-  };
-
-  /************************************
-   * Interrupt registers
-   ***********************************/
-
-  // 13.3.27
-  regtype intreg "Interrupt register format" {
-    txdw       1 "Transmit descriptor written back";
-    txqe       1 "Transmit queue empty";
-    lsc                1 "Link status change";
-    rxseq      1 "Receive sequence error";
-    rxdmt0     1 "Receive descriptor minimum threshold reached";
-    _          1;
-    rxo                1 "Receiver overrun";
-    rxt0       1 "Receiver timer interrupt";
-    _          1;
-    mdac       1 "MDI/O access complete";
-    rxcfg      1 "Received configuration symbols";
-    _          2;
-    gpi_sdp2   1 "General-purpose interrupt on SPD2";
-    gpi_sdp3   1 "General-purpose interrupt on SPD3";
-    txd_low    1 "Transmit descriptor low threshold";
-    srpd       1 "Small receive packet detected";
-    ack                1 "Receive ack frame detected";
-    _          2;
-    rx_desc_fifo_par0 1 "Rx descriptor FIFO parity error 0"; 
-    tx_desc_fifo_par0 1 "Tx descriptor FIFO parity error 0"; 
-    pcie_master_par 1 "PCIe master data FIFO parity error";
-    pbpar      1 "Packet buffer parity error";
-    rx_desc_fifo_par1 1 "Rx descriptor FIFO parity error 1"; 
-    tx_desc_fifo_par1 1 "Tx descriptor FIFO parity error 1"; 
-    _          5;
-    int_asserted 1 "Interrupt asserted";
-  };
-
-  // 13.3.27
-  register icr ro addr(base, 0x00c0) "Interrupt cause read" type(intreg);
-
-  // 13.3.28
-  register itr rw addr(base, 0x00c4) "Interrupt throttling rate" {
-    interval   16 "Minimum inter-interrupt interval (x256ns)";
-    _          16 mbz;
-  };
-  
-  // 13.3.29
-  register ics wo addr(base, 0x00c8) "Interrupt cause write" type(intreg);
-  
-  // 13.3.30 
-  register ims rw addr(base, 0x00d0) "Interrupt mask set/read" type(intreg);
-  
-  // 13.3.31
-  register imc wo addr(base, 0x00d8) "Interrupt mask clear" type(intreg);
-
-  // 13.3.32
-  register iam rw addr(base, 0x00e0) "Interrupt ack auto mask" type(intreg);
-
-  regarray eitr addr(base, 0x1680)[9;0x4] "Extended Interrupt Throttle" {
-    _         2 mbz;
-    interval 13 "Interval";
-    _         1 mbz;
-    counter  16 "Down counter";
-  };
-
-  /************************************
-   * Receive registers
-   ***********************************/
-
-  // 13.3.33
-  constants lbmode "Loopback mode" {
-    lb_normal  = 0b00 "Normal operation";
-    lb_mac     = 0b01 "MAC loopback";
-  };
-  constants rxthresh "Received desc. threshold size" {
-    rdlen_2    = 0b00 "1/2 RDLEN";
-    rdlen_4    = 0b01 "1/4 RDLEN";
-    rdlen_8    = 0b10 "1/8 RDLEN";
-  };
-  constants dtype "Descriptor type" {
-    dt_legacy  = 0b00 "Legacy descriptor type";
-    dt_split   = 0b01 "Packet split descriptor type";
-  };
-  constants rxbsize "Receive buffer size" {
-    rxb2048    = 0b00 "2048 bytes";
-    rxb1024    = 0b01 "1024 or 16384 bytes";
-    rxb512     = 0b10 "512 or 8192 bytes";
-    rxb256     = 0b11 "256 or 4096 bytes";
-  };
-  register rctl rw addr(base, 0x0100) "Receive control" {
-    _          1 mbz;
-    en         1 "Receiver enable";
-    sbp                1 "Store bad packets";
-    upe                1 "Unicast promiscuous enabled";
-    mpe                1 "Multicast promiscuous enabled";
-    lpe                1 "Long packet reception enable";
-    lbm                2 type(lbmode) "Loopback mode";
-    rdmts      2 type(rxthresh) "Receive descriptor minimum threshold size";
-    dtyp       2 type(dtype) "Descriptor type";
-    mo         2 "Multicast offset (12 bits starting at 36-val)";
-    _          1 mbz;
-    bam                1 "Broadcast accept mode";
-    bsize      2 type(rxbsize) "Receive buffer size (see BSEX)";
-    vfe                1 "VLAN filter enable";
-    cfien      1 "Canonical form indicator enable";
-    cfi                1 "Canonical form indicator value";
-    _          1 mbz;
-    dpf                1 "Discard pause frames";
-    pmcf       1 "Pass MAC control frames";
-    _          1 mbz;
-    bsex       1 "Buffer size extension";
-    secrc      1 "Strip Ethernet CRC from packet";
-    flxbuf     4 "Flexible buffer size (in KB)";
-    _          1 mbz;
-  };    
-  
-  // 13.3.34
-  register ert rw addr(base, 0x2008) "Early receive threshold" {
-    rxthresh   13 "Receive threshold value (x 8 bytes)";
-    _          1;
-    _          18 mbz;
-  };
-
-  // 13.3.35
-  register fcrtl rw addr(base, 0x2160) "Flow control rx threshold low" {
-    _          3 mbz;
-    rtl                13 "Recieve threshold low";
-    _          15 mbz;
-    xone       1 "XON enable";
-  };
-
-  // 13.3.36
-  register fcrth rw addr(base, 0x2168) "Flow control rx threshold high" {
-    _          3 mbz;
-    rth                13 "Recieve threshold high";
-    _          15 mbz;
-    flowcntdis 1 "Flow control disable";
-  };
-
-  // 13.3.37
-  register psrctl rw addr(base, 0x2170) "Packet split rx control" {
-    bsize0     7 "Receive buffer 0 size (x 128 bytes)";
-    _          1 mbz;
-    bsize1     7 "Receive buffer 1 size (x 1 kbytes)";
-    _          1 mbz;
-    bsize2     7 "Receive buffer 2 size (x 1 kbytes)";
-    _          1 mbz;
-    bsize3     7 "Receive buffer 3 size (x 1 kbytes)";
-    _          1 mbz;
-  };
-  
-  // 13.3.38/46/39/47
-  regarray rdbal rw addr(base, 0x2800)[2;0x100] 
-    "Rx descr. base addr low" type(uint32);
-  regarray rdbah rw addr(base, 0x2804)[2;0x100] 
-    "Rx descr. base addr high" type(uint32);
-
-  // 13.3.40/48 and 13.3.62/71
-  // Note that the description of the transmit length (13.3.62/71) refers to
-  // the size of the descriptor buffer in bytes. This is misleading; the whole
-  // register (raw value) refers to that, but the bottom 7 bits must be zero.
-  regtype dqlen "Descriptor length value" {
-    _          7 mbz;
-    len                13 "Num. descriptors (x8)";
-    _          12 mbz;
-  };
-  regarray rdlen rw addr(base, 0x2808)[2;0x100] 
-    "Rx descriptor length" type(dqlen);
-
-  // 13.3.41/49/42/50
-  regtype dqval "Descriptor head/tail value" {
-    val                16 "value";
-    _          16 mbz;
-  };
-  regarray rdh rw addr(base, 0x2810)[2;0x100] "Rx descr. head" type(dqval);
-  regarray rdt rw addr(base, 0x2818)[2;0x100] "Rx descr. tail" type(dqval);
-
-  // 13.3.43
-  register rdtr rw addr(base, 0x2820) "Rx. interrupt delay timer" {
-    delay      16 "delay timer (x 1.024us)";
-    _          15 mbz;
-    fpd                1 "Flush partial descriptor block";
-  };
-
-  // 13.3.44/51
-  constants threshgran "Threshold granularity" {
-    gran_cache = 0 "Cache line granularity";
-    gran_desc  = 1 "Descriptor granularity";
-  };
-
-  regarray rxdctl rw addr(base, 0x2828)[2;0x100] "Rx descriptor control" {
-    pthresh 6 "Prefetch threshold";
-    _       2 mbz;
-    hthresh 6 "Host threshold";
-    _       2 mbz;
-    wthresh 6 "Write back threshold";
-    _       2 mbz;
-    gran    1 type(threshgran) "Granularity";
-    _       7 mbz;
-  };
-
-  regarray rxdctl_82575 rw also addr(base, 0x2828)[2;0x100] "Rx descriptor control" {
-    pthresh 6 "Prefetch threshold";
-    _       2 mbz;
-    hthresh 6 "Host threshold";
-    _       2 mbz;
-    wthresh 6 "Write back threshold";
-    _       3 mbz;
-    enable  1 "Granularity";
-    swflush 1 "Receive Software Flush";
-    _       5 mbz;
-  };
-
-  // 13.3.45
-  register radv rw addr(base, 0x282c) "Rx absolute intr. delay" {
-    idv                16 "Interrupt delay value";
-    _          16 mbz;
-  };
-  
-  // 13.3.52
-  register rsrpd rw addr(base, 0x2c00) "Rx small packet detect interrupt" {
-    size       12 "Max size of small packet";
-    _          20 mbz;
-  };
-  
-  // 13.3.53 
-  register raid rw addr(base, 0x2c08) "Rx ACK interrupt delay" {
-    idv                16 "Interrupt delay value (x 1.024us)";
-    _          16 mbz;
-  };
-
-  // 13.3.54
-  register cpuvec rw addr(base, 0x2c10) "CPU vector" type(uint32);
-
-  // 13.3.55
-  register rxcsum rw addr(base, 0x5000) "Receive checksum control" {
-    pcss       8 "Packet checksum start";
-    ipofld     1 "IP checksum offload enable";
-    tuofld     1 "TCP/UDP checksum offload enable";
-    _          22 mbz;
-  };
-
-  // 13.3.56
-  register rfctl rw addr(base, 0x5008) "Receive filter control" {
-    iscsi_dis  1 "iSCSI filtering disable";
-    iscsi_dwc  5 "iSCSI dword count";
-    nfsw_dis   1 "NFS write filtering disable";
-    nfsr_dis   1 "NFS read filtering disable";
-    nfs_ver    2 "NFS version (+2)";
-    ipv6_dis   1 "IPv6 filtering disable";
-    ipv6xsum_dis 1 "IPv6 xsum disable";
-    ackdis     1 "ACK accelerator disable";
-    ackd_dis   1 "ACK data disable";
-    ipfrsp_dis 1 "IP fragment split disable";
-    exsten     1 "Extended status enable";
-    _          16 mbz;
-  };
-
-  /************************************
-   * Transmit registers
-   ***********************************/
-
-  // 13.3.57
-  constants coldist "Recommended collision distances" {
-    cd_half    = 0x200 "512 byte-times";
-    cd_full    = 0x3f  "64 byte-times";
-    cd_esb     = 0x40  "64 byte-times (for 631xESB/632xESB)";
-  };
-  register tctl rw addr(base, 0x400) "Transmit control" {
-    _          1 mbz;
-    en         1 "Transmit enable";
-    _          1 mbz;
-    psp                1 "Pad short packets";
-    ct         8 "Collision threshold";
-    bst            10 "Back-Off Slot time";
-    swxoff     1 "Software XOFF transmission";
-    _          1 mbz;
-    rtlc       1 "Retransmit on late collision";
-    unortx     1 "Underrun no re-transmit";
-    txcscmt    2 "Tx descriptor minimum threshold";
-    mulr       1 "Multiple request support";
-    _          3;
-  };
-
-  // 13.3.58
-  register tctl_ext rw addr(base, 0x0404) "Transmit control extended" {
-    _          10 mbz;
-    cold       10 type(coldist) "Collision distance";
-    _          12;
-  };
-
-  // 13.3.59
-  register tipg rw addr(base, 0x0410) "Transmit IPQ" {
-    ipgt       10 "IPG back to back (x MAC clock, +4)";
-    ipgr1      10 "IPG Part 1";
-    ipgr2      10 "IPG after deferral";
-    _          2 mbz;
-  };
-
-  //
-  // The e1000 has two transmit queues, hence two sets of the
-  // remaining registers
-  //
-
-  // 13.3.60/61/69/70
-  regarray tdbal rw addr(base, 0x3800)[2;0x100] "Tx descr. base addr. low" 
-    type(uint32);
-  regarray tdbah rw addr(base, 0x3804)[2;0x100] "Tx descr. base addr. hi" 
-    type(uint32);
-  
-  // 13.3.62/71
-  regarray tdlen rw addr(base, 0x3808)[2;0x100] "Tx descr. length" type(dqlen);
-
-  // 13.3.63/64/73
-  regarray tdh rw addr(base, 0x3810)[2;0x100] "Tx descr. head" type(dqval);
-  regarray tdt rw addr(base, 0x3818)[2;0x100] "Tx descr. tail" type(dqval);
-
-  // 13.3.65
-  register tidv rw addr(base, 0x3820) "Transmit interrupt delay value" {
-    idv                16 "Interupt delay value";
-    _          15 mbz;
-    fdp                1 wo "Flush partial description block";
-  };
-
-  // 13.3.66/74
-  regarray txdctl rw addr(base, 0x3828)[2;0x100] "Transmit descr. control queue"  {
-    pthresh    6 "Prefetch threshold";
-    _          2 mbz;
-    hthresh    8 "Host threshold";
-    wthresh    6 "Write back threshold";
-    _          1 mb1;
-    _          1;
-    gran       1 type(threshgran) "Granularity";
-    lwthresh   7 "Transmit descriptor low threshold";
-  };
-
-  regarray txdctl_82575 rw also addr(base, 0x3828)[4;0x100] "Transmit descr. control queue for 82575 cards"  {
-    pthresh  6 "Prefetch threshold";
-    _        2 mbz;
-    hthresh  6 "Host threshold";
-    _        2;
-    wthresh  6 "Write back threshold";
-    _        3 mb1;
-    enable   1 "Enable the queue";
-    swflsh   1 "Transmit Software Flush";
-    priority 1 "Priority";
-    _        4;
-  };
-
-  // 13.3.67
-  register tadv rw addr(base, 0x382c) "Tx absolute intr. delay" {
-    idv                16 "Interrupt delay value";
-    _          16 mbz;
-  };
-
-  // 13.3.68/75
-  regarray tarc rw addr(base, 0x3840)[2;0x100] "Tx arbitration counter"  {
-    count      7 "Transmit arbitration count";
-    _          1;
-    ratio      2 "Compensation ratio (1 / 2^val)";
-    enable     1 mb1;
-    _          10 mbz;
-    _          1 mb1;
-    _          1 mbz;
-    _          4 mb1;
-    _          5 mbz;
-  };
-
-  /************************************
-   * Filter registers
-   ***********************************/
-
-  // 13.4.1
-  regarray mta rw addr(base, 0x5200)[128] "Multicast table array" type(uint32);
-  
-  // 13.4.2
-  regarray ral rw addr(base, 0x5400)[16;8] "Receive address low" type(uint32);
-  
-  // 13.4.3
-  constants addrsel "Address select" {
-    as_dest    = 0b00 "Destination";
-    as_src      = 0b01 "Source";
-  };
-  regarray rah rw addr(base, 0x5404)[16;8] "Receive address high" {
-    rah                16 "Receive address high";
-    asel       2 type(addrsel) "Address select";
-    _          13 mbz;
-    av         1 "Address valid";
-  };
-
-  // 13.4.4
-  regarray vfta rw addr(base, 0x5600)[128] 
-    "VLAN filter table array" type(uint32);
-
-  // 13.4.5
-  constants mrqen "Multiple rx queue enable" {
-    mrq_dis    = 0b00 "Multiple queues disabled";
-    mrq_rss    = 0b01 "Multiple queues enabled by MSFT RSS";
-  };
-  register mrq rw addr(base, 0x5818) "Multiple queues receive command" {
-    mrqe       2 type(mrqen) "Multiple rx queues enable";
-    rssie      1 "RSS interrupt enable";
-    _          13 mbz;
-    tcp4       1 "Enable TCP IPv4 hash";
-    ipv4       1 "Enable IPv4 hash";
-    tcp6ex     1 "Enable TCP IPv6 Ex hash";
-    ipv6ex     1 "Enable IPv6 Ex hash";
-    ipv6       1 "Enable IPv6 hash";
-    _          11;
-  };
-
-  // 13.4.6
-  register rssim rw addr(base, 0x5864) "RSS interrupt mask" type(uint32);
-  
-  // 13.4.7 
-  register rssir rw addr(base, 0x5868) "RSS interrupt request" type(uint32);
-  
-  // 13.4.8
-  regarray reta rw addr(base, 0x5c00)[128] "Redirection table" type(uint8);
-
-  // 13.4.9
-  regarray rssrk rw addr(base, 0x5c80)[40] "RSS Random key" type(uint8);
-
-  /************************************
-   * Wakeup registers
-   ***********************************/
-
-  // 13.5.1
-  register wuc rw addr(base, 0x5800) "Wakeup control" {
-    apme       1 "Advanced power mgmt enable";
-    pme_en     1 "PME enable";
-    pme_stat   1 "PME status";
-    apmpme     1 "Assert PME on APM wakeup";
-    _          28;
-  };
-
-  // 13.5.2 
-  regtype wakeup "Wakeup register" {
-    lnkc       1 "Link status change";
-    mag                1 "Magic packet";
-    ex         1 "Directed exact";
-    mc         1 "Directed multicast";
-    bc         1 "Broadcast";
-    arp                1 "ARP request packet";
-    ipv4       1 "Directed IPv4";
-    ipv6       1 "Directed IPv6";
-    _          7 mbz;
-    notco      1 "Ignore TCO/management packets";
-    flx0       1 "Flexible filter 0 enable";
-    flx1       1 "Flexible filter 1 enable";
-    flx2       1 "Flexible filter 2 enable";
-    flx3       1 "Flexible filter 3 enable";
-    _          12 mbz;
-  };
-  register wufc rw addr(base, 0x5808) "Wakeup filter control" type(wakeup);
-
-  // 13.5.3
-  register wus ro addr(base, 0x5810) "Wakeup status" type(wakeup);
-
-  // 13.5.4
-  register ipav rw addr(base, 0x5838) "IP address valid" {
-    v40                1 "IPv4 address 0 valid";
-    v41                1 "IPv4 address 1 valid";
-    v42                1 "IPv4 address 2 valid";
-    v43                1 "IPv4 address 3 valid";
-    _          12 mbz;
-    v60                1 "IPv6 address 0 valid";
-    _          15 mbz;
-  };
-
-  // 13.5.5
-  regarray ip4at rw addr(base, 0x5840)[4;8] 
-    "IPv4 address table" type(uint32);
-
-  // 13.5.6
-  regarray ip6at rw addr(base, 0x5880)[4] "IPv6 address table" type(uint32);
-
-  // 13.5.7
-  register wupl rw addr(base, 0x5900) "Wakeup packet length" {
-    len                12 "Length";
-    _          20 mbz;
-  };
-
-  // 13.5.8
-  regarray wupm rw addr(base, 0x5a00)[32] "Wakeup packet memory" type(uint32);
-  
-  // 13.5.9 
-  regarray fflt rw addr(base, 0x5f00)[4;8] "Flexible filter length table" {
-    len                11 "Length";
-    _          21 mbz;
-  };
-  regarray ffltco rw addr(base, 0x5f20)[2;8] "Flexible filter length table" {
-    tcolen     11 "Length";
-    _          21 mbz;
-  };
-  
-  // 13.5.10
-  regarray ffmt rw addr(base, 0x9000)[128;8] "Flexible filter mask table" {
-    mask       4 "mask";
-    _          28 mbz;
-  };
-
-  // 13.5.11
-  regarray ffvt rw addr(base, 0x9800)[128;8] "Flexible filter value table" {
-    val0       8 "Value 0";
-    val1       8 "Value 1";
-    val2       8 "Value 2";
-    val3       8 "Value 3";
-  };
-
-  /************************************
-   * Management control registers
-   ***********************************/
-
-  // 13.6.1
-  register manc rw addr(base, 0x5820) "Management control" {
-    _          3 mbz;
-    en_flexport0 1 "Enable flex UDP/TCP port 0 filtering";
-    en_flexport1 1 "Enable flex UDP/TCP port 1 filtering";
-    en_flexport2 1 "Enable flex UDP/TCP port 2 filtering";
-    flex_tco1_filter 1 "Enable TCO filter 1";
-    flex_tco0_filter 1 "Enable TCO filter 0";
-    rmcp_en    1 "Enable RMCP 0x026f filtering";
-    o298_en    1 "Enable RMCP 0x0298 filtering";
-    _          3 mbz;
-    arp_req_en 1 "Enable ARP request filtering";
-    neighbor_en        1 "Enable neighbor discovery filtering";
-    arp_res_en 1 "Enable ARP response filtering";
-    tco_reset  1 "TCO reset occurred";
-    rcv_tco_en 1 "Receive TCO packets enable";
-    blk_phyrst_on_ide 1 "Block PHY reset and power on state changes";
-    rcv_all    1 "Receive all enable";
-    en_mac16_filter 1 "Enable MAC address 16 filtering";
-    en_mng2host 1 "Enable firmware packets to host memory";
-    en_ip_addrfilter 1 "Enable IP address filtering";
-    en_xsum_filter 1 "Enable Xsum filtering to firmware";
-    br_en      1 "Enable broadcast filtering";
-    _          7 mbz;
-  };
-
-  /************************************
-   * PCIe registers
-   ***********************************/
-  
-  // NOTE: Intel in their infinite wisdom have chosen to list these
-  // registers MSBfirst in the documentation, as opposed to all the
-  // others which are LSBfirst...
-
-  // 13.7.1
-  register gcr rw addr(base, 0x5b00) "PCIe control" {
-    rxd_nosnoop                1 "Receive data write";
-    rxdscw_nosnoop     1 "Receive descriptor write";
-    rxdscr_nosnoop     1 "Receive descriptor read";
-    txd_nosnoop                1 "Transmit data write";
-    txdscw_nosnoop     1 "Transmit descriptor write";
-    txdscr_nosnoop     1 "Transmit descriptor read";
-    elec_idle_in0      1 ro "SerDes0 internal electrical idle indicator";
-    elec_idle_in1      1 ro "SerDes1 internal electrical idle indicator";
-    self_test_enable   1 "Perform self test";
-    _                  12 mbz;
-    logheader          1 "Log header into PCI config space";
-    _                  1 mbz;
-    l1el_msb           1 ro "L1 Entry latency msb";
-    l0s_el             1 "L0s entry latency";
-    l1el_lsb           2 ro "L1 Entry latency lsbs";
-    l1_aw_l0s          1 "L1 act without L0s_rx correlation";
-    gio_dis_rderr      1 "Disable running disparity err";
-    gio_good_10s       1 "Force good PCIe l0s training";
-    self_test_result   1 "Result of self test";
-    dis_tmout          1 "Disable PCIe timeout mechanism";
-  };
-
-  // 13.7.2 
-  register gscl1 rw addr(base, 0x5b10) "PCIe statistics control 1" {
-    count_en0  1 "Enable PCIe stats counter 0";
-    count_en1  1 "Enable PCIe stats counter 1";
-    count_en2  1 "Enable PCIe stats counter 2";
-    count_en3  1 "Enable PCIe stats counter 3";
-    _          23;
-    count_test 1 "Test bit";
-    en_64bit   1 "Enable two 64-bit counters instead of 4 32-bit";
-    count_reset 1 "Reset indication of PCIe stats";
-    count_stop 1 "Stop indication";
-    count_start        1 "Start indication";
-  };
-  
-  // 13.7.3
-  register gscl2 rw addr(base, 0x5b14) "PCIe statistics control 2" {
-    event0     8 "Event number that counter 0 counts";
-    event1     8 "Event number that counter 1 counts";
-    event2     8 "Event number that counter 2 counts";
-    event3     8 "Event number that counter 3 counts";
-  };
-
-  // 13.7.4
-  register gscl3 rw addr(base, 0x5b18) "PCIe statistics control 3" {
-    fc_th0     12 "Threshold of flow control credits 0";
-    _          4;
-    fc_th1     12 "Threshold of flow control credits 1";
-    _          4;
-  };
-
-  // 13.7.5
-  register gscl4 rw addr(base, 0x5b1c) "PCIe statistics control 4" {
-    coml_th    10 "Completions latency threshold";
-    rb_th      6 "Retry buffer threshold";
-    _          16;
-  };
-
-  // 13.7.6-9
-  regarray gscn rw addr(base, 0x5b20)[4] "PCIe counter" type(uint32);
-
-  // 13.7.10
-  constants fps "Function power state" {
-    fps_dr     = 0b00 "DR";
-    fps_d0u    = 0b01 "D0u";
-    fps_d0a    = 0b10 "Doa";
-    fps_d3     = 0b11 "D3";
-  };
-  register factps ro addr(base, 0x5b30) "Fn. active & power state to MNG" {
-    f0ps       2 type(fps) "Power state of fn. 0";
-    lan0v      1 "LAN 0 valid enable";
-    f0aux      1 "Fn. 0 aux power enable shadow";
-    lan0en     1 "LAN 0 enabled";
-    _          1;
-    f1ps       2 type(fps) "Power state of fn. 1";
-    lan1v      1 "LAN 1 valid enable";
-    f1aux      1 "Fn. 1 aux power enable shadow";
-    lan1en     1 "LAN 1 enabled";
-    _          1;
-    f2ps       2 type(fps) "Power state of fn. 2";
-    ide_en     1 "IDE (function 2) enable";
-    f2aux      1 "Fn. 2 aux power enable shadow";
-    _          2;
-    f3ps       2 type(fps) "Power state of fn. 3";
-    sp_en      1 "SP (function 3) enable";
-    f3aux      1 "Fn. 3 aux power enable shadow";
-    _          2;
-    f4ps       2 type(fps) "Power state of fn. 4";
-    ipmi_en    1 "IPMI (function 4) enable";
-    f4aux      1 "Fn. 4 aux power enable shadow";
-    _          1;
-    mngcg      1 "MNG clock gated";
-    lanfs      1 "LAN function select";
-    pmchg      1 "PM state changed";
-  };
-  
-  // 13.7.11-12
-  regtype anal_ctl "Analog circuit configuration" {
-    data       8 "Data to SerDes";
-    address    8 "Address to SerDes";
-    _          15;
-    done       1 "Done indicator";
-  };
-  regarray gioanactl rw addr(base,0x5b34)[4] "Analog control" type(anal_ctl);
-  
-  // 13.7.13
-  register gioanactlall rw addr(base,0x5b44) "Analog control" type(anal_ctl);
-
-  // 13.7.14
-  register ccmctl rw addr(base,0x5b48) "CCM analog control" type(anal_ctl);
-  
-  // 13.7.15
-  register anactl rw also addr(base,0x5b48) "Analog control" {
-    data       8 "Data to/from analog register";
-    address    8 "Address of analog register";
-    _          14;
-    write      1 "Read/write command";
-    done       1 "Done indication";
-  };
-  
-  // 13.7.16
-  register scctl rw addr(base, 0x5b4c) "SCC analog control" type(anal_ctl);
-  
-  // 13.7.17
-  register swsm rw addr(base, 0x5b50) "Software semaphore" {
-    smbi       1 "Semaphore bit";
-    swesmbi    1 "Software EEPROM semaphore bit";
-    wmng       1 "Wake MNG clock";
-    _          29;
-  };
-
-  // 13.7.18
-  constants fwmode "Firmware mode" {
-    nomng      = 0b000 "No MNG";
-    ptmode     = 0b010 "PT mode";
-    hieo       = 0b100 "Host interface firmware";
-  };
-  constants pcierr "PCIe external error indication" {
-    pe_none    = 0x00 "No error";
-    pe_mschk   = 0x01 "Bad checksum in manageability sections";
-    pe_prot    = 0x02 "EEPROM protection disabled";
-    pe_clkoff  = 0x03 "Clock off command executed";
-    pe_flchk   = 0x04 "Bad checksum in flash header";
-    pe_pschk   = 0x05 "Bad checksum in patch section";
-    pe_lschk   = 0x06 "Bad checksum in loader section";
-    pe_dschk   = 0x07 "Bad checksum in diagnostic section";
-    pe_inval   = 0x08 "Invalid firmware mode";
-    pe_tlbe    = 0x09 "TLB table exceeded";
-    pe_eerd    = 0x0a "EEPROM read failed";
-    pe_hwver   = 0x0b "Bad hardware version in patch load";
-    pe_sfrd    = 0x0c "SFlash read failed";
-    pe_unspec  = 0x0d "Unspecified error";
-    pe_auth    = 0x0e "Flash authentication failed";
-    pe_pfrd    = 0x0f "PFlash read failed";
-    pe_ifep    = 0x10 "Invalid Flash entry point";
-  };
-  register fwsm rw addr(base, 0x5b54) "Firmware semaphore" {
-    eep_fw     1 "EEPROM firmware semaphore";
-    fw_mode    3 type(fwmode) "Firmware mode";
-    ide_on     1 "IDE redirection on";
-    sol_on     1 "SOL on";
-    eep_rl     1 "EEPROM reloaded indication";
-    _          8;
-    fwval      1 "Firmware valid bit";
-    rstcnt     3 "Reset counter";
-    error      6 type(pcierr) "External error indication";
-    _          7;
-  };
-
-  /************************************
-   * Statistics registers
-   ***********************************/
-
-  // 13.8 ff
-  register crcerrs rc addr(base, 0x4000)
-    "CRC error count" type(uint32);
-  register algnerrc rc addr(base, 0x4004)
-    "Alignment error count" type(uint32);
-  register symerrs rc addr(base, 0x4008)
-    "Symbol error count" type(uint32);
-  register rxerrc rc addr(base, 0x400c)
-    "Receive error count" type(uint32);
-  register mpc rc addr(base, 0x4010)
-    "Missed packets count" type(uint32);
-  register scc rc addr(base, 0x4014)
-    "Single collision count" type(uint32);
-  register ecol rc addr(base, 0x4018)
-    "Excessive collisions count" type(uint32);
-  register mcc rc addr(base, 0x401c)
-    "Multiple collision count" type(uint32);
-  register latecol rc addr(base, 0x4020)
-    "Late collisions count" type(uint32);
-  register colc rc addr(base, 0x4028)
-    "Collision count" type(uint32);
-  register dc rc addr(base, 0x4030)
-    "Defer count" type(uint32);
-  register tncrs rc addr(base, 0x4034)
-    "Transmit with no CRS" type(uint32);
-  register sec rc addr(base, 0x4038)
-    "Sequence error count" type(uint32);
-  register cexterr rc addr(base, 0x403c)
-    "Carrier extension error count" type(uint32);
-  register rlec rc addr(base, 0x4040)
-    "Receive length error count" type(uint32);
-  register xonrxc rc addr(base, 0x4048)
-    "XON received count" type(uint32);
-  register xontxc rc addr(base, 0x404c)
-    "XON transmitted count" type(uint32);
-  register xoffrxc rc addr(base, 0x4050)
-    "XOFF received count" type(uint32);
-  register xofftxc rc addr(base, 0x4054)
-    "XOFF transmitted count" type(uint32);
-  register fcurc rc addr(base, 0x4058)
-    "FC received unsupported count" type(uint32);
-  register prc64 rc addr(base, 0x405c)
-    "Packets received (64 bytes) count" type(uint32);
-  register prc127 rc addr(base, 0x4060)
-    "Packets received (65-127 bytes) count" type(uint32);
-  register prc255 rc addr(base, 0x4064)
-    "Packets received (128-255 bytes) count" type(uint32);
-  register prc511 rc addr(base, 0x4068)
-    "Packets received (256-511 bytes) count" type(uint32);
-  register prc1023 rc addr(base, 0x406c)
-    "Packets received (512-1023 bytes) count" type(uint32);
-  register prc1522 rc addr(base, 0x4070)
-    "Packets received (1024-max bytes) count" type(uint32);
-  register gprc rc addr(base, 0x4074)
-    "Good packets received count" type(uint32);
-  register bprc rc addr(base, 0x4078)
-    "Broadcast packets received count" type(uint32);
-  register mcprc rc addr(base, 0x407c)
-    "Multicast packets received count" type(uint32);
-  register gptc rc addr(base, 0x4080)
-    "Good packets transmitted count" type(uint32);
-  register gorcl rc addr(base, 0x4088)
-    "Good octets received count low" type(uint32);
-  register gorch rc addr(base, 0x408c)
-    "Good octets received count high" type(uint32);
-  register gotcl rc addr(base, 0x4090)
-    "Good octets transmitted count low" type(uint32);
-  register gotch rc addr(base, 0x4094)
-    "Good octets transmitted count high" type(uint32);
-  register rnbc rc addr(base, 0x40a0)
-    "Receive no buffers count" type(uint32);
-  register ruc rc addr(base, 0x40a4)
-    "Receive undersize count" type(uint32);
-  register rfc rc addr(base, 0x40a8)
-    "Receive fragment count" type(uint32);
-  register roc rc addr(base, 0x40ac)
-    "Receive oversize count" type(uint32);
-  register rjc rc addr(base, 0x40b0)
-    "Receive jabber count" type(uint32);
-  register mprc rc addr(base, 0x40b4)
-    "Management packets receive count" type(uint32);
-  register mpdc rc addr(base, 0x40b8)
-    "Management packets dropped count" type(uint32);
-  register mptc rc addr(base, 0x40bc)
-    "Management packets transmitted count" type(uint32);
-  register torl rc addr(base, 0x40c0)
-    "Total octets received low" type(uint32);
-  register torh rc addr(base, 0x40c4)
-    "Total octets received high" type(uint32);
-  register totl rc addr(base, 0x40c8)
-    "Total octets transmitted low" type(uint32);
-  register toth rc addr(base, 0x40cc)
-    "Total octets transmitted high" type(uint32);
-  register tpr rc addr(base, 0x40d0)
-    "Total packets received" type(uint32);
-  register tpt rc addr(base, 0x40d4)
-    "Total packets transmitted" type(uint32);
-  register ptc64 rc addr(base, 0x40d8)
-    "Packets transmitted (64 bytes) count" type(uint32);
-  register ptc127 rc addr(base, 0x40dc)
-    "Packets transmitted (65-127 bytes) count" type(uint32);
-  register ptc255 rc addr(base, 0x40e0)
-    "Packets transmitted (128-255 bytes) count" type(uint32);
-  register ptc511 rc addr(base, 0x40e4)
-    "Packets transmitted (256-511 bytes) count" type(uint32);
-  register ptc1023 rc addr(base, 0x40e8)
-    "Packets transmitted (512-1023 bytes) count" type(uint32);
-  register ptc1522 rc addr(base, 0x40ec)
-    "Packets transmitted (1024-max bytes) count" type(uint32);
-  register mcptc rc addr(base, 0x40f0)
-    "Multicast packets transmitted count" type(uint32);
-  register bptc rc addr(base, 0x40f4)
-    "Broadcast packets transmitted count" type(uint32);
-  register tsctc rc addr(base, 0x40f8)
-    "TCP segmentation context transmitted count" type(uint32);
-  register tsctfc rc addr(base, 0x40fc)
-    "TCP segmentation context tx fail count" type(uint32);
-  register iac rc addr(base, 0x4100)
-    "Interrupt assertion count" type(uint32);
-  register icrxptc rc addr(base, 0x4104)
-    "Interrupt cause rx packet timer expire count" type(uint32);
-  register icrxatc rc addr(base, 0x4108)
-    "Interrupt cause rx absolute timer expire count" type(uint32);
-  register ictxptc rc addr(base, 0x410c)
-    "Interrupt cause tx packet timer expire count" type(uint32);
-  register ictxatc rc addr(base, 0x4110)
-    "Interrupt cause tx absolute timer expire count" type(uint32);
-  register ictxqec rc addr(base, 0x4118)
-    "Interrupt cause transmit queue empty count" type(uint32);
-  register ictxdltc rc addr(base, 0x411c)
-    "Interrupt cause transmit descriptor low threshold count" type(uint32);
-  register icrxdmtc rc addr(base, 0x4120)
-    "Interrupt cause receive descriptor minimum threshold count" type(uint32);
-  register icrxoc rc addr(base, 0x4124)
-    "Interrupt cause receive overrun count" type(uint32);
-
-  regarray statsregs rc also addr(base, 0x4000)[74] 
-    "All stats registers" type(uint32);
-
-
-  /************************************
-   * Descriptors
-   ***********************************/
-
-  // 3.2.4
-  datatype legacy_rdesc lsbfirst(64) "Legacy rx descriptor" {
-      addr     64 "Buffer address";
-      length   16 "Packet length";
-      checksum  16 "Packet checksum";
-      // Status
-      dd       1  "Descriptor done";
-      eop      1  "End of packet";
-      ixsm     1  "Ignore checksum indication";
-      vp       1  "Packet is 802.1q (matched VET)";
-      udpcs    1  "UDP checksum calculated on packet";
-      tcpcs    1  "TCP checksum calculated on packet";
-      ipcs     1  "IPv4 checksum calculated on packet";
-      pif      1  "Passed in-exact filter";
-      // Errors
-      ce       1  "CRC or alignment error";
-      se       1  "Symbol error";
-      seq      1  "Sequence error";
-      _                2;
-      tcpe     1  "TCP/UDP checksum error";
-      ipe      1  "IPv4 checksum error";
-      rxe      1  "RX data error";
-      // VLAN tag field
-      vlan     12 "VLAN id";
-      cr       1  "Canonical form indicator";
-      pri      3  "802.1p priority";
-  };
-
-  // 3.2.5
-  datatype rdesc_read lsbfirst(64) "Extended rx descriptor (read format)" {
-      addr     64 "Buffer address";
-      dd       1  "Descriptor done";
-      _                63;
-  };
-  datatype rdesc_write lsbfirst(64) "Extended rx descriptor (write format)" {
-      // MRQ 
-      rss      4 type(rsstype) "RSS type";
-      _                4;
-      queue    5 "Receive queue";
-      _                19;
-      // IP id; note that the RSS hash can overlay the next two fields
-      ipid     16 "IP header identification field";
-      // Checksum
-      checksum 16 "Packet checksum";
-      // Extended status
-      dd       1  "Descriptor done";
-      eop      1  "End of packet";
-      ixsm     1  "Ignore checksum indication";
-      vp       1  "Packet is 802.1q (matched VET)";
-      udpcs    1  "UDP checksum calculated on packet";
-      tcpcs    1  "TCP checksum calculated on packet";
-      ipcs     1  "IPv4 checksum calculated on packet";
-      pif      1  "Passed in-exact filter";
-      _                1;
-      ipidv    1  "IP identification valid";
-      udpv     1  "Valid UDP checksum";
-      _                4;
-      ack      1  "ACK packet identification";
-      _                4;
-      // Extended errors 
-      _                4;
-      ce       1  "CRC or alignment error";
-      se       1  "Symbol error";
-      seq      1  "Sequence error";
-      _                2;
-      tcpe     1  "TCP/UDP checksum error";
-      ipe      1  "IPv4 checksum error";
-      rxe      1  "RX data error";
-      // Length
-      length   16 "Packet length";
-      // VLAN tag field
-      vlan     12 "VLAN id";
-      cr       1  "Canonical form indicator";
-      pri      3  "802.1p priority";
-  };
-
-  // 3.2.5.4
-  constants rsstype "RSS computation type" {
-      no_rss   = 0x0 "No RS computation";
-      tcp_v4   = 0x1 "IPv4 with TCP hash";
-      ipv4     = 0x2 "IPv4 hash";
-      tcp_v6   = 0x3 "IPv6 with TCP hash";
-      ipv6     = 0x5 "IPv6 hash";
-  };
-
-
-};
diff --git a/devices/knc_sbox.dev b/devices/knc_sbox.dev
deleted file mode 100644 (file)
index 63e5941..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (c) 2014 ETH Zurich. All rights reserved.
- *
- * This file is distributed under the terms in the attached LICENSE file.
- * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
- */
-
-/*
- * knc_sbox.dev
- *
- * description: intel e1000 family gigabit ethernet nics
- */
-
-device knc_sbox lsbfirst ( addr base ) "intel xeon phi (knights corner) sbox" {
-
-register oc_i2c_icr                     rw addr(base, 0x1000) "foo" { };
-register thermal_status                 rw addr(base, 0x1018) "foo" { };
-register thermal_interrupt_enable               rw addr(base, 0x101c) "foo" { };
-register status_fan1                    rw addr(base, 0x1024) "foo" { };
-register status_fan2                    rw addr(base, 0x1028) "foo" { };
-register speed_override_fan                 rw addr(base, 0x102c) "foo" { };
-register board_temp1                    rw addr(base, 0x1030) "foo" { };
-register board_temp2                    rw addr(base, 0x1034) "foo" { };
-register board_voltage_sense                rw addr(base, 0x1038) "foo" { };
-register current_die_temp0                  rw addr(base, 0x103c) "foo" { };
-register current_die_temp1                  rw addr(base, 0x1040) "foo" { };
-register current_die_temp2                  rw addr(base, 0x1044) "foo" { };
-register max_die_temp0                  rw addr(base, 0x1048) "foo" { };
-register max_die_temp1                  rw addr(base, 0x104c) "foo" { };
-register max_die_temp2                  rw addr(base, 0x1050) "foo" { };
-register elapsed_time_low                                   rw addr(base, 0x1074) "foo" { };
-register elapsed_time_high                                  rw addr(base, 0x1078) "foo" { };
-register fail_safe_offset                   rw addr(base, 0x2004) "foo" { };
-register current_clk_ratio                  rw addr(base, 0x3004) "foo" { };
-register smpt00                     rw addr(base, 0x3100) "foo" { };
-register smpt02                     rw addr(base, 0x3108) "foo" { };
-register rgcr                       rw addr(base, 0x4010) "foo" { };
-register dstat                      rw addr(base, 0x4014) "foo" { };
-register pcie_pci_revision_id_and_c_0x8         rw addr(base, 0x5808) "foo" { };
-register pcie_bar_enable                    rw addr(base, 0x5cd4) "foo" { };
-register sicr0                      rw addr(base, 0x9004) "foo" { };
-register sice0                      rw addr(base, 0x900c) "foo" { };
-register sicc0                      rw addr(base, 0x9010) "foo" { };
-register sicr1                      rw addr(base, 0x901c) "foo" { };
-register sicc1                      rw addr(base, 0x9028) "foo" { };
-register pmu_period_sel             rw addr(base, 0x1070) "foo" { };
-register thermal_status_interrupt   rw addr(base, 0x107c) "foo" { };
-register thermal_status_2           rw addr(base, 0x1080) "foo" { };
-register thermal_test_2             rw addr(base, 0x1084) "foo" { };
-register corefreq                   rw addr(base, 0x4100) "foo" { };
-register corevolt                   rw addr(base, 0x4104) "foo" { };
-register memoryfreq                 rw addr(base, 0x4108) "foo" { };
-register memvolt                    rw addr(base, 0x410c) "foo" { };
-register sdbic0                     rw addr(base, 0xcc90) "foo" { };
-register sdbic1                     rw addr(base, 0xcc94) "foo" { };
-register sdbic2                     rw addr(base, 0xcc98) "foo" { };
-register sdbic3                     rw addr(base, 0xcc9c) "foo" { };
-register mxar0                      rw addr(base, 0x9040) "foo" { };
-register mxar0_k1om                     rw addr(base, 0x9044) "foo" { };
-register mxar1                      rw addr(base, 0x9044) "foo" { };
-register mxar2                      rw addr(base, 0x9048) "foo" { };
-register mxar3                      rw addr(base, 0x904c) "foo" { };
-register mxar4                      rw addr(base, 0x9050) "foo" { };
-register mxar5                      rw addr(base, 0x9054) "foo" { };
-register mxar6                      rw addr(base, 0x9058) "foo" { };
-register mxar7                      rw addr(base, 0x905c) "foo" { };
-register mxar8                      rw addr(base, 0x9060) "foo" { };
-register mxar9                      rw addr(base, 0x9064) "foo" { };
-register mxar10                     rw addr(base, 0x9068) "foo" { };
-register mxar11                     rw addr(base, 0x906c) "foo" { };
-register mxar12                     rw addr(base, 0x9070) "foo" { };
-register mxar13                     rw addr(base, 0x9074) "foo" { };
-register mxar14                     rw addr(base, 0x9078) "foo" { };
-register mxar15                     rw addr(base, 0x907c) "foo" { };
-register msixpbacr                      rw addr(base, 0x9080) "foo" { };
-register msixpbacr_k1om                 rw addr(base, 0x9084) "foo" { };
-register dcar_0                     rw addr(base, 0xa000) "foo" { };
-register dhpr_0                     rw addr(base, 0xa004) "foo" { };
-register dtpr_0                     rw addr(base, 0xa008) "foo" { };
-register daux_lo_0                      rw addr(base, 0xa00c) "foo" { };
-register daux_hi_0                      rw addr(base, 0xa010) "foo" { };
-register drar_lo_0                      rw addr(base, 0xa014) "foo" { };
-register drar_hi_0                      rw addr(base, 0xa018) "foo" { };
-register ditr_0                     rw addr(base, 0xa01c) "foo" { };
-register dstat_0                        rw addr(base, 0xa020) "foo" { };
-register dstatwb_lo_0                   rw addr(base, 0xa024) "foo" { };
-register dstatwb_hi_0                   rw addr(base, 0xa028) "foo" { };
-register dcherr_0                       rw addr(base, 0xa02c) "foo" { };
-register dcherrmsk_0                    rw addr(base, 0xa030) "foo" { };
-register dcar_1                     rw addr(base, 0xa040) "foo" { };
-register dhpr_1                     rw addr(base, 0xa044) "foo" { };
-register dtpr_1                     rw addr(base, 0xa048) "foo" { };
-register daux_lo_1                      rw addr(base, 0xa04c) "foo" { };
-register daux_hi_1                      rw addr(base, 0xa050) "foo" { };
-register drar_lo_1                      rw addr(base, 0xa054) "foo" { };
-register drar_hi_1                      rw addr(base, 0xa058) "foo" { };
-register ditr_1                     rw addr(base, 0xa05c) "foo" { };
-register dstat_1                        rw addr(base, 0xa060) "foo" { };
-register dstatwb_lo_1                   rw addr(base, 0xa064) "foo" { };
-register dstatwb_hi_1                   rw addr(base, 0xa068) "foo" { };
-register dcherr_1                       rw addr(base, 0xa06c) "foo" { };
-register dcherrmsk_1                    rw addr(base, 0xa070) "foo" { };
-register dcar_2                     rw addr(base, 0xa080) "foo" { };
-register dhpr_2                     rw addr(base, 0xa084) "foo" { };
-register dtpr_2                     rw addr(base, 0xa088) "foo" { };
-register daux_lo_2                      rw addr(base, 0xa08c) "foo" { };
-register daux_hi_2                      rw addr(base, 0xa090) "foo" { };
-register drar_lo_2                      rw addr(base, 0xa094) "foo" { };
-register drar_hi_2                      rw addr(base, 0xa098) "foo" { };
-register ditr_2                     rw addr(base, 0xa09c) "foo" { };
-register dstat_2                        rw addr(base, 0xa0a0) "foo" { };
-register dstatwb_lo_2                   rw addr(base, 0xa0a4) "foo" { };
-register dstatwb_hi_2                   rw addr(base, 0xa0a8) "foo" { };
-register dcherr_2                       rw addr(base, 0xa0ac) "foo" { };
-register dcherrmsk_2                    rw addr(base, 0xa0b0) "foo" { };
-register dcar_3                     rw addr(base, 0xa0c0) "foo" { };
-register dhpr_3                     rw addr(base, 0xa0c4) "foo" { };
-register dtpr_3                     rw addr(base, 0xa0c8) "foo" { };
-register daux_lo_3                      rw addr(base, 0xa0cc) "foo" { };
-register daux_hi_3                      rw addr(base, 0xa0d0) "foo" { };
-register drar_lo_3                      rw addr(base, 0xa0d4) "foo" { };
-register drar_hi_3                      rw addr(base, 0xa0d8) "foo" { };
-register ditr_3                     rw addr(base, 0xa0dc) "foo" { };
-register dstat_3                        rw addr(base, 0xa0e0) "foo" { };
-register dstatwb_lo_3                   rw addr(base, 0xa0e4) "foo" { };
-register dstatwb_hi_3                   rw addr(base, 0xa0e8) "foo" { };
-register dcherr_3                       rw addr(base, 0xa0ec) "foo" { };
-register dcherrmsk_3                    rw addr(base, 0xa0f0) "foo" { };
-register dcar_4                     rw addr(base, 0xa100) "foo" { };
-register dhpr_4                     rw addr(base, 0xa104) "foo" { };
-register dtpr_4                     rw addr(base, 0xa108) "foo" { };
-register daux_lo_4                      rw addr(base, 0xa10c) "foo" { };
-register daux_hi_4                      rw addr(base, 0xa110) "foo" { };
-register drar_lo_4                      rw addr(base, 0xa114) "foo" { };
-register drar_hi_4                      rw addr(base, 0xa118) "foo" { };
-register ditr_4                     rw addr(base, 0xa11c) "foo" { };
-register dstat_4                        rw addr(base, 0xa120) "foo" { };
-register dstatwb_lo_4                   rw addr(base, 0xa124) "foo" { };
-register dstatwb_hi_4                   rw addr(base, 0xa128) "foo" { };
-register dcherr_4                       rw addr(base, 0xa12c) "foo" { };
-register dcherrmsk_4                    rw addr(base, 0xa130) "foo" { };
-register dcar_5                     rw addr(base, 0xa140) "foo" { };
-register dhpr_5                     rw addr(base, 0xa144) "foo" { };
-register dtpr_5                     rw addr(base, 0xa148) "foo" { };
-register daux_lo_5                      rw addr(base, 0xa14c) "foo" { };
-register daux_hi_5                      rw addr(base, 0xa150) "foo" { };
-register drar_lo_5                      rw addr(base, 0xa154) "foo" { };
-register drar_hi_5                      rw addr(base, 0xa158) "foo" { };
-register ditr_5                     rw addr(base, 0xa15c) "foo" { };
-register dstat_5                        rw addr(base, 0xa160) "foo" { };
-register dstatwb_lo_5                   rw addr(base, 0xa164) "foo" { };
-register dstatwb_hi_5                   rw addr(base, 0xa168) "foo" { };
-register dcherr_5                       rw addr(base, 0xa16c) "foo" { };
-register dcherrmsk_5                    rw addr(base, 0xa170) "foo" { };
-register dcar_6                     rw addr(base, 0xa180) "foo" { };
-register dhpr_6                     rw addr(base, 0xa184) "foo" { };
-register dtpr_6                     rw addr(base, 0xa188) "foo" { };
-register daux_lo_6                      rw addr(base, 0xa18c) "foo" { };
-register daux_hi_6                      rw addr(base, 0xa190) "foo" { };
-register drar_lo_6                      rw addr(base, 0xa194) "foo" { };
-register drar_hi_6                      rw addr(base, 0xa198) "foo" { };
-register ditr_6                     rw addr(base, 0xa19c) "foo" { };
-register dstat_6                        rw addr(base, 0xa1a0) "foo" { };
-register dstatwb_lo_6                   rw addr(base, 0xa1a4) "foo" { };
-register dstatwb_hi_6                   rw addr(base, 0xa1a8) "foo" { };
-register dcherr_6                       rw addr(base, 0xa1ac) "foo" { };
-register dcherrmsk_6                    rw addr(base, 0xa1b0) "foo" { };
-register dcar_7                     rw addr(base, 0xa1c0) "foo" { };
-register dhpr_7                     rw addr(base, 0xa1c4) "foo" { };
-register dtpr_7                     rw addr(base, 0xa1c8) "foo" { };
-register daux_lo_7                      rw addr(base, 0xa1cc) "foo" { };
-register daux_hi_7                      rw addr(base, 0xa1d0) "foo" { };
-register drar_lo_7                      rw addr(base, 0xa1d4) "foo" { };
-register drar_hi_7                      rw addr(base, 0xa1d8) "foo" { };
-register ditr_7                     rw addr(base, 0xa1dc) "foo" { };
-register dstat_7                        rw addr(base, 0xa1e0) "foo" { };
-register dstatwb_lo_7                   rw addr(base, 0xa1e4) "foo" { };
-register dstatwb_hi_7                   rw addr(base, 0xa1e8) "foo" { };
-register dcherr_7                       rw addr(base, 0xa1ec) "foo" { };
-register dcherrmsk_7                    rw addr(base, 0xa1f0) "foo" { };
-register dcr                        rw addr(base, 0xa280) "foo" { };
-register apicicr0                       rw addr(base, 0xa9d0) "foo" { };
-register apicicr1                       rw addr(base, 0xa9d8) "foo" { };
-register apicicr2                       rw addr(base, 0xa9e0) "foo" { };
-register apicicr3                       rw addr(base, 0xa9e8) "foo" { };
-register apicicr4                       rw addr(base, 0xa9f0) "foo" { };
-register apicicr5                       rw addr(base, 0xa9f8) "foo" { };
-register apicicr6                       rw addr(base, 0xaa00) "foo" { };
-register apicicr7                       rw addr(base, 0xaa08) "foo" { };
-register scratch0                       rw addr(base, 0xab20) "foo" { };
-register scratch1                       rw addr(base, 0xab24) "foo" { };
-register scratch2                       rw addr(base, 0xab28) "foo" { };
-register scratch3                       rw addr(base, 0xab2c) "foo" { };
-register scratch4                       rw addr(base, 0xab30) "foo" { };
-register scratch5                       rw addr(base, 0xab34) "foo" { };
-register scratch6                       rw addr(base, 0xab38) "foo" { };
-register scratch7                       rw addr(base, 0xab3c) "foo" { };
-register scratch8                       rw addr(base, 0xab40) "foo" { };
-register scratch9                       rw addr(base, 0xab44) "foo" { };
-register scratch10                      rw addr(base, 0xab48) "foo" { };
-register scratch11                      rw addr(base, 0xab4c) "foo" { };
-register scratch12                      rw addr(base, 0xab50) "foo" { };
-register scratch13                      rw addr(base, 0xab54) "foo" { };
-register scratch14                      rw addr(base, 0xab58) "foo" { };
-register scratch15                      rw addr(base, 0xab5c) "foo" { };
-register rdmasr0                        rw addr(base, 0xb180) "foo" { };
-register sbq_flush                      rw addr(base, 0xb1a0 ) "foo" { };
-register tlb_flush                      rw addr(base, 0xb1a4) "foo" { };
-register gtt_phy_base                   rw addr(base, 0xc118) "foo" { };
-register emon_cnt0                      rw addr(base, 0xcc28) "foo" { };
-register emon_cnt1                      rw addr(base, 0xcc2c) "foo" { };
-register emon_cnt2                      rw addr(base, 0xcc30) "foo" { };
-register emon_cnt3                      rw addr(base, 0xcc34) "foo" { };
-};
diff --git a/devices/virtio/virtio_blk.dev b/devices/virtio/virtio_blk.dev
new file mode 100644 (file)
index 0000000..4baf42a
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2012, ETH Zurich. All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+/*
+ * virtio.dev
+ *
+ * The following structurs are taken from the Virtio Specification 1.0
+ *
+ */
+device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
+   
+    datatype features lsbfirst (32)  "Feature bits for block devices"  {
+        barrier             1 "Device supports request barriers (Legacy)";
+        size_max            1 "Maximum size of any single segment in size_max";
+        seg_max             1 "Maximum number of segments in a request in seg_max";
+        _                   1 "Reserved";
+        geometry            1 "Disk-style geometry specified in geometry";
+        read_only           1 "Device is read-only";
+        blk_size            1 "Block size of disk is in blk_size";
+        scsi                1 "Device supports scsi packet commands";
+        _                   1 "Reserved";
+        flush               1 "Cache flush command support (Legacy)";
+        topology            1 "Device exports information on optimal IO alignment";
+        /* reserved bits */
+        _                  12 "";
+        notify_on_empty     1 "(Legacy) The device MUST issue an interrupt if the device runs out of available descriptors"; 
+        _                   2 "";
+        any_layout          1 "(Legacy) his feature indicates that the device accepts arbitrary descriptor layouts";
+        ring_indirect_desc  1 "river can use descriptors with the VIRTQ_DESC_F_INDIRECT";
+        ring_event_idx      1 "enables the used_event and the avail_event fields";
+        _                   2 "Reserved";
+        version_1           1 "Distinction Legacy / Version 1 Device";
+    };
+    
+    /*
+     * Note: 
+     */
+    datatype req lsbfirst(32)  "Request header" {
+        rtype    32 "The type of the request";
+        ioprio  32 "The IO prioroty (Legacy)";
+        sector  64 "The sector where to write/read";
+        /* data */
+    };
+    
+    /*
+     * The cmd field is only present for scsi packet command requests, and 
+     * indicates the command to perform. This field MUST reside in a single, 
+     * separate device-readable buffer; command length can be derived from the 
+     * length of this buffer.
+     */
+    datatype scsi_req lsbfirst(32) "SCSI trailer"{
+        /* request header */
+        /* cmd */
+        /* data */
+        /* sense buffer */
+        errors      32  "Errors that may have occurred";
+        data_len    32  "Deprecated: Should be ignored.";
+        sense_len   32  "The number of bytes in the sense buffer";
+        residual    32  "The residual size: total - transferred";
+        status       8  "Request status";
+        _           24  "To make mackerel happy";
+    };
+    
+    constants req_type "Possible request types for the block device" {
+        in           = 0x00000000 "Request type is an IN operation";
+        out          = 0x00000001 "Request type is an OUT operation";
+        scsi_cmd     = 0x00000002 "Request type is an OUT operation";
+        scsi_cmd_out = 0x00000003 "Request type is an OUT operation";
+        flush        = 0x00000004 "Request type is a cache flush";
+        flush_out    = 0x00000005 "Request type is a cache flush";
+        barrier      = 0x80000000 "IO Barrier (Legacy)";
+    };
+    
+    constants req_status "The status of the request" {
+        ok      = 0x0 "Everythin ok";
+        ioerror = 0x1 "IO error occured";
+        unsupp  = 0x2 "The request is not supported";
+    };
+    
+   register capacity addr(base, 0x00) "The capacity in 512byte sectors" {
+       sectors  64  "Number of 512byte sectors";
+   };
+   
+   register size_max addr(base, 0x08) "The maximum segment size" {
+       size 32 "Maximum segment size";
+   };
+   
+   register seg_max addr(base, 0x0C) "The maximum number of segments" {
+       num 32 "Number of segments";
+   };
+   
+   register geo_cylinders addr(base, 0x10) "Geometry Information: Cylinders" {
+       num 16 "Geometry: Number of cylinders";
+   };
+   
+   register geo_heads addr(base, 0x12) "Geometry Information: Heads" {
+       num 8 "Geometry: Number of heads";
+   };
+   
+   register geo_sectors addr(base, 0x13) "Geometry Information: Sectors" {
+       num 8 "Geometry: Number of sectors";
+   };
+   
+   register block_size addr(base, 0x14) "Block Size" {
+       size 32 "The size of a block";
+   };
+   
+   register phys_block_exp addr(base, 0x18) "Toplogy: Logical Blocks" {
+       exp 8 "Number of logical blocks per physical block";
+   };
+   
+   register align_offset addr(base, 0x19) "Topology: Align Offset" {
+      off 8 "Offset of first aligned logical block";
+   };
+   
+   register min_io addr(base, 0x1A) "Topology: minimum IO Size" {
+       size 16 "Minimum number of IO size in blocks";
+   };
+   
+   register opt_io addr(base, 0x1C) "Topology: maximum IO Size" {
+       size 32 "Maximum number of IO size in  blocks";
+   };
+   
+   register writeback addr(base, 0x20) "Legacy Writeback Register" {
+       wb   8 "Write back";
+   };
+ };
+          
\ No newline at end of file
diff --git a/devices/virtio/virtio_mmio.dev b/devices/virtio/virtio_mmio.dev
new file mode 100644 (file)
index 0000000..cf54299
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2014, ETH Zurich. All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+/*
+ * virtio_mmio.dev
+ *
+ * Virtio over Memory Mapped IO
+ * 
+ * From the Virtio Specification, Section 4.2
+ *
+ */
+device virtio_mmio lsbfirst ( addr base ) "Virtio MMIO Transport Specification" {
+
+    constants virtio_magic width(4) "Little Endian equivalent of the 'virt' string" {
+        value = 0x74726976;
+    };
+    
+    register magic_value addr(base, 0x000) "Magic value for identifying the Virtio device" {
+        val 32 "Has to be 0x74726976";        
+    };
+    
+    constants virtio_version width(32) "Virtio MMIO Device Versions" {
+        invalid = 0x0 "Invalid Version.";
+        legacy  = 0x1 "The legacy interface is used.";
+        virtio1 = 0x2 "Virtio Version 1.0";
+    };
+    
+    register version addr(base, 0x004) "Device Version Number" {
+        version 32 "Virtio device interface version";        
+    };
+    
+    constants virtio_deviceid width(32) "Virtio Device IDs" {
+        reserved         = 0x0 "Invalid Device ID";
+        network_card    = 0x1 "Network Interface Device";
+        block_device    = 0x2 "Block Device";
+        console         = 0x3 "Serial Console Device";
+        entropy_source  = 0x4 "Entorpy Source Device (Randomness)";
+        legacy_balloon  = 0x5 "Memory Ballooning Device (legacy)";
+        io_memory       = 0x6 "IO Memory Device";
+        rpmsg           = 0x7 "RPMSG Device";
+        scsi_host       = 0x8 "SCSI Host Device";
+        transport_9p    = 0x9 "9P Transport Device";
+        mac80211_wlan   = 0xA "MAC 802.11 WLAN Device";
+        rproc_serial    = 0xB "RPROC Serial Device";
+        virtio_caif     = 0xC "Virtio CAIF Device";
+        memory_balloon  = 0xD "Memory Ballooning Device";
+        gpu_device      = 0xE "GPU Device";
+        timer_device    = 0xF "Clock / Timer Device";  
+    };
+    
+    /*
+     * See 5 Device Types for possible values. Value zero (0x0) is used to de-
+     * fine a system memory map with placeholder devices at static, well known
+     * addresses, assigning functions to them depending on user’s needs.
+     */
+    register deviceid addr(base, 0x008) "Virtio Subsystem Device ID" {
+        id 32 "Device ID";
+    };
+    
+    register vendorid addr(base, 0x00C) "Virtio Subsystem Vendor ID" {
+        id 32 "Vendor ID";
+    };
+   
+    
+    /*
+     * Reading from this register returns 32 consecutive flag bits, first bit 
+     * depending on the last value written to DeviceFeaturesSel. Access to this 
+     * register returns bits DeviceFeaturesSel ∗ 32 to 
+     * (DeviceFeaturesSel ∗ 32) + 31, eg. feature bits 0 to 31 if 
+     *  DeviceFeaturesSel is set to 0 and features bits 32 to 63 if 
+     *  DeviceFeaturesSel is set to 1. Also see 2.2 Feature Bits.
+     *  
+     *  Note: The representation of the actual feature bits depend on the device
+     */
+    register dev_features addr(base, 0x010) "Flags representing features the device supports" {
+        features 32 "Virtio Features Bits";
+    };
+    
+    /* 
+     * Writing to this register selects a set of 32 device feature bits accessible 
+     * by reading from DeviceFeatures.
+     */
+    register dev_features_sel addr(base, 0x014) "Device (host) features word selection." {
+        selector 32 "Virtio Feature Selector";
+    };
+    
+    /*
+     * Writing to this register sets 32 consecutive flag bits, first bit depending 
+     * on the last value written to DriverFeaturesSel. Access to this register sets 
+     * bits DriverFeaturesSel ∗ 32 to (DriverFeaturesSel ∗ 32) + 31, eg. feature 
+     * bits 0 to 31 if DriverFeaturesSel is set to 0 and features bits 32 to 63 
+     * if DriverFeaturesSel is set to 1. Also see 2.2 Feature Bits.
+     * 
+     *  Note: The representation of the actual feature bits depend on the device 
+     */
+    register driv_features addr(base, 0x020) "Flags representing device features understood and activated by the driver" {
+        features 32 "Virtio Features Bits";
+    };
+  
+    register driv_features_sel addr(base, 0x024) "Activated (guest) features word selection" {
+        selector 32 "Virtio Feature Selector";
+    };
+    
+    /*
+     * Writing to this register selects the virtual queue that the following 
+     * operations on QueueNumMax, QueueNum, QueueReady, QueueDescLow,
+     * QueueDescHigh, QueueAvailLow, QueueAvailHigh, QueueUsedLow and 
+     * QueueUsedHigh apply to. The index number of the first queue is zero (0x0).
+     */
+    register queue_sel addr(base, 0x030) "Virtual queue index" {
+        selector 32 "Virtio Queue Selector";
+    };
+    
+    /*
+     * Reading from the register returns the maximum size (number of elements)
+     * of the queue the device is ready to process or zero (0x0) if the queue is 
+     * not available. This applies to the queue selected by writing to QueueSel.
+     */
+    register queue_max addr(base, 0x34) "Maximum virtual queue size" {
+        size 32 "Number ready to process";
+    };
+    
+    /*
+     * Queue size is the number of elements in the queue, therefore size of the
+     * Descriptor Table and both Available and Used rings. Writing to this 
+     * register notifies the device what size of the queue the driver will use. 
+     * This applies to the queue selected by writing to QueueSel.
+     */
+    register queue_num addr(base, 0x038) "Virtual queue size" {
+        size 16 "Number of elements in queue";
+    };
+    
+    
+    /*
+     * Writing one (0x1) to this register notifies the device that the virtual 
+     * queue is ready to be used. Reading from this register returns the last 
+     * value written to it. Both read and write accesses apply to the queue 
+     * selected by writing to QueueSel.
+     */
+    register queue_ready addr(base, 0x044) "Virtual queue ready bit" {
+        ready  1 "Queue ready bit";
+        _     31 "Reserved";
+    };
+    
+    constants queue width(1) "Queue Ready Bit Values" {
+        ready    = 0x1 "The queue is ready to use";
+        notready = 0x0 "The queue is not ready";
+    };
+    
+    /*
+     * Writing a queue index to this register notifies the device that there are 
+     * new buffers to process in the queue.
+     */
+    register queue_notify addr(base, 0x050) "Queue notifier" {
+        index 32 "The queue index with new buffers";
+    };
+    
+    /*
+     * Reading from this register returns a bit mask of events that caused the 
+     * device interrupt to be asserted. The following events are possible:
+     * 
+     * Used Ring Update - bit 0 - the interrupt was asserted because the device
+     * has updated the Used Ring in at least one of the active virtual queues.
+     * 
+     * Configuration Change - bit 1 - the interrupt was asserted because the 
+     * configuration of the device has changed.
+     */
+    register interrupt_status addr(base, 0x060) "Interrupt status" {
+        ring_update    1 "The device has updated the used ring";  
+        config_change  1 "The configuration of the device has changed";
+        _             30 "";
+    };
+    
+    /*
+     * Writing to this register notifies the device that the interrupt has been 
+     * handled, as per values for InterruptStatus.
+     * 
+     */
+    register interrupt_ack addr(base, 0x064) "Interrupt acknowledge" {
+        ring_update    1 "The device has updated the used ring";  
+        config_change  1 "The configuration of the device has changed";
+        _             30 "";
+    };    
+    
+    constants device_status width(8) "Reset value" {
+        reset = 0x0 "Reset the device";
+    };
+    
+    /*
+     * Reading from this register returns the current device status flags. 
+     * Writing non-zero values to this register sets the status flags, indicating 
+     * the driver progress. Writing zero (0x0) to this register triggers a 
+     * device reset.
+     */
+    register status addr(base, 0x70) {
+        acknowledge 1   "Guest has found the device";
+        driver      1   "Guest knows how to drive the device";
+        driver_ok   1   "Driver setup and ready to drive the device";
+        features_ok 1   "Driver has acknowledged all the features it understands";
+        _           3   "Reserved";
+        failed      1   "Something went wrong";
+        _          24 "Reserved";
+    };
+    
+    register reset also addr(base, 0x70) {
+        reset       8 "Reset the device";
+        _          24 "Reserved";
+    };
+    
+    /*
+     * Writing to these two registers (lower 32 bits of the address to QueueDescLow, 
+     * higher 32 bits to QueueDescHigh) notifies the device about location of 
+     * the Descriptor Table of the queue selected by writing to QueueSel register.
+     */
+    register queue_desc_lo addr(base, 0x080) "Virtual queue’s Descriptor Table 64 bit long physical address" { 
+        addr 32 "Address of Queue Descriptor Table";
+    };
+    register queue_desc_hi addr(base, 0x084) "Virtual queue’s Descriptor Table 64 bit long physical address" { 
+        addr 32 "Address of Queue Descriptor Table";
+    };    
+    
+    /*
+     * Writing to these two registers (lower 32 bits of the address to 
+     * QueueAvailLow, higher 32 bits to QueueAvailHigh) notifies the device 
+     * about location of the Available Ring of the queue selected by writing to QueueSel.
+     */
+    register queue_avail_lo addr(base, 0x090) "Virtual queue’s Available Ring 64 bit long physical address" { 
+        addr 32 "Address of available ring";
+    };
+    register queue_avail_hi addr(base, 0x094) "Virtual queue’s Available Ring 64 bit long physical address" { 
+        addr 32 "Address of available ring";
+    };
+    
+    /*
+     * Writing to these two registers (lower 32 bits of the address to 
+     * QueueUsedLow, higher 32 bits to QueueUsedHigh) notifies the device about 
+     * locationof the Used Ring of the queue selected by writing to QueueSel.
+     */
+    register queue_used_lo addr(base, 0x0a0) "Virtual queue’s Used Ring 64 bit long physical address" { 
+        addr 32 "Address of used ring";
+    };
+    register queue_used_hi addr(base, 0x0a4) "Virtual queue’s Used Ring 64 bit long physical address" { 
+        addr 32 "Address of used ring";
+    };
+    
+    /*
+     * Changes every time the configuration noticeably changes
+     */
+    register config_gen addr(base, 0x0fc) "Configuration atomicity value" {
+        value 32 "Value";
+    };
+    
+    register config_addr addr(base, 0x100) "The Offset to the start of the device config space" {
+        offset 32 "Offset to config space";
+    };
+    
+};
diff --git a/devices/xeon_phi/xeon_phi_boot.dev b/devices/xeon_phi/xeon_phi_boot.dev
new file mode 100644 (file)
index 0000000..9ac1139
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2014 ETH Zurich. All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+/*
+ * xeon_phi_boot.dev
+ *
+ * description: register definitions for the Xeon Phi Boot Time Registers
+ */
+
+device xeon_phi_boot lsbfirst ( addr base ) "Intel Xeon Phi Boot Registers" {
+
+    /*
+     * Protection Level: Ring 0
+     * Visibility: Host / Coprocessor
+     * Reset Dmain: CSR_RESET, HOT_RESET
+     * Register Access: TRM
+     */
+
+     constants offset width(32) "" {
+         address_shift=12;
+         address_mask=0xfffff000;
+     };
+
+    /*
+     * alias for scratch register 2
+     */
+    register download rw addr(base, 0xAB28) {
+        status       1 "Download status bit";
+        apicid       9 "APIC ID to send the boot interrupt";
+        _            2 "unused";
+        offset      20 "Load offset";         
+    };
+    
+    /*
+     * alias for scratch register 3
+     */
+    register res_size rw addr(base, 0xAB2C) {
+        os 32 "Reserved size";
+    };
+    
+    /*
+     * alias for scratch register 5
+     */
+    register os_size rw addr(base, 0xAB34) {
+        size 32 "Size of the loaded image";
+    };
+    
+    constants mem width(2) "" {
+          mem_all    = 0x0;
+          mem_half   = 0x1;
+          mem_third  = 0x2;
+          mem_fourth = 0x3;
+    };
+    
+    register meminfo rw addr(base, 0xAB20) {
+          test_disable  1 "Memtest disable";
+          usage         2 "Memory usage";
+          size_kb      29 "Memory size in KB";
+    };
+    
+    
+
+};
\ No newline at end of file
diff --git a/devices/xeon_phi/xeon_phi_serial.dev b/devices/xeon_phi/xeon_phi_serial.dev
new file mode 100644 (file)
index 0000000..07b61d7
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2014 ETH Zurich. All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+/*
+ * xeon_phi_serial.dev
+ *
+ * description: register definitions for the Xeon Phi software scratch registers
+ *
+ * Base: the base of the sbox
+ */
+
+device xeon_phi_serial lsbfirst ( addr base ) "Intel Xeon Phi Software Scratch Registers" {
+   
+    constants ctrl_values width(8) "Constants" {
+        reset = 0x0;
+        data  = 0x7A;
+    };
+   
+    // currently scratch 15 register
+    register data rw addr(base, 0xAB5C) "" {
+          value0 8 "Datavalue to send";
+          value1 8 "Datavalue to send";
+          value2 8 "Datavalue to send";
+          value3 8 "Datavalue to send";
+    };
+    
+    // currently scratch 8 register
+    register ctrl rw addr(base, 0xAB40) "" {
+          value0 8 "Datavalue to send";
+          value1 8 "Datavalue to send";
+          value2 8 "Datavalue to send";
+          value3 8 "Datavalue to send";
+    };
+
+
+};
\ No newline at end of file
index e02e417..61feffb 100644 (file)
@@ -178,7 +178,8 @@ let
                          "xapic", 
                          "amd_vmcb", 
                          "cpuid", 
-                         "lpc_rtc" ],
+                         "lpc_rtc", 
+                         "xeon_phi/xeon_phi_serial" ],
      addLibraries = [ "elf_kernel" ] 
      },
 
index 72fa000..f78681f 100644 (file)
 #include <x86.h>
 #include <serial.h>
 
+#include <dev/xeon_phi/xeon_phi_serial_dev.h>
+
 #define SBOX_BASE               0x08007D0000ULL
 #define SBOX_SCRATCH14          0x0000AB58
 #define SBOX_SCRATCH15          0x0000AB5C
 #define SBOX_SCRATCH8           0x0000AB40
 
+static xeon_phi_serial_t mmio_serial;
 
 /* todo: get rid of those */
 int serial_portbase;
 
-lvaddr_t serial_base = SBOX_BASE;
-
-union xeon_phi_message {
-       uint32_t val;
-       char c[4];
-};
 
 /** \brief Initialise the serial driver. */
 errval_t serial_init(lvaddr_t base) {
 
-    serial_base = base;
+    xeon_phi_serial_initialize(&mmio_serial, (mackerel_addr_t)base);
 
        // XXX: if non-BSP core, assume HW is already initialised
        if (!arch_core_is_bsp()) {
@@ -48,39 +45,55 @@ errval_t serial_init(lvaddr_t base) {
 
 errval_t serial_early_init(void) {
 
-    serial_base = SBOX_BASE;
+    xeon_phi_serial_initialize(&mmio_serial, (mackerel_addr_t)SBOX_BASE);
+
+    xeon_phi_serial_ctrl_rawwr(&mmio_serial, xeon_phi_serial_reset);
 
-       /* clear out the control register */
-       uint32_t *signal = (uint32_t*) ((void *) serial_base + SBOX_SCRATCH8);
-       *signal = 0;
        return SYS_ERR_OK;
 }
 
-union xeon_phi_message data_buf;
-union xeon_phi_message data_ctrl;
+xeon_phi_serial_ctrl_t sctrl = xeon_phi_serial_reset;
+xeon_phi_serial_data_t sdata = xeon_phi_serial_reset;
+
+
 uint32_t didx = 0;
 
 #define SERIAL_TIMEOUT 0xFFFFFF
 
 /** \brief Prints a single character to the default serial port. */
 void serial_putchar(char c) {
-       volatile uint32_t *ctrl = ((volatile uint32_t *) (serial_base + SBOX_SCRATCH8));
-       volatile uint32_t *data = ((volatile uint32_t *) (serial_base + SBOX_SCRATCH15));
+       switch (didx) {
+        case 0:
+            sctrl = xeon_phi_serial_ctrl_value0_insert(sctrl, xeon_phi_serial_data);
+            sdata = xeon_phi_serial_data_value0_insert(sdata, c);
+            break;
+        case 1:
+            sctrl = xeon_phi_serial_ctrl_value1_insert(sctrl, xeon_phi_serial_data);
+            sdata = xeon_phi_serial_data_value1_insert(sdata, c);
+            break;
+        case 2:
+            sctrl = xeon_phi_serial_ctrl_value2_insert(sctrl, xeon_phi_serial_data);
+            sdata = xeon_phi_serial_data_value2_insert(sdata, c);
+            break;
+        case 3:
+            sctrl = xeon_phi_serial_ctrl_value3_insert(sctrl, xeon_phi_serial_data);
+            sdata = xeon_phi_serial_data_value3_insert(sdata, c);
+            break;
+       };
 
-       data_buf.c[didx] = c;
-       data_ctrl.c[didx] = 0x7A;
        ++didx;
 
        if (c == '\n' || didx == 4) {
                // write
            volatile uint32_t timeout = SERIAL_TIMEOUT;
-               while ((*ctrl) && (timeout--))
-                       ;
+           while ((xeon_phi_serial_ctrl_rd(&mmio_serial)) && (timeout--))
+                   ;
+
+           xeon_phi_serial_data_rawwr(&mmio_serial, sdata);
+           xeon_phi_serial_ctrl_rawwr(&mmio_serial, sctrl);
 
-               *data = data_buf.val;
-               (*ctrl) = data_ctrl.val;
-               data_buf.val = 0;
-               data_ctrl.val = 0;
+               sdata = xeon_phi_serial_data_initial;
+               sctrl = xeon_phi_serial_ctrl_initial;
                didx = 0;
        }
 }
index f2fd7af..fcd2b61 100644 (file)
@@ -74,20 +74,20 @@ static inline char serial_console_getchar(void)
 #else
 static inline errval_t serial_console_init(void)
 {
-    return serial_init(serial_debug_port);
+    return serial_init(serial_console_port);
 }
 
 static inline void serial_console_putchar(char c)
 {
     if (c == '\n') {
-        serial_putchar(serial_debug_port, '\r');
+        serial_putchar(serial_console_port, '\r');
     }
-    serial_putchar(serial_debug_port, c);
+    serial_putchar(serial_console_port, c);
 }
 
 static inline char serial_console_getchar(void)
 {
-    return serial_getchar(serial_debug_port);
+    return serial_getchar(serial_console_port);
 }
 #endif
 
diff --git a/lib/virtio/Hakefile b/lib/virtio/Hakefile
new file mode 100644 (file)
index 0000000..61038da
--- /dev/null
@@ -0,0 +1,18 @@
+
+--------------------------------------------------------------------------
+-- Copyright (c) 2007-2012, ETH Zurich.
+-- All rights reserved.
+--
+-- This file is distributed under the terms in the attached LICENSE file.
+-- If you do not find this file, copies can be found by writing to:
+-- ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+--
+-- Hakefile for lib/virtio
+-- 
+--------------------------------------------------------------------------
+
+[ build library { target = "virtio",
+                      cFiles = [ "virtio_ring.c" ],
+                      mackerelDevices = [ "virtio/virtio_mmio", "virtio/virtio_blk" ]
+                }
+]
index 709f70e..07fb39f 100644 (file)
@@ -15,8 +15,8 @@
     cFiles = [ "block_server.c",    "network_server.c", "network_client.c", 
                "block_storage.c", "block_storage_cache.c",   "local_server.c", "net_benchmark.c" ],
     addLibraries = libDeps [ "bulk_transfer", "lwip", "net_if_raw", "bench"],
-    flounderDefs = [ "block_service" ],
-    flounderBindings = [ "block_service" ],
+    flounderDefs = [ "block_service", "bulk_ctrl" ],
+    flounderBindings = [ "block_service", "bulk_ctrl" ],
     architectures = [ "x86_64", "x86_32" ]
   },
     
@@ -26,8 +26,8 @@
                "local_server.c", "block_storage_cache.c",
                "block_storage.c", "net_benchmark.c" ],
     addLibraries = libDeps [ "bulk_transfer", "lwip", "bench" ],
-    flounderDefs = [ "block_service" ],
-    flounderBindings = [ "block_service" ],
+    flounderDefs = [ "block_service", "bulk_ctrl" ],
+    flounderBindings = [ "block_service", "bulk_ctrl" ],
     architectures = [ "x86_64", "x86_32" ]
   }
 ]
\ No newline at end of file
index 232d2c3..6fd717c 100644 (file)
@@ -13,6 +13,8 @@
 [ build application { 
     target = "bulk_transfer_passthrough",
     cFiles = [ "passthrough.c" ],
+    flounderDefs = [ "bulk_ctrl" ],
+    flounderBindings = [ "bulk_ctrl" ],
     addLibraries = libDeps [ "bulk_transfer"],
     architectures = [ "x86_64", "x86_32" ]
   }
index 6bb95a0..0965e94 100644 (file)
 --------------------------------------------------------------------------
 
 [ build application { target = "xeon_phi",
-                      cFiles = [ "main.c" ],
-                      architectures = [ "x86_64" ]
+                      cFiles = [ "main.c", "boot.c", "serial.c" ],
+                      addLibraries = libDeps ["skb", "pci", "spawndomain", "elf" ],
+                      architectures= ["x86_64"],
+                      mackerelDevices = [ "xeon_phi/xeon_phi_apic", 
+                                          "xeon_phi/xeon_phi_boot", 
+                                          "xeon_phi/xeon_phi_serial"]
                     }
 ]
diff --git a/usr/drivers/xeon_phi/boot.c b/usr/drivers/xeon_phi/boot.c
new file mode 100644 (file)
index 0000000..1f749b9
--- /dev/null
@@ -0,0 +1,261 @@
+/**
+ * \file
+ * \brief Boot module for the Xeon Phi
+ *
+ * Loads the co processor OS onto the card and boots it
+ */
+
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <barrelfish/barrelfish.h>
+#include <spawndomain/spawndomain.h>
+#include <elf/elf.h>
+
+#include <dev/xeon_phi/xeon_phi_boot_dev.h>
+#include <dev/xeon_phi/xeon_phi_apic_dev.h>
+
+#include "xeon_phi.h"
+
+
+static xeon_phi_boot_t boot_registers;
+
+/**
+ * \brief   get the load offset to where to place the bootloader
+ *
+ * The bootstrap on the card will write the offset into the SBOX_SCRATCH2
+ * register once the bootstrap is finished
+ */
+static inline lvaddr_t
+get_load_offset(struct xeon_phi *phi)
+{
+
+    xeon_phi_boot_download_t offset;
+    offset = xeon_phi_boot_download_rawrd(&boot_registers);
+    return (offset & xeon_phi_boot_address_mask);
+}
+
+/**
+ * \brief Loads the bootloader image onto the card
+ *
+ * \param phi           the xeon phi card information
+ * \param xloader_img   name of the bootloader image
+ * \param ret_imgsize   returned image size
+ * \param ret_cmdoffset returned offset to load the next piece onto the card
+ */
+static errval_t
+load_os(struct xeon_phi *phi,
+        char *xloader_img,
+        uint32_t *ret_imgsize,
+        lvaddr_t *ret_cmdoffset)
+{
+    errval_t err;
+    /*
+     * find the boot loader image in the host multiboot
+     */
+    struct mem_region *module = multiboot_find_module(NULL, xloader_img);
+    if (module == NULL) {
+        return SPAWN_ERR_FIND_MODULE;
+    }
+
+    lvaddr_t binary = 0;
+    size_t imgsize = 0;
+
+    err = spawn_map_module(module, &imgsize, &binary, NULL);
+    if (err_is_fail(err)) {
+        return err_push(err, SPAWN_ERR_ELF_MAP);
+    }
+
+    struct Elf64_Ehdr *head = (struct Elf64_Ehdr *) binary;
+    if (head->e_machine != EM_K1OM) {
+        return SPAWN_ERR_DETERMINE_CPUTYPE;
+    }
+
+    /*
+     * get the load offset: we do not want to write into the
+     */
+    lvaddr_t loadoffset = get_load_offset(phi);
+
+    printf("Loading xloader onto card...\n");
+    XBOOT_DEBUG("aper_base=0x%lx, offset = 0x%lx, size=0x%lx\n", phi->aper_base,
+                loadoffset, imgsize);
+
+    memcpy((void *) (phi->aper_base + loadoffset), (void *)binary, imgsize);
+
+    if (ret_cmdoffset) {
+        *ret_cmdoffset = loadoffset + imgsize;
+    }
+
+    if (ret_imgsize) {
+        *ret_imgsize = imgsize;
+    }
+
+    return SYS_ERR_OK;
+}
+
+/**
+ *
+ */
+static errval_t
+load_multiboot_image(struct xeon_phi *phi,
+                     char *multiboot_img,
+                     lvaddr_t load_offset,
+                     uint32_t *ret_imgsize)
+{
+    errval_t err;
+    /*
+     * find the boot loader image in the host multiboot
+     */
+    struct mem_region *module = multiboot_find_module(NULL, multiboot_img);
+    if (module == NULL) {
+        return SPAWN_ERR_FIND_MODULE;
+    }
+
+    lvaddr_t image = 0;
+    size_t imgsize = 0;
+
+    err = spawn_map_module(module, &imgsize, &image, NULL);
+    if (err_is_fail(err)) {
+        return err_push(err, SPAWN_ERR_ELF_MAP);
+    }
+
+    lvaddr_t os_offset = get_load_offset(phi);
+
+    printf("Loading multiboot image onto card...\n");
+    XBOOT_DEBUG("aper_base=0x%lx, offset = 0x%lx, size=0x%lx\n", phi->aper_base,
+                load_offset, imgsize);
+
+    memcpy((void *) (phi->aper_base + load_offset), (void *)image, imgsize);
+
+    /*
+     * we are using the Linux style way in booting. The following will update
+     * the corresponding fields in struct boot_param of the header.
+     */
+    uint32_t *ramfs_addr_ptr = (uint32_t *) (phi->aper_base + os_offset + 0x218);
+    *ramfs_addr_ptr = load_offset;
+    ramfs_addr_ptr = (uint32_t *) (phi->aper_base + os_offset + 0x21c);
+    *ramfs_addr_ptr = imgsize;
+
+    return SYS_ERR_OK;
+}
+
+/**
+ * \brief   generates the cmdline supplied to the card kernel
+ *
+ * \param   phi         the card information structure
+ * \param   load_offset offset where to load the cmdline
+ * \param   ret_size    size of the cmdline in bytes
+ */
+static errval_t
+load_cmdline(struct xeon_phi *phi,
+             lvaddr_t load_offset,
+             uint32_t *ret_size)
+{
+    uint32_t cmdlen = 0;
+    void *buf = (void *) (phi->aper_base + load_offset);
+
+    if (phi->cmdline) {
+        cmdlen += sprintf(buf, "%s foobar=%i", phi->cmdline, 123);
+    } else {
+        cmdlen += sprintf(buf, "foobar=%i", 123);
+    }
+
+    /*
+     * TODO: Add multihop / communication information here..
+     */
+
+    if (ret_size) {
+        *ret_size = load_offset;
+    }
+
+    return SYS_ERR_OK;
+}
+
+static errval_t
+bootstrap_notify(struct xeon_phi *phi,
+                 uint32_t os_imgsize)
+{
+#if 0
+    uint32_t scratch5;
+
+    scratch5 = os_imgsize;
+    // XPU_RACE_CONDITION: write to MMIO space is uncached and flushes WC buffers
+    SBOX_WRITE(scratch5, mmio_va, SBOX_SCRATCH5);
+
+    get_adapter_memsize(mmio_va, &adapter_memsize);
+
+    // Program the register to inform the uOS of how much space to reserve
+    get_uos_reserved_size(mmio_va, adapter_memsize, &uos_reserved_size);
+    set_uos_reserved_size(mmio_va, uos_reserved_size);
+
+    mic_send_bootstrap_intr(mic_ctx);
+#endif
+    return SYS_ERR_OK;
+}
+
+/**
+ * \brief boots the card with the given loader and multiboot image
+ *
+ * \param phi           pointer to the card information
+ * \param xloader_img   pointer to the card bootloader image
+ * \param multiboot_img pointer to the card multiboot image
+ */
+errval_t
+xeon_phi_boot(struct xeon_phi *phi,
+              char *xloader_img,
+              char *multiboot_img)
+{
+    errval_t err;
+    lvaddr_t offset;
+    uint32_t size, osimg_size;
+
+    xeon_phi_boot_initialize(&boot_registers, XEON_PHI_MMIO_TO_SBOX(phi->mmio_base));
+
+    // load the coprocessor OS
+    err = load_os(phi, xloader_img, &osimg_size, &offset);
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Could not load multiboot image");
+    }
+
+    // load cmdline
+    err = load_cmdline(phi, offset, &size);
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Could not load multiboot image");
+    }
+
+    // round to next page
+    offset  += size + BASE_PAGE_SIZE - (size & (BASE_PAGE_SIZE - 1 ));
+
+    // load multiboot image
+    err = load_multiboot_image(phi, multiboot_img, offset, &size);
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Could not load multiboot image");
+    }
+
+    // start the receive thread
+    serial_start_recv_thread(phi);
+
+    // notify the bootstrap
+    bootstrap_notify(phi, osimg_size);
+
+    return SYS_ERR_OK;
+}
+
+/**
+ * \brief performs a soft reset of the card
+ *
+ * \param phi   pointer to the card information
+ */
+errval_t
+xeon_phi_reset(struct xeon_phi *phi)
+{
+    return SYS_ERR_OK;
+}
index 11da963..7397040 100644 (file)
@@ -13,3 +13,7 @@
  */
 
 
+int main(int argc, char *argv[]) {
+
+    return 0;
+}
diff --git a/usr/drivers/xeon_phi/serial.c b/usr/drivers/xeon_phi/serial.c
new file mode 100644 (file)
index 0000000..d1c2655
--- /dev/null
@@ -0,0 +1,164 @@
+/**
+ * \file
+ * \brief "Serial" driver on host side
+ */
+
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <barrelfish/barrelfish.h>
+
+
+#include <dev/xeon_phi/xeon_phi_serial_dev.h>
+
+#include "xeon_phi.h"
+
+#define XEON_PHI_BUFFER_LENGTH 0x400
+#define XEON_PHI_POLL_GIVEUP   0x100
+
+static xeon_phi_serial_t mmio_serial;
+
+uint8_t xeon_phi_id = 0;
+
+static inline void
+xprintf(uint8_t xid, char *fmt)
+{
+    printf("\033[34m>> XEON_PHI\033[31m%u\033[0m: %s", xid, fmt);
+}
+
+struct xeon_phi_arg
+{
+    xeon_phi_serial_t base;
+    uint8_t xid;
+    char buffer[XEON_PHI_BUFFER_LENGTH+1];
+    uint32_t idx;
+};
+
+static int
+xeon_phi_recv_handler(void *arg)
+{
+    struct xeon_phi_arg *xarg = arg;
+    uint32_t nodata;
+
+    xeon_phi_serial_ctrl_t sctrl = xeon_phi_serial_reset;
+    xeon_phi_serial_data_t sdata = xeon_phi_serial_reset;
+
+    debug_printf("xeon phi receive handler started. %d\n", xarg->xid);
+
+    xeon_phi_serial_ctrl_rawwr(&mmio_serial, xeon_phi_serial_reset);
+
+    nodata = XEON_PHI_POLL_GIVEUP;
+
+    while (1) {
+        sctrl = xeon_phi_serial_ctrl_rd(&xarg->base);
+
+        if (!sctrl) {
+            if (--nodata) {
+                continue;
+            }
+            // reset counter
+            nodata = XEON_PHI_POLL_GIVEUP;
+
+            thread_yield();
+
+            continue;
+        }
+
+        uint32_t i = 0;
+        sdata = xeon_phi_serial_data_rd(&xarg->base);
+        uint8_t has_data = 0;
+        uint8_t value = 0;
+        while (i < 4) {
+            switch (i) {
+            case 0:
+                has_data = xeon_phi_serial_ctrl_value0_extract(sctrl);
+                value = xeon_phi_serial_data_value0_extract(sdata);
+                break;
+            case 1:
+                has_data = xeon_phi_serial_ctrl_value1_extract(sctrl);
+                value = xeon_phi_serial_data_value0_extract(sdata);
+                break;
+            case 2:
+                has_data = xeon_phi_serial_ctrl_value2_extract(sctrl);
+                value = xeon_phi_serial_data_value0_extract(sdata);
+                break;
+            case 3:
+                has_data = xeon_phi_serial_ctrl_value3_extract(sctrl);
+                value = xeon_phi_serial_data_value0_extract(sdata);
+                break;
+            }
+
+            if (has_data & 0x80) {
+                i++;
+                continue;
+            }
+            if (has_data != xeon_phi_serial_data) {
+                debug_printf("[xeon phi %d] : ERROR invalid ctrl value.%x\n",
+                             xarg->xid, has_data);
+            }
+            /* always issue a new line */
+            if (value == '\n') {
+                xarg->buffer[xarg->idx] = '\0';
+                xprintf(xarg->xid, xarg->buffer);
+                xarg->idx = 0;
+                /* there was a "flush" so flush buffer to log */
+            } else if (value == 0x4) {
+                xarg->buffer[xarg->idx] = '\0';
+                xprintf(xarg->xid, xarg->buffer);
+                xarg->idx = 0;
+                /* buffer is full, flush buffer */
+            } else if (xarg->idx == XEON_PHI_BUFFER_LENGTH) {
+                xarg->buffer[xarg->idx] = '\0';
+                xprintf(xarg->xid, xarg->buffer);
+                xarg->buffer[0] = value;
+                xarg->idx = 1;
+                /* just store the char */
+            } else {
+                xarg->buffer[xarg->idx] = value;
+                xarg->idx++;
+            }
+            i++;
+        }
+        /* acknowledge the data receive */
+        xeon_phi_serial_ctrl_rawwr(&xarg->base, xeon_phi_serial_reset);
+    }
+
+    debug_printf("[xeon phi %d] : thread terminated.\n ", xarg->xid);
+
+    free(xarg);
+    return 0;
+}
+
+/**
+ * \brief initializes a new thread for receiving the serial out of the card
+ *
+ * The sbox memory region has already been mapped
+ */
+errval_t
+serial_start_recv_thread(struct xeon_phi *phi)
+{
+    struct xeon_phi_arg *xarg = malloc(sizeof(struct xeon_phi_arg));
+    if (xarg == NULL) {
+        return LIB_ERR_MALLOC_FAIL;
+    }
+    memset(xarg, 0, sizeof(struct xeon_phi_arg));
+
+    xarg->xid = phi->id;
+
+    xeon_phi_serial_initialize(&xarg->base, XEON_PHI_MMIO_TO_SBOX(phi->mmio_base));
+
+    /*
+     * xxx: maybe store the thread pointer
+     */
+    thread_create(xeon_phi_recv_handler, xarg);
+
+    return SYS_ERR_OK;
+}
diff --git a/usr/drivers/xeon_phi/xeon_phi.h b/usr/drivers/xeon_phi/xeon_phi.h
new file mode 100644 (file)
index 0000000..95b7863
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2014 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#ifndef XEON_PHI_H_
+#define XEON_PHI_H_
+
+#define HOST_DBOX_OFFSET      0x00000000
+#define HOST_SBOX_OFFSET      0x00010000
+
+#define XEON_PHI_MMIO_TO_SBOX(x) \
+    ((mackerel_addr_t)((lvaddr_t)(x)+HOST_SBOX_OFFSET))
+
+#define XEON_PHI_NUM_CARDS 8
+
+#define XBOOT_DEBUG(x...) debug_printf(" BOOT | " x)
+//#define XBOOT_DEBUG(x...)
+
+struct xeon_phi
+{
+    lvaddr_t mmio_base;     ///< base address of the MMIO register space
+    lvaddr_t mmio_lengh;    ///< length of the MMIO register space
+    lvaddr_t aper_base;     ///< base address of the cards GDDR
+    lvaddr_t aper_length;   ///< length of the cards GDDR
+
+    uint8_t id;             ///< card id for identifying the card
+
+    uint32_t apicid;        ///< APIC id used for sending the boot interrupt
+
+    char *cmdline;          ///< pointer to the bootloader cmdline
+};
+
+/**
+ * \brief initializes the serial receive thread from the xeon phi
+ *
+ * \param phi   pointer to the card information
+ */
+errval_t
+serial_start_recv_thread(struct xeon_phi *phi);
+
+/**
+ * \brief boots the card with the given loader and multiboot image
+ *
+ * \param phi           pointer to the card information
+ * \param xloader_img   pointer to the card bootloader image
+ * \param multiboot_img pointer to the card multiboot image
+ */
+errval_t
+xeon_phi_boot(struct xeon_phi *phi,
+              char *xloader_img,
+              char *multiboot_img);
+
+/**
+ * \brief performs a soft reset of the card
+ *
+ * \param phi   pointer to the card information
+ */
+errval_t
+xeon_phi_reset(struct xeon_phi *phi);
+
+#endif /* XEON_PHI_H_ */