diff options
author | jmallett <jmallett@FreeBSD.org> | 2010-11-28 08:18:16 +0000 |
---|---|---|
committer | jmallett <jmallett@FreeBSD.org> | 2010-11-28 08:18:16 +0000 |
commit | cdfefa0ba06939d897cb0d1f5987a4d0996ea3ef (patch) | |
tree | 0a50a5816f02b42087de787ad200f1eb12f29144 /sys/contrib/octeon-sdk/cvmx-srio.h | |
parent | 4b7c147940d7db81a4434262cf5cb2f5cd0102f2 (diff) | |
parent | 76ef03b9cb287a0817808454c8b27cbcce5243d3 (diff) | |
download | FreeBSD-src-cdfefa0ba06939d897cb0d1f5987a4d0996ea3ef.zip FreeBSD-src-cdfefa0ba06939d897cb0d1f5987a4d0996ea3ef.tar.gz |
Merge Cavium Octeon SDK 2.0 Simple Executive; this brings some fixes and new
facilities as well as support for the Octeon 2 family of SoCs.
XXX Note that with our antediluvian assembler, we can't support some Octeon 2
instructions and fall back to using the old ones instead.
Diffstat (limited to 'sys/contrib/octeon-sdk/cvmx-srio.h')
-rw-r--r-- | sys/contrib/octeon-sdk/cvmx-srio.h | 525 |
1 files changed, 525 insertions, 0 deletions
diff --git a/sys/contrib/octeon-sdk/cvmx-srio.h b/sys/contrib/octeon-sdk/cvmx-srio.h new file mode 100644 index 0000000..e53813c --- /dev/null +++ b/sys/contrib/octeon-sdk/cvmx-srio.h @@ -0,0 +1,525 @@ +/***********************license start*************** + * Copyright (c) 2003-2010 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + + * This Software, including technical data, may be subject to U.S. export control + * laws, including the U.S. Export Administration Act and its associated + * regulations, and may be subject to export or import regulations in other + * countries. + + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS OR + * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO + * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR + * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM + * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, + * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF + * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR + * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR + * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + ***********************license end**************************************/ + + + +/** + * @file + * + * Interface to SRIO + * + * <hr>$Revision: 41586 $<hr> + */ + +#ifndef __CVMX_SRIO_H__ +#define __CVMX_SRIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Enumeration of the type of operations that can be performed + * by a mapped write operation. + */ +typedef enum +{ + CVMX_SRIO_WRITE_MODE_NWRITE = 0, /**< Only create NWrite operations */ + CVMX_SRIO_WRITE_MODE_NWRITE_RESP = 1, /**< Create NWrite with response */ + CVMX_SRIO_WRITE_MODE_AUTO = 2, /**< Intelligently breaks writes into multiple transactions based on alignment */ + CVMX_SRIO_WRITE_MODE_AUTO_RESP = 3, /**< CVMX_SRIO_WRITE_MODE_WRITE followed with a response */ + CVMX_SRIO_WRITE_MODE_MAINTENANCE = 6, /**< Create a MAINTENANCE transaction. Use cvmx_srio_config_write32() instead */ + CVMX_SRIO_WRITE_MODE_PORT = 7 /**< Port Write? */ +} cvmx_srio_write_mode_t; + +/** + * Enumeration of the type of operations that can be performed + * by a mapped read operation. + */ +typedef enum +{ + CVMX_SRIO_READ_MODE_NORMAL = 0, /**< Perform a normal read */ + CVMX_SRIO_READ_MODE_ATOMIC_SET = 2, /**< Atomically sets bits in data on remote device */ + CVMX_SRIO_READ_MODE_ATOMIC_CLEAR = 3, /**< Atomically clears bits in data on remote device */ + CVMX_SRIO_READ_MODE_ATOMIC_INCREMENT = 4,/**< Atomically increments data on remote device */ + CVMX_SRIO_READ_MODE_ATOMIC_DECREMENT = 5,/**< Atomically decrements data on remote device */ + CVMX_SRIO_READ_MODE_MAINTENANCE = 6 /**< Create a MAINTENANCE transaction. Use cvmx_srio_config_read32() instead */ +} cvmx_srio_read_mode_t; + +/** + * Initialization flags for SRIO + */ +typedef enum +{ + CVMX_SRIO_INITIALIZE_DEBUG = 1, +} cvmx_srio_initialize_flags_t; + +/** + * The possible results from a doorbell operation + */ +typedef enum +{ + CVMX_SRIO_DOORBELL_DONE, /**< The doorbell is complete */ + CVMX_SRIO_DOORBELL_NONE, /**< There wasn't an outstanding doorbell */ + CVMX_SRIO_DOORBELL_BUSY, /**< The doorbell is still processing */ + CVMX_SRIO_DOORBELL_RETRY, /**< The doorbell needs to be retried */ + CVMX_SRIO_DOORBELL_ERROR /**< The doorbell failed with an error */ +} cvmx_srio_doorbell_status_t; + +/** + * This structure represents the SRIO header received from SRIO on + * the top of every received message. This header passes through + * IPD/PIP unmodified. + */ +typedef struct +{ + union + { + uint64_t u64; + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t prio : 2; /**< The sRIO prio (priority) field in the + first sRIO message segment received for the + message. */ + uint64_t tt : 1; /**< When set, indicates that the first sRIO + message segment received for the message had + 16-bit source and destination ID's. When + clear, indicates 8-bit ID were present. */ + uint64_t dis : 1; /**< When set, indicates that the destination + ID in the first sRIO message segment received + for the message matched the 63xx's secondary + ID. When clear, indicates that the destination + ID in the first sRIO message segment + received for the message matched the 63xx's + primary ID. Note that the full destination + ID in the received sRIO message can be + determined via the combination of + WORD0[DIS] in the sRIO inbound message + header and WORD1[iprt] in the work queue + entry created by PIP/IPD. */ + uint64_t ssize : 4; /**< The RIO ssize (standard message packet data + size) field used for the message. */ + uint64_t sid : 16; /**< The source ID in the first sRIO message + segment received for the message. When TT is + clear, the most-significant 8 bits are zero. */ + uint64_t xmbox : 4; /**< The RIO xmbox (recipient mailbox extension) + field in the first sRIO message segment + received for the message. Always zero for + multi-segment messages. */ + uint64_t mbox : 2; /**< The RIO mbox (recipient mailbox) field in + the first sRIO message segment received for + the message. */ + uint64_t letter : 2; /**< The RIO letter (slot within a mailbox) + field in the first sRIO message segment + received for the message. */ + uint64_t seq : 32; /**< A sequence number. Whenever the OCTEON + 63xx sRIO hardware accepts the first sRIO + segment of either a message or doorbell, it + samples the current value of a counter + register and increments the counter + register. SEQ is the value sampled for the + message. The counter increments once per + message/doorbell. SEQ can be used to + determine the relative order of + packets/doorbells. Note that the SEQ-implied + order may differ from the order that the + WQE's are received by software for a number + of reasons, including the fact that the WQE + is not created until the end of the message, + while SEQ is sampled when the first segment. */ +#else + uint64_t seq : 32; + uint64_t letter : 2; + uint64_t mbox : 2; + uint64_t xmbox : 4; + uint64_t sid : 16; + uint64_t ssize : 4; + uint64_t dis : 1; + uint64_t tt : 1; + uint64_t prio : 2; +#endif + } s; + } word0; + union + { + uint64_t u64; + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t r : 1; /**< When set, WORD1[R]/PKT_INST_HDR[R] selects + either RAWFULL or RAWSCHED special PIP + instruction form. WORD1[R] may commonly be + set so that WORD1[QOS,GRP] will be directly + used by the PIP hardware. */ + uint64_t reserved_62_58 : 5; + uint64_t pm : 2; /**< WORD1[PM]/PKT_INST_HDR[PM] selects the PIP + parse mode (uninterpreted, skip-to-L2, + skip-to-IP), and chooses between + RAWFULL/RAWSCHED when WORD1[R] is set. */ + uint64_t reserved_55 : 1; + uint64_t sl : 7; /**< WORD1[SL]/PKT_INST_HDR[SL] selects the + skip II length. WORD1[SL] may typically be + set to 8 (or larger) so that PIP skips this + WORD1. */ + uint64_t reserved_47_46 : 2; + uint64_t nqos : 1; /**< WORD1[NQOS] must not be set when WORD1[R] + is clear and PIP interprets WORD1 as a + PKT_INST_HDR. When set, WORD1[NQOS]/PKT_INST_HDR[NQOS] + prevents PIP from directly using + WORD1[QOS]/PKT_INST_HDR[QOS] for the QOS + value in the work queue entry created by + PIP. WORD1[NQOS] may commonly be clear so + that WORD1[QOS] will be directly used by the + PIP hardware. PKT_INST_HDR[NQOS] is new to + 63xx - this functionality did not exist in + prior OCTEON's. */ + uint64_t ngrp : 1; /**< WORD1[NGRP] must not be set when WORD1[R] + is clear and PIP interprets WORD1 as a + PKT_INST_HDR. When set, WORD1[NGRP]/PKT_INST_HDR[NGRP] + prevents PIP from directly using + WORD1[GRP]/PKT_INST_HDR[GRP] for the GRP + value in the work queue entry created by + PIP. WORD1[NGRP] may commonly be clear so + that WORD1[GRP] will be directly used by the + PIP hardware. PKT_INST_HDR[NGRP] is new to + 63xx - this functionality did not exist in + prior OCTEON's. */ + uint64_t ntt : 1; /**< WORD1[NTT] must not be set when WORD1[R] + is clear and PIP interprets WORD1 as a + PKT_INST_HDR. When set, WORD1[NTT]/PKT_INST_HDR[NTT] + prevents PIP from directly using + WORD1[TT]/PKT_INST_HDR[TT] for the TT value + in the work queue entry created by PIP. + PKT_INST_HDR[NTT] is new to 63xx - this + functionality did not exist in prior OCTEON's. */ + uint64_t ntag : 1; /**< WORD1[NTAG] must not be set when WORD1[R] + is clear and PIP interprets WORD1 as a + PKT_INST_HDR. When set, WORD1[NTAG]/PKT_INST_HDR[NTAG] + prevents PIP from directly using + WORD1[TAG]/PKT_INST_HDR[TAG] for the TAG + value in the work queue entry created by PIP. + PKT_INST_HDR[NTAG] is new to 63xx - this + functionality did not exist in prior OCTEON's. */ + uint64_t qos : 3; /**< Created by the hardware from an entry in a + 256-entry table. The 8-bit value + WORD0[PRIO,TT,DIS,MBOX,LETTER] selects the + table entry. When WORD1[R] is set and WORD1[NQOS] + is clear, WORD1[QOS] becomes the QOS value + in the work queue entry created by PIP. The + QOS value in the work queue entry determines + the priority that SSO/POW will schedule the + work, and can also control how/if the sRIO + message gets dropped by PIP/IPD. The 256-entry + table is unique to each sRIO core, but + shared by the two controllers associated + with the sRIO core. */ + uint64_t grp : 4; /**< Created by the hardware from an entry in a + 256-entry table. The 8-bit value + WORD0[PRIO,TT,DIS,MBOX,LETTER] selects the + table entry. When WORD1[R] is set and WORD1[NGRP] + is clear, WORD1[GRP] becomes the GRP value + in the work queue entry created by PIP. The + GRP value in the work queue entry can direct + the work to particular cores or particular + groups of cores. The 256-entry table is + unique to each sRIO core, but shared by the + two controllers associated with the sRIO core. */ + uint64_t rs : 1; /**< In some configurations, enables the sRIO + message to be buffered solely in the work + queue entry, and not otherwise in L2/DRAM. */ + uint64_t tt : 2; /**< When WORD1[R] is set and WORD1[NTT] is + clear, WORD1[TT]/PKT_INST_HDR[TT] becomes + the TT value in the work queue entry created + by PIP. The TT and TAG values in the work + queue entry determine the scheduling/synchronization + constraints for the work (no constraints, + tag order, atomic tag order). */ + uint64_t tag : 32; /**< Created by the hardware from a CSR + associated with the sRIO inbound message + controller. When WORD1[R] is set and WORD1[NTAG] + is clear, WORD1[TAG]/PKT_INST_HDR[TAG] + becomes the TAG value in the work queue + entry created by PIP. The TT and TAG values + in the work queue entry determine the + scheduling/synchronization constraints for + the work (no constraints, tag order, atomic + tag order). */ +#else + uint64_t tag : 32; + uint64_t tt : 2; + uint64_t rs : 1; + uint64_t grp : 4; + uint64_t qos : 3; + uint64_t ntag : 1; + uint64_t ntt : 1; + uint64_t ngrp : 1; + uint64_t nqos : 1; + uint64_t reserved_47_46 : 2; + uint64_t sl : 7; + uint64_t reserved_55 : 1; + uint64_t pm : 2; + uint64_t reserved_62_58 : 5; + uint64_t r : 1; +#endif + } s; + } word1; +} cvmx_srio_rx_message_header_t; + +/** + * This structure represents the SRIO header required on the front + * of PKO packets destine for SRIO message queues. + */ +typedef union +{ + uint64_t u64; + struct + { +#if __BYTE_ORDER == __BIG_ENDIAN + uint64_t prio : 2; /**< The sRIO prio (priority) field for all + segments in the message. */ + uint64_t tt : 1; /**< When set, the sRIO message segments use a + 16-bit source and destination ID for all the + segments in the message. When clear, the + message segments use an 8-bit ID. */ + uint64_t sis : 1; /**< When set, the sRIO message segments use the + 63xx's secondary ID as the source ID. When + clear, the sRIO message segments use the + primary ID as the source ID. */ + uint64_t ssize : 4; /**< The RIO ssize (standard message segment + data size) field used for the message. */ + uint64_t did : 16; /**< The destination ID in the sRIO message + segments of the message. When TT is clear, + the most-significant 8 bits must be zero. */ + uint64_t xmbox : 4; /**< The RIO xmbox (recipient mailbox extension) + field in the sRIO message segment for a + single-segment message. Must be zero for + multi-segment messages. */ + uint64_t mbox : 2; /**< The RIO mbox (recipient mailbox) field in + the sRIO message segments of the message. */ + uint64_t letter : 2; /**< The RIO letter (slot within mailbox) field + in the sRIO message segments of the message + when LNS is clear. When LNS is set, this + LETTER field is not used and must be zero. */ + uint64_t reserved_31_2 : 30; + uint64_t lns : 1; /**< When set, the outbound message controller + will dynamically selects an sRIO letter + field for the message (based on LETTER_SP or + LETTER_MP - see appendix A), and the LETTER + field in this sRIO outbound message + descriptor is unused. When clear, the LETTER + field in this sRIO outbound message + descriptor selects the sRIO letter used for + the message. */ + uint64_t intr : 1; /**< When set, the outbound message controller + will set an interrupt bit after all sRIO + segments of the message receive a message + DONE response. If the message transfer has + errors, the interrupt bit is not set (but + others are). */ +#else + uint64_t intr : 1; + uint64_t lns : 1; + uint64_t reserved_31_2 : 30; + uint64_t letter : 2; + uint64_t mbox : 2; + uint64_t xmbox : 4; + uint64_t did : 16; + uint64_t ssize : 4; + uint64_t sis : 1; + uint64_t tt : 1; + uint64_t prio : 2; +#endif + } s; +} cvmx_srio_tx_message_header_t; + +/** + * Initialize a SRIO port for use. + * + * @param srio_port SRIO port to initialize + * @param flags Optional flags + * + * @return Zero on success + */ +int cvmx_srio_initialize(int srio_port, cvmx_srio_initialize_flags_t flags); + +/** + * Read 32bits from a Device's config space + * + * @param srio_port SRIO port the device is on + * @param srcid_index + * Which SRIO source ID to use. 0 = Primary, 1 = Secondary + * @param destid RapidIO device ID, or -1 for the local Octeon. + * @param is16bit Non zero if the transactions should use 16bit device IDs. Zero + * if transactions should use 8bit device IDs. + * @param hopcount Number of hops to the remote device. Use 0 for the local Octeon. + * @param offset Offset in config space. This must be a multiple of 32 bits. + * @param result Result of the read. This will be unmodified on failure. + * + * @return Zero on success, negative on failure. + */ +int cvmx_srio_config_read32(int srio_port, int srcid_index, int destid, + int is16bit, uint8_t hopcount, uint32_t offset, + uint32_t *result); + +/** + * Write 32bits to a Device's config space + * + * @param srio_port SRIO port the device is on + * @param srcid_index + * Which SRIO source ID to use. 0 = Primary, 1 = Secondary + * @param destid RapidIO device ID, or -1 for the local Octeon. + * @param is16bit Non zero if the transactions should use 16bit device IDs. Zero + * if transactions should use 8bit device IDs. + * @param hopcount Number of hops to the remote device. Use 0 for the local Octeon. + * @param offset Offset in config space. This must be a multiple of 32 bits. + * @param data Data to write. + * + * @return Zero on success, negative on failure. + */ +int cvmx_srio_config_write32(int srio_port, int srcid_index, int destid, + int is16bit, uint8_t hopcount, uint32_t offset, + uint32_t data); + +/** + * Send a RapidIO doorbell to a remote device + * + * @param srio_port SRIO port the device is on + * @param srcid_index + * Which SRIO source ID to use. 0 = Primary, 1 = Secondary + * @param destid RapidIO device ID. + * @param is16bit Non zero if the transactions should use 16bit device IDs. Zero + * if transactions should use 8bit device IDs. + * @param priority Doorbell priority (0-3) + * @param data Data for doorbell. + * + * @return Zero on success, negative on failure. + */ +int cvmx_srio_send_doorbell(int srio_port, int srcid_index, int destid, + int is16bit, int priority, uint16_t data); + +/** + * Get the status of the last doorbell sent. If the dooorbell + * hardware is done, then the status is cleared to get ready for + * the next doorbell (or retry). + * + * @param srio_port SRIO port to check doorbell on + * + * @return Doorbell status + */ +cvmx_srio_doorbell_status_t cvmx_srio_send_doorbell_status(int srio_port); + +/** + * Read a received doorbell and report data about it. + * + * @param srio_port SRIO port to check for the received doorbell + * @param destid_index + * Which Octeon destination ID was the doorbell for + * @param sequence_num + * Sequence number of doorbell (32bits) + * @param srcid RapidIO source ID of the doorbell sender + * @param priority Priority of the doorbell (0-3) + * @param is16bit Non zero if the transactions should use 16bit device IDs. Zero + * if transactions should use 8bit device IDs. + * @param data Data in the doorbell (16 bits) + * + * @return Doorbell status. Either DONE, NONE, or ERROR. + */ +cvmx_srio_doorbell_status_t cvmx_srio_receive_doorbell(int srio_port, + int *destid_index, uint32_t *sequence_num, int *srcid, int *priority, + int *is16bit, uint16_t *data); + +/** + * Receive a packet from the Soft Packet FIFO (SPF). + * + * @param srio_port SRIO port to read the packet from. + * @param buffer Buffer to receive the packet. + * @param buffer_length + * Length of the buffer in bytes. + * + * @return Returns the length of the packet read. Negative on failure. + * Zero if no packets are available. + */ +int cvmx_srio_receive_spf(int srio_port, void *buffer, int buffer_length); + +/** + * Map a remote device's memory region into Octeon's physical + * address area. The caller can then map this into a core using + * the TLB or XKPHYS. + * + * @param srio_port SRIO port to map the device on + * @param write_op Type of operation to perform on a write to the device. + * Normally should be CVMX_SRIO_WRITE_MODE_AUTO. + * @param write_priority + * SRIO priority of writes (0-3) + * @param read_op Type of operation to perform on reads to the device. + * Normally should be CVMX_SRIO_READ_MODE_NORMAL. + * @param read_priority + * SRIO priority of reads (0-3) + * @param srcid_index + * Which SRIO source ID to use. 0 = Primary, 1 = Secondary + * @param destid RapidIO device ID. + * @param is16bit Non zero if the transactions should use 16bit device IDs. Zero + * if transactions should use 8bit device IDs. + * @param base Device base address to start the mapping + * @param size Size of the mapping in bytes + * + * @return Octeon 64bit physical address that accesses the remote device, + * or zero on failure. + */ +uint64_t cvmx_srio_physical_map(int srio_port, cvmx_srio_write_mode_t write_op, + int write_priority, cvmx_srio_read_mode_t read_op, int read_priority, + int srcid_index, int destid, int is16bit, uint64_t base, uint64_t size); + +/** + * Unmap a physical address window created by cvmx_srio_phys_map(). + * + * @param physical_address + * Physical address returned by cvmx_srio_phys_map(). + * @param size Size used on original call. + * + * @return Zero on success, negative on failure. + */ +int cvmx_srio_physical_unmap(uint64_t physical_address, uint64_t size); + +#ifdef __cplusplus +} +#endif + +#endif |