606 lines
23 KiB
C
606 lines
23 KiB
C
|
/*
|
||
|
* Copyright 2011 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.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Interface definitions for the mpipe driver.
|
||
|
*/
|
||
|
|
||
|
#ifndef _SYS_HV_DRV_MPIPE_INTF_H
|
||
|
#define _SYS_HV_DRV_MPIPE_INTF_H
|
||
|
|
||
|
#include <arch/mpipe.h>
|
||
|
#include <arch/mpipe_constants.h>
|
||
|
|
||
|
|
||
|
/** Number of mPIPE instances supported */
|
||
|
#define HV_MPIPE_INSTANCE_MAX (2)
|
||
|
|
||
|
/** Number of buffer stacks (32). */
|
||
|
#define HV_MPIPE_NUM_BUFFER_STACKS \
|
||
|
(MPIPE_MMIO_INIT_DAT_GX36_1__BUFFER_STACK_MASK_WIDTH)
|
||
|
|
||
|
/** Number of NotifRings (256). */
|
||
|
#define HV_MPIPE_NUM_NOTIF_RINGS (MPIPE_NUM_NOTIF_RINGS)
|
||
|
|
||
|
/** Number of NotifGroups (32). */
|
||
|
#define HV_MPIPE_NUM_NOTIF_GROUPS (MPIPE_NUM_NOTIF_GROUPS)
|
||
|
|
||
|
/** Number of buckets (4160). */
|
||
|
#define HV_MPIPE_NUM_BUCKETS (MPIPE_NUM_BUCKETS)
|
||
|
|
||
|
/** Number of "lo" buckets (4096). */
|
||
|
#define HV_MPIPE_NUM_LO_BUCKETS 4096
|
||
|
|
||
|
/** Number of "hi" buckets (64). */
|
||
|
#define HV_MPIPE_NUM_HI_BUCKETS \
|
||
|
(HV_MPIPE_NUM_BUCKETS - HV_MPIPE_NUM_LO_BUCKETS)
|
||
|
|
||
|
/** Number of edma rings (24). */
|
||
|
#define HV_MPIPE_NUM_EDMA_RINGS \
|
||
|
(MPIPE_MMIO_INIT_DAT_GX36_1__EDMA_POST_MASK_WIDTH)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/** A flag bit indicating a fixed resource allocation. */
|
||
|
#define HV_MPIPE_ALLOC_FIXED 0x01
|
||
|
|
||
|
/** Offset for the config register MMIO region. */
|
||
|
#define HV_MPIPE_CONFIG_MMIO_OFFSET \
|
||
|
(MPIPE_MMIO_ADDR__REGION_VAL_CFG << MPIPE_MMIO_ADDR__REGION_SHIFT)
|
||
|
|
||
|
/** Size of the config register MMIO region. */
|
||
|
#define HV_MPIPE_CONFIG_MMIO_SIZE (64 * 1024)
|
||
|
|
||
|
/** Offset for the config register MMIO region. */
|
||
|
#define HV_MPIPE_FAST_MMIO_OFFSET \
|
||
|
(MPIPE_MMIO_ADDR__REGION_VAL_IDMA << MPIPE_MMIO_ADDR__REGION_SHIFT)
|
||
|
|
||
|
/** Size of the fast register MMIO region (IDMA, EDMA, buffer stack). */
|
||
|
#define HV_MPIPE_FAST_MMIO_SIZE \
|
||
|
((MPIPE_MMIO_ADDR__REGION_VAL_BSM + 1 - MPIPE_MMIO_ADDR__REGION_VAL_IDMA) \
|
||
|
<< MPIPE_MMIO_ADDR__REGION_SHIFT)
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Each type of resource allocation comes in quantized chunks, where
|
||
|
* XXX_BITS is the number of chunks, and XXX_RES_PER_BIT is the number
|
||
|
* of resources in each chunk.
|
||
|
*/
|
||
|
|
||
|
/** Number of buffer stack chunks available (32). */
|
||
|
#define HV_MPIPE_ALLOC_BUFFER_STACKS_BITS \
|
||
|
MPIPE_MMIO_INIT_DAT_GX36_1__BUFFER_STACK_MASK_WIDTH
|
||
|
|
||
|
/** Granularity of buffer stack allocation (1). */
|
||
|
#define HV_MPIPE_ALLOC_BUFFER_STACKS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_BUFFER_STACKS / HV_MPIPE_ALLOC_BUFFER_STACKS_BITS)
|
||
|
|
||
|
/** Number of NotifRing chunks available (32). */
|
||
|
#define HV_MPIPE_ALLOC_NOTIF_RINGS_BITS \
|
||
|
MPIPE_MMIO_INIT_DAT_GX36_0__NOTIF_RING_MASK_WIDTH
|
||
|
|
||
|
/** Granularity of NotifRing allocation (8). */
|
||
|
#define HV_MPIPE_ALLOC_NOTIF_RINGS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_NOTIF_RINGS / HV_MPIPE_ALLOC_NOTIF_RINGS_BITS)
|
||
|
|
||
|
/** Number of NotifGroup chunks available (32). */
|
||
|
#define HV_MPIPE_ALLOC_NOTIF_GROUPS_BITS \
|
||
|
HV_MPIPE_NUM_NOTIF_GROUPS
|
||
|
|
||
|
/** Granularity of NotifGroup allocation (1). */
|
||
|
#define HV_MPIPE_ALLOC_NOTIF_GROUPS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_NOTIF_GROUPS / HV_MPIPE_ALLOC_NOTIF_GROUPS_BITS)
|
||
|
|
||
|
/** Number of lo bucket chunks available (16). */
|
||
|
#define HV_MPIPE_ALLOC_LO_BUCKETS_BITS \
|
||
|
MPIPE_MMIO_INIT_DAT_GX36_0__BUCKET_RELEASE_MASK_LO_WIDTH
|
||
|
|
||
|
/** Granularity of lo bucket allocation (256). */
|
||
|
#define HV_MPIPE_ALLOC_LO_BUCKETS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_LO_BUCKETS / HV_MPIPE_ALLOC_LO_BUCKETS_BITS)
|
||
|
|
||
|
/** Number of hi bucket chunks available (16). */
|
||
|
#define HV_MPIPE_ALLOC_HI_BUCKETS_BITS \
|
||
|
MPIPE_MMIO_INIT_DAT_GX36_0__BUCKET_RELEASE_MASK_HI_WIDTH
|
||
|
|
||
|
/** Granularity of hi bucket allocation (4). */
|
||
|
#define HV_MPIPE_ALLOC_HI_BUCKETS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_HI_BUCKETS / HV_MPIPE_ALLOC_HI_BUCKETS_BITS)
|
||
|
|
||
|
/** Number of eDMA ring chunks available (24). */
|
||
|
#define HV_MPIPE_ALLOC_EDMA_RINGS_BITS \
|
||
|
MPIPE_MMIO_INIT_DAT_GX36_1__EDMA_POST_MASK_WIDTH
|
||
|
|
||
|
/** Granularity of eDMA ring allocation (1). */
|
||
|
#define HV_MPIPE_ALLOC_EDMA_RINGS_RES_PER_BIT \
|
||
|
(HV_MPIPE_NUM_EDMA_RINGS / HV_MPIPE_ALLOC_EDMA_RINGS_BITS)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/** Bit vector encoding which NotifRings are in a NotifGroup. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The actual bits. */
|
||
|
uint64_t ring_mask[4];
|
||
|
|
||
|
} gxio_mpipe_notif_group_bits_t;
|
||
|
|
||
|
|
||
|
/** Another name for MPIPE_LBL_INIT_DAT_BSTS_TBL_t. */
|
||
|
typedef MPIPE_LBL_INIT_DAT_BSTS_TBL_t gxio_mpipe_bucket_info_t;
|
||
|
|
||
|
|
||
|
|
||
|
/** Eight buffer stack ids. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The stacks. */
|
||
|
uint8_t stacks[8];
|
||
|
|
||
|
} gxio_mpipe_rules_stacks_t;
|
||
|
|
||
|
|
||
|
/** A destination mac address. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The octets. */
|
||
|
uint8_t octets[6];
|
||
|
|
||
|
} gxio_mpipe_rules_dmac_t;
|
||
|
|
||
|
|
||
|
/** A vlan. */
|
||
|
typedef uint16_t gxio_mpipe_rules_vlan_t;
|
||
|
|
||
|
|
||
|
|
||
|
/** Maximum number of characters in a link name. */
|
||
|
#define GXIO_MPIPE_LINK_NAME_LEN 32
|
||
|
|
||
|
|
||
|
/** Structure holding a link name. Only needed, and only typedef'ed,
|
||
|
* because the IORPC stub generator only handles types which are single
|
||
|
* words coming before the parameter name. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The name itself. */
|
||
|
char name[GXIO_MPIPE_LINK_NAME_LEN];
|
||
|
}
|
||
|
_gxio_mpipe_link_name_t;
|
||
|
|
||
|
/** Maximum number of characters in a symbol name. */
|
||
|
#define GXIO_MPIPE_SYMBOL_NAME_LEN 128
|
||
|
|
||
|
|
||
|
/** Structure holding a symbol name. Only needed, and only typedef'ed,
|
||
|
* because the IORPC stub generator only handles types which are single
|
||
|
* words coming before the parameter name. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The name itself. */
|
||
|
char name[GXIO_MPIPE_SYMBOL_NAME_LEN];
|
||
|
}
|
||
|
_gxio_mpipe_symbol_name_t;
|
||
|
|
||
|
|
||
|
/** Structure holding a MAC address. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The address. */
|
||
|
uint8_t mac[6];
|
||
|
}
|
||
|
_gxio_mpipe_link_mac_t;
|
||
|
|
||
|
|
||
|
|
||
|
/** Request shared data permission -- that is, the ability to send and
|
||
|
* receive packets -- on the specified link. Other processes may also
|
||
|
* request shared data permission on the same link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_DATA, ::GXIO_MPIPE_LINK_NO_DATA,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_DATA may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_DATA is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_DATA 0x00000001UL
|
||
|
|
||
|
/** Do not request data permission on the specified link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_DATA, ::GXIO_MPIPE_LINK_NO_DATA,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_DATA may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_DATA is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_NO_DATA 0x00000002UL
|
||
|
|
||
|
/** Request exclusive data permission -- that is, the ability to send and
|
||
|
* receive packets -- on the specified link. No other processes may
|
||
|
* request data permission on this link, and if any process already has
|
||
|
* data permission on it, this open will fail.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_DATA, ::GXIO_MPIPE_LINK_NO_DATA,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_DATA may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_DATA is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_EXCL_DATA 0x00000004UL
|
||
|
|
||
|
/** Request shared stats permission -- that is, the ability to read and write
|
||
|
* registers which contain link statistics, and to get link attributes --
|
||
|
* on the specified link. Other processes may also request shared stats
|
||
|
* permission on the same link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_STATS, ::GXIO_MPIPE_LINK_NO_STATS,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_STATS may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_STATS is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_STATS 0x00000008UL
|
||
|
|
||
|
/** Do not request stats permission on the specified link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_STATS, ::GXIO_MPIPE_LINK_NO_STATS,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_STATS may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_STATS is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_NO_STATS 0x00000010UL
|
||
|
|
||
|
/** Request exclusive stats permission -- that is, the ability to read and
|
||
|
* write registers which contain link statistics, and to get link
|
||
|
* attributes -- on the specified link. No other processes may request
|
||
|
* stats permission on this link, and if any process already
|
||
|
* has stats permission on it, this open will fail.
|
||
|
*
|
||
|
* Requesting exclusive stats permission is normally a very bad idea, since
|
||
|
* it prevents programs like mpipe-stat from providing information on this
|
||
|
* link. Applications should only do this if they use MAC statistics
|
||
|
* registers, and cannot tolerate any of the clear-on-read registers being
|
||
|
* reset by other statistics programs.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_STATS, ::GXIO_MPIPE_LINK_NO_STATS,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_STATS may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_STATS is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_EXCL_STATS 0x00000020UL
|
||
|
|
||
|
/** Request shared control permission -- that is, the ability to modify link
|
||
|
* attributes, and read and write MAC and MDIO registers -- on the
|
||
|
* specified link. Other processes may also request shared control
|
||
|
* permission on the same link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_CTL, ::GXIO_MPIPE_LINK_NO_CTL,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_CTL may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_CTL is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_CTL 0x00000040UL
|
||
|
|
||
|
/** Do not request control permission on the specified link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_CTL, ::GXIO_MPIPE_LINK_NO_CTL,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_CTL may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_CTL is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_NO_CTL 0x00000080UL
|
||
|
|
||
|
/** Request exclusive control permission -- that is, the ability to modify
|
||
|
* link attributes, and read and write MAC and MDIO registers -- on the
|
||
|
* specified link. No other processes may request control permission on
|
||
|
* this link, and if any process already has control permission on it,
|
||
|
* this open will fail.
|
||
|
*
|
||
|
* Requesting exclusive control permission is not always a good idea, since
|
||
|
* it prevents programs like mpipe-link from configuring the link.
|
||
|
*
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_CTL, ::GXIO_MPIPE_LINK_NO_CTL,
|
||
|
* or ::GXIO_MPIPE_LINK_EXCL_CTL may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_CTL is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_EXCL_CTL 0x00000100UL
|
||
|
|
||
|
/** Set the desired state of the link to up, allowing any speeds which are
|
||
|
* supported by the link hardware, as part of this open operation; do not
|
||
|
* change the desired state of the link when it is closed or the process
|
||
|
* exits. No more than one of ::GXIO_MPIPE_LINK_AUTO_UP,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UPDOWN, ::GXIO_MPIPE_LINK_AUTO_DOWN, or
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_NONE may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_AUTO_UPDOWN is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_AUTO_UP 0x00000200UL
|
||
|
|
||
|
/** Set the desired state of the link to up, allowing any speeds which are
|
||
|
* supported by the link hardware, as part of this open operation; when the
|
||
|
* link is closed or this process exits, if no other process has the link
|
||
|
* open, set the desired state of the link to down. No more than one of
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UP, ::GXIO_MPIPE_LINK_AUTO_UPDOWN,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_DOWN, or ::GXIO_MPIPE_LINK_AUTO_NONE may be
|
||
|
* specifed in a gxio_mpipe_link_open() call. If none are specified,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UPDOWN is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_AUTO_UPDOWN 0x00000400UL
|
||
|
|
||
|
/** Do not change the desired state of the link as part of the open
|
||
|
* operation; when the link is closed or this process exits, if no other
|
||
|
* process has the link open, set the desired state of the link to down.
|
||
|
* No more than one of ::GXIO_MPIPE_LINK_AUTO_UP,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UPDOWN, ::GXIO_MPIPE_LINK_AUTO_DOWN, or
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_NONE may be specifed in a gxio_mpipe_link_open()
|
||
|
* call. If none are specified, ::GXIO_MPIPE_LINK_AUTO_UPDOWN is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_AUTO_DOWN 0x00000800UL
|
||
|
|
||
|
/** Do not change the desired state of the link as part of the open
|
||
|
* operation; do not change the desired state of the link when it is
|
||
|
* closed or the process exits. No more than one of
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UP, ::GXIO_MPIPE_LINK_AUTO_UPDOWN,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_DOWN, or ::GXIO_MPIPE_LINK_AUTO_NONE may be
|
||
|
* specifed in a gxio_mpipe_link_open() call. If none are specified,
|
||
|
* ::GXIO_MPIPE_LINK_AUTO_UPDOWN is assumed.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_AUTO_NONE 0x00001000UL
|
||
|
|
||
|
/** Request that this open call not complete until the network link is up.
|
||
|
* The process will wait as long as necessary for this to happen;
|
||
|
* applications which wish to abandon waiting for the link after a
|
||
|
* specific time period should not specify this flag when opening a link,
|
||
|
* but should instead call gxio_mpipe_link_wait() afterward. The link
|
||
|
* must be opened with stats permission. Note that this flag by itself
|
||
|
* does not change the desired link state; if other open flags or previous
|
||
|
* link state changes have not requested a desired state of up, the open
|
||
|
* call will never complete. This flag is not available to kernel
|
||
|
* clients.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_WAIT 0x00002000UL
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Note: link attributes must fit in 24 bits, since we use the top 8 bits
|
||
|
* of the IORPC offset word for the channel number.
|
||
|
*/
|
||
|
|
||
|
/** Determine whether jumbo frames may be received. If this attribute's
|
||
|
* value value is nonzero, the MAC will accept frames of up to 10240 bytes.
|
||
|
* If the value is zero, the MAC will only accept frames of up to 1544
|
||
|
* bytes. The default value is zero. */
|
||
|
#define GXIO_MPIPE_LINK_RECEIVE_JUMBO 0x010000
|
||
|
|
||
|
/** Determine whether to send pause frames on this link if the mPIPE packet
|
||
|
* FIFO is nearly full. If the value is zero, pause frames are not sent.
|
||
|
* If the value is nonzero, it is the delay value which will be sent in any
|
||
|
* pause frames which are output, in units of 512 bit times.
|
||
|
*
|
||
|
* Bear in mind that in almost all circumstances, the mPIPE packet FIFO
|
||
|
* will never fill up, since mPIPE will empty it as fast as or faster than
|
||
|
* the incoming data rate, by either delivering or dropping packets. The
|
||
|
* only situation in which this is not true is if the memory and cache
|
||
|
* subsystem is extremely heavily loaded, and mPIPE cannot perform DMA of
|
||
|
* packet data to memory in a timely fashion. In particular, pause frames
|
||
|
* will <em>not</em> be sent if packets cannot be delivered because
|
||
|
* NotifRings are full, buckets are full, or buffers are not available in
|
||
|
* a buffer stack. */
|
||
|
#define GXIO_MPIPE_LINK_SEND_PAUSE 0x020000
|
||
|
|
||
|
/** Determine whether to suspend output on the receipt of pause frames.
|
||
|
* If the value is nonzero, mPIPE shim will suspend output on the link's
|
||
|
* channel when a pause frame is received. If the value is zero, pause
|
||
|
* frames will be ignored. The default value is zero. */
|
||
|
#define GXIO_MPIPE_LINK_RECEIVE_PAUSE 0x030000
|
||
|
|
||
|
/** Interface MAC address. The value is a 6-byte MAC address, in the least
|
||
|
* significant 48 bits of the value; in other words, an address which would
|
||
|
* be printed as '12:34:56:78:90:AB' in IEEE 802 canonical format would
|
||
|
* be returned as 0x12345678ab.
|
||
|
*
|
||
|
* Depending upon the overall system design, a MAC address may or may not
|
||
|
* be available for each interface. Note that the interface's MAC address
|
||
|
* does not limit the packets received on its channel, although the
|
||
|
* classifier's rules could be configured to do that. Similarly, the MAC
|
||
|
* address is not used when transmitting packets, although applications
|
||
|
* could certainly decide to use the assigned address as a source MAC
|
||
|
* address when doing so. This attribute may only be retrieved with
|
||
|
* gxio_mpipe_link_get_attr(); it may not be modified.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_MAC 0x040000
|
||
|
|
||
|
/** Determine whether to discard egress packets on link down. If this value
|
||
|
* is nonzero, packets sent on this link while the link is down will be
|
||
|
* discarded. If this value is zero, no packets will be sent on this link
|
||
|
* while it is down. The default value is one. */
|
||
|
#define GXIO_MPIPE_LINK_DISCARD_IF_DOWN 0x050000
|
||
|
|
||
|
/** Possible link state. The value is a combination of link state flags,
|
||
|
* ORed together, that indicate link modes which are actually supported by
|
||
|
* the hardware. This attribute may only be retrieved with
|
||
|
* gxio_mpipe_link_get_attr(); it may not be modified. */
|
||
|
#define GXIO_MPIPE_LINK_POSSIBLE_STATE 0x060000
|
||
|
|
||
|
/** Current link state. The value is a combination of link state flags,
|
||
|
* ORed together, that indicate the current state of the hardware. If the
|
||
|
* link is down, the value ANDed with ::GXIO_MPIPE_LINK_SPEED will be zero;
|
||
|
* if the link is up, the value ANDed with ::GXIO_MPIPE_LINK_SPEED will
|
||
|
* result in exactly one of the speed values, indicating the current speed.
|
||
|
* This attribute may only be retrieved with gxio_mpipe_link_get_attr(); it
|
||
|
* may not be modified. */
|
||
|
#define GXIO_MPIPE_LINK_CURRENT_STATE 0x070000
|
||
|
|
||
|
/** Desired link state. The value is a conbination of flags, which specify
|
||
|
* the desired state for the link. With gxio_mpipe_link_set_attr(), this
|
||
|
* will, in the background, attempt to bring up the link using whichever of
|
||
|
* the requested flags are reasonable, or take down the link if the flags
|
||
|
* are zero. The actual link up or down operation may happen after this
|
||
|
* call completes. If the link state changes in the future, the system
|
||
|
* will continue to try to get back to the desired link state; for
|
||
|
* instance, if the link is brought up successfully, and then the network
|
||
|
* cable is disconnected, the link will go down. However, the desired
|
||
|
* state of the link is still up, so if the cable is reconnected, the link
|
||
|
* will be brought up again.
|
||
|
*
|
||
|
* With gxio_mpipe_link_set_attr(), this will indicate the desired state
|
||
|
* for the link, as set with a previous gxio_mpipe_link_set_attr() call,
|
||
|
* or implicitly by a gxio_mpipe_link_open() or link close operation.
|
||
|
* This may not reflect the current state of the link; to get that, use
|
||
|
* ::GXIO_MPIPE_LINK_CURRENT_STATE.
|
||
|
*/
|
||
|
#define GXIO_MPIPE_LINK_DESIRED_STATE 0x080000
|
||
|
|
||
|
|
||
|
|
||
|
/** Link can run, should run, or is running at 10 Mbps. */
|
||
|
#define GXIO_MPIPE_LINK_10M 0x0000000000000001UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 100 Mbps. */
|
||
|
#define GXIO_MPIPE_LINK_100M 0x0000000000000002UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 1 Gbps. */
|
||
|
#define GXIO_MPIPE_LINK_1G 0x0000000000000004UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 10 Gbps. */
|
||
|
#define GXIO_MPIPE_LINK_10G 0x0000000000000008UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 20 Gbps. */
|
||
|
#define GXIO_MPIPE_LINK_20G 0x0000000000000010UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 25 Gbps. */
|
||
|
#define GXIO_MPIPE_LINK_25G 0x0000000000000020UL
|
||
|
|
||
|
/** Link can run, should run, or is running at 50 Gbps. */
|
||
|
#define GXIO_MPIPE_LINK_50G 0x0000000000000040UL
|
||
|
|
||
|
/** Link should run at the highest speed supported by the link and by
|
||
|
* the device connected to the link. Only usable as a value for
|
||
|
* the link's desired state; never returned as a value for the current
|
||
|
* or possible states. */
|
||
|
#define GXIO_MPIPE_LINK_ANYSPEED 0x0000000000000800UL
|
||
|
|
||
|
/** All legal link speeds. This value is provided for use in extracting
|
||
|
* the speed-related subset of the link state flags; it is not intended
|
||
|
* to be set directly as a value for one of the GXIO_MPIPE_LINK_xxx_STATE
|
||
|
* attributes. A link is up or is requested to be up if its current or
|
||
|
* desired state, respectively, ANDED with this value, is nonzero. */
|
||
|
#define GXIO_MPIPE_LINK_SPEED_MASK 0x0000000000000FFFUL
|
||
|
|
||
|
/** Link can run, should run, or is running in MAC loopback mode. This
|
||
|
* loops transmitted packets back to the receiver, inside the Tile
|
||
|
* Processor. */
|
||
|
#define GXIO_MPIPE_LINK_LOOP_MAC 0x0000000000001000UL
|
||
|
|
||
|
/** Link can run, should run, or is running in PHY loopback mode. This
|
||
|
* loops transmitted packets back to the receiver, inside the external
|
||
|
* PHY chip. */
|
||
|
#define GXIO_MPIPE_LINK_LOOP_PHY 0x0000000000002000UL
|
||
|
|
||
|
/** Link can run, should run, or is running in external loopback mode.
|
||
|
* This requires that an external loopback plug be installed on the
|
||
|
* Ethernet port. Note that only some links require that this be
|
||
|
* configured via the gxio_mpipe_link routines; other links can do
|
||
|
* external loopack with the plug and no special configuration. */
|
||
|
#define GXIO_MPIPE_LINK_LOOP_EXT 0x0000000000004000UL
|
||
|
|
||
|
/** All legal loopback types. */
|
||
|
#define GXIO_MPIPE_LINK_LOOP_MASK 0x000000000000F000UL
|
||
|
|
||
|
/** Link can run, should run, or is running in full-duplex mode.
|
||
|
* If neither ::GXIO_MPIPE_LINK_FDX nor ::GXIO_MPIPE_LINK_HDX are
|
||
|
* specified in a set of desired state flags, both are assumed. */
|
||
|
#define GXIO_MPIPE_LINK_FDX 0x0000000000010000UL
|
||
|
|
||
|
/** Link can run, should run, or is running in half-duplex mode.
|
||
|
* If neither ::GXIO_MPIPE_LINK_FDX nor ::GXIO_MPIPE_LINK_HDX are
|
||
|
* specified in a set of desired state flags, both are assumed. */
|
||
|
#define GXIO_MPIPE_LINK_HDX 0x0000000000020000UL
|
||
|
|
||
|
|
||
|
/** An individual rule. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The total size. */
|
||
|
uint16_t size;
|
||
|
|
||
|
/** The priority. */
|
||
|
int16_t priority;
|
||
|
|
||
|
/** The "headroom" in each buffer. */
|
||
|
uint8_t headroom;
|
||
|
|
||
|
/** The "tailroom" in each buffer. */
|
||
|
uint8_t tailroom;
|
||
|
|
||
|
/** The "capacity" of the largest buffer. */
|
||
|
uint16_t capacity;
|
||
|
|
||
|
/** The mask for converting a flow hash into a bucket. */
|
||
|
uint16_t bucket_mask;
|
||
|
|
||
|
/** The offset for converting a flow hash into a bucket. */
|
||
|
uint16_t bucket_first;
|
||
|
|
||
|
/** The buffer stack ids. */
|
||
|
gxio_mpipe_rules_stacks_t stacks;
|
||
|
|
||
|
/** The actual channels. */
|
||
|
uint32_t channel_bits;
|
||
|
|
||
|
/** The number of dmacs. */
|
||
|
uint16_t num_dmacs;
|
||
|
|
||
|
/** The number of vlans. */
|
||
|
uint16_t num_vlans;
|
||
|
|
||
|
/** The actual dmacs and vlans. */
|
||
|
uint8_t dmacs_and_vlans[];
|
||
|
|
||
|
} gxio_mpipe_rules_rule_t;
|
||
|
|
||
|
|
||
|
/** A list of classifier rules. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** The offset to the end of the current rule. */
|
||
|
uint16_t tail;
|
||
|
|
||
|
/** The offset to the start of the current rule. */
|
||
|
uint16_t head;
|
||
|
|
||
|
/** The actual rules. */
|
||
|
uint8_t rules[4096 - 4];
|
||
|
|
||
|
} gxio_mpipe_rules_list_t;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/** mPIPE statistics structure. These counters include all relevant
|
||
|
* events occurring on all links within the mPIPE shim. */
|
||
|
typedef struct
|
||
|
{
|
||
|
/** Number of ingress packets dropped for any reason. */
|
||
|
uint64_t ingress_drops;
|
||
|
/** Number of ingress packets dropped because a buffer stack was empty. */
|
||
|
uint64_t ingress_drops_no_buf;
|
||
|
/** Number of ingress packets dropped or truncated due to lack of space in
|
||
|
* the iPkt buffer. */
|
||
|
uint64_t ingress_drops_ipkt;
|
||
|
/** Number of ingress packets dropped by the classifier or load balancer */
|
||
|
uint64_t ingress_drops_cls_lb;
|
||
|
/** Total number of ingress packets. */
|
||
|
uint64_t ingress_packets;
|
||
|
/** Total number of egress packets. */
|
||
|
uint64_t egress_packets;
|
||
|
/** Total number of ingress bytes. */
|
||
|
uint64_t ingress_bytes;
|
||
|
/** Total number of egress bytes. */
|
||
|
uint64_t egress_bytes;
|
||
|
}
|
||
|
gxio_mpipe_stats_t;
|
||
|
|
||
|
|
||
|
#endif /* _SYS_HV_DRV_MPIPE_INTF_H */
|