These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / mips / include / asm / octeon / cvmx-wqe.h
index 2d6d0c7..0d697aa 100644 (file)
@@ -193,6 +193,53 @@ typedef union {
                uint64_t bufs:8;
 #endif
        } s;
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               uint64_t bufs:8;
+               uint64_t ip_offset:8;
+               uint64_t vlan_valid:1;
+               uint64_t vlan_stacked:1;
+               uint64_t unassigned:1;
+               uint64_t vlan_cfi:1;
+               uint64_t vlan_id:12;
+               uint64_t port:12;               /* MAC/PIP port number. */
+               uint64_t dec_ipcomp:1;
+               uint64_t tcp_or_udp:1;
+               uint64_t dec_ipsec:1;
+               uint64_t is_v6:1;
+               uint64_t software:1;
+               uint64_t L4_error:1;
+               uint64_t is_frag:1;
+               uint64_t IP_exc:1;
+               uint64_t is_bcast:1;
+               uint64_t is_mcast:1;
+               uint64_t not_IP:1;
+               uint64_t rcv_error:1;
+               uint64_t err_code:8;
+#else
+               uint64_t err_code:8;
+               uint64_t rcv_error:1;
+               uint64_t not_IP:1;
+               uint64_t is_mcast:1;
+               uint64_t is_bcast:1;
+               uint64_t IP_exc:1;
+               uint64_t is_frag:1;
+               uint64_t L4_error:1;
+               uint64_t software:1;
+               uint64_t is_v6:1;
+               uint64_t dec_ipsec:1;
+               uint64_t tcp_or_udp:1;
+               uint64_t dec_ipcomp:1;
+               uint64_t port:12;
+               uint64_t vlan_id:12;
+               uint64_t vlan_cfi:1;
+               uint64_t unassigned:1;
+               uint64_t vlan_stacked:1;
+               uint64_t vlan_valid:1;
+               uint64_t ip_offset:8;
+               uint64_t bufs:8;
+#endif
+       } s_cn68xx;
 
        /* use this to get at the 16 vlan bits */
        struct {
@@ -355,6 +402,146 @@ typedef union {
 
 } cvmx_pip_wqe_word2;
 
+union cvmx_pip_wqe_word0 {
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               /**
+                * raw chksum result generated by the HW
+                */
+               uint16_t hw_chksum;
+               /**
+                * Field unused by hardware - available for software
+                */
+               uint8_t unused;
+               /**
+                * Next pointer used by hardware for list maintenance.
+                * May be written/read by HW before the work queue
+                * entry is scheduled to a PP (Only 36 bits used in
+                * Octeon 1)
+                */
+               uint64_t next_ptr:40;
+#else
+               uint64_t next_ptr:40;
+               uint8_t unused;
+               uint16_t hw_chksum;
+#endif
+       } cn38xx;
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               uint64_t l4ptr:8;       /* 56..63 */
+               uint64_t unused0:8;     /* 48..55 */
+               uint64_t l3ptr:8;       /* 40..47 */
+               uint64_t l2ptr:8;       /* 32..39 */
+               uint64_t unused1:18;    /* 14..31 */
+               uint64_t bpid:6;        /* 8..13 */
+               uint64_t unused2:2;     /* 6..7 */
+               uint64_t pknd:6;        /* 0..5 */
+#else
+               uint64_t pknd:6;        /* 0..5 */
+               uint64_t unused2:2;     /* 6..7 */
+               uint64_t bpid:6;        /* 8..13 */
+               uint64_t unused1:18;    /* 14..31 */
+               uint64_t l2ptr:8;       /* 32..39 */
+               uint64_t l3ptr:8;       /* 40..47 */
+               uint64_t unused0:8;     /* 48..55 */
+               uint64_t l4ptr:8;       /* 56..63 */
+#endif
+       } cn68xx;
+};
+
+union cvmx_wqe_word0 {
+       uint64_t u64;
+       union cvmx_pip_wqe_word0 pip;
+};
+
+union cvmx_wqe_word1 {
+       uint64_t u64;
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               uint64_t len:16;
+               uint64_t varies:14;
+               /**
+                * the type of the tag (ORDERED, ATOMIC, NULL)
+                */
+               uint64_t tag_type:2;
+               uint64_t tag:32;
+#else
+               uint64_t tag:32;
+               uint64_t tag_type:2;
+               uint64_t varies:14;
+               uint64_t len:16;
+#endif
+       };
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               uint64_t len:16;
+               uint64_t zero_0:1;
+               /**
+                * HW sets this to what it thought the priority of
+                * the input packet was
+                */
+               uint64_t qos:3;
+
+               uint64_t zero_1:1;
+               /**
+                * the group that the work queue entry will be scheduled to
+                */
+               uint64_t grp:6;
+               uint64_t zero_2:3;
+               uint64_t tag_type:2;
+               uint64_t tag:32;
+#else
+               uint64_t tag:32;
+               uint64_t tag_type:2;
+               uint64_t zero_2:3;
+               uint64_t grp:6;
+               uint64_t zero_1:1;
+               uint64_t qos:3;
+               uint64_t zero_0:1;
+               uint64_t len:16;
+#endif
+       } cn68xx;
+       struct {
+#ifdef __BIG_ENDIAN_BITFIELD
+               /**
+                * HW sets to the total number of bytes in the packet
+                */
+               uint64_t len:16;
+               /**
+                * HW sets this to input physical port
+                */
+               uint64_t ipprt:6;
+
+               /**
+                * HW sets this to what it thought the priority of
+                * the input packet was
+                */
+               uint64_t qos:3;
+
+               /**
+                * the group that the work queue entry will be scheduled to
+                */
+               uint64_t grp:4;
+               /**
+                * the type of the tag (ORDERED, ATOMIC, NULL)
+                */
+               uint64_t tag_type:3;
+               /**
+                * the synchronization/ordering tag
+                */
+               uint64_t tag:32;
+#else
+               uint64_t tag:32;
+               uint64_t tag_type:2;
+               uint64_t zero_2:1;
+               uint64_t grp:4;
+               uint64_t qos:3;
+               uint64_t ipprt:6;
+               uint64_t len:16;
+#endif
+       } cn38xx;
+};
+
 /**
  * Work queue entry format
  *
@@ -366,70 +553,13 @@ typedef struct {
      * WORD 0
      * HW WRITE: the following 64 bits are filled by HW when a packet arrives
      */
-
-#ifdef __BIG_ENDIAN_BITFIELD
-    /**
-     * raw chksum result generated by the HW
-     */
-       uint16_t hw_chksum;
-    /**
-     * Field unused by hardware - available for software
-     */
-       uint8_t unused;
-    /**
-     * Next pointer used by hardware for list maintenance.
-     * May be written/read by HW before the work queue
-     *          entry is scheduled to a PP
-     * (Only 36 bits used in Octeon 1)
-     */
-       uint64_t next_ptr:40;
-#else
-       uint64_t next_ptr:40;
-       uint8_t unused;
-       uint16_t hw_chksum;
-#endif
+       union cvmx_wqe_word0 word0;
 
     /*****************************************************************
      * WORD 1
      * HW WRITE: the following 64 bits are filled by HW when a packet arrives
      */
-
-#ifdef __BIG_ENDIAN_BITFIELD
-    /**
-     * HW sets to the total number of bytes in the packet
-     */
-       uint64_t len:16;
-    /**
-     * HW sets this to input physical port
-     */
-       uint64_t ipprt:6;
-
-    /**
-     * HW sets this to what it thought the priority of the input packet was
-     */
-       uint64_t qos:3;
-
-    /**
-     * the group that the work queue entry will be scheduled to
-     */
-       uint64_t grp:4;
-    /**
-     * the type of the tag (ORDERED, ATOMIC, NULL)
-     */
-       uint64_t tag_type:3;
-    /**
-     * the synchronization/ordering tag
-     */
-       uint64_t tag:32;
-#else
-       uint64_t tag:32;
-       uint64_t tag_type:2;
-       uint64_t zero_2:1;
-       uint64_t grp:4;
-       uint64_t qos:3;
-       uint64_t ipprt:6;
-       uint64_t len:16;
-#endif
+       union cvmx_wqe_word1 word1;
 
     /**
      * WORD 2 HW WRITE: the following 64-bits are filled in by
@@ -465,4 +595,64 @@ typedef struct {
 
 } CVMX_CACHE_LINE_ALIGNED cvmx_wqe_t;
 
+static inline int cvmx_wqe_get_port(cvmx_wqe_t *work)
+{
+       int port;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               port = work->word2.s_cn68xx.port;
+       else
+               port = work->word1.cn38xx.ipprt;
+
+       return port;
+}
+
+static inline void cvmx_wqe_set_port(cvmx_wqe_t *work, int port)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word2.s_cn68xx.port = port;
+       else
+               work->word1.cn38xx.ipprt = port;
+}
+
+static inline int cvmx_wqe_get_grp(cvmx_wqe_t *work)
+{
+       int grp;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               grp = work->word1.cn68xx.grp;
+       else
+               grp = work->word1.cn38xx.grp;
+
+       return grp;
+}
+
+static inline void cvmx_wqe_set_grp(cvmx_wqe_t *work, int grp)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word1.cn68xx.grp = grp;
+       else
+               work->word1.cn38xx.grp = grp;
+}
+
+static inline int cvmx_wqe_get_qos(cvmx_wqe_t *work)
+{
+       int qos;
+
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               qos = work->word1.cn68xx.qos;
+       else
+               qos = work->word1.cn38xx.qos;
+
+       return qos;
+}
+
+static inline void cvmx_wqe_set_qos(cvmx_wqe_t *work, int qos)
+{
+       if (octeon_has_feature(OCTEON_FEATURE_CN68XX_WQE))
+               work->word1.cn68xx.qos = qos;
+       else
+               work->word1.cn38xx.qos = qos;
+}
+
 #endif /* __CVMX_WQE_H__ */