510 lines
17 KiB
C
510 lines
17 KiB
C
|
/*
|
||
|
* Copyright 2012 Tilera Corporation. All Rights Reserved.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation, version 2.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful, but
|
||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
||
|
* NON INFRINGEMENT. See the GNU General Public License for
|
||
|
* more details.
|
||
|
*/
|
||
|
|
||
|
/* Machine-generated file; do not edit. */
|
||
|
|
||
|
|
||
|
#ifndef __ARCH_MPIPE_SHM_H__
|
||
|
#define __ARCH_MPIPE_SHM_H__
|
||
|
|
||
|
#include <arch/abi.h>
|
||
|
#include <arch/mpipe_shm_def.h>
|
||
|
|
||
|
#ifndef __ASSEMBLER__
|
||
|
/**
|
||
|
* MPIPE eDMA Descriptor.
|
||
|
* The eDMA descriptor is written by software and consumed by hardware. It
|
||
|
* is used to specify the location of egress packet data to be sent out of
|
||
|
* the chip via one of the packet interfaces.
|
||
|
*/
|
||
|
|
||
|
__extension__
|
||
|
typedef union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
/* Word 0 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Generation number. Used to indicate a valid descriptor in ring. When
|
||
|
* a new descriptor is written into the ring, software must toggle this
|
||
|
* bit. The net effect is that the GEN bit being written into new
|
||
|
* descriptors toggles each time the ring tail pointer wraps.
|
||
|
*/
|
||
|
uint_reg_t gen : 1;
|
||
|
/** Reserved. Must be zero. */
|
||
|
uint_reg_t r0 : 7;
|
||
|
/** Checksum generation enabled for this transfer. */
|
||
|
uint_reg_t csum : 1;
|
||
|
/**
|
||
|
* Nothing to be sent. Used, for example, when software has dropped a
|
||
|
* packet but still wishes to return all of the associated buffers.
|
||
|
*/
|
||
|
uint_reg_t ns : 1;
|
||
|
/**
|
||
|
* Notification interrupt will be delivered when packet has been egressed.
|
||
|
*/
|
||
|
uint_reg_t notif : 1;
|
||
|
/**
|
||
|
* Boundary indicator. When 1, this transfer includes the EOP for this
|
||
|
* command. Must be clear on all but the last descriptor for an egress
|
||
|
* packet.
|
||
|
*/
|
||
|
uint_reg_t bound : 1;
|
||
|
/** Reserved. Must be zero. */
|
||
|
uint_reg_t r1 : 4;
|
||
|
/**
|
||
|
* Number of bytes to be sent for this descriptor. When zero, no data
|
||
|
* will be moved and the buffer descriptor will be ignored. If the
|
||
|
* buffer descriptor indicates that it is chained, the low 7 bits of the
|
||
|
* VA indicate the offset within the first buffer (e.g. 127 bytes is the
|
||
|
* maximum offset into the first buffer). If the size exceeds a single
|
||
|
* buffer, subsequent buffer descriptors will be fetched prior to
|
||
|
* processing the next eDMA descriptor in the ring.
|
||
|
*/
|
||
|
uint_reg_t xfer_size : 14;
|
||
|
/** Reserved. Must be zero. */
|
||
|
uint_reg_t r2 : 2;
|
||
|
/**
|
||
|
* Destination of checksum relative to CSUM_START relative to the first
|
||
|
* byte moved by this descriptor. Must be zero if CSUM=0 in this
|
||
|
* descriptor. Must be less than XFER_SIZE (e.g. the first byte of the
|
||
|
* CSUM_DEST must be within the span of this descriptor).
|
||
|
*/
|
||
|
uint_reg_t csum_dest : 8;
|
||
|
/**
|
||
|
* Start byte of checksum relative to the first byte moved by this
|
||
|
* descriptor. If this is not the first descriptor for the egress
|
||
|
* packet, CSUM_START is still relative to the first byte in this
|
||
|
* descriptor. Must be zero if CSUM=0 in this descriptor.
|
||
|
*/
|
||
|
uint_reg_t csum_start : 8;
|
||
|
/**
|
||
|
* Initial value for 16-bit 1's compliment checksum if enabled via CSUM.
|
||
|
* Specified in network order. That is, bits[7:0] will be added to the
|
||
|
* byte pointed to by CSUM_START and bits[15:8] will be added to the byte
|
||
|
* pointed to by CSUM_START+1 (with appropriate 1's compliment carries).
|
||
|
* Must be zero if CSUM=0 in this descriptor.
|
||
|
*/
|
||
|
uint_reg_t csum_seed : 16;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t csum_seed : 16;
|
||
|
uint_reg_t csum_start : 8;
|
||
|
uint_reg_t csum_dest : 8;
|
||
|
uint_reg_t r2 : 2;
|
||
|
uint_reg_t xfer_size : 14;
|
||
|
uint_reg_t r1 : 4;
|
||
|
uint_reg_t bound : 1;
|
||
|
uint_reg_t notif : 1;
|
||
|
uint_reg_t ns : 1;
|
||
|
uint_reg_t csum : 1;
|
||
|
uint_reg_t r0 : 7;
|
||
|
uint_reg_t gen : 1;
|
||
|
#endif
|
||
|
|
||
|
/* Word 1 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/** Virtual address. Must be sign extended by consumer. */
|
||
|
int_reg_t va : 42;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_0 : 6;
|
||
|
/** Index of the buffer stack to which this buffer belongs. */
|
||
|
uint_reg_t stack_idx : 5;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_1 : 3;
|
||
|
/**
|
||
|
* Instance ID. For devices that support more than one mPIPE instance,
|
||
|
* this field indicates the buffer owner. If the INST field does not
|
||
|
* match the mPIPE's instance number when a packet is egressed, buffers
|
||
|
* with HWB set will be returned to the other mPIPE instance.
|
||
|
*/
|
||
|
uint_reg_t inst : 1;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_2 : 1;
|
||
|
/**
|
||
|
* Always set to one by hardware in iDMA packet descriptors. For eDMA,
|
||
|
* indicates whether the buffer will be released to the buffer stack
|
||
|
* manager. When 0, software is responsible for releasing the buffer.
|
||
|
*/
|
||
|
uint_reg_t hwb : 1;
|
||
|
/**
|
||
|
* Encoded size of buffer. Set by the ingress hardware for iDMA packet
|
||
|
* descriptors. For eDMA descriptors, indicates the buffer size if .c
|
||
|
* indicates a chained packet. If an eDMA descriptor is not chained and
|
||
|
* the .hwb bit is not set, this field is ignored and the size is
|
||
|
* specified by the .xfer_size field.
|
||
|
* 0 = 128 bytes
|
||
|
* 1 = 256 bytes
|
||
|
* 2 = 512 bytes
|
||
|
* 3 = 1024 bytes
|
||
|
* 4 = 1664 bytes
|
||
|
* 5 = 4096 bytes
|
||
|
* 6 = 10368 bytes
|
||
|
* 7 = 16384 bytes
|
||
|
*/
|
||
|
uint_reg_t size : 3;
|
||
|
/**
|
||
|
* Chaining configuration for the buffer. Indicates that an ingress
|
||
|
* packet or egress command is chained across multiple buffers, with each
|
||
|
* buffer's size indicated by the .size field.
|
||
|
*/
|
||
|
uint_reg_t c : 2;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t c : 2;
|
||
|
uint_reg_t size : 3;
|
||
|
uint_reg_t hwb : 1;
|
||
|
uint_reg_t __reserved_2 : 1;
|
||
|
uint_reg_t inst : 1;
|
||
|
uint_reg_t __reserved_1 : 3;
|
||
|
uint_reg_t stack_idx : 5;
|
||
|
uint_reg_t __reserved_0 : 6;
|
||
|
int_reg_t va : 42;
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
/** Word access */
|
||
|
uint_reg_t words[2];
|
||
|
} MPIPE_EDMA_DESC_t;
|
||
|
|
||
|
/**
|
||
|
* MPIPE Packet Descriptor.
|
||
|
* The packet descriptor is filled by the mPIPE's classification,
|
||
|
* load-balancing, and buffer management services. Some fields are consumed
|
||
|
* by mPIPE hardware, and others are consumed by Tile software.
|
||
|
*/
|
||
|
|
||
|
__extension__
|
||
|
typedef union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
/* Word 0 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Notification ring into which this packet descriptor is written.
|
||
|
* Typically written by load balancer, but can be overridden by
|
||
|
* classification program if NR is asserted.
|
||
|
*/
|
||
|
uint_reg_t notif_ring : 8;
|
||
|
/** Source channel for this packet. Written by mPIPE DMA hardware. */
|
||
|
uint_reg_t channel : 5;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_0 : 1;
|
||
|
/**
|
||
|
* MAC Error.
|
||
|
* Generated by the MAC interface. Asserted if there was an overrun of
|
||
|
* the MAC's receive FIFO. This condition generally only occurs if the
|
||
|
* mPIPE clock is running too slowly.
|
||
|
*/
|
||
|
uint_reg_t me : 1;
|
||
|
/**
|
||
|
* Truncation Error.
|
||
|
* Written by the iDMA hardware. Asserted if packet was truncated due to
|
||
|
* insufficient space in iPkt buffer
|
||
|
*/
|
||
|
uint_reg_t tr : 1;
|
||
|
/**
|
||
|
* Written by the iDMA hardware. Indicates the number of bytes written
|
||
|
* to Tile memory. In general, this is the actual size of the packet as
|
||
|
* received from the MAC. But if the packet is truncated due to running
|
||
|
* out of buffers or due to the iPkt buffer filling up, then the L2_SIZE
|
||
|
* will be reduced to reflect the actual number of valid bytes written to
|
||
|
* Tile memory.
|
||
|
*/
|
||
|
uint_reg_t l2_size : 14;
|
||
|
/**
|
||
|
* CRC Error.
|
||
|
* Generated by the MAC. Asserted if MAC indicated an L2 CRC error or
|
||
|
* other L2 error (bad length etc.) on the packet.
|
||
|
*/
|
||
|
uint_reg_t ce : 1;
|
||
|
/**
|
||
|
* Cut Through.
|
||
|
* Written by the iDMA hardware. Asserted if packet was not completely
|
||
|
* received before being sent to classifier. L2_Size will indicate
|
||
|
* number of bytes received so far.
|
||
|
*/
|
||
|
uint_reg_t ct : 1;
|
||
|
/**
|
||
|
* Written by the classification program. Used by the load balancer to
|
||
|
* select the ring into which this packet descriptor is written.
|
||
|
*/
|
||
|
uint_reg_t bucket_id : 13;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_1 : 3;
|
||
|
/**
|
||
|
* Checksum.
|
||
|
* Written by classification program. When 1, the checksum engine will
|
||
|
* perform checksum based on the CSUM_SEED, CSUM_START, and CSUM_BYTES
|
||
|
* fields. The result will be placed in CSUM_VAL.
|
||
|
*/
|
||
|
uint_reg_t cs : 1;
|
||
|
/**
|
||
|
* Notification Ring Select.
|
||
|
* Written by the classification program. When 1, the NotifRingIDX is
|
||
|
* set by classification program rather than being set by load balancer.
|
||
|
*/
|
||
|
uint_reg_t nr : 1;
|
||
|
/**
|
||
|
* Written by classification program. Indicates whether packet and
|
||
|
* descriptor should both be dropped, both be delivered, or only the
|
||
|
* descriptor should be delivered.
|
||
|
*/
|
||
|
uint_reg_t dest : 2;
|
||
|
/**
|
||
|
* General Purpose Sequence Number Enable.
|
||
|
* Written by the classification program. When 1, the GP_SQN_SEL field
|
||
|
* contains the sequence number selector and the GP_SQN field will be
|
||
|
* replaced with the associated sequence number. When clear, the GP_SQN
|
||
|
* field is left intact and be used as "Custom" bytes.
|
||
|
*/
|
||
|
uint_reg_t sq : 1;
|
||
|
/**
|
||
|
* TimeStamp Enable.
|
||
|
* Enable TimeStamp insertion. When clear, timestamp field may be filled
|
||
|
* with custom data by classifier. When set, hardware inserts the
|
||
|
* timestamp when the start of packet is received from the MAC.
|
||
|
*/
|
||
|
uint_reg_t ts : 1;
|
||
|
/**
|
||
|
* Packet Sequence Number Enable.
|
||
|
* Enable PacketSQN insertion. When clear, PacketSQN field may be filled
|
||
|
* with custom data by classifier. When set, hardware inserts the packet
|
||
|
* sequence number when the packet descriptor is written to a
|
||
|
* notification ring.
|
||
|
*/
|
||
|
uint_reg_t ps : 1;
|
||
|
/**
|
||
|
* Buffer Error.
|
||
|
* Written by the iDMA hardware. Asserted if iDMA ran out of buffers
|
||
|
* while writing the packet. Software must still return any buffer
|
||
|
* descriptors whose C field indicates a valid descriptor was consumed.
|
||
|
*/
|
||
|
uint_reg_t be : 1;
|
||
|
/**
|
||
|
* Written by the classification program. The associated counter is
|
||
|
* incremented when the packet is sent.
|
||
|
*/
|
||
|
uint_reg_t ctr0 : 5;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_2 : 3;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t __reserved_2 : 3;
|
||
|
uint_reg_t ctr0 : 5;
|
||
|
uint_reg_t be : 1;
|
||
|
uint_reg_t ps : 1;
|
||
|
uint_reg_t ts : 1;
|
||
|
uint_reg_t sq : 1;
|
||
|
uint_reg_t dest : 2;
|
||
|
uint_reg_t nr : 1;
|
||
|
uint_reg_t cs : 1;
|
||
|
uint_reg_t __reserved_1 : 3;
|
||
|
uint_reg_t bucket_id : 13;
|
||
|
uint_reg_t ct : 1;
|
||
|
uint_reg_t ce : 1;
|
||
|
uint_reg_t l2_size : 14;
|
||
|
uint_reg_t tr : 1;
|
||
|
uint_reg_t me : 1;
|
||
|
uint_reg_t __reserved_0 : 1;
|
||
|
uint_reg_t channel : 5;
|
||
|
uint_reg_t notif_ring : 8;
|
||
|
#endif
|
||
|
|
||
|
/* Word 1 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Written by the classification program. The associated counter is
|
||
|
* incremented when the packet is sent.
|
||
|
*/
|
||
|
uint_reg_t ctr1 : 5;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_3 : 3;
|
||
|
/**
|
||
|
* Written by classification program. Indicates the start byte for
|
||
|
* checksum. Relative to 1st byte received from MAC.
|
||
|
*/
|
||
|
uint_reg_t csum_start : 8;
|
||
|
/**
|
||
|
* Checksum seed written by classification program. Overwritten with
|
||
|
* resultant checksum if CS bit is asserted. The endianness of the CSUM
|
||
|
* value bits when viewed by Tile software match the packet byte order.
|
||
|
* That is, bits[7:0] of the resulting checksum value correspond to
|
||
|
* earlier (more significant) bytes in the packet. To avoid classifier
|
||
|
* software from having to byte swap the CSUM_SEED, the iDMA checksum
|
||
|
* engine byte swaps the classifier's result before seeding the checksum
|
||
|
* calculation. Thus, the CSUM_START byte of packet data is added to
|
||
|
* bits[15:8] of the CSUM_SEED field generated by the classifier. This
|
||
|
* byte swap will be visible to Tile software if the CS bit is clear.
|
||
|
*/
|
||
|
uint_reg_t csum_seed_val : 16;
|
||
|
/**
|
||
|
* Written by the classification program. Not interpreted by mPIPE
|
||
|
* hardware.
|
||
|
*/
|
||
|
uint_reg_t custom0 : 32;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t custom0 : 32;
|
||
|
uint_reg_t csum_seed_val : 16;
|
||
|
uint_reg_t csum_start : 8;
|
||
|
uint_reg_t __reserved_3 : 3;
|
||
|
uint_reg_t ctr1 : 5;
|
||
|
#endif
|
||
|
|
||
|
/* Word 2 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Written by the classification program. Not interpreted by mPIPE
|
||
|
* hardware.
|
||
|
*/
|
||
|
uint_reg_t custom1 : 64;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t custom1 : 64;
|
||
|
#endif
|
||
|
|
||
|
/* Word 3 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Written by the classification program. Not interpreted by mPIPE
|
||
|
* hardware.
|
||
|
*/
|
||
|
uint_reg_t custom2 : 64;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t custom2 : 64;
|
||
|
#endif
|
||
|
|
||
|
/* Word 4 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Written by the classification program. Not interpreted by mPIPE
|
||
|
* hardware.
|
||
|
*/
|
||
|
uint_reg_t custom3 : 64;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t custom3 : 64;
|
||
|
#endif
|
||
|
|
||
|
/* Word 5 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Sequence number applied when packet is distributed. Classifier
|
||
|
* selects which sequence number is to be applied by writing the 13-bit
|
||
|
* SQN-selector into this field.
|
||
|
*/
|
||
|
uint_reg_t gp_sqn : 16;
|
||
|
/**
|
||
|
* Written by notification hardware. The packet sequence number is
|
||
|
* incremented for each packet that wasn't dropped.
|
||
|
*/
|
||
|
uint_reg_t packet_sqn : 48;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t packet_sqn : 48;
|
||
|
uint_reg_t gp_sqn : 16;
|
||
|
#endif
|
||
|
|
||
|
/* Word 6 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/**
|
||
|
* Written by hardware when the start-of-packet is received by the mPIPE
|
||
|
* from the MAC. This is the nanoseconds part of the packet timestamp.
|
||
|
*/
|
||
|
uint_reg_t time_stamp_ns : 32;
|
||
|
/**
|
||
|
* Written by hardware when the start-of-packet is received by the mPIPE
|
||
|
* from the MAC. This is the seconds part of the packet timestamp.
|
||
|
*/
|
||
|
uint_reg_t time_stamp_sec : 32;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t time_stamp_sec : 32;
|
||
|
uint_reg_t time_stamp_ns : 32;
|
||
|
#endif
|
||
|
|
||
|
/* Word 7 */
|
||
|
|
||
|
#ifndef __BIG_ENDIAN__
|
||
|
/** Virtual address. Must be sign extended by consumer. */
|
||
|
int_reg_t va : 42;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_4 : 6;
|
||
|
/** Index of the buffer stack to which this buffer belongs. */
|
||
|
uint_reg_t stack_idx : 5;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_5 : 3;
|
||
|
/**
|
||
|
* Instance ID. For devices that support more than one mPIPE instance,
|
||
|
* this field indicates the buffer owner. If the INST field does not
|
||
|
* match the mPIPE's instance number when a packet is egressed, buffers
|
||
|
* with HWB set will be returned to the other mPIPE instance.
|
||
|
*/
|
||
|
uint_reg_t inst : 1;
|
||
|
/** Reserved. */
|
||
|
uint_reg_t __reserved_6 : 1;
|
||
|
/**
|
||
|
* Always set to one by hardware in iDMA packet descriptors. For eDMA,
|
||
|
* indicates whether the buffer will be released to the buffer stack
|
||
|
* manager. When 0, software is responsible for releasing the buffer.
|
||
|
*/
|
||
|
uint_reg_t hwb : 1;
|
||
|
/**
|
||
|
* Encoded size of buffer. Set by the ingress hardware for iDMA packet
|
||
|
* descriptors. For eDMA descriptors, indicates the buffer size if .c
|
||
|
* indicates a chained packet. If an eDMA descriptor is not chained and
|
||
|
* the .hwb bit is not set, this field is ignored and the size is
|
||
|
* specified by the .xfer_size field.
|
||
|
* 0 = 128 bytes
|
||
|
* 1 = 256 bytes
|
||
|
* 2 = 512 bytes
|
||
|
* 3 = 1024 bytes
|
||
|
* 4 = 1664 bytes
|
||
|
* 5 = 4096 bytes
|
||
|
* 6 = 10368 bytes
|
||
|
* 7 = 16384 bytes
|
||
|
*/
|
||
|
uint_reg_t size : 3;
|
||
|
/**
|
||
|
* Chaining configuration for the buffer. Indicates that an ingress
|
||
|
* packet or egress command is chained across multiple buffers, with each
|
||
|
* buffer's size indicated by the .size field.
|
||
|
*/
|
||
|
uint_reg_t c : 2;
|
||
|
#else /* __BIG_ENDIAN__ */
|
||
|
uint_reg_t c : 2;
|
||
|
uint_reg_t size : 3;
|
||
|
uint_reg_t hwb : 1;
|
||
|
uint_reg_t __reserved_6 : 1;
|
||
|
uint_reg_t inst : 1;
|
||
|
uint_reg_t __reserved_5 : 3;
|
||
|
uint_reg_t stack_idx : 5;
|
||
|
uint_reg_t __reserved_4 : 6;
|
||
|
int_reg_t va : 42;
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
/** Word access */
|
||
|
uint_reg_t words[8];
|
||
|
} MPIPE_PDESC_t;
|
||
|
#endif /* !defined(__ASSEMBLER__) */
|
||
|
|
||
|
#endif /* !defined(__ARCH_MPIPE_SHM_H__) */
|