Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios-OLD.git] / kitten / include / rca / l0rca_config.h
diff --git a/kitten/include/rca/l0rca_config.h b/kitten/include/rca/l0rca_config.h
new file mode 100644 (file)
index 0000000..ae6be7a
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2006 Cray, Inc.
+ *
+ * The contents of this file is proprietary information of Cray Inc. 
+ * and may not be disclosed without prior written consent.
+ */
+/*
+ *
+ * This code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+
+#ifndef __L0RCA_CONFIG_H__
+#define __L0RCA_CONFIG_H__
+
+
+#include <rca/cray_event_def.h>                /* rca_types.h includes rs_event.h */
+
+/*
+ * PKT_MODE* Registers:
+ *
+ * Writing a "0" to a bit in pkt_mode0 will atomically clear that bit
+ * in pkt_mode.  Writing a "1" to a bit in pkt_mode1 will atomically
+ * set that bit in pkt_mode.  Reading any of these will return the
+ * instantanious contents of pkt_mode.  Writing pkt_mode replaces the
+ * contents non-atomically.
+ */
+typedef struct {
+    uint32_t    pkt_mode;
+    uint32_t    _pad1;
+    uint32_t    pkt_mode0;  /* atomically clear bits */
+    uint32_t    _pad2;
+    uint32_t    pkt_mode1;  /* atomically set bits */
+} l0ssi_pkt_mode_t;
+
+#define phy_pkt_mode    (*(l0ssi_pkt_mode_t *)PKT_MODE)
+
+#define PKT_MODE0   (uint32_t)&phy_pkt_mode.pkt_mode0
+#define PKT_MODE1   (uint32_t)&phy_pkt_mode.pkt_mode1
+
+/*
+ * How the RCA interrupts the L0.
+ *
+ * Writing a "0" to a bit in pkt_mode0 will atomically CLEAR that bit
+ * in pkt_mode.  Writing a "1" to a bit in pkt_mode1 will atomically
+ * SET that bit in pkt_mode.  Normally, pkt_mode should never be
+ * written directly.  It can be read to get the current state of bits.
+ * In general, any set bits in pkt_mode will cause an interrupt to
+ * be raised to the L0, via the SSI and L0_FPGA.
+ *
+ * CAUTION: pkt_mode0 must only be written with "0"(s) in the
+ * position(s) to be cleared and "1"s everywhere else.  I.e. it
+ * must be written with the value one would use to AND-out the
+ * bits.  This is contrary to most SET/CLEAR register implementations.
+ *
+ * Bits in pkt_mode are assigned in l0ssi_intr.h
+ */
+typedef l0ssi_pkt_mode_t l0rca_intr_t;
+#define l0r_intr_get   pkt_mode
+#define l0r_intr_clr   pkt_mode0
+#define l0r_intr_set   pkt_mode1
+
+/* Should be removed... */
+#define L0RCA_CONFIG L0RCA_CFG
+
+/* defined channel id */
+#define L0RCA_CH_EV_UP        0
+#define L0RCA_CH_EV_DOWN      1
+#define L0RCA_CH_CON_UP       2
+#define L0RCA_CH_CON_DOWN     3
+#define L0RCA_CH_KGDB_UP      4
+#define L0RCA_CH_KGDB_DOWN    5
+#define NUM_L0RCA_CHANNELS    6
+
+/* NOTE for the following L0 Opteron communication related structures:
+ * ###################################################################
+ * There are following restrictions for the L0 Opteron communication
+ * related structures.
+ * The elements must be aligned on 4-byte boundaries.  The structure
+ * size must be a multiple of 4 bytes. Structures should be packed so
+ * that the compiler will not insert padding.  
+ * ###################################################################
+ */
+
+/* 
+ * l0rca_ch_data_t: channel buffer data structure
+ * NOTE: This l0rca_ch_data_t is packed.  If we update this structure,
+ *     we need to make sure that each element is 4-byte aligned,
+ *     otherwise it might break the L0 Opteron communication (size of
+ *     l0rca_ch_data_t must be a multiple of 4bytes).
+ *     All communication channel uses rs_event_t so, the size of object
+ *     in buffer is sizeof(rs_event_t).  RCA events has fixed ev_data
+ *     length (256) and num_obj is the number of events can be stored
+ *     in the buffer.
+ *
+ * The *_intr_bit fields declare which bit in the PKT_MODE register
+ * is used for the channel interrupt.  l0_intr_bit is for interrupts
+ * sent *to* the L0, while proc_intr_bit is for interrupts sent *to*
+ * the Opteron processor.
+ */
+typedef struct l0rca_ch_data_s {
+       uint32_t num_obj;        /* number of objects    */
+       uint32_t ridx;           /* read index           */
+       uint32_t widx;           /* write index          */
+       uint32_t l0_intr_bit;    /* Opteron -> L0 intr assignment */
+       uint32_t proc_intr_bit;  /* L0 -> Opteron intr assignment */
+} __attribute__((packed)) l0rca_ch_data_t;
+
+#define L0RCA_CONF_VERSION     2
+
+/*
+ * Circular Buffer Usage:
+ *
+ * When (widx == ridx), buffer is empty;
+ * ELSE When (widx - ridx < num_obj)), there are one or more 
+ * available buffers.
+ *
+ * ridx and widx reflect the object index, not byte index.
+ *
+ * Restrictions:
+ *
+ * num_obj must be a power of 2 (i.e. (num_obj & (num_obj - 1)) == 0).
+ * Therefore indices are normalized with AND: idx = ridx & (num_obj - 1).
+ *
+ */
+
+/*
+ * NOTE: This l0rca_config_t is packed.  If we update this sturcture,
+ *     we need to make sure that each element is 4-byte aligned,
+ *     otherwise it might break the L0 Opteron communication (size
+ *     of l0rca_config_t must be a multiple of 4bytes).
+ *
+ * configuration data structure */
+typedef struct l0rca_config_s {
+       uint64_t        l0rca_buf_addr;         /* ch buffer addr */
+       uint64_t        l0rca_l0_intr_addr;     /* interrupt to L0 */
+       uint32_t                version;                                /* config version */
+       rs_node_t               proc_id;                         /* node id */
+       int32_t         proc_num;                         /* proc number (0-3) */
+       int32_t         reserved_1;                       /* reserved for future use */
+       int32_t         reserved_2;                      /* reserved for future use */
+       /* channel data */
+       l0rca_ch_data_t chnl_data[NUM_L0RCA_CHANNELS];
+} __attribute__((packed)) l0rca_config_t;
+
+
+/*
+ * Definitions in the L0-reserved area of SIC RAM
+ */
+#define L0_SIC_RAM  0xfffff000
+#define L0_SIC_RAM_LEN  4096
+
+#define COLDSPIN    0xfffffe80
+#define L0RCA_CFG   L0_SIC_RAM
+#define L0RCA_CFG_LEN   (COLDSPIN - L0RCA_CFG)
+
+/*
+ * The following provides an abstraction for accessing the RAM
+ * location of the config structure.  It set phy_l0r_cfg to the
+ * l0rca_config_t physical address defined as L0RCA_CONFIG.
+ * To use it, include this header file and then access the
+ * config area as &phy_l0r_cfg.<element>.
+ */
+#define phy_l0r_cfg    (*(l0rca_config_t *)L0RCA_CFG)
+
+
+#endif /* !__L0RCA_CONFIG_H__ */