xref: /freebsd/sys/contrib/alpine-hal/al_hal_pcie.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
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