|
@@ -0,0 +1,346 @@
|
|
|
|
+#ifndef ZUMA_PBB_H
|
|
|
|
+#define ZUMA_PBB_H
|
|
|
|
+
|
|
|
|
+#define MAX_NUM_BUFFER_PER_RING 32
|
|
|
|
+
|
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
|
+#define cpu_bits _be_s_bits /* use with le32_to_cpu only */
|
|
|
|
+#define pci_bits _be_bits /* may contain swapped bytes,
|
|
|
|
+ but dont need le32_to_cpu */
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifdef __LITTLE_ENDIAN
|
|
|
|
+#define cpu_bits _le_bits
|
|
|
|
+#define pci_bits _le_bits
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define VENDOR_ID_ZUMA 0x1172
|
|
|
|
+#define DEVICE_ID_ZUMA_PBB 0x0004
|
|
|
|
+
|
|
|
|
+#define RXDBP(chan) (&sip->rx_desc[chan].base) /* ch*8 */
|
|
|
|
+#define RXDP(chan) (&sip->rx_desc[chan].current) /* ch*8 + 4 */
|
|
|
|
+#define TXDBP(chan) (&sip->tx_desc[chan].base) /* ch*8 + 64 */
|
|
|
|
+#define TXDP(chan) (&sip->tx_desc[chan].current) /* ch*8 + 68 */
|
|
|
|
+
|
|
|
|
+#define PBB_DMA_OWN_BIT 0x80000000
|
|
|
|
+#define PBB_DMA_LAST_BIT 0x40000000
|
|
|
|
+
|
|
|
|
+#define EOF_RX_FLAG 1 /* bit 0 */
|
|
|
|
+#define EOB_RX_FLAG 2 /* bit 1 */
|
|
|
|
+#define EOF_TX_FLAG 4 /* bit 2 */
|
|
|
|
+#define EOB_TX_FLAG 8 /* bit 3 */
|
|
|
|
+
|
|
|
|
+#define TX_MODE(m) (((m)&7) << 16)
|
|
|
|
+
|
|
|
|
+#define RX_DESC(i) (cs->rx_desc[i])
|
|
|
|
+#define TX_DESC(i) (cs->tx_desc[i])
|
|
|
|
+
|
|
|
|
+#define RX_CONTROL(i) (RX_DESC(i).control.word)
|
|
|
|
+#define RX_CONTROL_SIZE(i) (RX_DESC(i).control.rx.size)
|
|
|
|
+#define TX_CONTROL(i) (TX_DESC(i).control.word)
|
|
|
|
+
|
|
|
|
+#define RX_DATA_P(i) (&RX_DESC(i).ptr)
|
|
|
|
+#define TX_DATA_P(i) (&TX_DESC(i).ptr)
|
|
|
|
+
|
|
|
|
+typedef volatile unsigned char V8;
|
|
|
|
+typedef volatile unsigned short V16;
|
|
|
|
+typedef volatile unsigned int V32;
|
|
|
|
+
|
|
|
|
+/* RAM descriptor layout */
|
|
|
|
+typedef struct _tag_dma_descriptor {
|
|
|
|
+ V32 ptr;
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ V32 owner:1;
|
|
|
|
+ V32 last:1;
|
|
|
|
+ V32 reserved0: 10;
|
|
|
|
+ V32 tx_mode: 4;
|
|
|
|
+
|
|
|
|
+ V32 reserved1: 5;
|
|
|
|
+ V32 size: 11;
|
|
|
|
+ } tx;
|
|
|
|
+ struct {
|
|
|
|
+ V32 owner:1;
|
|
|
|
+ V32 last:1;
|
|
|
|
+ V32 reserved0: 14;
|
|
|
|
+
|
|
|
|
+ V32 reserved1: 5;
|
|
|
|
+ V32 size: 11;
|
|
|
|
+ } rx;
|
|
|
|
+ V32 word;
|
|
|
|
+ } control;
|
|
|
|
+} DMA_DESCRIPTOR;
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * NOTE: DO NOT USE structure to write non-word values... all registers
|
|
|
|
+ * MUST be written 4 bytes at a time in SI version 0.
|
|
|
|
+ * Non-word writes will result in "unaccessed" bytes written as zero.
|
|
|
|
+ *
|
|
|
|
+ * Byte reads are allowed.
|
|
|
|
+ *
|
|
|
|
+ * V32 pads are because the registers are spaced every 8 bytes (64 bits)
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/* NOTE!!! 4 dwords */
|
|
|
|
+typedef struct _tag_dma_descriptor_ring {
|
|
|
|
+ DMA_DESCRIPTOR *base;
|
|
|
|
+ V32 pad1; /* skip high dword */
|
|
|
|
+ volatile DMA_DESCRIPTOR *current;
|
|
|
|
+ V32 pad3; /* skip high dword */
|
|
|
|
+} DMA_DESCRIPTOR_RING;
|
|
|
|
+
|
|
|
|
+/* 1 dword */
|
|
|
|
+typedef union _tag_dma_generic {
|
|
|
|
+ struct { /* byte 3 2 1 0 */
|
|
|
|
+ V32 chan7:4; /* bits 31-28 */
|
|
|
|
+ V32 chan6:4; /* bits 27-24 */
|
|
|
|
+ V32 chan5:4; /* bits 23-20 */
|
|
|
|
+ V32 chan4:4; /* bits 19-16 */
|
|
|
|
+ V32 chan3:4; /* bits 15-12 */
|
|
|
|
+ V32 chan2:4; /* bits 11-8 */
|
|
|
|
+ V32 chan1:4; /* bits 7-4 */
|
|
|
|
+ V32 chan0:4; /* bits 3-0 */
|
|
|
|
+ } _be_s_bits;
|
|
|
|
+ struct { /* byte 0 1 2 3 */
|
|
|
|
+ V32 chan1:4; /* bits 7-4 */
|
|
|
|
+ V32 chan0:4; /* bits 3-0 */
|
|
|
|
+ V32 chan3:4; /* bits 15-12 */
|
|
|
|
+ V32 chan2:4; /* bits 11-8 */
|
|
|
|
+ V32 chan5:4; /* bits 23-20 */
|
|
|
|
+ V32 chan4:4; /* bits 19-16 */
|
|
|
|
+ V32 chan7:4; /* bits 31-28 */
|
|
|
|
+ V32 chan6:4; /* bits 27-24 */
|
|
|
|
+ } _be_bits;
|
|
|
|
+ struct { /* byte 0 1 2 3 */
|
|
|
|
+ V32 chan0:4; /* bits 0-3 */
|
|
|
|
+ V32 chan1:4; /* bits 4-7 */
|
|
|
|
+ V32 chan2:4; /* bits 8-11 */
|
|
|
|
+ V32 chan3:4; /* bits 12-15 */
|
|
|
|
+ V32 chan4:4; /* bits 16-19 */
|
|
|
|
+ V32 chan5:4; /* bits 20-23 */
|
|
|
|
+ V32 chan6:4; /* bits 24-27 */
|
|
|
|
+ V32 chan7:4; /* bits 28-31 */
|
|
|
|
+ } _le_bits;
|
|
|
|
+ V8 byte[4];
|
|
|
|
+ V32 word;
|
|
|
|
+} DMA_RXTX_ENABLE, DMA_RX_DELETE,
|
|
|
|
+ DMA_INT_STATUS, DMA_INT_MASK,
|
|
|
|
+ DMA_RX_LEVEL_STATUS, DMA_RX_LEVEL_INT_MASK;
|
|
|
|
+
|
|
|
|
+/* 1 dword */
|
|
|
|
+typedef union _tag_dma_rx_timer{
|
|
|
|
+ struct {
|
|
|
|
+ V32 res0:8; /* bits 32-24 */
|
|
|
|
+ V32 res1:7; /* bits 23-17 */
|
|
|
|
+ V32 enable:1; /* bit 16 */
|
|
|
|
+ V32 value:16; /* bits 15-0 */
|
|
|
|
+ } _be_s_bits;
|
|
|
|
+ struct {
|
|
|
|
+ /* crosses byte boundary. must use swap. */
|
|
|
|
+ V32 s_value:16; /* bits 7-0,15-8 */
|
|
|
|
+ V32 enable:1; /* bit 16 */
|
|
|
|
+ V32 res1:7; /* bits 23-17 */
|
|
|
|
+ V32 res0:8; /* bits 32-24 */
|
|
|
|
+ } _be_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 value:16; /* bits 0-15 */
|
|
|
|
+ V32 enable:1; /* bit 16 */
|
|
|
|
+ V32 res1:7; /* bits 17-23 */
|
|
|
|
+ V32 res0:8; /* bits 24-32 */
|
|
|
|
+ } _le_bits;
|
|
|
|
+ V8 byte[4];
|
|
|
|
+ V32 word;
|
|
|
|
+} DMA_RX_TIMER;
|
|
|
|
+
|
|
|
|
+/* NOTE!!!: 2 dwords */
|
|
|
|
+typedef struct _tag_dma_desc_level{
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ V32 res1:8; /* bits 31-24 */
|
|
|
|
+ V32 res0:7; /* bits 23-17 */
|
|
|
|
+ V32 write:1; /* bit 16 */
|
|
|
|
+ V32 thresh:8; /* bits 15-8 */
|
|
|
|
+ V32 level:8; /* bits 7-0 */
|
|
|
|
+ } _be_s_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 level:8; /* bits 7-0 */
|
|
|
|
+ V32 thresh:8; /* bits 15-8 */
|
|
|
|
+ V32 res0:7; /* bits 30-17 */
|
|
|
|
+ V32 write:1; /* bit 16 */
|
|
|
|
+ V32 res1:8; /* bits 31-24 */
|
|
|
|
+ } _be_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 level:8; /* bits 0-7 */
|
|
|
|
+ V32 thresh:8; /* bits 8-15 */
|
|
|
|
+ V32 write:1; /* bit 16 */
|
|
|
|
+ V32 res0:7; /* bit 17-30 */
|
|
|
|
+ V32 res1:8; /* bits 24-31 */
|
|
|
|
+ } _le_bits;
|
|
|
|
+ V8 byte[4];
|
|
|
|
+ V32 word;
|
|
|
|
+ } desc;
|
|
|
|
+ V32 pad1;
|
|
|
|
+} DMA_DESC_LEVEL;
|
|
|
|
+
|
|
|
|
+typedef struct _tag_pbb_dma_reg_map {
|
|
|
|
+ /* 0-15 (0x000-0x078) */
|
|
|
|
+ DMA_DESCRIPTOR_RING rx_desc[8]; /* 4 dwords each, 128 bytes tot. */
|
|
|
|
+
|
|
|
|
+ /* 16-31 (0x080-0x0f8) */
|
|
|
|
+ DMA_DESCRIPTOR_RING tx_desc[8]; /* 4 dwords each, 128 bytes tot. */
|
|
|
|
+
|
|
|
|
+ /* 32/33 (0x100/0x108) */
|
|
|
|
+ V32 reserved_32;
|
|
|
|
+ V32 pad_32;
|
|
|
|
+ V32 reserved_33;
|
|
|
|
+ V32 pad_33;
|
|
|
|
+
|
|
|
|
+ /* 34 (0x110) */
|
|
|
|
+ DMA_RXTX_ENABLE rxtx_enable;
|
|
|
|
+ V32 pad_34;
|
|
|
|
+
|
|
|
|
+ /* 35 (0x118) */
|
|
|
|
+ DMA_RX_DELETE rx_delete;
|
|
|
|
+ V32 pad_35;
|
|
|
|
+
|
|
|
|
+ /* 36-38 (0x120-0x130) */
|
|
|
|
+ DMA_INT_STATUS status;
|
|
|
|
+ V32 pad_36;
|
|
|
|
+ DMA_INT_STATUS last_status;
|
|
|
|
+ V32 pad_37;
|
|
|
|
+ DMA_INT_MASK int_mask;
|
|
|
|
+ V32 pad_38;
|
|
|
|
+
|
|
|
|
+ /* 39/40 (0x138/0x140) */
|
|
|
|
+ union {
|
|
|
|
+ /* NOTE!! 4 dwords */
|
|
|
|
+ struct {
|
|
|
|
+ V32 channel_3:8;
|
|
|
|
+ V32 channel_2:8;
|
|
|
|
+ V32 channel_1:8;
|
|
|
|
+ V32 channel_0:8;
|
|
|
|
+ V32 pad1;
|
|
|
|
+ V32 channel_7:8;
|
|
|
|
+ V32 channel_6:8;
|
|
|
|
+ V32 channel_5:8;
|
|
|
|
+ V32 channel_4:8;
|
|
|
|
+ V32 pad3;
|
|
|
|
+ } _be_s_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 channel_0:8;
|
|
|
|
+ V32 channel_1:8;
|
|
|
|
+ V32 channel_2:8;
|
|
|
|
+ V32 channel_3:8;
|
|
|
|
+ V32 pad1;
|
|
|
|
+ V32 channel_4:8;
|
|
|
|
+ V32 channel_5:8;
|
|
|
|
+ V32 channel_6:8;
|
|
|
|
+ V32 channel_7:8;
|
|
|
|
+ V32 pad3;
|
|
|
|
+ } _be_bits, _le_bits;
|
|
|
|
+ V8 byte[16];
|
|
|
|
+ V32 word[4];
|
|
|
|
+ } rx_size;
|
|
|
|
+
|
|
|
|
+ /* 41/42 (0x148/0x150) */
|
|
|
|
+ V32 reserved_41;
|
|
|
|
+ V32 pad_41;
|
|
|
|
+ V32 reserved_42;
|
|
|
|
+ V32 pad_42;
|
|
|
|
+
|
|
|
|
+ /* 43/44 (0x158/0x160) */
|
|
|
|
+ DMA_RX_LEVEL_STATUS rx_level_status;
|
|
|
|
+ V32 pad_43;
|
|
|
|
+ DMA_RX_LEVEL_INT_MASK rx_level_int_mask;
|
|
|
|
+ V32 pad_44;
|
|
|
|
+
|
|
|
|
+ /* 45 (0x168) */
|
|
|
|
+ DMA_RX_TIMER rx_timer;
|
|
|
|
+ V32 pad_45;
|
|
|
|
+
|
|
|
|
+ /* 46 (0x170) */
|
|
|
|
+ V32 reserved_46;
|
|
|
|
+ V32 pad_46;
|
|
|
|
+
|
|
|
|
+ /* 47 (0x178) */
|
|
|
|
+ V32 mbox_status;
|
|
|
|
+ V32 pad_47;
|
|
|
|
+
|
|
|
|
+ /* 48/49 (0x180/0x188) */
|
|
|
|
+ V32 mbox_out;
|
|
|
|
+ V32 pad_48;
|
|
|
|
+ V32 mbox_in;
|
|
|
|
+ V32 pad_49;
|
|
|
|
+
|
|
|
|
+ /* 50 (0x190) */
|
|
|
|
+ V32 config;
|
|
|
|
+ V32 pad_50;
|
|
|
|
+
|
|
|
|
+ /* 51/52 (0x198/0x1a0) */
|
|
|
|
+ V32 c2a_ctr;
|
|
|
|
+ V32 pad_51;
|
|
|
|
+ V32 a2c_ctr;
|
|
|
|
+ V32 pad_52;
|
|
|
|
+
|
|
|
|
+ /* 53 (0x1a8) */
|
|
|
|
+ union {
|
|
|
|
+ struct {
|
|
|
|
+ V32 rev_major:8; /* bits 31-24 */
|
|
|
|
+ V32 rev_minor:8; /* bits 23-16 */
|
|
|
|
+ V32 reserved:16; /* bits 15-0 */
|
|
|
|
+ } _be_s_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 s_reserved:16; /* bits 7-0, 15-8 */
|
|
|
|
+ V32 rev_minor:8; /* bits 23-16 */
|
|
|
|
+ V32 rev_major:8; /* bits 31-24 */
|
|
|
|
+ } _be_bits;
|
|
|
|
+ struct {
|
|
|
|
+ V32 reserved:16; /* bits 0-15 */
|
|
|
|
+ V32 rev_minor:8; /* bits 16-23 */
|
|
|
|
+ V32 rev_major:8; /* bits 24-31 */
|
|
|
|
+ } _le_bits;
|
|
|
|
+ V8 byte[4];
|
|
|
|
+ V32 word;
|
|
|
|
+ } version;
|
|
|
|
+ V32 pad_53;
|
|
|
|
+
|
|
|
|
+ /* 54-59 (0x1b0-0x1d8) */
|
|
|
|
+ V32 debug_54;
|
|
|
|
+ V32 pad_54;
|
|
|
|
+ V32 debug_55;
|
|
|
|
+ V32 pad_55;
|
|
|
|
+ V32 debug_56;
|
|
|
|
+ V32 pad_56;
|
|
|
|
+ V32 debug_57;
|
|
|
|
+ V32 pad_57;
|
|
|
|
+ V32 debug_58;
|
|
|
|
+ V32 pad_58;
|
|
|
|
+ V32 debug_59;
|
|
|
|
+ V32 pad_59;
|
|
|
|
+
|
|
|
|
+ /* 60 (0x1e0) */
|
|
|
|
+ V32 timestamp;
|
|
|
|
+ V32 pad_60;
|
|
|
|
+
|
|
|
|
+ /* 61-63 (0x1e8-0x1f8) */
|
|
|
|
+ V32 debug_61;
|
|
|
|
+ V32 pad_61;
|
|
|
|
+ V32 debug_62;
|
|
|
|
+ V32 pad_62;
|
|
|
|
+ V32 debug_63;
|
|
|
|
+ V32 pad_63;
|
|
|
|
+
|
|
|
|
+ /* 64-71 (0x200 - 0x238) */
|
|
|
|
+ DMA_DESC_LEVEL rx_desc_level[8]; /* 2 dwords each, 32 bytes tot. */
|
|
|
|
+
|
|
|
|
+ /* 72-98 (0x240 - 0x2f8) */
|
|
|
|
+ /* reserved */
|
|
|
|
+
|
|
|
|
+ /* 96-127 (0x300 - 0x3f8) */
|
|
|
|
+ /* mirrors (0x100 - 0x1f8) */
|
|
|
|
+
|
|
|
|
+} PBB_DMA_REG_MAP;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#endif /* ZUMA_PBB_H */
|