1f4b37ed0SZbigniew Bodek /*- 2f4b37ed0SZbigniew Bodek ******************************************************************************** 3f4b37ed0SZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd. 4f4b37ed0SZbigniew Bodek 5f4b37ed0SZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial 6f4b37ed0SZbigniew Bodek License Agreement. 7f4b37ed0SZbigniew Bodek 8f4b37ed0SZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General 9f4b37ed0SZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be 10f4b37ed0SZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html 11f4b37ed0SZbigniew Bodek 12f4b37ed0SZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or 13f4b37ed0SZbigniew Bodek without modification, are permitted provided that the following conditions are 14f4b37ed0SZbigniew Bodek met: 15f4b37ed0SZbigniew Bodek 16f4b37ed0SZbigniew Bodek * Redistributions of source code must retain the above copyright notice, 17f4b37ed0SZbigniew Bodek this list of conditions and the following disclaimer. 18f4b37ed0SZbigniew Bodek 19f4b37ed0SZbigniew Bodek * Redistributions in binary form must reproduce the above copyright 20f4b37ed0SZbigniew Bodek notice, this list of conditions and the following disclaimer in 21f4b37ed0SZbigniew Bodek the documentation and/or other materials provided with the 22f4b37ed0SZbigniew Bodek distribution. 23f4b37ed0SZbigniew Bodek 24f4b37ed0SZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 25f4b37ed0SZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26f4b37ed0SZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27f4b37ed0SZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 28f4b37ed0SZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29f4b37ed0SZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30f4b37ed0SZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 31f4b37ed0SZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32f4b37ed0SZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33f4b37ed0SZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34f4b37ed0SZbigniew Bodek 35f4b37ed0SZbigniew Bodek *******************************************************************************/ 36f4b37ed0SZbigniew Bodek 37f4b37ed0SZbigniew Bodek /** 38f4b37ed0SZbigniew Bodek * @defgroup grouppcie PCI Express Controller 39f4b37ed0SZbigniew Bodek * @{ 40f4b37ed0SZbigniew Bodek * @section overview Overview 41f4b37ed0SZbigniew Bodek * This header file provide API for the HAL driver of the pcie port, the driver 42f4b37ed0SZbigniew Bodek * provides the following functionalities: 43f4b37ed0SZbigniew Bodek * - Port initialization 44f4b37ed0SZbigniew Bodek * - Link operation 45f4b37ed0SZbigniew Bodek * - Interrupts transactions generation (Endpoint mode). 46f4b37ed0SZbigniew Bodek * - Configuration Access management functions 47f4b37ed0SZbigniew Bodek * - Internal Translation Unit programming 48f4b37ed0SZbigniew Bodek * 49f4b37ed0SZbigniew Bodek * This API does not provide the following: 50f4b37ed0SZbigniew Bodek * - PCIe transactions generation and reception (except interrupts as mentioned 51f4b37ed0SZbigniew Bodek * above) as this functionality is done by the port without need for sw 52f4b37ed0SZbigniew Bodek * intervention. 53f4b37ed0SZbigniew Bodek * - Configuration Access: those transactions are generated automatically by 54f4b37ed0SZbigniew Bodek * the port (ECAM or ATU mode) when the CPU issues memory transaction 55f4b37ed0SZbigniew Bodek * through the fabric toward the PCIe port. This API provides management 56f4b37ed0SZbigniew Bodek * function for controlling the Configuration Access type and bus destination 57f4b37ed0SZbigniew Bodek * - Interrupt Handling. 58f4b37ed0SZbigniew Bodek * - Message Generation: common used messages are automatically generated, also, 59f4b37ed0SZbigniew Bodek * the ATU generic mechanism for generating various kind of messages. 60f4b37ed0SZbigniew Bodek * - PCIe Port Management: both link and port power management features can be 61f4b37ed0SZbigniew Bodek * managed using the PCI/PCIe standard power management and PCIe capabilities 62f4b37ed0SZbigniew Bodek * registers. 63f4b37ed0SZbigniew Bodek * - PCIe link and protocol error handling: the feature can be managed using 64f4b37ed0SZbigniew Bodek * the Advanced Error Handling PCIe capability registers. 65f4b37ed0SZbigniew Bodek * 66f4b37ed0SZbigniew Bodek * @section flows Software Flows 67f4b37ed0SZbigniew Bodek * @subsection init Initialization 68f4b37ed0SZbigniew Bodek * - allocation and set zeros al_pcie_port and al_pcie_pf structures handles 69f4b37ed0SZbigniew Bodek * - call al_pcie_port_handle_init() with pointer to the allocated 70f4b37ed0SZbigniew Bodek * al_pcie_port handle, address of the port internal registers space, and 71f4b37ed0SZbigniew Bodek * port id. 72f4b37ed0SZbigniew Bodek * - call al_pcie_pf_handle_init() with pointer to the al_pcie_port handle 73f4b37ed0SZbigniew Bodek * and pf_number. 74f4b37ed0SZbigniew Bodek * - set the port mode, End-Point or Root-Compex (default). 75f4b37ed0SZbigniew Bodek * - set number of lanes connected to the controller. 76f4b37ed0SZbigniew Bodek * - enable the controller using the al_pcie_port_enable(). note that this 77f4b37ed0SZbigniew Bodek * function expect the virtual address of the PBS Functional Registers. 78f4b37ed0SZbigniew Bodek * - wait for 2000 South-bridge cycles. 79f4b37ed0SZbigniew Bodek * - prepare al_pcie_port_config_params and al_pcie_pf_config_params 80f4b37ed0SZbigniew Bodek * structures depending on chip, board and system configuration. 81f4b37ed0SZbigniew Bodek * for example, when using the port as root complex, the operating_mode 82f4b37ed0SZbigniew Bodek * field should be set to AL_PCIE_OPERATING_MODE_RC. In this example we 83f4b37ed0SZbigniew Bodek * prepare the following configuration: 84f4b37ed0SZbigniew Bodek * For port configuration 85f4b37ed0SZbigniew Bodek * - Root Complex mode 86f4b37ed0SZbigniew Bodek * - Set the Max Link Speed to Gen2 87f4b37ed0SZbigniew Bodek * - Set the max lanes width to 2 (x2) 88f4b37ed0SZbigniew Bodek * - Enable Snoops to support I/O Hardware cache coherency 89f4b37ed0SZbigniew Bodek * - Enable pcie core RAM parity 90f4b37ed0SZbigniew Bodek * - Enable pcie core AXI parity 91f4b37ed0SZbigniew Bodek * - Keep transaction layer default credits 92f4b37ed0SZbigniew Bodek * For pf configuration 93f4b37ed0SZbigniew Bodek * - No EP parameters 94f4b37ed0SZbigniew Bodek * - No SR-IOV parameters 95f4b37ed0SZbigniew Bodek * so the structures we prepare: 96f4b37ed0SZbigniew Bodek * @code 97f4b37ed0SZbigniew Bodek * - struct al_pcie_link_params link_params = { 98f4b37ed0SZbigniew Bodek * AL_PCIE_LINK_SPEED_GEN2, 99f4b37ed0SZbigniew Bodek * AL_PCIE_MPS_DEFAULT}; 100f4b37ed0SZbigniew Bodek * 101f4b37ed0SZbigniew Bodek * - struct al_pcie_port_config_params config_params = { 102f4b37ed0SZbigniew Bodek * &link_params, 103f4b37ed0SZbigniew Bodek * AL_TRUE, // enable Snoop for inbound memory transactions 104f4b37ed0SZbigniew Bodek * AL_TRUE, // enable pcie port RAM parity 105f4b37ed0SZbigniew Bodek * AL_TRUE, // enable pcie port AXI parity 106f4b37ed0SZbigniew Bodek * NULL, // use default latency/replay timers 107f4b37ed0SZbigniew Bodek * NULL, // use default gen2 pipe params 108f4b37ed0SZbigniew Bodek * NULL, // gen3_params not needed when max speed set to Gen2 109f4b37ed0SZbigniew Bodek * NULL, // don't change TL credits 110f4b37ed0SZbigniew Bodek * NULL, // end point params not needed 111f4b37ed0SZbigniew Bodek * AL_FALSE, //no fast link 112f4b37ed0SZbigniew Bodek * AL_FALSE}; //return 0xFFFFFFFF for read transactions with 113f4b37ed0SZbigniew Bodek * //pci target error 114f4b37ed0SZbigniew Bodek * @endcode 115f4b37ed0SZbigniew Bodek * - now call al_pcie_port_config() with pcie_port and port_config_params 116f4b37ed0SZbigniew Bodek * @subsection link-init Link Initialization 117f4b37ed0SZbigniew Bodek * - once the port configured, we can start PCIe link: 118f4b37ed0SZbigniew Bodek * - call al_pcie_link_start() 119f4b37ed0SZbigniew Bodek * - call al_pcie_link_up_wait() 120f4b37ed0SZbigniew Bodek * - allocate al_pcie_link_status struct and call al_pcie_link_status() and 121f4b37ed0SZbigniew Bodek * check the link is established. 122f4b37ed0SZbigniew Bodek * 123f4b37ed0SZbigniew Bodek * @subsection cap Configuration Access Preparation 124f4b37ed0SZbigniew Bodek * - Once the link is established, we can prepare the port for pci 125f4b37ed0SZbigniew Bodek * configuration access, this stage requires system knowledge about the PCI 126f4b37ed0SZbigniew Bodek * buses enumeration. For example, if 5 buses were discovered on previously 127f4b37ed0SZbigniew Bodek * scanned root complex port, then we should start enumeration from bus 5 (PCI 128f4b37ed0SZbigniew Bodek * secondary bus), the sub-ordinary bus will be temporarily set to maximum 129f4b37ed0SZbigniew Bodek * value (255) until the scan process under this bus is finished, then it will 130f4b37ed0SZbigniew Bodek * updated to the maximum bus value found. So we use the following sequence: 131f4b37ed0SZbigniew Bodek * - call al_pcie_secondary_bus_set() with sec-bus = 5 132f4b37ed0SZbigniew Bodek * - call al_pcie_subordinary_bus_set() with sub-bus = 255 133f4b37ed0SZbigniew Bodek * 134f4b37ed0SZbigniew Bodek * @subsection cfg Configuration (Cfg) Access Generation 135f4b37ed0SZbigniew Bodek * - we assume using ECAM method, in this method, the software issues pcie Cfg 136f4b37ed0SZbigniew Bodek * access by accessing the ECAM memory space of the pcie port. For example, to 137f4b37ed0SZbigniew Bodek * issue 4 byte Cfg Read from bus B, Device D, Function F and register R, the 138f4b37ed0SZbigniew Bodek * software issues 4 byte read access to the following physical address 139f4b37ed0SZbigniew Bodek * ECAM base address of the port + (B << 20) + (D << 15) + (F << 12) + R. 140f4b37ed0SZbigniew Bodek * But, as the default size of the ECAM address space is less than 141f4b37ed0SZbigniew Bodek * needed full range (256MB), we modify the target_bus value prior to Cfg 142f4b37ed0SZbigniew Bodek * access in order make the port generate Cfg access with bus value set to the 143f4b37ed0SZbigniew Bodek * value of the target_bus rather than bits 27:20 of the physical address. 144f4b37ed0SZbigniew Bodek * - call al_pcie_target_bus_set() with target_bus set to the required bus of 145f4b37ed0SZbigniew Bodek * the next Cfg access to be issued, mask_target_bus will be set to 0xff. 146f4b37ed0SZbigniew Bodek * no need to call that function if the next Cfg access bus equals to the last 147f4b37ed0SZbigniew Bodek * value set to target_bus. 148f4b37ed0SZbigniew Bodek * 149f4b37ed0SZbigniew Bodek * @file al_hal_pcie.h 150f4b37ed0SZbigniew Bodek * @brief HAL Driver Header for the Annapurna Labs PCI Express port. 151f4b37ed0SZbigniew Bodek */ 152f4b37ed0SZbigniew Bodek 153f4b37ed0SZbigniew Bodek #ifndef _AL_HAL_PCIE_H_ 154f4b37ed0SZbigniew Bodek #define _AL_HAL_PCIE_H_ 155f4b37ed0SZbigniew Bodek 156f4b37ed0SZbigniew Bodek #include "al_hal_common.h" 157f4b37ed0SZbigniew Bodek #include "al_hal_pcie_regs.h" 158f4b37ed0SZbigniew Bodek 159f4b37ed0SZbigniew Bodek /******************************************************************************/ 160f4b37ed0SZbigniew Bodek /********************************* Constants **********************************/ 161f4b37ed0SZbigniew Bodek /******************************************************************************/ 162f4b37ed0SZbigniew Bodek 163*3fc36ee0SWojciech Macek /** 164*3fc36ee0SWojciech Macek * PCIe Core revision IDs: 165*3fc36ee0SWojciech Macek * ID_1: Alpine V1 166*3fc36ee0SWojciech Macek * ID_2: Alpine V2 x4 167*3fc36ee0SWojciech Macek * ID_3: Alpine V2 x8 168*3fc36ee0SWojciech Macek */ 169*3fc36ee0SWojciech Macek #define AL_PCIE_REV_ID_1 1 170*3fc36ee0SWojciech Macek #define AL_PCIE_REV_ID_2 2 171*3fc36ee0SWojciech Macek #define AL_PCIE_REV_ID_3 3 172f4b37ed0SZbigniew Bodek 173f4b37ed0SZbigniew Bodek /** Number of extended registers */ 174f4b37ed0SZbigniew Bodek #define AL_PCIE_EX_REGS_NUM 40 175f4b37ed0SZbigniew Bodek 176f4b37ed0SZbigniew Bodek /******************************************************************************* 177*3fc36ee0SWojciech Macek * The inbound flow control for headers is programmable per P, NP and CPL 178*3fc36ee0SWojciech Macek * transactions types. The following parameters define the total number of 179*3fc36ee0SWojciech Macek * available header flow controls for all types. 180*3fc36ee0SWojciech Macek ******************************************************************************/ 181*3fc36ee0SWojciech Macek /** Inbound header credits sum - rev1/2 */ 182*3fc36ee0SWojciech Macek #define AL_PCIE_REV_1_2_IB_HCRD_SUM 97 183*3fc36ee0SWojciech Macek /** Inbound header credits sum - rev3 */ 184*3fc36ee0SWojciech Macek #define AL_PCIE_REV3_IB_HCRD_SUM 259 185*3fc36ee0SWojciech Macek 186*3fc36ee0SWojciech Macek /******************************************************************************* 187f4b37ed0SZbigniew Bodek * PCIe AER uncorrectable error bits 188f4b37ed0SZbigniew Bodek * To be used with the following functions: 189f4b37ed0SZbigniew Bodek * - al_pcie_aer_config 190f4b37ed0SZbigniew Bodek * - al_pcie_aer_uncorr_get_and_clear 191f4b37ed0SZbigniew Bodek ******************************************************************************/ 192f4b37ed0SZbigniew Bodek /** Data Link Protocol Error */ 193f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_DLP_ERR AL_BIT(4) 194f4b37ed0SZbigniew Bodek /** Poisoned TLP */ 195f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_POISIONED_TLP AL_BIT(12) 196f4b37ed0SZbigniew Bodek /** Flow Control Protocol Error */ 197f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_FLOW_CTRL_ERR AL_BIT(13) 198f4b37ed0SZbigniew Bodek /** Completion Timeout */ 199f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_COMPL_TO AL_BIT(14) 200f4b37ed0SZbigniew Bodek /** Completer Abort */ 201f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_COMPL_ABT AL_BIT(15) 202f4b37ed0SZbigniew Bodek /** Unexpected Completion */ 203f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_UNEXPCTED_COMPL AL_BIT(16) 204f4b37ed0SZbigniew Bodek /** Receiver Overflow */ 205f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_RCV_OVRFLW AL_BIT(17) 206f4b37ed0SZbigniew Bodek /** Malformed TLP */ 207f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_MLFRM_TLP AL_BIT(18) 208f4b37ed0SZbigniew Bodek /** ECRC Error */ 209f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_ECRC_ERR AL_BIT(19) 210f4b37ed0SZbigniew Bodek /** Unsupported Request Error */ 211f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_UNSUPRT_REQ_ERR AL_BIT(20) 212f4b37ed0SZbigniew Bodek /** Uncorrectable Internal Error */ 213f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_INT_ERR AL_BIT(22) 214f4b37ed0SZbigniew Bodek /** AtomicOp Egress Blocked */ 215f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_UNCORR_ATOMIC_EGRESS_BLK AL_BIT(24) 216f4b37ed0SZbigniew Bodek 217f4b37ed0SZbigniew Bodek /******************************************************************************* 218f4b37ed0SZbigniew Bodek * PCIe AER correctable error bits 219f4b37ed0SZbigniew Bodek * To be used with the following functions: 220f4b37ed0SZbigniew Bodek * - al_pcie_aer_config 221f4b37ed0SZbigniew Bodek * - al_pcie_aer_corr_get_and_clear 222f4b37ed0SZbigniew Bodek ******************************************************************************/ 223f4b37ed0SZbigniew Bodek /** Receiver Error */ 224f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_RCV_ERR AL_BIT(0) 225f4b37ed0SZbigniew Bodek /** Bad TLP */ 226f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_BAD_TLP AL_BIT(6) 227f4b37ed0SZbigniew Bodek /** Bad DLLP */ 228f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_BAD_DLLP AL_BIT(7) 229f4b37ed0SZbigniew Bodek /** REPLAY_NUM Rollover */ 230f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_RPLY_NUM_ROLL_OVR AL_BIT(8) 231f4b37ed0SZbigniew Bodek /** Replay Timer Timeout */ 232f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_RPLY_TMR_TO AL_BIT(12) 233f4b37ed0SZbigniew Bodek /** Advisory Non-Fatal Error */ 234f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_ADVISORY_NON_FTL_ERR AL_BIT(13) 235f4b37ed0SZbigniew Bodek /** Corrected Internal Error */ 236f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_CORR_INT_ERR AL_BIT(14) 237f4b37ed0SZbigniew Bodek 238f4b37ed0SZbigniew Bodek /** The AER erroneous TLP header length [num DWORDs] */ 239f4b37ed0SZbigniew Bodek #define AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS 4 240f4b37ed0SZbigniew Bodek 241f4b37ed0SZbigniew Bodek /******************************************************************************/ 242f4b37ed0SZbigniew Bodek /************************* Data Structures and Types **************************/ 243f4b37ed0SZbigniew Bodek /******************************************************************************/ 244f4b37ed0SZbigniew Bodek 245f4b37ed0SZbigniew Bodek /** 246f4b37ed0SZbigniew Bodek * al_pcie_ib_hcrd_config: data structure internally used in order to config 247f4b37ed0SZbigniew Bodek * inbound posted/non-posted parameters. 248*3fc36ee0SWojciech Macek * Note: this is a private member in pcie_port handle and MUST NOT be modified 249*3fc36ee0SWojciech Macek * by the user. 250f4b37ed0SZbigniew Bodek */ 251f4b37ed0SZbigniew Bodek struct al_pcie_ib_hcrd_config { 252f4b37ed0SZbigniew Bodek /* Internally used - see 'al_pcie_ib_hcrd_os_ob_reads_config' */ 253f4b37ed0SZbigniew Bodek unsigned int nof_np_hdr; 254f4b37ed0SZbigniew Bodek 255f4b37ed0SZbigniew Bodek /* Internally used - see 'al_pcie_ib_hcrd_os_ob_reads_config' */ 256f4b37ed0SZbigniew Bodek unsigned int nof_p_hdr; 257f4b37ed0SZbigniew Bodek }; 258f4b37ed0SZbigniew Bodek 259f4b37ed0SZbigniew Bodek /* The Max Payload Size. Measured in bytes. 260f4b37ed0SZbigniew Bodek * DEFAULT: do not change the current MPS 261f4b37ed0SZbigniew Bodek */ 262f4b37ed0SZbigniew Bodek enum al_pcie_max_payload_size { 263f4b37ed0SZbigniew Bodek AL_PCIE_MPS_DEFAULT, 264f4b37ed0SZbigniew Bodek AL_PCIE_MPS_128 = 0, 265f4b37ed0SZbigniew Bodek AL_PCIE_MPS_256 = 1, 266f4b37ed0SZbigniew Bodek }; 267f4b37ed0SZbigniew Bodek 268f4b37ed0SZbigniew Bodek /** 269f4b37ed0SZbigniew Bodek * al_pcie_port: data structure used by the HAL to handle a specific pcie port. 270f4b37ed0SZbigniew Bodek * this structure is allocated and set to zeros by the upper layer, then it is 271f4b37ed0SZbigniew Bodek * initialized by the al_pcie_port_handle_init() that should be called before any 272f4b37ed0SZbigniew Bodek * other function of this API. later, this handle passed to the API functions. 273f4b37ed0SZbigniew Bodek */ 274f4b37ed0SZbigniew Bodek struct al_pcie_port { 275f4b37ed0SZbigniew Bodek void __iomem *pcie_reg_base; 276f4b37ed0SZbigniew Bodek struct al_pcie_regs regs_ptrs; 277f4b37ed0SZbigniew Bodek struct al_pcie_regs *regs; 278f4b37ed0SZbigniew Bodek uint32_t *ex_regs_ptrs[AL_PCIE_EX_REGS_NUM]; 279f4b37ed0SZbigniew Bodek void *ex_regs; 280f4b37ed0SZbigniew Bodek void __iomem *pbs_regs; 281f4b37ed0SZbigniew Bodek 282*3fc36ee0SWojciech Macek /* Rev ID */ 283f4b37ed0SZbigniew Bodek uint8_t rev_id; 284f4b37ed0SZbigniew Bodek unsigned int port_id; 285f4b37ed0SZbigniew Bodek uint8_t max_lanes; 286*3fc36ee0SWojciech Macek 287*3fc36ee0SWojciech Macek /* For EP mode only */ 288f4b37ed0SZbigniew Bodek uint8_t max_num_of_pfs; 289f4b37ed0SZbigniew Bodek 290f4b37ed0SZbigniew Bodek /* Internally used */ 291f4b37ed0SZbigniew Bodek struct al_pcie_ib_hcrd_config ib_hcrd_config; 292f4b37ed0SZbigniew Bodek }; 293f4b37ed0SZbigniew Bodek 294f4b37ed0SZbigniew Bodek /** 295f4b37ed0SZbigniew Bodek * al_pcie_pf: the pf handle, a data structure used to handle PF specific 296f4b37ed0SZbigniew Bodek * functionality. Initialized using "al_pcie_pf_handle_init()" 297*3fc36ee0SWojciech Macek * 298*3fc36ee0SWojciech Macek * Note: This structure should be used for EP mode only 299f4b37ed0SZbigniew Bodek */ 300f4b37ed0SZbigniew Bodek struct al_pcie_pf { 301f4b37ed0SZbigniew Bodek unsigned int pf_num; 302f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port; 303f4b37ed0SZbigniew Bodek }; 304f4b37ed0SZbigniew Bodek 305f4b37ed0SZbigniew Bodek /** Operating mode (endpoint, root complex) */ 306f4b37ed0SZbigniew Bodek enum al_pcie_operating_mode { 307f4b37ed0SZbigniew Bodek AL_PCIE_OPERATING_MODE_EP, 308f4b37ed0SZbigniew Bodek AL_PCIE_OPERATING_MODE_RC, 309f4b37ed0SZbigniew Bodek AL_PCIE_OPERATING_MODE_UNKNOWN 310f4b37ed0SZbigniew Bodek }; 311f4b37ed0SZbigniew Bodek 312f4b37ed0SZbigniew Bodek /* The maximum link speed, measured GT/s (Giga transfer / second) 313f4b37ed0SZbigniew Bodek * DEFAULT: do not change the current speed 314f4b37ed0SZbigniew Bodek * GEN1: 2.5 GT/s 315f4b37ed0SZbigniew Bodek * GEN2: 5 GT/s 316f4b37ed0SZbigniew Bodek * GEN3: 8GT/s 317f4b37ed0SZbigniew Bodek * 318f4b37ed0SZbigniew Bodek * Note: The values of this enumerator are important for proper behavior 319f4b37ed0SZbigniew Bodek */ 320f4b37ed0SZbigniew Bodek enum al_pcie_link_speed { 321f4b37ed0SZbigniew Bodek AL_PCIE_LINK_SPEED_DEFAULT, 322f4b37ed0SZbigniew Bodek AL_PCIE_LINK_SPEED_GEN1 = 1, 323f4b37ed0SZbigniew Bodek AL_PCIE_LINK_SPEED_GEN2 = 2, 324f4b37ed0SZbigniew Bodek AL_PCIE_LINK_SPEED_GEN3 = 3 325f4b37ed0SZbigniew Bodek }; 326f4b37ed0SZbigniew Bodek 327f4b37ed0SZbigniew Bodek /** PCIe capabilities that supported by a specific port */ 328f4b37ed0SZbigniew Bodek struct al_pcie_max_capability { 329f4b37ed0SZbigniew Bodek al_bool end_point_mode_supported; 330f4b37ed0SZbigniew Bodek al_bool root_complex_mode_supported; 331f4b37ed0SZbigniew Bodek enum al_pcie_link_speed max_speed; 332f4b37ed0SZbigniew Bodek uint8_t max_lanes; 333f4b37ed0SZbigniew Bodek uint8_t atu_regions_num; 334*3fc36ee0SWojciech Macek uint32_t atu_min_size; /* Size granularity: 4 Kbytes */ 335f4b37ed0SZbigniew Bodek }; 336f4b37ed0SZbigniew Bodek 337f4b37ed0SZbigniew Bodek /** PCIe link related parameters */ 338f4b37ed0SZbigniew Bodek struct al_pcie_link_params { 339f4b37ed0SZbigniew Bodek enum al_pcie_link_speed max_speed; 340f4b37ed0SZbigniew Bodek enum al_pcie_max_payload_size max_payload_size; 341f4b37ed0SZbigniew Bodek 342f4b37ed0SZbigniew Bodek }; 343f4b37ed0SZbigniew Bodek 344f4b37ed0SZbigniew Bodek /** PCIe gen2 link parameters */ 345f4b37ed0SZbigniew Bodek struct al_pcie_gen2_params { 346f4b37ed0SZbigniew Bodek al_bool tx_swing_low; /* set tx swing low when true, and tx swing full when false */ 347f4b37ed0SZbigniew Bodek al_bool tx_compliance_receive_enable; 348f4b37ed0SZbigniew Bodek al_bool set_deemphasis; 349f4b37ed0SZbigniew Bodek }; 350f4b37ed0SZbigniew Bodek 351f4b37ed0SZbigniew Bodek /** PCIe gen 3 standard per lane equalization parameters */ 352f4b37ed0SZbigniew Bodek struct al_pcie_gen3_lane_eq_params { 353f4b37ed0SZbigniew Bodek uint8_t downstream_port_transmitter_preset; 354f4b37ed0SZbigniew Bodek uint8_t downstream_port_receiver_preset_hint; 355f4b37ed0SZbigniew Bodek uint8_t upstream_port_transmitter_preset; 356f4b37ed0SZbigniew Bodek uint8_t upstream_port_receiver_preset_hint; 357f4b37ed0SZbigniew Bodek }; 358f4b37ed0SZbigniew Bodek 359f4b37ed0SZbigniew Bodek /** PCIe gen 3 equalization parameters */ 360f4b37ed0SZbigniew Bodek struct al_pcie_gen3_params { 361f4b37ed0SZbigniew Bodek al_bool perform_eq; 362f4b37ed0SZbigniew Bodek al_bool interrupt_enable_on_link_eq_request; 363f4b37ed0SZbigniew Bodek struct al_pcie_gen3_lane_eq_params *eq_params; /* array of lanes params */ 364f4b37ed0SZbigniew Bodek int eq_params_elements; /* number of elements in the eq_params array */ 365f4b37ed0SZbigniew Bodek 366f4b37ed0SZbigniew Bodek al_bool eq_disable; /* disables the equalization feature */ 367f4b37ed0SZbigniew Bodek al_bool eq_phase2_3_disable; /* Equalization Phase 2 and Phase 3 */ 368f4b37ed0SZbigniew Bodek /* Disable (RC mode only) */ 369f4b37ed0SZbigniew Bodek uint8_t local_lf; /* Full Swing (FS) Value for Gen3 Transmit Equalization */ 370f4b37ed0SZbigniew Bodek /* Value Range: 12 through 63 (decimal).*/ 371f4b37ed0SZbigniew Bodek 372f4b37ed0SZbigniew Bodek uint8_t local_fs; /* Low Frequency (LF) Value for Gen3 Transmit Equalization */ 373f4b37ed0SZbigniew Bodek }; 374f4b37ed0SZbigniew Bodek 375f4b37ed0SZbigniew Bodek /** 376f4b37ed0SZbigniew Bodek * Inbound posted/non-posted header credits and outstanding outbound reads 377*3fc36ee0SWojciech Macek * completion header configuration. 378*3fc36ee0SWojciech Macek * 379*3fc36ee0SWojciech Macek * This structure controls the resource partitioning of an important resource in 380*3fc36ee0SWojciech Macek * the PCIe port. This resource includes the PCIe TLP headers coming on the PCIe 381*3fc36ee0SWojciech Macek * port, and is shared between three types: 382*3fc36ee0SWojciech Macek * - Inbound Non-posted, which are PCIe Reads as well as PCIe Config Cycles 383*3fc36ee0SWojciech Macek * - Inbound Posted, i.e. PCIe Writes 384*3fc36ee0SWojciech Macek * - Inbound Read-completion, which are the completions matching and outbound 385*3fc36ee0SWojciech Macek * reads issued previously by the same core. 386*3fc36ee0SWojciech Macek * The programmer need to take into consideration that a given outbound read 387*3fc36ee0SWojciech Macek * request could be split on the return path into Ceiling[MPS_Size / 64] + 1 388*3fc36ee0SWojciech Macek * of Read Completions. 389*3fc36ee0SWojciech Macek * Programmers are not expected to modify these setting except for rare cases, 390*3fc36ee0SWojciech Macek * where a different ratio between Posted-Writes and Read-Completions is desired 391f4b37ed0SZbigniew Bodek * 392f4b37ed0SZbigniew Bodek * Constraints: 393f4b37ed0SZbigniew Bodek * - nof_cpl_hdr + nof_np_hdr + nof_p_hdr == 394f4b37ed0SZbigniew Bodek * AL_PCIE_REV_1_2_IB_HCRD_SUM/AL_PCIE_REV3_IB_HCRD_SUM 395f4b37ed0SZbigniew Bodek * - nof_cpl_hdr > 0 396f4b37ed0SZbigniew Bodek * - nof_p_hdr > 0 397f4b37ed0SZbigniew Bodek * - nof_np_hdr > 0 398f4b37ed0SZbigniew Bodek */ 399f4b37ed0SZbigniew Bodek struct al_pcie_ib_hcrd_os_ob_reads_config { 400f4b37ed0SZbigniew Bodek /** Max number of outstanding outbound reads */ 401f4b37ed0SZbigniew Bodek uint8_t nof_outstanding_ob_reads; 402f4b37ed0SZbigniew Bodek 403f4b37ed0SZbigniew Bodek /** 404f4b37ed0SZbigniew Bodek * This value set the possible outstanding headers CMPLs , the core 405f4b37ed0SZbigniew Bodek * can get (the core always advertise infinite credits for CMPLs). 406f4b37ed0SZbigniew Bodek */ 407f4b37ed0SZbigniew Bodek unsigned int nof_cpl_hdr; 408f4b37ed0SZbigniew Bodek 409f4b37ed0SZbigniew Bodek /** 410f4b37ed0SZbigniew Bodek * This value set the possible outstanding headers reads (non-posted 411f4b37ed0SZbigniew Bodek * transactions), the core can get (it set the value in the init FC 412f4b37ed0SZbigniew Bodek * process). 413f4b37ed0SZbigniew Bodek */ 414f4b37ed0SZbigniew Bodek unsigned int nof_np_hdr; 415f4b37ed0SZbigniew Bodek 416f4b37ed0SZbigniew Bodek /** 417f4b37ed0SZbigniew Bodek * This value set the possible outstanding headers writes (posted 418f4b37ed0SZbigniew Bodek * transactions), the core can get (it set the value in the init FC 419f4b37ed0SZbigniew Bodek * process). 420f4b37ed0SZbigniew Bodek */ 421f4b37ed0SZbigniew Bodek unsigned int nof_p_hdr; 422f4b37ed0SZbigniew Bodek }; 423f4b37ed0SZbigniew Bodek 424*3fc36ee0SWojciech Macek /** 425*3fc36ee0SWojciech Macek * PCIe Ack/Nak Latency and Replay timers 426*3fc36ee0SWojciech Macek * 427*3fc36ee0SWojciech Macek * Note: Programmer is not expected to modify these values unless working in 428*3fc36ee0SWojciech Macek * very slow external devices like low-end FPGA or hardware devices 429*3fc36ee0SWojciech Macek * emulated in software 430*3fc36ee0SWojciech Macek */ 431f4b37ed0SZbigniew Bodek struct al_pcie_latency_replay_timers { 432f4b37ed0SZbigniew Bodek uint16_t round_trip_lat_limit; 433f4b37ed0SZbigniew Bodek uint16_t replay_timer_limit; 434f4b37ed0SZbigniew Bodek }; 435f4b37ed0SZbigniew Bodek 436*3fc36ee0SWojciech Macek /** 437*3fc36ee0SWojciech Macek * SRIS KP counter values 438*3fc36ee0SWojciech Macek * 439*3fc36ee0SWojciech Macek * Description: SRIS is PCI SIG ECN, that enables the two peers on a given PCIe 440*3fc36ee0SWojciech Macek * link to run with Separate Reference clock with Independent Spread spectrum 441*3fc36ee0SWojciech Macek * clock and requires inserting PCIe SKP symbols on the link in faster frequency 442*3fc36ee0SWojciech Macek * that original PCIe spec 443*3fc36ee0SWojciech Macek */ 444f4b37ed0SZbigniew Bodek struct al_pcie_sris_params { 445f4b37ed0SZbigniew Bodek /** set to AL_TRUE to use defaults and ignore the other parameters */ 446f4b37ed0SZbigniew Bodek al_bool use_defaults; 447f4b37ed0SZbigniew Bodek uint16_t kp_counter_gen3; /* only for Gen3 */ 448f4b37ed0SZbigniew Bodek uint16_t kp_counter_gen21; 449f4b37ed0SZbigniew Bodek }; 450f4b37ed0SZbigniew Bodek 451*3fc36ee0SWojciech Macek /** 452*3fc36ee0SWojciech Macek * Relaxed ordering params 453*3fc36ee0SWojciech Macek * Enable ordering relaxations for applications that does not require 454*3fc36ee0SWojciech Macek * enforcement of 'completion must not bypass posted' ordering rule. 455*3fc36ee0SWojciech Macek * 456*3fc36ee0SWojciech Macek * Recommendation: 457*3fc36ee0SWojciech Macek * - For downstream port, set enable_tx_relaxed_ordering 458*3fc36ee0SWojciech Macek * - For upstream port 459*3fc36ee0SWojciech Macek * - set enable_rx_relaxed_ordering 460*3fc36ee0SWojciech Macek * - set enable tx_relaxed_ordering for emulated EP. 461*3fc36ee0SWojciech Macek * 462*3fc36ee0SWojciech Macek * Defaults: 463*3fc36ee0SWojciech Macek * - For Root-Complex: 464*3fc36ee0SWojciech Macek * - tx_relaxed_ordering = AL_FALSE, rx_relaxed_ordering = AL_TRUE 465*3fc36ee0SWojciech Macek * - For End-Point: 466*3fc36ee0SWojciech Macek * - tx_relaxed_ordering = AL_TRUE, rx_relaxed_ordering = AL_FALSE 467*3fc36ee0SWojciech Macek */ 468f4b37ed0SZbigniew Bodek struct al_pcie_relaxed_ordering_params { 469f4b37ed0SZbigniew Bodek al_bool enable_tx_relaxed_ordering; 470f4b37ed0SZbigniew Bodek al_bool enable_rx_relaxed_ordering; 471f4b37ed0SZbigniew Bodek }; 472f4b37ed0SZbigniew Bodek 473f4b37ed0SZbigniew Bodek /** PCIe port configuration parameters 474f4b37ed0SZbigniew Bodek * This structure includes the parameters that the HAL should apply to the port 475f4b37ed0SZbigniew Bodek * (by al_pcie_port_config()). 476f4b37ed0SZbigniew Bodek * The fields that are pointers (e.g. link_params) can be set to NULL, in that 477f4b37ed0SZbigniew Bodek * case, the al_pcie_port_config() will keep the current HW settings. 478f4b37ed0SZbigniew Bodek */ 479f4b37ed0SZbigniew Bodek struct al_pcie_port_config_params { 480f4b37ed0SZbigniew Bodek struct al_pcie_link_params *link_params; 481f4b37ed0SZbigniew Bodek al_bool enable_axi_snoop; 482f4b37ed0SZbigniew Bodek al_bool enable_ram_parity_int; 483f4b37ed0SZbigniew Bodek al_bool enable_axi_parity_int; 484f4b37ed0SZbigniew Bodek struct al_pcie_latency_replay_timers *lat_rply_timers; 485f4b37ed0SZbigniew Bodek struct al_pcie_gen2_params *gen2_params; 486f4b37ed0SZbigniew Bodek struct al_pcie_gen3_params *gen3_params; 487*3fc36ee0SWojciech Macek /* 488*3fc36ee0SWojciech Macek * Sets all internal timers to Fast Mode for speeding up simulation. 489*3fc36ee0SWojciech Macek * this varible should be set always to AL_FALSE unless user is running 490*3fc36ee0SWojciech Macek * on simulation setup 491*3fc36ee0SWojciech Macek */ 492f4b37ed0SZbigniew Bodek al_bool fast_link_mode; 493f4b37ed0SZbigniew Bodek /* 494*3fc36ee0SWojciech Macek * when true, the PCI unit will return Slave Error/Decoding Error to any 495*3fc36ee0SWojciech Macek * I/O Fabric master or Internal Processors in case of error. 496*3fc36ee0SWojciech Macek * when false, the value 0xFFFFFFFF will be returned without error indication. 497f4b37ed0SZbigniew Bodek */ 498f4b37ed0SZbigniew Bodek al_bool enable_axi_slave_err_resp; 499f4b37ed0SZbigniew Bodek struct al_pcie_sris_params *sris_params; 500f4b37ed0SZbigniew Bodek struct al_pcie_relaxed_ordering_params *relaxed_ordering_params; 501f4b37ed0SZbigniew Bodek }; 502f4b37ed0SZbigniew Bodek 503*3fc36ee0SWojciech Macek /** 504*3fc36ee0SWojciech Macek * BAR register configuration parameters 505*3fc36ee0SWojciech Macek * Note: This structure should be used for EP mode only 506*3fc36ee0SWojciech Macek */ 507f4b37ed0SZbigniew Bodek struct al_pcie_ep_bar_params { 508f4b37ed0SZbigniew Bodek al_bool enable; 509f4b37ed0SZbigniew Bodek al_bool memory_space; /**< memory or io */ 510f4b37ed0SZbigniew Bodek al_bool memory_64_bit; /**< is memory space is 64 bit */ 511f4b37ed0SZbigniew Bodek al_bool memory_is_prefetchable; 512f4b37ed0SZbigniew Bodek uint64_t size; /* the bar size in bytes */ 513f4b37ed0SZbigniew Bodek }; 514f4b37ed0SZbigniew Bodek 515*3fc36ee0SWojciech Macek /** 516*3fc36ee0SWojciech Macek * PF config params (EP mode only) 517*3fc36ee0SWojciech Macek * Note: This structure should be used for EP mode only 518*3fc36ee0SWojciech Macek */ 519f4b37ed0SZbigniew Bodek struct al_pcie_pf_config_params { 520*3fc36ee0SWojciech Macek /** 521*3fc36ee0SWojciech Macek * disable advertising D1 and D3hot state 522*3fc36ee0SWojciech Macek * Recommended to be AL_TRUE 523*3fc36ee0SWojciech Macek */ 524f4b37ed0SZbigniew Bodek al_bool cap_d1_d3hot_dis; 525*3fc36ee0SWojciech Macek /** 526*3fc36ee0SWojciech Macek * disable advertising support for Function-Level-Reset 527*3fc36ee0SWojciech Macek * Recommended to be AL_FALSE 528*3fc36ee0SWojciech Macek */ 529f4b37ed0SZbigniew Bodek al_bool cap_flr_dis; 530*3fc36ee0SWojciech Macek /* 531*3fc36ee0SWojciech Macek * disable advertising Advanced power management states 532*3fc36ee0SWojciech Macek */ 533f4b37ed0SZbigniew Bodek al_bool cap_aspm_dis; 534f4b37ed0SZbigniew Bodek al_bool bar_params_valid; 535*3fc36ee0SWojciech Macek /* 536*3fc36ee0SWojciech Macek * Note: only bar_params[0], [2] and [4] can have memory_64_bit enabled 537*3fc36ee0SWojciech Macek * and in such case, the next bar ([1], [3], or [5] respectively) is not used 538*3fc36ee0SWojciech Macek */ 539f4b37ed0SZbigniew Bodek struct al_pcie_ep_bar_params bar_params[6]; 540f4b37ed0SZbigniew Bodek struct al_pcie_ep_bar_params exp_bar_params;/* expansion ROM BAR*/ 541f4b37ed0SZbigniew Bodek }; 542f4b37ed0SZbigniew Bodek 543f4b37ed0SZbigniew Bodek /** PCIe link status */ 544f4b37ed0SZbigniew Bodek struct al_pcie_link_status { 545f4b37ed0SZbigniew Bodek al_bool link_up; 546f4b37ed0SZbigniew Bodek enum al_pcie_link_speed speed; 547*3fc36ee0SWojciech Macek uint8_t lanes; /* Number of lanes */ 548f4b37ed0SZbigniew Bodek uint8_t ltssm_state; 549f4b37ed0SZbigniew Bodek }; 550f4b37ed0SZbigniew Bodek 551f4b37ed0SZbigniew Bodek /** PCIe lane status */ 552f4b37ed0SZbigniew Bodek struct al_pcie_lane_status { 553f4b37ed0SZbigniew Bodek al_bool is_reset; 554f4b37ed0SZbigniew Bodek enum al_pcie_link_speed requested_speed; 555f4b37ed0SZbigniew Bodek }; 556f4b37ed0SZbigniew Bodek 557*3fc36ee0SWojciech Macek /** 558*3fc36ee0SWojciech Macek * PCIe MSIX capability configuration parameters 559*3fc36ee0SWojciech Macek * Note: This structure should be used for EP mode only 560*3fc36ee0SWojciech Macek */ 561f4b37ed0SZbigniew Bodek struct al_pcie_msix_params { 562*3fc36ee0SWojciech Macek /* Number of entries - size can be up to: 2024 */ 563f4b37ed0SZbigniew Bodek uint16_t table_size; 564f4b37ed0SZbigniew Bodek uint16_t table_offset; 565f4b37ed0SZbigniew Bodek uint8_t table_bar; 566f4b37ed0SZbigniew Bodek uint16_t pba_offset; 567*3fc36ee0SWojciech Macek /* which bar to use when calculating the PBA table address and adding offset to */ 568f4b37ed0SZbigniew Bodek uint16_t pba_bar; 569f4b37ed0SZbigniew Bodek }; 570f4b37ed0SZbigniew Bodek 571f4b37ed0SZbigniew Bodek /** PCIE AER capability parameters */ 572f4b37ed0SZbigniew Bodek struct al_pcie_aer_params { 573*3fc36ee0SWojciech Macek /** ECRC Generation Enable 574*3fc36ee0SWojciech Macek * while this feature is powerful, all known Chip-sets and processors 575*3fc36ee0SWojciech Macek * do not support it as of 2015 576*3fc36ee0SWojciech Macek */ 577f4b37ed0SZbigniew Bodek al_bool ecrc_gen_en; 578f4b37ed0SZbigniew Bodek /** ECRC Check Enable */ 579f4b37ed0SZbigniew Bodek al_bool ecrc_chk_en; 580f4b37ed0SZbigniew Bodek 581f4b37ed0SZbigniew Bodek /** 582f4b37ed0SZbigniew Bodek * Enabled reporting of correctable errors (bit mask) 583f4b37ed0SZbigniew Bodek * See 'AL_PCIE_AER_CORR_*' for details 584f4b37ed0SZbigniew Bodek * 0 - no reporting at all 585f4b37ed0SZbigniew Bodek */ 586f4b37ed0SZbigniew Bodek unsigned int enabled_corr_err; 587f4b37ed0SZbigniew Bodek /** 588f4b37ed0SZbigniew Bodek * Enabled reporting of non-fatal uncorrectable errors (bit mask) 589f4b37ed0SZbigniew Bodek * See 'AL_PCIE_AER_UNCORR_*' for details 590f4b37ed0SZbigniew Bodek * 0 - no reporting at all 591f4b37ed0SZbigniew Bodek */ 592f4b37ed0SZbigniew Bodek unsigned int enabled_uncorr_non_fatal_err; 593f4b37ed0SZbigniew Bodek /** 594f4b37ed0SZbigniew Bodek * Enabled reporting of fatal uncorrectable errors (bit mask) 595f4b37ed0SZbigniew Bodek * See 'AL_PCIE_AER_UNCORR_*' for details 596f4b37ed0SZbigniew Bodek * 0 - no reporting at all 597f4b37ed0SZbigniew Bodek */ 598f4b37ed0SZbigniew Bodek unsigned int enabled_uncorr_fatal_err; 599f4b37ed0SZbigniew Bodek }; 600f4b37ed0SZbigniew Bodek 601f4b37ed0SZbigniew Bodek /******************************************************************************/ 602f4b37ed0SZbigniew Bodek /********************************** PCIe API **********************************/ 603f4b37ed0SZbigniew Bodek /******************************************************************************/ 604f4b37ed0SZbigniew Bodek 605f4b37ed0SZbigniew Bodek /*************************** PCIe Initialization API **************************/ 606f4b37ed0SZbigniew Bodek 607f4b37ed0SZbigniew Bodek /** 608f4b37ed0SZbigniew Bodek * Initializes a PCIe port handle structure. 609f4b37ed0SZbigniew Bodek * 610f4b37ed0SZbigniew Bodek * @param pcie_port an allocated, non-initialized instance. 611f4b37ed0SZbigniew Bodek * @param pcie_reg_base the virtual base address of the port internal 612f4b37ed0SZbigniew Bodek * registers 613f4b37ed0SZbigniew Bodek * @param pbs_reg_base the virtual base address of the pbs functional 614f4b37ed0SZbigniew Bodek * registers 615f4b37ed0SZbigniew Bodek * @param port_id the port id (used mainly for debug messages) 616f4b37ed0SZbigniew Bodek * 617f4b37ed0SZbigniew Bodek * @return 0 if no error found. 618f4b37ed0SZbigniew Bodek */ 619f4b37ed0SZbigniew Bodek int al_pcie_port_handle_init(struct al_pcie_port *pcie_port, 620f4b37ed0SZbigniew Bodek void __iomem *pcie_reg_base, 621f4b37ed0SZbigniew Bodek void __iomem *pbs_reg_base, 622f4b37ed0SZbigniew Bodek unsigned int port_id); 623f4b37ed0SZbigniew Bodek 624f4b37ed0SZbigniew Bodek /** 625f4b37ed0SZbigniew Bodek * Initializes a PCIe pf handle structure 626f4b37ed0SZbigniew Bodek * @param pcie_pf an allocated, non-initialized instance of pf handle 627f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 628f4b37ed0SZbigniew Bodek * @param pf_num physical function number 629f4b37ed0SZbigniew Bodek * @return 0 if no error found 630f4b37ed0SZbigniew Bodek */ 631f4b37ed0SZbigniew Bodek int al_pcie_pf_handle_init( 632f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 633f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 634f4b37ed0SZbigniew Bodek unsigned int pf_num); 635f4b37ed0SZbigniew Bodek 636*3fc36ee0SWojciech Macek /** 637*3fc36ee0SWojciech Macek * Get port revision ID 638*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 639*3fc36ee0SWojciech Macek * @return Port rev_id 640*3fc36ee0SWojciech Macek */ 641*3fc36ee0SWojciech Macek int al_pcie_port_rev_id_get(struct al_pcie_port *pcie_port); 642*3fc36ee0SWojciech Macek 643f4b37ed0SZbigniew Bodek /************************** Pre PCIe Port Enable API **************************/ 644f4b37ed0SZbigniew Bodek 645f4b37ed0SZbigniew Bodek /** 646f4b37ed0SZbigniew Bodek * @brief set current pcie operating mode (root complex or endpoint) 647f4b37ed0SZbigniew Bodek * This function can be called only before enabling the controller using 648f4b37ed0SZbigniew Bodek * al_pcie_port_enable(). 649f4b37ed0SZbigniew Bodek * 650f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 651f4b37ed0SZbigniew Bodek * @param mode pcie operating mode 652f4b37ed0SZbigniew Bodek * 653f4b37ed0SZbigniew Bodek * @return 0 if no error found. 654f4b37ed0SZbigniew Bodek */ 655f4b37ed0SZbigniew Bodek int al_pcie_port_operating_mode_config(struct al_pcie_port *pcie_port, 656f4b37ed0SZbigniew Bodek enum al_pcie_operating_mode mode); 657f4b37ed0SZbigniew Bodek 658f4b37ed0SZbigniew Bodek /** 659f4b37ed0SZbigniew Bodek * Configure number of lanes connected to this port. 660f4b37ed0SZbigniew Bodek * This function can be called only before enabling the controller using al_pcie_port_enable(). 661f4b37ed0SZbigniew Bodek * 662f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 663*3fc36ee0SWojciech Macek * @param lanes number of lanes (must be 1,2,4,8,16 and not any other value) 664*3fc36ee0SWojciech Macek * 665f4b37ed0SZbigniew Bodek * Note: this function must be called before any al_pcie_port_config() calls 666f4b37ed0SZbigniew Bodek * 667f4b37ed0SZbigniew Bodek * @return 0 if no error found. 668f4b37ed0SZbigniew Bodek */ 669f4b37ed0SZbigniew Bodek int al_pcie_port_max_lanes_set(struct al_pcie_port *pcie_port, uint8_t lanes); 670f4b37ed0SZbigniew Bodek 671f4b37ed0SZbigniew Bodek /** 672f4b37ed0SZbigniew Bodek * Set maximum physical function numbers 673f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 674f4b37ed0SZbigniew Bodek * @param max_num_of_pfs number of physical functions 675*3fc36ee0SWojciech Macek * 676*3fc36ee0SWojciech Macek * Notes: 677*3fc36ee0SWojciech Macek * - this function must be called before any al_pcie_pf_config() calls 678*3fc36ee0SWojciech Macek * - exposed on a given PCIe Endpoint port 679*3fc36ee0SWojciech Macek * - PCIe rev1/rev2 supports only single Endpoint 680*3fc36ee0SWojciech Macek * - PCIe rev3 can support up to 4 681f4b37ed0SZbigniew Bodek */ 682f4b37ed0SZbigniew Bodek int al_pcie_port_max_num_of_pfs_set( 683f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 684f4b37ed0SZbigniew Bodek uint8_t max_num_of_pfs); 685f4b37ed0SZbigniew Bodek 686f4b37ed0SZbigniew Bodek /** 687f4b37ed0SZbigniew Bodek * @brief Inbound posted/non-posted header credits and outstanding outbound 688f4b37ed0SZbigniew Bodek * reads completion header configuration 689f4b37ed0SZbigniew Bodek * 690f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 691f4b37ed0SZbigniew Bodek * @param ib_hcrd_os_ob_reads_config 692f4b37ed0SZbigniew Bodek * Inbound header credits and outstanding outbound reads 693f4b37ed0SZbigniew Bodek * configuration 694f4b37ed0SZbigniew Bodek */ 695f4b37ed0SZbigniew Bodek int al_pcie_port_ib_hcrd_os_ob_reads_config( 696f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 697f4b37ed0SZbigniew Bodek struct al_pcie_ib_hcrd_os_ob_reads_config *ib_hcrd_os_ob_reads_config); 698f4b37ed0SZbigniew Bodek 699f4b37ed0SZbigniew Bodek /** return PCIe operating mode 700f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 701f4b37ed0SZbigniew Bodek * @return operating mode 702f4b37ed0SZbigniew Bodek */ 703f4b37ed0SZbigniew Bodek enum al_pcie_operating_mode al_pcie_operating_mode_get( 704f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port); 705f4b37ed0SZbigniew Bodek 706*3fc36ee0SWojciech Macek /** 707*3fc36ee0SWojciech Macek * PCIe AXI quality of service configuration 708*3fc36ee0SWojciech Macek * 709*3fc36ee0SWojciech Macek * @param pcie_port 710*3fc36ee0SWojciech Macek * Initialized PCIe port handle 711*3fc36ee0SWojciech Macek * @param arqos 712*3fc36ee0SWojciech Macek * AXI read quality of service (0 - 15) 713*3fc36ee0SWojciech Macek * @param awqos 714*3fc36ee0SWojciech Macek * AXI write quality of service (0 - 15) 715*3fc36ee0SWojciech Macek */ 716*3fc36ee0SWojciech Macek void al_pcie_axi_qos_config( 717*3fc36ee0SWojciech Macek struct al_pcie_port *pcie_port, 718*3fc36ee0SWojciech Macek unsigned int arqos, 719*3fc36ee0SWojciech Macek unsigned int awqos); 720*3fc36ee0SWojciech Macek 721f4b37ed0SZbigniew Bodek /**************************** PCIe Port Enable API ****************************/ 722f4b37ed0SZbigniew Bodek 723*3fc36ee0SWojciech Macek /** 724*3fc36ee0SWojciech Macek * Enable PCIe unit (deassert reset) 725*3fc36ee0SWojciech Macek * This function only enables the port, without any configuration/link 726*3fc36ee0SWojciech Macek * functionality. Should be called before starting any configuration/link API 727f4b37ed0SZbigniew Bodek * 728f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 729f4b37ed0SZbigniew Bodek * 730f4b37ed0SZbigniew Bodek * @return 0 if no error found. 731f4b37ed0SZbigniew Bodek */ 732f4b37ed0SZbigniew Bodek int al_pcie_port_enable(struct al_pcie_port *pcie_port); 733f4b37ed0SZbigniew Bodek 734f4b37ed0SZbigniew Bodek /** Disable PCIe unit (assert reset) 735f4b37ed0SZbigniew Bodek * 736f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 737f4b37ed0SZbigniew Bodek */ 738f4b37ed0SZbigniew Bodek void al_pcie_port_disable(struct al_pcie_port *pcie_port); 739f4b37ed0SZbigniew Bodek 740f4b37ed0SZbigniew Bodek /** 741f4b37ed0SZbigniew Bodek * Port memory shutdown/up 742*3fc36ee0SWojciech Macek * Memory shutdown should be called for an unused ports for power-saving 743*3fc36ee0SWojciech Macek * 744f4b37ed0SZbigniew Bodek * Caution: This function can be called only when the controller is disabled 745f4b37ed0SZbigniew Bodek * 746f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 747f4b37ed0SZbigniew Bodek * @param enable memory shutdown enable or disable 748f4b37ed0SZbigniew Bodek * 749f4b37ed0SZbigniew Bodek */ 750f4b37ed0SZbigniew Bodek int al_pcie_port_memory_shutdown_set( 751f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 752f4b37ed0SZbigniew Bodek al_bool enable); 753f4b37ed0SZbigniew Bodek 754f4b37ed0SZbigniew Bodek /** 755f4b37ed0SZbigniew Bodek * Check if port enabled or not 756f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 757f4b37ed0SZbigniew Bodek * @return AL_TRUE of port enabled and AL_FALSE otherwise 758f4b37ed0SZbigniew Bodek */ 759f4b37ed0SZbigniew Bodek al_bool al_pcie_port_is_enabled(struct al_pcie_port *pcie_port); 760f4b37ed0SZbigniew Bodek 761f4b37ed0SZbigniew Bodek /*************************** PCIe Configuration API ***************************/ 762f4b37ed0SZbigniew Bodek 763f4b37ed0SZbigniew Bodek /** 764f4b37ed0SZbigniew Bodek * @brief configure pcie port (mode, link params, etc..) 765f4b37ed0SZbigniew Bodek * this function must be called before initializing the link 766f4b37ed0SZbigniew Bodek * 767f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 768f4b37ed0SZbigniew Bodek * @param params configuration structure. 769f4b37ed0SZbigniew Bodek * 770f4b37ed0SZbigniew Bodek * @return 0 if no error found 771f4b37ed0SZbigniew Bodek */ 772f4b37ed0SZbigniew Bodek int al_pcie_port_config(struct al_pcie_port *pcie_port, 773f4b37ed0SZbigniew Bodek const struct al_pcie_port_config_params *params); 774f4b37ed0SZbigniew Bodek 775f4b37ed0SZbigniew Bodek /** 776*3fc36ee0SWojciech Macek * @brief Configure a specific PF 777f4b37ed0SZbigniew Bodek * this function must be called before any datapath transactions 778f4b37ed0SZbigniew Bodek * 779f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 780f4b37ed0SZbigniew Bodek * @param params configuration structure. 781f4b37ed0SZbigniew Bodek * 782f4b37ed0SZbigniew Bodek * @return 0 if no error found 783f4b37ed0SZbigniew Bodek */ 784f4b37ed0SZbigniew Bodek int al_pcie_pf_config( 785f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 786f4b37ed0SZbigniew Bodek const struct al_pcie_pf_config_params *params); 787f4b37ed0SZbigniew Bodek 788f4b37ed0SZbigniew Bodek /************************** PCIe Link Operations API **************************/ 789f4b37ed0SZbigniew Bodek 790f4b37ed0SZbigniew Bodek /** 791f4b37ed0SZbigniew Bodek * @brief start pcie link 792*3fc36ee0SWojciech Macek * This function starts the link and should be called only after port is enabled 793*3fc36ee0SWojciech Macek * and pre port-enable and configurations are done 794f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 795f4b37ed0SZbigniew Bodek * 796f4b37ed0SZbigniew Bodek * @return 0 if no error found 797f4b37ed0SZbigniew Bodek */ 798f4b37ed0SZbigniew Bodek int al_pcie_link_start(struct al_pcie_port *pcie_port); 799f4b37ed0SZbigniew Bodek 800f4b37ed0SZbigniew Bodek /** 801f4b37ed0SZbigniew Bodek * @brief stop pcie link 802f4b37ed0SZbigniew Bodek * 803f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 804f4b37ed0SZbigniew Bodek * 805f4b37ed0SZbigniew Bodek * @return 0 if no error found 806f4b37ed0SZbigniew Bodek */ 807f4b37ed0SZbigniew Bodek int al_pcie_link_stop(struct al_pcie_port *pcie_port); 808f4b37ed0SZbigniew Bodek 809f4b37ed0SZbigniew Bodek /** 810*3fc36ee0SWojciech Macek * @brief check if pcie link is started 811*3fc36ee0SWojciech Macek * Note that this function checks if link is started rather than link is up 812*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 813*3fc36ee0SWojciech Macek * @return AL_TRUE if link is started and AL_FALSE otherwise 814*3fc36ee0SWojciech Macek */ 815*3fc36ee0SWojciech Macek al_bool al_pcie_is_link_started(struct al_pcie_port *pcie_port); 816*3fc36ee0SWojciech Macek 817*3fc36ee0SWojciech Macek /** 818f4b37ed0SZbigniew Bodek * @brief trigger link-disable 819f4b37ed0SZbigniew Bodek * 820f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 821f4b37ed0SZbigniew Bodek * @param disable AL_TRUE to disable the link and AL_FALSE to enable it 822f4b37ed0SZbigniew Bodek * 823f4b37ed0SZbigniew Bodek * Note: this functionality differs from "al_pcie_link_stop" as it's a spec 824f4b37ed0SZbigniew Bodek * functionality where both sides of the PCIe agrees to disable the link 825f4b37ed0SZbigniew Bodek * @return 0 if no error found 826f4b37ed0SZbigniew Bodek */ 827f4b37ed0SZbigniew Bodek int al_pcie_link_disable(struct al_pcie_port *pcie_port, al_bool disable); 828f4b37ed0SZbigniew Bodek 829f4b37ed0SZbigniew Bodek /** 830f4b37ed0SZbigniew Bodek * @brief wait for link up indication 831f4b37ed0SZbigniew Bodek * this function waits for link up indication, it polls LTSSM state until link is ready 832f4b37ed0SZbigniew Bodek * 833f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 834f4b37ed0SZbigniew Bodek * @param timeout_ms maximum timeout in milli-seconds to wait for link up 835f4b37ed0SZbigniew Bodek * 836f4b37ed0SZbigniew Bodek * @return 0 if link up indication detected 837f4b37ed0SZbigniew Bodek * -ETIME if not. 838f4b37ed0SZbigniew Bodek */ 839f4b37ed0SZbigniew Bodek int al_pcie_link_up_wait(struct al_pcie_port *pcie_port, uint32_t timeout_ms); 840f4b37ed0SZbigniew Bodek 841f4b37ed0SZbigniew Bodek /** 842f4b37ed0SZbigniew Bodek * @brief get link status 843f4b37ed0SZbigniew Bodek * 844f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 845f4b37ed0SZbigniew Bodek * @param status structure for link status 846f4b37ed0SZbigniew Bodek * 847f4b37ed0SZbigniew Bodek * @return 0 if no error found 848f4b37ed0SZbigniew Bodek */ 849f4b37ed0SZbigniew Bodek int al_pcie_link_status(struct al_pcie_port *pcie_port, struct al_pcie_link_status *status); 850f4b37ed0SZbigniew Bodek 851f4b37ed0SZbigniew Bodek /** 852f4b37ed0SZbigniew Bodek * @brief get lane status 853f4b37ed0SZbigniew Bodek * 854f4b37ed0SZbigniew Bodek * @param pcie_port 855f4b37ed0SZbigniew Bodek * pcie port handle 856f4b37ed0SZbigniew Bodek * @param lane 857f4b37ed0SZbigniew Bodek * PCIe lane 858f4b37ed0SZbigniew Bodek * @param status 859f4b37ed0SZbigniew Bodek * Pointer to returned structure for lane status 860f4b37ed0SZbigniew Bodek * 861f4b37ed0SZbigniew Bodek */ 862f4b37ed0SZbigniew Bodek void al_pcie_lane_status_get( 863f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 864f4b37ed0SZbigniew Bodek unsigned int lane, 865f4b37ed0SZbigniew Bodek struct al_pcie_lane_status *status); 866f4b37ed0SZbigniew Bodek 867f4b37ed0SZbigniew Bodek /** 868f4b37ed0SZbigniew Bodek * @brief trigger hot reset 869*3fc36ee0SWojciech Macek * this function initiates In-Band reset while link is up. 870*3fc36ee0SWojciech Macek * to initiate hot reset: call this function with AL_TRUE 871*3fc36ee0SWojciech Macek * to exit from hos reset: call this function with AL_FALSE 872*3fc36ee0SWojciech Macek * Note: This function should be called in RC mode only 873f4b37ed0SZbigniew Bodek * 874f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 875f4b37ed0SZbigniew Bodek * @param enable AL_TRUE to enable hot-reset and AL_FALSE to disable it 876f4b37ed0SZbigniew Bodek * 877f4b37ed0SZbigniew Bodek * @return 0 if no error found 878f4b37ed0SZbigniew Bodek */ 879f4b37ed0SZbigniew Bodek int al_pcie_link_hot_reset(struct al_pcie_port *pcie_port, al_bool enable); 880f4b37ed0SZbigniew Bodek 881f4b37ed0SZbigniew Bodek /** 882f4b37ed0SZbigniew Bodek * @brief trigger link-retain 883f4b37ed0SZbigniew Bodek * this function initiates Link retraining by directing the Physical Layer LTSSM 884f4b37ed0SZbigniew Bodek * to the Recovery state. If the LTSSM is already in Recovery or Configuration, 885f4b37ed0SZbigniew Bodek * re-entering Recovery is permitted but not required. 886*3fc36ee0SWojciech Macek * Note: This function should be called in RC mode only 887f4b37ed0SZbigniew Bodek 888f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 889f4b37ed0SZbigniew Bodek * 890f4b37ed0SZbigniew Bodek * Note: there's no need to disable initiating link-retrain 891f4b37ed0SZbigniew Bodek * @return 0 if no error found 892f4b37ed0SZbigniew Bodek */ 893f4b37ed0SZbigniew Bodek int al_pcie_link_retrain(struct al_pcie_port *pcie_port); 894f4b37ed0SZbigniew Bodek 895f4b37ed0SZbigniew Bodek /** 896f4b37ed0SZbigniew Bodek * @brief change port speed 897f4b37ed0SZbigniew Bodek * this function changes the port speed, it doesn't wait for link re-establishment 898f4b37ed0SZbigniew Bodek * 899f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 900f4b37ed0SZbigniew Bodek * @param new_speed the new speed gen to set 901f4b37ed0SZbigniew Bodek * 902f4b37ed0SZbigniew Bodek * @return 0 if no error found 903f4b37ed0SZbigniew Bodek */ 904f4b37ed0SZbigniew Bodek int al_pcie_link_change_speed(struct al_pcie_port *pcie_port, enum al_pcie_link_speed new_speed); 905f4b37ed0SZbigniew Bodek 906f4b37ed0SZbigniew Bodek /* TODO: check if this function needed */ 907f4b37ed0SZbigniew Bodek int al_pcie_link_change_width(struct al_pcie_port *pcie_port, uint8_t width); 908f4b37ed0SZbigniew Bodek 909f4b37ed0SZbigniew Bodek /**************************** Post Link Start API *****************************/ 910f4b37ed0SZbigniew Bodek 911f4b37ed0SZbigniew Bodek /************************** Snoop Configuration API ***************************/ 912f4b37ed0SZbigniew Bodek 913f4b37ed0SZbigniew Bodek /** 914f4b37ed0SZbigniew Bodek * @brief configure pcie port axi snoop 915*3fc36ee0SWojciech Macek * This enable the inbound PCIe posted write data or the Read completion data to 916*3fc36ee0SWojciech Macek * snoop the internal processor caches for I/O cache coherency 917f4b37ed0SZbigniew Bodek * 918f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 919f4b37ed0SZbigniew Bodek * @param enable_axi_snoop enable snoop. 920f4b37ed0SZbigniew Bodek * 921f4b37ed0SZbigniew Bodek * @return 0 if no error found 922f4b37ed0SZbigniew Bodek */ 923f4b37ed0SZbigniew Bodek /* TODO: Can this API be called after port enable? */ 924f4b37ed0SZbigniew Bodek int al_pcie_port_snoop_config(struct al_pcie_port *pcie_port, 925f4b37ed0SZbigniew Bodek al_bool enable_axi_snoop); 926f4b37ed0SZbigniew Bodek 927f4b37ed0SZbigniew Bodek /************************** Configuration Space API ***************************/ 928f4b37ed0SZbigniew Bodek 929f4b37ed0SZbigniew Bodek /** 930*3fc36ee0SWojciech Macek * Configuration Space Access Through PCI-E_ECAM_Ext PASW 931*3fc36ee0SWojciech Macek * This feature enables the internal processors to generate configuration cycles 932*3fc36ee0SWojciech Macek * on the PCIe ports by writing to part of the processor memory space marked by 933*3fc36ee0SWojciech Macek * the PCI-E_EXCAM_Ext address window 934f4b37ed0SZbigniew Bodek */ 935f4b37ed0SZbigniew Bodek 936f4b37ed0SZbigniew Bodek /** 937f4b37ed0SZbigniew Bodek * @brief get base address of pci configuration space header 938f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 939f4b37ed0SZbigniew Bodek * @param addr pointer for returned address; 940f4b37ed0SZbigniew Bodek * @return 0 if no error found 941f4b37ed0SZbigniew Bodek */ 942f4b37ed0SZbigniew Bodek int al_pcie_config_space_get( 943f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 944f4b37ed0SZbigniew Bodek uint8_t __iomem **addr); 945f4b37ed0SZbigniew Bodek 946f4b37ed0SZbigniew Bodek /** 947f4b37ed0SZbigniew Bodek * Read data from the local configuration space 948f4b37ed0SZbigniew Bodek * 949f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 950f4b37ed0SZbigniew Bodek * @param reg_offset Configuration space register offset 951f4b37ed0SZbigniew Bodek * @return Read data 952f4b37ed0SZbigniew Bodek */ 953f4b37ed0SZbigniew Bodek uint32_t al_pcie_local_cfg_space_read( 954f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 955f4b37ed0SZbigniew Bodek unsigned int reg_offset); 956f4b37ed0SZbigniew Bodek 957f4b37ed0SZbigniew Bodek /** 958f4b37ed0SZbigniew Bodek * Write data to the local configuration space 959f4b37ed0SZbigniew Bodek * 960f4b37ed0SZbigniew Bodek * @param pcie_pf PCIe pf handle 961f4b37ed0SZbigniew Bodek * @param reg_offset Configuration space register offset 962f4b37ed0SZbigniew Bodek * @param data Data to write 963f4b37ed0SZbigniew Bodek * @param cs2 Should be AL_TRUE if dbi_cs2 must be asserted 964f4b37ed0SZbigniew Bodek * to enable writing to this register, according to 965f4b37ed0SZbigniew Bodek * the PCIe Core specifications 966f4b37ed0SZbigniew Bodek * @param allow_ro_wr AL_TRUE to allow writing into read-only regs 967f4b37ed0SZbigniew Bodek * 968f4b37ed0SZbigniew Bodek */ 969f4b37ed0SZbigniew Bodek void al_pcie_local_cfg_space_write( 970f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 971f4b37ed0SZbigniew Bodek unsigned int reg_offset, 972f4b37ed0SZbigniew Bodek uint32_t data, 973f4b37ed0SZbigniew Bodek al_bool cs2, 974f4b37ed0SZbigniew Bodek al_bool allow_ro_wr); 975f4b37ed0SZbigniew Bodek 976f4b37ed0SZbigniew Bodek /** 977f4b37ed0SZbigniew Bodek * @brief set target_bus and mask_target_bus 978*3fc36ee0SWojciech Macek * 979*3fc36ee0SWojciech Macek * Call this function with target_bus set to the required bus of the next 980*3fc36ee0SWojciech Macek * outbound config access to be issued. No need to call that function if the 981*3fc36ee0SWojciech Macek * next config access bus equals to the last one. 982*3fc36ee0SWojciech Macek * 983f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 984f4b37ed0SZbigniew Bodek * @param target_bus 985f4b37ed0SZbigniew Bodek * @param mask_target_bus 986f4b37ed0SZbigniew Bodek * @return 0 if no error found 987f4b37ed0SZbigniew Bodek */ 988f4b37ed0SZbigniew Bodek int al_pcie_target_bus_set(struct al_pcie_port *pcie_port, 989f4b37ed0SZbigniew Bodek uint8_t target_bus, 990f4b37ed0SZbigniew Bodek uint8_t mask_target_bus); 991f4b37ed0SZbigniew Bodek 992f4b37ed0SZbigniew Bodek /** 993f4b37ed0SZbigniew Bodek * @brief get target_bus and mask_target_bus 994f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 995f4b37ed0SZbigniew Bodek * @param target_bus 996f4b37ed0SZbigniew Bodek * @param mask_target_bus 997f4b37ed0SZbigniew Bodek * @return 0 if no error found 998f4b37ed0SZbigniew Bodek */ 999f4b37ed0SZbigniew Bodek int al_pcie_target_bus_get(struct al_pcie_port *pcie_port, 1000f4b37ed0SZbigniew Bodek uint8_t *target_bus, 1001f4b37ed0SZbigniew Bodek uint8_t *mask_target_bus); 1002f4b37ed0SZbigniew Bodek 1003f4b37ed0SZbigniew Bodek /** 1004f4b37ed0SZbigniew Bodek * Set secondary bus number 1005f4b37ed0SZbigniew Bodek * 1006*3fc36ee0SWojciech Macek * Same as al_pcie_target_bus_set but with secondary bus 1007*3fc36ee0SWojciech Macek * 1008f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1009f4b37ed0SZbigniew Bodek * @param secbus pci secondary bus number 1010f4b37ed0SZbigniew Bodek * 1011f4b37ed0SZbigniew Bodek * @return 0 if no error found. 1012f4b37ed0SZbigniew Bodek */ 1013f4b37ed0SZbigniew Bodek int al_pcie_secondary_bus_set(struct al_pcie_port *pcie_port, uint8_t secbus); 1014f4b37ed0SZbigniew Bodek 1015f4b37ed0SZbigniew Bodek /** 1016f4b37ed0SZbigniew Bodek * Set subordinary bus number 1017f4b37ed0SZbigniew Bodek * 1018*3fc36ee0SWojciech Macek * Same as al_pcie_target_bus_set but with subordinary bus 1019*3fc36ee0SWojciech Macek * 1020f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1021f4b37ed0SZbigniew Bodek * @param subbus the highest bus number of all of the buses that can be reached 1022f4b37ed0SZbigniew Bodek * downstream of the PCIE instance. 1023f4b37ed0SZbigniew Bodek * 1024f4b37ed0SZbigniew Bodek * @return 0 if no error found. 1025f4b37ed0SZbigniew Bodek */ 1026f4b37ed0SZbigniew Bodek int al_pcie_subordinary_bus_set(struct al_pcie_port *pcie_port,uint8_t subbus); 1027f4b37ed0SZbigniew Bodek 1028f4b37ed0SZbigniew Bodek /** 1029f4b37ed0SZbigniew Bodek * @brief Enable/disable deferring incoming configuration requests until 1030f4b37ed0SZbigniew Bodek * initialization is complete. When enabled, the core completes incoming 1031f4b37ed0SZbigniew Bodek * configuration requests with a Configuration Request Retry Status. 1032*3fc36ee0SWojciech Macek * Other incoming non-configuration Requests complete with Unsupported Request status. 1033*3fc36ee0SWojciech Macek * 1034*3fc36ee0SWojciech Macek * Note: This function should be used for EP mode only 1035f4b37ed0SZbigniew Bodek * 1036f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1037f4b37ed0SZbigniew Bodek * @param en enable/disable 1038f4b37ed0SZbigniew Bodek */ 1039f4b37ed0SZbigniew Bodek void al_pcie_app_req_retry_set(struct al_pcie_port *pcie_port, al_bool en); 1040f4b37ed0SZbigniew Bodek 1041*3fc36ee0SWojciech Macek /** 1042*3fc36ee0SWojciech Macek * @brief Check if deferring incoming configuration requests is enabled or not 1043*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 1044*3fc36ee0SWojciech Macek * @return AL_TRUE is it's enabled and AL_FALSE otherwise 1045*3fc36ee0SWojciech Macek */ 1046*3fc36ee0SWojciech Macek al_bool al_pcie_app_req_retry_get_status(struct al_pcie_port *pcie_port); 1047*3fc36ee0SWojciech Macek 1048f4b37ed0SZbigniew Bodek /*************** Internal Address Translation Unit (ATU) API ******************/ 1049f4b37ed0SZbigniew Bodek 1050f4b37ed0SZbigniew Bodek enum al_pcie_atu_dir { 1051f4b37ed0SZbigniew Bodek AL_PCIE_ATU_DIR_OUTBOUND = 0, 1052f4b37ed0SZbigniew Bodek AL_PCIE_ATU_DIR_INBOUND = 1, 1053f4b37ed0SZbigniew Bodek }; 1054f4b37ed0SZbigniew Bodek 1055*3fc36ee0SWojciech Macek /** decoding of the PCIe TLP Type as appears on the wire */ 1056f4b37ed0SZbigniew Bodek enum al_pcie_atu_tlp { 1057f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_MEM = 0, 1058f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_IO = 2, 1059f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_CFG0 = 4, 1060f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_CFG1 = 5, 1061f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_MSG = 0x10, 1062f4b37ed0SZbigniew Bodek AL_PCIE_TLP_TYPE_RESERVED = 0x1f 1063f4b37ed0SZbigniew Bodek }; 1064f4b37ed0SZbigniew Bodek 1065*3fc36ee0SWojciech Macek /** default response types */ 1066f4b37ed0SZbigniew Bodek enum al_pcie_atu_response { 1067f4b37ed0SZbigniew Bodek AL_PCIE_RESPONSE_NORMAL = 0, 1068*3fc36ee0SWojciech Macek AL_PCIE_RESPONSE_UR = 1, /* UR == Unsupported Request */ 1069*3fc36ee0SWojciech Macek AL_PCIE_RESPONSE_CA = 2 /* CA == Completion Abort */ 1070f4b37ed0SZbigniew Bodek }; 1071f4b37ed0SZbigniew Bodek 1072f4b37ed0SZbigniew Bodek struct al_pcie_atu_region { 1073*3fc36ee0SWojciech Macek 1074*3fc36ee0SWojciech Macek /********************************************************************** 1075*3fc36ee0SWojciech Macek * General Parameters * 1076*3fc36ee0SWojciech Macek **********************************************************************/ 1077*3fc36ee0SWojciech Macek 1078f4b37ed0SZbigniew Bodek al_bool enable; 1079f4b37ed0SZbigniew Bodek /* outbound or inbound */ 1080f4b37ed0SZbigniew Bodek enum al_pcie_atu_dir direction; 1081f4b37ed0SZbigniew Bodek /* region index */ 1082f4b37ed0SZbigniew Bodek uint8_t index; 1083*3fc36ee0SWojciech Macek /* the 64-bit address that get matched with the 64-bit address incoming 1084*3fc36ee0SWojciech Macek * on the PCIe TLP 1085*3fc36ee0SWojciech Macek */ 1086f4b37ed0SZbigniew Bodek uint64_t base_addr; 1087*3fc36ee0SWojciech Macek /** 1088*3fc36ee0SWojciech Macek * limit marks the region's end address. 1089*3fc36ee0SWojciech Macek * For Alpine V1 (PCIe rev1): only bits [39:0] are valid 1090*3fc36ee0SWojciech Macek * For Alpine V2 (PCIe rev2/rev3): only bits [47:0] are valid 1091*3fc36ee0SWojciech Macek * an access is a hit in iATU if the: 1092*3fc36ee0SWojciech Macek * - address >= base_addr 1093*3fc36ee0SWojciech Macek * - address <= base_addr + limit 1094f4b37ed0SZbigniew Bodek */ 1095f4b37ed0SZbigniew Bodek uint64_t limit; 1096*3fc36ee0SWojciech Macek /** 1097*3fc36ee0SWojciech Macek * the address that matches (hit) will be translated to: 1098*3fc36ee0SWojciech Macek * target_addr + offset 1099*3fc36ee0SWojciech Macek * 1100*3fc36ee0SWojciech Macek * Exmaple: accessing (base_addr + 0x1000) will be translated to: 1101*3fc36ee0SWojciech Macek * (target_addr + 0x1000) in case limit >= 0x1000 1102f4b37ed0SZbigniew Bodek */ 1103f4b37ed0SZbigniew Bodek uint64_t target_addr; 1104*3fc36ee0SWojciech Macek /** 1105*3fc36ee0SWojciech Macek * When the Invert feature is activated, an address match occurs when 1106*3fc36ee0SWojciech Macek * the untranslated address is not in the region bounded by the Base 1107*3fc36ee0SWojciech Macek * address and Limit address. Match occurs when the untranslated address 1108*3fc36ee0SWojciech Macek * is not in the region bounded by the base address and limit address 1109*3fc36ee0SWojciech Macek */ 1110f4b37ed0SZbigniew Bodek al_bool invert_matching; 1111*3fc36ee0SWojciech Macek /** 1112*3fc36ee0SWojciech Macek * PCIe TLP type 1113*3fc36ee0SWojciech Macek * Can be: Mem, IO, CGF0, CFG1 or MSG 1114*3fc36ee0SWojciech Macek */ 1115f4b37ed0SZbigniew Bodek enum al_pcie_atu_tlp tlp_type; 1116*3fc36ee0SWojciech Macek /** 1117*3fc36ee0SWojciech Macek * PCIe frame header attr field. 1118*3fc36ee0SWojciech Macek * When the address of a TLP is matched to this region, then the ATTR 1119*3fc36ee0SWojciech Macek * field of the TLP is changed to the value in this register. 1120*3fc36ee0SWojciech Macek */ 1121f4b37ed0SZbigniew Bodek uint8_t attr; 1122*3fc36ee0SWojciech Macek 1123*3fc36ee0SWojciech Macek /********************************************************************** 1124*3fc36ee0SWojciech Macek * Outbound specific Parameters * 1125*3fc36ee0SWojciech Macek **********************************************************************/ 1126*3fc36ee0SWojciech Macek 1127f4b37ed0SZbigniew Bodek /** 1128*3fc36ee0SWojciech Macek * PCIe Message code 1129*3fc36ee0SWojciech Macek * MSG TLPs (Message Code). When the address of an outbound TLP is 1130*3fc36ee0SWojciech Macek * matched to this region, and the translated TLP TYPE field is Msg 1131*3fc36ee0SWojciech Macek * then the message field of the TLP is changed to the value in this 1132*3fc36ee0SWojciech Macek * register. 1133f4b37ed0SZbigniew Bodek */ 1134f4b37ed0SZbigniew Bodek uint8_t msg_code; 1135f4b37ed0SZbigniew Bodek /** 1136*3fc36ee0SWojciech Macek * CFG Shift Mode. This is useful for CFG transactions where the PCIe 1137*3fc36ee0SWojciech Macek * configuration mechanism maps bits [27:12] of the address to the 1138*3fc36ee0SWojciech Macek * bus/device and function number. This allows a CFG configuration space 1139*3fc36ee0SWojciech Macek * to be located in any 256MB window of your application memory space 1140*3fc36ee0SWojciech Macek * using a 28-bit effective address.Shifts bits [27:12] of the 1141*3fc36ee0SWojciech Macek * untranslated address to form bits [31:16] of the translated address. 1142f4b37ed0SZbigniew Bodek */ 1143*3fc36ee0SWojciech Macek al_bool cfg_shift_mode; 1144*3fc36ee0SWojciech Macek 1145*3fc36ee0SWojciech Macek /********************************************************************** 1146*3fc36ee0SWojciech Macek * Inbound specific Parameters * 1147*3fc36ee0SWojciech Macek **********************************************************************/ 1148*3fc36ee0SWojciech Macek 1149f4b37ed0SZbigniew Bodek uint8_t bar_number; 1150*3fc36ee0SWojciech Macek /** 1151*3fc36ee0SWojciech Macek * Match Mode. Determines Inbound matching mode for TLPs. The mode 1152*3fc36ee0SWojciech Macek * depends on the type of TLP that is received as follows: 1153*3fc36ee0SWojciech Macek * MEM-I/O: 0 = Address Match Mode 1154*3fc36ee0SWojciech Macek * 1 = BAR Match Mode 1155*3fc36ee0SWojciech Macek * CFG0 : 0 = Routing ID Match Mode 1156*3fc36ee0SWojciech Macek * 1 = Accept Mode 1157*3fc36ee0SWojciech Macek * MSG : 0 = Address Match Mode 1158*3fc36ee0SWojciech Macek * 1 = Vendor ID Match Mode 1159*3fc36ee0SWojciech Macek */ 1160f4b37ed0SZbigniew Bodek uint8_t match_mode; 1161f4b37ed0SZbigniew Bodek /** 1162*3fc36ee0SWojciech Macek * For outbound: 1163*3fc36ee0SWojciech Macek * - AL_TRUE : enables taking the function number of the translated TLP 1164*3fc36ee0SWojciech Macek * from the PCIe core 1165*3fc36ee0SWojciech Macek * - AL_FALSE: no function number is taken from PCIe core 1166*3fc36ee0SWojciech Macek * For inbound: 1167*3fc36ee0SWojciech Macek * - AL_TRUE : enables ATU function match mode 1168*3fc36ee0SWojciech Macek * - AL_FALSE: no function match mode applied to transactions 1169*3fc36ee0SWojciech Macek * 1170f4b37ed0SZbigniew Bodek * Note: this boolean is ignored in RC mode 1171f4b37ed0SZbigniew Bodek */ 1172f4b37ed0SZbigniew Bodek al_bool function_match_bypass_mode; 1173f4b37ed0SZbigniew Bodek /** 1174f4b37ed0SZbigniew Bodek * The function number to match/bypass (see previous parameter) 1175*3fc36ee0SWojciech Macek * Note: this parameter is ignored when previous parameter is AL_FALSE 1176f4b37ed0SZbigniew Bodek */ 1177f4b37ed0SZbigniew Bodek uint8_t function_match_bypass_mode_number; 1178*3fc36ee0SWojciech Macek /** 1179*3fc36ee0SWojciech Macek * setting up what is the default response for an inbound transaction 1180*3fc36ee0SWojciech Macek * that matches the iATU 1181*3fc36ee0SWojciech Macek */ 1182f4b37ed0SZbigniew Bodek enum al_pcie_atu_response response; 1183*3fc36ee0SWojciech Macek /** 1184*3fc36ee0SWojciech Macek * Attr Match Enable. Ensures that a successful AT TLP field comparison 1185*3fc36ee0SWojciech Macek * match (see attr above) occurs for address translation to proceed 1186*3fc36ee0SWojciech Macek */ 1187f4b37ed0SZbigniew Bodek al_bool enable_attr_match_mode; 1188*3fc36ee0SWojciech Macek /** 1189*3fc36ee0SWojciech Macek * Message Code Match Enable(Msg TLPS). Ensures that a successful 1190*3fc36ee0SWojciech Macek * message Code TLP field comparison match (see Message msg_code)occurs 1191*3fc36ee0SWojciech Macek * (in MSG transactions) for address translation to proceed. 1192*3fc36ee0SWojciech Macek */ 1193f4b37ed0SZbigniew Bodek al_bool enable_msg_match_mode; 1194f4b37ed0SZbigniew Bodek /** 1195f4b37ed0SZbigniew Bodek * USE WITH CAUTION: setting this boolean to AL_TRUE allows setting the 1196f4b37ed0SZbigniew Bodek * outbound ATU even after link is already started. DO NOT SET this 1197f4b37ed0SZbigniew Bodek * boolean to AL_TRUE unless there have been NO traffic before calling 1198f4b37ed0SZbigniew Bodek * al_pcie_atu_region_set function 1199f4b37ed0SZbigniew Bodek */ 1200f4b37ed0SZbigniew Bodek al_bool enforce_ob_atu_region_set; 1201f4b37ed0SZbigniew Bodek }; 1202f4b37ed0SZbigniew Bodek 1203f4b37ed0SZbigniew Bodek /** 1204f4b37ed0SZbigniew Bodek * @brief program internal ATU region entry 1205f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1206f4b37ed0SZbigniew Bodek * @param atu_region data structure that contains the region index and the 1207f4b37ed0SZbigniew Bodek * translation parameters 1208f4b37ed0SZbigniew Bodek * @return 0 if no error 1209f4b37ed0SZbigniew Bodek */ 1210f4b37ed0SZbigniew Bodek int al_pcie_atu_region_set( 1211f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 1212f4b37ed0SZbigniew Bodek struct al_pcie_atu_region *atu_region); 1213f4b37ed0SZbigniew Bodek 1214f4b37ed0SZbigniew Bodek /** 1215f4b37ed0SZbigniew Bodek * @brief get internal ATU is enabled and base/target addresses 1216f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1217f4b37ed0SZbigniew Bodek * @param direction input: iATU direction (IB/OB) 1218f4b37ed0SZbigniew Bodek * @param index input: iATU index 1219f4b37ed0SZbigniew Bodek * @param enable output: AL_TRUE if the iATU is enabled 1220f4b37ed0SZbigniew Bodek * @param base_addr output: the iATU base address 1221f4b37ed0SZbigniew Bodek * @param target_addr output: the iATU target address 1222f4b37ed0SZbigniew Bodek */ 1223f4b37ed0SZbigniew Bodek void al_pcie_atu_region_get_fields( 1224f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 1225f4b37ed0SZbigniew Bodek enum al_pcie_atu_dir direction, uint8_t index, 1226f4b37ed0SZbigniew Bodek al_bool *enable, uint64_t *base_addr, uint64_t *target_addr); 1227f4b37ed0SZbigniew Bodek 1228f4b37ed0SZbigniew Bodek /** 1229f4b37ed0SZbigniew Bodek * @brief Configure axi io bar. 1230*3fc36ee0SWojciech Macek * 1231*3fc36ee0SWojciech Macek * This is an EP feature, enabling PCIe IO transaction to be captured if it fits 1232*3fc36ee0SWojciech Macek * within start and end address, and then mapped to internal 4-byte 1233*3fc36ee0SWojciech Macek * memRead/memWrite. Every hit to this bar will override size to 4 bytes. 1234*3fc36ee0SWojciech Macek * 1235f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1236f4b37ed0SZbigniew Bodek * @param start the first address of the memory 1237f4b37ed0SZbigniew Bodek * @param end the last address of the memory 1238f4b37ed0SZbigniew Bodek * @return 1239f4b37ed0SZbigniew Bodek */ 1240f4b37ed0SZbigniew Bodek void al_pcie_axi_io_config( 1241f4b37ed0SZbigniew Bodek struct al_pcie_port *pcie_port, 1242f4b37ed0SZbigniew Bodek al_phys_addr_t start, 1243f4b37ed0SZbigniew Bodek al_phys_addr_t end); 1244f4b37ed0SZbigniew Bodek 1245f4b37ed0SZbigniew Bodek /************** Interrupt generation (Endpoint mode Only) API *****************/ 1246f4b37ed0SZbigniew Bodek 1247f4b37ed0SZbigniew Bodek enum al_pcie_legacy_int_type{ 1248f4b37ed0SZbigniew Bodek AL_PCIE_LEGACY_INTA = 0, 1249f4b37ed0SZbigniew Bodek AL_PCIE_LEGACY_INTB, 1250f4b37ed0SZbigniew Bodek AL_PCIE_LEGACY_INTC, 1251f4b37ed0SZbigniew Bodek AL_PCIE_LEGACY_INTD 1252f4b37ed0SZbigniew Bodek }; 1253f4b37ed0SZbigniew Bodek 1254*3fc36ee0SWojciech Macek 1255*3fc36ee0SWojciech Macek /* @brief generate FLR_PF_DONE message 1256*3fc36ee0SWojciech Macek * @param pcie_pf pcie pf handle 1257*3fc36ee0SWojciech Macek * @return 0 if no error found 1258*3fc36ee0SWojciech Macek */ 1259*3fc36ee0SWojciech Macek int al_pcie_pf_flr_done_gen(struct al_pcie_pf *pcie_pf); 1260*3fc36ee0SWojciech Macek 1261f4b37ed0SZbigniew Bodek /** 1262f4b37ed0SZbigniew Bodek * @brief generate INTx Assert/DeAssert Message 1263f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1264f4b37ed0SZbigniew Bodek * @param assert when true, Assert Message is sent 1265f4b37ed0SZbigniew Bodek * @param type type of message (INTA, INTB, etc) 1266f4b37ed0SZbigniew Bodek * @return 0 if no error found 1267f4b37ed0SZbigniew Bodek */ 1268f4b37ed0SZbigniew Bodek int al_pcie_legacy_int_gen( 1269f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 1270f4b37ed0SZbigniew Bodek al_bool assert, 1271f4b37ed0SZbigniew Bodek enum al_pcie_legacy_int_type type); 1272f4b37ed0SZbigniew Bodek 1273f4b37ed0SZbigniew Bodek /** 1274f4b37ed0SZbigniew Bodek * @brief generate MSI interrupt 1275f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1276f4b37ed0SZbigniew Bodek * @param vector the vector index to send interrupt for. 1277f4b37ed0SZbigniew Bodek * @return 0 if no error found 1278f4b37ed0SZbigniew Bodek */ 1279f4b37ed0SZbigniew Bodek int al_pcie_msi_int_gen(struct al_pcie_pf *pcie_pf, uint8_t vector); 1280f4b37ed0SZbigniew Bodek 1281f4b37ed0SZbigniew Bodek /** 1282f4b37ed0SZbigniew Bodek * @brief configure MSIX capability 1283f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1284f4b37ed0SZbigniew Bodek * @param msix_params MSIX capability configuration parameters 1285f4b37ed0SZbigniew Bodek * @return 0 if no error found 1286f4b37ed0SZbigniew Bodek */ 1287f4b37ed0SZbigniew Bodek int al_pcie_msix_config( 1288f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 1289f4b37ed0SZbigniew Bodek struct al_pcie_msix_params *msix_params); 1290f4b37ed0SZbigniew Bodek 1291f4b37ed0SZbigniew Bodek /** 1292f4b37ed0SZbigniew Bodek * @brief check whether MSIX capability is enabled 1293f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1294f4b37ed0SZbigniew Bodek * @return AL_TRUE if MSIX capability is enabled, AL_FALSE otherwise 1295f4b37ed0SZbigniew Bodek */ 1296f4b37ed0SZbigniew Bodek al_bool al_pcie_msix_enabled(struct al_pcie_pf *pcie_pf); 1297f4b37ed0SZbigniew Bodek 1298f4b37ed0SZbigniew Bodek /** 1299f4b37ed0SZbigniew Bodek * @brief check whether MSIX capability is masked 1300f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1301f4b37ed0SZbigniew Bodek * @return AL_TRUE if MSIX capability is masked, AL_FALSE otherwise 1302f4b37ed0SZbigniew Bodek */ 1303f4b37ed0SZbigniew Bodek al_bool al_pcie_msix_masked(struct al_pcie_pf *pcie_pf); 1304f4b37ed0SZbigniew Bodek 1305f4b37ed0SZbigniew Bodek /******************** Advanced Error Reporting (AER) API **********************/ 1306f4b37ed0SZbigniew Bodek 1307f4b37ed0SZbigniew Bodek /** 1308*3fc36ee0SWojciech Macek * @brief configure EP physical function AER capability 1309f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1310f4b37ed0SZbigniew Bodek * @param params AER capability configuration parameters 1311f4b37ed0SZbigniew Bodek * @return 0 if no error found 1312f4b37ed0SZbigniew Bodek */ 1313f4b37ed0SZbigniew Bodek int al_pcie_aer_config( 1314f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 1315f4b37ed0SZbigniew Bodek struct al_pcie_aer_params *params); 1316f4b37ed0SZbigniew Bodek 1317f4b37ed0SZbigniew Bodek /** 1318*3fc36ee0SWojciech Macek * @brief EP physical function AER uncorrectable errors get and clear 1319f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1320f4b37ed0SZbigniew Bodek * @return bit mask of uncorrectable errors - see 'AL_PCIE_AER_UNCORR_*' for 1321f4b37ed0SZbigniew Bodek * details 1322f4b37ed0SZbigniew Bodek */ 1323f4b37ed0SZbigniew Bodek unsigned int al_pcie_aer_uncorr_get_and_clear(struct al_pcie_pf *pcie_pf); 1324f4b37ed0SZbigniew Bodek 1325f4b37ed0SZbigniew Bodek /** 1326*3fc36ee0SWojciech Macek * @brief EP physical function AER correctable errors get and clear 1327f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1328f4b37ed0SZbigniew Bodek * @return bit mask of correctable errors - see 'AL_PCIE_AER_CORR_*' for 1329f4b37ed0SZbigniew Bodek * details 1330f4b37ed0SZbigniew Bodek */ 1331f4b37ed0SZbigniew Bodek unsigned int al_pcie_aer_corr_get_and_clear(struct al_pcie_pf *pcie_pf); 1332f4b37ed0SZbigniew Bodek 1333f4b37ed0SZbigniew Bodek /** 1334*3fc36ee0SWojciech Macek * @brief EP physical function AER get the header for 1335*3fc36ee0SWojciech Macek * the TLP corresponding to a detected error 1336f4b37ed0SZbigniew Bodek * @param pcie_pf pcie pf handle 1337f4b37ed0SZbigniew Bodek * @param hdr pointer to an array for getting the header 1338f4b37ed0SZbigniew Bodek */ 1339f4b37ed0SZbigniew Bodek void al_pcie_aer_err_tlp_hdr_get( 1340f4b37ed0SZbigniew Bodek struct al_pcie_pf *pcie_pf, 1341f4b37ed0SZbigniew Bodek uint32_t hdr[AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS]); 1342f4b37ed0SZbigniew Bodek 1343*3fc36ee0SWojciech Macek /** 1344*3fc36ee0SWojciech Macek * @brief configure RC port AER capability 1345*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 1346*3fc36ee0SWojciech Macek * @param params AER capability configuration parameters 1347*3fc36ee0SWojciech Macek * @return 0 if no error found 1348*3fc36ee0SWojciech Macek */ 1349*3fc36ee0SWojciech Macek int al_pcie_port_aer_config( 1350*3fc36ee0SWojciech Macek struct al_pcie_port *pcie_port, 1351*3fc36ee0SWojciech Macek struct al_pcie_aer_params *params); 1352*3fc36ee0SWojciech Macek 1353*3fc36ee0SWojciech Macek /** 1354*3fc36ee0SWojciech Macek * @brief RC port AER uncorrectable errors get and clear 1355*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 1356*3fc36ee0SWojciech Macek * @return bit mask of uncorrectable errors - see 'AL_PCIE_AER_UNCORR_*' for 1357*3fc36ee0SWojciech Macek * details 1358*3fc36ee0SWojciech Macek */ 1359*3fc36ee0SWojciech Macek unsigned int al_pcie_port_aer_uncorr_get_and_clear( 1360*3fc36ee0SWojciech Macek struct al_pcie_port *pcie_port); 1361*3fc36ee0SWojciech Macek 1362*3fc36ee0SWojciech Macek /** 1363*3fc36ee0SWojciech Macek * @brief RC port AER correctable errors get and clear 1364*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 1365*3fc36ee0SWojciech Macek * @return bit mask of correctable errors - see 'AL_PCIE_AER_CORR_*' for 1366*3fc36ee0SWojciech Macek * details 1367*3fc36ee0SWojciech Macek */ 1368*3fc36ee0SWojciech Macek unsigned int al_pcie_port_aer_corr_get_and_clear( 1369*3fc36ee0SWojciech Macek struct al_pcie_port *pcie_port); 1370*3fc36ee0SWojciech Macek 1371*3fc36ee0SWojciech Macek /** 1372*3fc36ee0SWojciech Macek * @brief RC port AER get the header for 1373*3fc36ee0SWojciech Macek * the TLP corresponding to a detected error 1374*3fc36ee0SWojciech Macek * @param pcie_port pcie port handle 1375*3fc36ee0SWojciech Macek * @param hdr pointer to an array for getting the header 1376*3fc36ee0SWojciech Macek */ 1377*3fc36ee0SWojciech Macek void al_pcie_port_aer_err_tlp_hdr_get( 1378*3fc36ee0SWojciech Macek struct al_pcie_port *pcie_port, 1379*3fc36ee0SWojciech Macek uint32_t hdr[AL_PCIE_AER_ERR_TLP_HDR_NUM_DWORDS]); 1380*3fc36ee0SWojciech Macek 1381f4b37ed0SZbigniew Bodek /******************** Loop-Back mode (RC and Endpoint modes) ******************/ 1382f4b37ed0SZbigniew Bodek 1383f4b37ed0SZbigniew Bodek /** 1384f4b37ed0SZbigniew Bodek * @brief enter local pipe loop-back mode 1385f4b37ed0SZbigniew Bodek * This mode will connect the pipe RX signals to TX. 1386f4b37ed0SZbigniew Bodek * no need to start link when using this mode. 1387f4b37ed0SZbigniew Bodek * Gen3 equalization must be disabled before enabling this mode 1388f4b37ed0SZbigniew Bodek * The caller must make sure the port is ready to accept the TLPs it sends to 1389f4b37ed0SZbigniew Bodek * itself. for example, BARs should be initialized before sending memory TLPs. 1390f4b37ed0SZbigniew Bodek * 1391f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1392f4b37ed0SZbigniew Bodek * @return 0 if no error found 1393f4b37ed0SZbigniew Bodek */ 1394f4b37ed0SZbigniew Bodek int al_pcie_local_pipe_loopback_enter(struct al_pcie_port *pcie_port); 1395f4b37ed0SZbigniew Bodek 1396f4b37ed0SZbigniew Bodek /** 1397f4b37ed0SZbigniew Bodek * @brief exit local pipe loopback mode 1398f4b37ed0SZbigniew Bodek * 1399f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1400f4b37ed0SZbigniew Bodek * @return 0 if no error found 1401f4b37ed0SZbigniew Bodek */ 1402f4b37ed0SZbigniew Bodek int al_pcie_local_pipe_loopback_exit(struct al_pcie_port *pcie_port); 1403f4b37ed0SZbigniew Bodek 1404f4b37ed0SZbigniew Bodek /** 1405f4b37ed0SZbigniew Bodek * @brief enter master remote loopback mode 1406f4b37ed0SZbigniew Bodek * No need to configure the link partner to enter slave remote loopback mode 1407f4b37ed0SZbigniew Bodek * as this should be done as response to special training sequence directives 1408f4b37ed0SZbigniew Bodek * when master works in remote loopback mode. 1409f4b37ed0SZbigniew Bodek * The caller must make sure the port is ready to accept the TLPs it sends to 1410f4b37ed0SZbigniew Bodek * itself. for example, BARs should be initialized before sending memory TLPs. 1411f4b37ed0SZbigniew Bodek * 1412f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1413f4b37ed0SZbigniew Bodek * @return 0 if no error found 1414f4b37ed0SZbigniew Bodek */ 1415f4b37ed0SZbigniew Bodek int al_pcie_remote_loopback_enter(struct al_pcie_port *pcie_port); 1416f4b37ed0SZbigniew Bodek 1417f4b37ed0SZbigniew Bodek /** 1418f4b37ed0SZbigniew Bodek * @brief exit remote loopback mode 1419f4b37ed0SZbigniew Bodek * 1420f4b37ed0SZbigniew Bodek * @param pcie_port pcie port handle 1421f4b37ed0SZbigniew Bodek * @return 0 if no error found 1422f4b37ed0SZbigniew Bodek */ 1423f4b37ed0SZbigniew Bodek int al_pcie_remote_loopback_exit(struct al_pcie_port *pcie_port); 1424f4b37ed0SZbigniew Bodek 1425f4b37ed0SZbigniew Bodek #endif 1426f4b37ed0SZbigniew Bodek /** @} end of grouppcie group */ 1427