xref: /rk3399_ARM-atf/plat/brcm/board/stingray/src/paxb.c (revision a7e62f1d9ef6773c2c4ee186694fb2f3892f20f7)
13942d3a8SSheetal Tigadoli /*
23942d3a8SSheetal Tigadoli  * Copyright (c) 2016 - 2020, Broadcom
33942d3a8SSheetal Tigadoli  *
43942d3a8SSheetal Tigadoli  * SPDX-License-Identifier: BSD-3-Clause
53942d3a8SSheetal Tigadoli  */
63942d3a8SSheetal Tigadoli 
73942d3a8SSheetal Tigadoli #include <errno.h>
83942d3a8SSheetal Tigadoli #include <stdbool.h>
93942d3a8SSheetal Tigadoli 
103942d3a8SSheetal Tigadoli #include <common/debug.h>
113942d3a8SSheetal Tigadoli #include <drivers/delay_timer.h>
123942d3a8SSheetal Tigadoli #include <lib/mmio.h>
133942d3a8SSheetal Tigadoli 
143942d3a8SSheetal Tigadoli #include <paxb.h>
153942d3a8SSheetal Tigadoli #include <sr_def.h>
163942d3a8SSheetal Tigadoli #include <sr_utils.h>
173942d3a8SSheetal Tigadoli 
183942d3a8SSheetal Tigadoli #define PCIE_CORE_PWR_ARR_POWERON        0x8
193942d3a8SSheetal Tigadoli #define PCIE_CORE_PWR_ARR_POWEROK        0x4
203942d3a8SSheetal Tigadoli #define PCIE_CORE_PWR_POWERON            0x2
213942d3a8SSheetal Tigadoli #define PCIE_CORE_PWR_POWEROK            0x1
223942d3a8SSheetal Tigadoli 
233942d3a8SSheetal Tigadoli #define PCIE_CORE_USER_CFG               (PCIE_CORE_BASE + 0x38)
243942d3a8SSheetal Tigadoli #define PCIE_PAXB_SMMU_SID_CFG           (PCIE_CORE_BASE + 0x60)
253942d3a8SSheetal Tigadoli #ifdef SID_B8_D1_F1
263942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_BUS_WIDTH      (0x8 << 8)
273942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_DEV_WIDTH      (0x1 << 12)
283942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_FUN_WIDTH      (0x1 << 16)
293942d3a8SSheetal Tigadoli #else
303942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_BUS_WIDTH      (0x2 << 8)
313942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_DEV_WIDTH      (0x5 << 12)
323942d3a8SSheetal Tigadoli #define PAXB_SMMU_SID_CFG_FUN_WIDTH      (0x3 << 16)
333942d3a8SSheetal Tigadoli #endif
343942d3a8SSheetal Tigadoli 
353942d3a8SSheetal Tigadoli #define PAXB_APB_TIMEOUT_COUNT_OFFSET 0x034
363942d3a8SSheetal Tigadoli 
373942d3a8SSheetal Tigadoli /* allow up to 5 ms for each power switch to stabilize */
383942d3a8SSheetal Tigadoli #define PCIE_CORE_PWR_TIMEOUT_MS      5
393942d3a8SSheetal Tigadoli 
403942d3a8SSheetal Tigadoli /* wait 1 microsecond for PCIe core soft reset */
413942d3a8SSheetal Tigadoli #define PCIE_CORE_SOFT_RST_DELAY_US 1
423942d3a8SSheetal Tigadoli 
433942d3a8SSheetal Tigadoli /*
443942d3a8SSheetal Tigadoli  * List of PAXB APB registers
453942d3a8SSheetal Tigadoli  */
463942d3a8SSheetal Tigadoli #define PAXB_BASE                        0x48000000
473942d3a8SSheetal Tigadoli #define PAXB_BASE_OFFSET                 0x4000
483942d3a8SSheetal Tigadoli #define PAXB_OFFSET(core)                (PAXB_BASE + \
493942d3a8SSheetal Tigadoli 					  (core) * PAXB_BASE_OFFSET)
503942d3a8SSheetal Tigadoli 
513942d3a8SSheetal Tigadoli #define PAXB_CLK_CTRL_OFFSET             0x000
523942d3a8SSheetal Tigadoli #define PAXB_EP_PERST_SRC_SEL_MASK       (1 << 2)
533942d3a8SSheetal Tigadoli #define PAXB_EP_MODE_PERST_MASK          (1 << 1)
543942d3a8SSheetal Tigadoli #define PAXB_RC_PCIE_RST_OUT_MASK        (1 << 0)
553942d3a8SSheetal Tigadoli 
563942d3a8SSheetal Tigadoli #define PAXB_MAX_IMAP_WINDOWS            8
573942d3a8SSheetal Tigadoli #define PAXB_IMAP_REG_WIDTH              8
583942d3a8SSheetal Tigadoli #define PAXB_IMAP0_REG_WIDTH             4
593942d3a8SSheetal Tigadoli #define PAXB_AXUSER_REG_WIDTH            4
603942d3a8SSheetal Tigadoli 
613942d3a8SSheetal Tigadoli #define PAXB_CFG_IND_ADDR_OFFSET         0x120
623942d3a8SSheetal Tigadoli #define PAXB_CFG_IND_DATA_OFFSET         0x124
633942d3a8SSheetal Tigadoli #define PAXB_CFG_IND_ADDR_MASK           0x1ffc
643942d3a8SSheetal Tigadoli #define PAXB_CFG_CFG_TYPE_MASK           0x1
653942d3a8SSheetal Tigadoli 
663942d3a8SSheetal Tigadoli #define PAXB_EP_CFG_ADDR_OFFSET          0x1f8
673942d3a8SSheetal Tigadoli #define PAXB_EP_CFG_DATA_OFFSET          0x1fc
683942d3a8SSheetal Tigadoli #define PAXB_EP_CFG_ADDR_MASK            0xffc
693942d3a8SSheetal Tigadoli #define PAXB_EP_CFG_TYPE_MASK            0x1
703942d3a8SSheetal Tigadoli 
713942d3a8SSheetal Tigadoli #define PAXB_0_DEFAULT_IMAP              0xed0
723942d3a8SSheetal Tigadoli #define DEFAULT_ADDR_INVALID             BIT(0)
733942d3a8SSheetal Tigadoli #define PAXB_0_DEFAULT_IMAP_AXUSER       0xed8
743942d3a8SSheetal Tigadoli #define PAXB_0_DEFAULT_IMAP_AXCACHE      0xedc
753942d3a8SSheetal Tigadoli #define IMAP_AXCACHE                     0xff
763942d3a8SSheetal Tigadoli #define OARR_VALID                       BIT(0)
773942d3a8SSheetal Tigadoli #define IMAP_VALID                       BIT(0)
783942d3a8SSheetal Tigadoli 
793942d3a8SSheetal Tigadoli #define PAXB_IMAP0_BASE_OFFSET           0xc00
803942d3a8SSheetal Tigadoli #define PAXB_IARR0_BASE_OFFSET           0xd00
813942d3a8SSheetal Tigadoli #define PAXB_IMAP0_OFFSET(idx)           (PAXB_IMAP0_BASE_OFFSET + \
823942d3a8SSheetal Tigadoli 					  (idx) * PAXB_IMAP0_REG_WIDTH)
833942d3a8SSheetal Tigadoli #define PAXB_IMAP0_WINDOW_SIZE           0x1000
843942d3a8SSheetal Tigadoli 
853942d3a8SSheetal Tigadoli #define PAXB_IMAP2_OFFSET                0xcc0
863942d3a8SSheetal Tigadoli #define PAXB_IMAP0_REGS_TYPE_OFFSET      0xcd0
873942d3a8SSheetal Tigadoli #define PAXB_IARR2_LOWER_OFFSET          0xd10
883942d3a8SSheetal Tigadoli 
893942d3a8SSheetal Tigadoli #define PAXB_IMAP3_BASE_OFFSET           0xe08
903942d3a8SSheetal Tigadoli #define PAXB_IMAP3_OFFSET(idx)           (PAXB_IMAP3_BASE_OFFSET + \
913942d3a8SSheetal Tigadoli 					  (idx) * PAXB_IMAP_REG_WIDTH)
923942d3a8SSheetal Tigadoli 
933942d3a8SSheetal Tigadoli #define PAXB_IMAP3_0_AXUSER_B_OFFSET     0xe48
943942d3a8SSheetal Tigadoli #define PAXB_IMAP3_0_AXUSER_OFFSET(idx)  (PAXB_IMAP3_0_AXUSER_B_OFFSET + \
953942d3a8SSheetal Tigadoli 					  (idx) * PAXB_AXUSER_REG_WIDTH)
963942d3a8SSheetal Tigadoli 
973942d3a8SSheetal Tigadoli #define PAXB_IMAP4_BASE_OFFSET           0xe70
983942d3a8SSheetal Tigadoli #define PAXB_IMAP4_OFFSET(idx)           (PAXB_IMAP4_BASE_OFFSET + \
993942d3a8SSheetal Tigadoli 					  (idx) * PAXB_IMAP_REG_WIDTH)
1003942d3a8SSheetal Tigadoli 
1013942d3a8SSheetal Tigadoli #define PAXB_IMAP4_0_AXUSER_B_OFFSET     0xeb0
1023942d3a8SSheetal Tigadoli #define PAXB_IMAP4_0_AXUSER_OFFSET(idx)  (PAXB_IMAP4_0_AXUSER_B_OFFSET + \
1033942d3a8SSheetal Tigadoli 					  (idx) * PAXB_AXUSER_REG_WIDTH)
1043942d3a8SSheetal Tigadoli 
1053942d3a8SSheetal Tigadoli #define PAXB_CFG_LINK_STATUS_OFFSET      0xf0c
1063942d3a8SSheetal Tigadoli #define PAXB_CFG_PHYLINKUP_MASK          (1 << 3)
1073942d3a8SSheetal Tigadoli #define PAXB_CFG_DL_ACTIVE_MASK          (1 << 2)
1083942d3a8SSheetal Tigadoli 
1093942d3a8SSheetal Tigadoli #define PAXB_IMAP0_0_AXUSER_OFFSET       0xf60
1103942d3a8SSheetal Tigadoli #define PAXB_IMAP2_AXUSER_OFFSET         0xfe0
1113942d3a8SSheetal Tigadoli 
1123942d3a8SSheetal Tigadoli /* cacheable write-back, allocate on both reads and writes */
1133942d3a8SSheetal Tigadoli #define IMAP_ARCACHE                     0x0f0
1143942d3a8SSheetal Tigadoli #define IMAP_AWCACHE                     0xf00
1153942d3a8SSheetal Tigadoli /* normal access, nonsecure access, and data access */
1163942d3a8SSheetal Tigadoli /* AWQOS:0xe and ARQOS:0xa */
1173942d3a8SSheetal Tigadoli /* AWPROT:0x2 and ARPROT:0x1 */
1183942d3a8SSheetal Tigadoli #define IMAP_AXUSER                      0x002e002a
1193942d3a8SSheetal Tigadoli 
1203942d3a8SSheetal Tigadoli /*
1213942d3a8SSheetal Tigadoli  * List of NIC security and PIPEMUX related registers
1223942d3a8SSheetal Tigadoli  */
1233942d3a8SSheetal Tigadoli #define SR_PCIE_NIC_SECURITY_BASE      0x58100000
1243942d3a8SSheetal Tigadoli #define NS3Z_PCIE_NIC_SECURITY_BASE    0x48100000
1253942d3a8SSheetal Tigadoli 
1263942d3a8SSheetal Tigadoli #define GITS_TRANSLATER                0x63c30000
1273942d3a8SSheetal Tigadoli 
1283942d3a8SSheetal Tigadoli #define VENDOR_ID                 0x14e4
1293942d3a8SSheetal Tigadoli #define CFG_RC_DEV_ID             0x434
1303942d3a8SSheetal Tigadoli #define CFG_RC_DEV_SUBID          0x438
1313942d3a8SSheetal Tigadoli #define PCI_BRIDGE_CTRL_REG_OFFSET     0x43c
1323942d3a8SSheetal Tigadoli #define PCI_CLASS_BRIDGE_MASK          0xffff00
1333942d3a8SSheetal Tigadoli #define PCI_CLASS_BRIDGE_SHIFT         8
1343942d3a8SSheetal Tigadoli #define PCI_CLASS_BRIDGE_PCI           0x0604
1353942d3a8SSheetal Tigadoli 
1363942d3a8SSheetal Tigadoli /*
1373942d3a8SSheetal Tigadoli  * List of PAXB RC configuration space registers
1383942d3a8SSheetal Tigadoli  */
1393942d3a8SSheetal Tigadoli 
1403942d3a8SSheetal Tigadoli /* first capability list entry */
1413942d3a8SSheetal Tigadoli #define PCI_CAPABILITY_LIST_OFFSET    0x34
1423942d3a8SSheetal Tigadoli #define PCI_CAPABILITY_SPEED_OFFSET   0xc
1433942d3a8SSheetal Tigadoli #define PCI_EP_CAPABILITY_OFFSET      0x10
1443942d3a8SSheetal Tigadoli 
1453942d3a8SSheetal Tigadoli #define CFG_RC_LINK_STATUS_CTRL_2     0x0dc
1463942d3a8SSheetal Tigadoli #define CFG_RC_LINK_SPEED_SHIFT       0
1473942d3a8SSheetal Tigadoli #define CFG_RC_LINK_SPEED_MASK        (0xf << CFG_RC_LINK_SPEED_SHIFT)
1483942d3a8SSheetal Tigadoli 
1493942d3a8SSheetal Tigadoli #define CFG_RC_DEVICE_CAP             0x4d4
1503942d3a8SSheetal Tigadoli #define CFG_RC_DEVICE_CAP_MPS_SHIFT   0
1513942d3a8SSheetal Tigadoli #define CFG_RC_DEVICE_CAP_MPS_MASK    (0x7 << CFG_RC_DEVICE_CAP_MPS_SHIFT)
1523942d3a8SSheetal Tigadoli /* MPS 256 bytes */
1533942d3a8SSheetal Tigadoli #define CFG_RC_DEVICE_CAP_MPS_256B    (0x1 << CFG_RC_DEVICE_CAP_MPS_SHIFT)
1543942d3a8SSheetal Tigadoli /* MPS 512 bytes */
1553942d3a8SSheetal Tigadoli #define CFG_RC_DEVICE_CAP_MPS_512B    (0x2 << CFG_RC_DEVICE_CAP_MPS_SHIFT)
1563942d3a8SSheetal Tigadoli 
1573942d3a8SSheetal Tigadoli #define CFG_RC_TL_FCIMM_NP_LIMIT       0xa10
1583942d3a8SSheetal Tigadoli #define CFG_RC_TL_FCIMM_NP_VAL         0x01500000
1593942d3a8SSheetal Tigadoli #define CFG_RC_TL_FCIMM_P_LIMIT        0xa14
1603942d3a8SSheetal Tigadoli #define CFG_RC_TL_FCIMM_P_VAL          0x03408080
1613942d3a8SSheetal Tigadoli 
1623942d3a8SSheetal Tigadoli #define CFG_RC_LINK_CAP               0x4dc
1633942d3a8SSheetal Tigadoli #define CFG_RC_LINK_CAP_SPEED_SHIFT   0
1643942d3a8SSheetal Tigadoli #define CFG_RC_LINK_CAP_SPEED_MASK    (0xf << CFG_RC_LINK_CAP_SPEED_SHIFT)
1653942d3a8SSheetal Tigadoli #define CFG_RC_LINK_CAP_WIDTH_SHIFT   4
1663942d3a8SSheetal Tigadoli #define CFG_RC_LINK_CAP_WIDTH_MASK    (0x1f << CFG_RC_LINK_CAP_WIDTH_SHIFT)
1673942d3a8SSheetal Tigadoli 
1683942d3a8SSheetal Tigadoli #define CFG_LINK_CAP_RC               0x4f0
1693942d3a8SSheetal Tigadoli #define CFG_RC_DL_ACTIVE_SHIFT        0
1703942d3a8SSheetal Tigadoli #define CFG_RC_DL_ACTIVE_MASK         (0x1 << CFG_RC_DL_ACTIVE_SHIFT)
1713942d3a8SSheetal Tigadoli #define CFG_RC_SLOT_CLK_SHIFT         1
1723942d3a8SSheetal Tigadoli #define CFG_RC_SLOT_CLK_MASK          (0x1 << CFG_RC_SLOT_CLK_SHIFT)
1733942d3a8SSheetal Tigadoli 
1743942d3a8SSheetal Tigadoli #define CFG_ROOT_CAP_RC               0x4f8
1753942d3a8SSheetal Tigadoli #define CFG_ROOT_CAP_LTR_SHIFT        1
1763942d3a8SSheetal Tigadoli #define CFG_ROOT_CAP_LTR_MASK         (0x1 << CFG_ROOT_CAP_LTR_SHIFT)
1773942d3a8SSheetal Tigadoli 
1783942d3a8SSheetal Tigadoli #define CFG_RC_CLKREQ_ENABLED         0x4fc
1793942d3a8SSheetal Tigadoli #define CFG_RC_CLKREQ_ENABLED_SHIFT   0
1803942d3a8SSheetal Tigadoli #define CFG_RC_CLKREQ_ENABLED_MASK    (0x1 << CFG_RC_CLKREQ_ENABLED_SHIFT)
1813942d3a8SSheetal Tigadoli 
1823942d3a8SSheetal Tigadoli #define CFG_RC_COEFF_ADDR             0x638
1833942d3a8SSheetal Tigadoli 
1843942d3a8SSheetal Tigadoli #define CFG_RC_TL_CTRL_0              0x800
1853942d3a8SSheetal Tigadoli #define RC_MEM_DW_CHK_MASK            0x03fe
1863942d3a8SSheetal Tigadoli 
1873942d3a8SSheetal Tigadoli #define CFG_RC_PDL_CTRL_4             0x1010
1883942d3a8SSheetal Tigadoli #define NPH_FC_INIT_SHIFT             24
1893942d3a8SSheetal Tigadoli #define NPH_FC_INIT_MASK              (U(0xff) << NPH_FC_INIT_SHIFT)
1903942d3a8SSheetal Tigadoli #define PD_FC_INIT_SHIFT              12
1913942d3a8SSheetal Tigadoli #define PD_FC_INIT_MASK               (0xffff << PD_FC_INIT_SHIFT)
1923942d3a8SSheetal Tigadoli 
1933942d3a8SSheetal Tigadoli #define CFG_RC_PDL_CTRL_5             0x1014
1943942d3a8SSheetal Tigadoli #define PH_INIT_SHIFT                 0
1953942d3a8SSheetal Tigadoli #define PH_INIT_MASK                  (0xff << PH_INIT_SHIFT)
1963942d3a8SSheetal Tigadoli 
1973942d3a8SSheetal Tigadoli #define DL_STATUS_OFFSET              0x1048
1983942d3a8SSheetal Tigadoli #define PHYLINKUP                     BIT(13)
1993942d3a8SSheetal Tigadoli 
2003942d3a8SSheetal Tigadoli #define PH_INIT                       0x10
2013942d3a8SSheetal Tigadoli #define PD_FC_INIT                    0x100
2023942d3a8SSheetal Tigadoli #define NPH_FC_INIT                   0x8
2033942d3a8SSheetal Tigadoli 
2043942d3a8SSheetal Tigadoli #define SRP_PH_INIT                   0x7F
2053942d3a8SSheetal Tigadoli #define SRP_PD_FC_INIT                0x200
2063942d3a8SSheetal Tigadoli #define SRP_NPH_FC_INIT               0x7F
2073942d3a8SSheetal Tigadoli 
2083942d3a8SSheetal Tigadoli #define CFG_ADDR_BUS_NUM_SHIFT        20
2093942d3a8SSheetal Tigadoli #define CFG_ADDR_DEV_NUM_SHIFT        15
2103942d3a8SSheetal Tigadoli #define CFG_ADDR_FUNC_NUM_SHIFT       12
2113942d3a8SSheetal Tigadoli #define CFG_ADDR_REG_NUM_SHIFT        2
2123942d3a8SSheetal Tigadoli #define CFG_ADDR_REG_NUM_MASK         0x00000ffc
2133942d3a8SSheetal Tigadoli #define CFG_ADDR_CFG_TYPE_MASK        0x00000003
2143942d3a8SSheetal Tigadoli 
2153942d3a8SSheetal Tigadoli #define DL_LINK_UP_TIMEOUT_MS         1000
2163942d3a8SSheetal Tigadoli 
2173942d3a8SSheetal Tigadoli #define CFG_RETRY_STATUS              0xffff0001
2183942d3a8SSheetal Tigadoli #define CRS_TIMEOUT_MS                5000
2193942d3a8SSheetal Tigadoli 
2203942d3a8SSheetal Tigadoli /* create EP config data to write */
2213942d3a8SSheetal Tigadoli #define DEF_BUS_NO                    1 /* default bus 1 */
2223942d3a8SSheetal Tigadoli #define DEF_SLOT_NO                   0 /* default slot 0 */
2233942d3a8SSheetal Tigadoli #define DEF_FN_NO                     0 /* default fn 0 */
2243942d3a8SSheetal Tigadoli 
2253942d3a8SSheetal Tigadoli #define EP_CONFIG_VAL(bus_no, slot, fn, where) \
2263942d3a8SSheetal Tigadoli 	(((bus_no) << CFG_ADDR_BUS_NUM_SHIFT) | \
2273942d3a8SSheetal Tigadoli 	((slot) << CFG_ADDR_DEV_NUM_SHIFT) | \
2283942d3a8SSheetal Tigadoli 	((fn) << CFG_ADDR_FUNC_NUM_SHIFT) | \
2293942d3a8SSheetal Tigadoli 	((where) & CFG_ADDR_REG_NUM_MASK) | \
2303942d3a8SSheetal Tigadoli 	(1 & CFG_ADDR_CFG_TYPE_MASK))
2313942d3a8SSheetal Tigadoli 
2323942d3a8SSheetal Tigadoli /* PAXB security offset */
2333942d3a8SSheetal Tigadoli #define PAXB_SECURITY_IDM_OFFSET 0x1c
2343942d3a8SSheetal Tigadoli #define PAXB_SECURITY_APB_OFFSET 0x24
2353942d3a8SSheetal Tigadoli #define PAXB_SECURITY_ECAM_OFFSET 0x3c
2363942d3a8SSheetal Tigadoli 
2373942d3a8SSheetal Tigadoli #define paxb_get_config(type) paxb_get_##type##_config()
2383942d3a8SSheetal Tigadoli 
2393942d3a8SSheetal Tigadoli static unsigned int paxb_sec_reg_offset[] = {
2403942d3a8SSheetal Tigadoli 	0x0c, /* PAXB0 AXI */
2413942d3a8SSheetal Tigadoli 	0x10, /* PAXB1 AXI */
2423942d3a8SSheetal Tigadoli 	0x14, /* PAXB2 AXI */
2433942d3a8SSheetal Tigadoli 	0x18, /* PAXB3 AXI */
2443942d3a8SSheetal Tigadoli 	0x20, /* PAXB4 AXI */
2453942d3a8SSheetal Tigadoli 	0x28, /* PAXB5 AXI */
2463942d3a8SSheetal Tigadoli 	0x2c, /* PAXB6 AXI */
2473942d3a8SSheetal Tigadoli 	0x30, /* PAXB7 AXI */
2483942d3a8SSheetal Tigadoli 	0x24, /* PAXB APB */
2493942d3a8SSheetal Tigadoli };
2503942d3a8SSheetal Tigadoli 
2513942d3a8SSheetal Tigadoli const paxb_cfg *paxb;
2523942d3a8SSheetal Tigadoli 
2533942d3a8SSheetal Tigadoli /*
2543942d3a8SSheetal Tigadoli  * Given a PIPEMUX strap and PCIe core index, this function returns 1 if a
2553942d3a8SSheetal Tigadoli  * PCIe core needs to be enabled
2563942d3a8SSheetal Tigadoli  */
pcie_core_needs_enable(unsigned int core_idx)2573942d3a8SSheetal Tigadoli int pcie_core_needs_enable(unsigned int core_idx)
2583942d3a8SSheetal Tigadoli {
2593942d3a8SSheetal Tigadoli 	if (paxb->core_needs_enable)
2603942d3a8SSheetal Tigadoli 		return paxb->core_needs_enable(core_idx);
2613942d3a8SSheetal Tigadoli 
2623942d3a8SSheetal Tigadoli 	return 0;
2633942d3a8SSheetal Tigadoli }
2643942d3a8SSheetal Tigadoli 
pcie_set_default_tx_coeff(uint32_t core_idx,uint32_t link_width)2653942d3a8SSheetal Tigadoli static void pcie_set_default_tx_coeff(uint32_t core_idx, uint32_t link_width)
2663942d3a8SSheetal Tigadoli {
2673942d3a8SSheetal Tigadoli 	unsigned int lanes = 0;
2683942d3a8SSheetal Tigadoli 	uint32_t data, addr;
2693942d3a8SSheetal Tigadoli 
2703942d3a8SSheetal Tigadoli 	addr = CFG_RC_COEFF_ADDR;
2713942d3a8SSheetal Tigadoli 	for (lanes = 0; lanes < link_width; lanes = lanes + 2) {
2723942d3a8SSheetal Tigadoli 		data = paxb_rc_cfg_read(core_idx, addr);
2733942d3a8SSheetal Tigadoli 		data &= 0xf0f0f0f0;
2743942d3a8SSheetal Tigadoli 		data |= (7 & 0xf);
2753942d3a8SSheetal Tigadoli 		data |= (7 & 0xf) << 8;
2763942d3a8SSheetal Tigadoli 		data |= (7 & 0xf) << 16;
2773942d3a8SSheetal Tigadoli 		data |= (7 & 0xf) << 24;
2783942d3a8SSheetal Tigadoli 
2793942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, addr, data);
2803942d3a8SSheetal Tigadoli 		addr += 4;
2813942d3a8SSheetal Tigadoli 	}
2823942d3a8SSheetal Tigadoli }
2833942d3a8SSheetal Tigadoli 
paxb_rc_link_init(void)2843942d3a8SSheetal Tigadoli static int paxb_rc_link_init(void)
2853942d3a8SSheetal Tigadoli {
2863942d3a8SSheetal Tigadoli 	uint32_t val, link_speed;
2873942d3a8SSheetal Tigadoli 	unsigned int link_width;
2883942d3a8SSheetal Tigadoli 	uint32_t core_idx;
2893942d3a8SSheetal Tigadoli 
2903942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
2913942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
2923942d3a8SSheetal Tigadoli 			continue;
2933942d3a8SSheetal Tigadoli 
2943942d3a8SSheetal Tigadoli 		link_width = paxb->get_link_width(core_idx);
2953942d3a8SSheetal Tigadoli 		if (!link_width) {
2963942d3a8SSheetal Tigadoli 			ERROR("Unsupported PIPEMUX\n");
2973942d3a8SSheetal Tigadoli 			return -EOPNOTSUPP;
2983942d3a8SSheetal Tigadoli 		}
2993942d3a8SSheetal Tigadoli 
3003942d3a8SSheetal Tigadoli 		link_speed = paxb->get_link_speed();
3013942d3a8SSheetal Tigadoli 		/* program RC's link cap reg to advertise proper link width */
3023942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_LINK_CAP);
3033942d3a8SSheetal Tigadoli 		val &= ~CFG_RC_LINK_CAP_WIDTH_MASK;
3043942d3a8SSheetal Tigadoli 		val |= (link_width << CFG_RC_LINK_CAP_WIDTH_SHIFT);
3053942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_LINK_CAP, val);
3063942d3a8SSheetal Tigadoli 
3073942d3a8SSheetal Tigadoli 		/* program RC's link cap reg to advertise proper link speed */
3083942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_LINK_CAP);
3093942d3a8SSheetal Tigadoli 		val &= ~CFG_RC_LINK_CAP_SPEED_MASK;
3103942d3a8SSheetal Tigadoli 		val |= link_speed << CFG_RC_LINK_CAP_SPEED_SHIFT;
3113942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_LINK_CAP, val);
3123942d3a8SSheetal Tigadoli 
3133942d3a8SSheetal Tigadoli 		/* also need to program RC's link status control register */
3143942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_LINK_STATUS_CTRL_2);
3153942d3a8SSheetal Tigadoli 		val &= ~(CFG_RC_LINK_SPEED_MASK);
3163942d3a8SSheetal Tigadoli 		val |= link_speed << CFG_RC_LINK_SPEED_SHIFT;
3173942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_LINK_STATUS_CTRL_2, val);
3183942d3a8SSheetal Tigadoli 
3193942d3a8SSheetal Tigadoli #ifdef WAR_PLX_PRESET_PARITY_FAIL
3203942d3a8SSheetal Tigadoli 		/* WAR to avoid crash with PLX switch in GEN3*/
3213942d3a8SSheetal Tigadoli 		/* While PRESET, PLX switch is not fixing parity so disabled */
3223942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_REG_PHY_CTL_10);
3233942d3a8SSheetal Tigadoli 		val &= ~(PHY_CTL_10_GEN3_MATCH_PARITY);
3243942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_REG_PHY_CTL_10, val);
3253942d3a8SSheetal Tigadoli #endif
3263942d3a8SSheetal Tigadoli 		pcie_set_default_tx_coeff(core_idx, link_width);
3273942d3a8SSheetal Tigadoli 	}
3283942d3a8SSheetal Tigadoli 	return 0;
3293942d3a8SSheetal Tigadoli }
3303942d3a8SSheetal Tigadoli 
3313942d3a8SSheetal Tigadoli #ifdef PAXB_LINKUP
paxb_perst_ctrl(unsigned int core_idx,bool assert)3323942d3a8SSheetal Tigadoli static void paxb_perst_ctrl(unsigned int core_idx, bool assert)
3333942d3a8SSheetal Tigadoli {
3343942d3a8SSheetal Tigadoli 	uint32_t clk_ctrl = PAXB_OFFSET(core_idx) + PAXB_CLK_CTRL_OFFSET;
3353942d3a8SSheetal Tigadoli 
3363942d3a8SSheetal Tigadoli 	if (assert) {
3373942d3a8SSheetal Tigadoli 		mmio_clrbits_32(clk_ctrl, PAXB_EP_PERST_SRC_SEL_MASK |
3383942d3a8SSheetal Tigadoli 				PAXB_EP_MODE_PERST_MASK |
3393942d3a8SSheetal Tigadoli 				PAXB_RC_PCIE_RST_OUT_MASK);
3403942d3a8SSheetal Tigadoli 		udelay(250);
3413942d3a8SSheetal Tigadoli 	} else {
3423942d3a8SSheetal Tigadoli 		mmio_setbits_32(clk_ctrl, PAXB_RC_PCIE_RST_OUT_MASK);
3433942d3a8SSheetal Tigadoli 		mdelay(100);
3443942d3a8SSheetal Tigadoli 	}
3453942d3a8SSheetal Tigadoli }
3463942d3a8SSheetal Tigadoli 
paxb_start_link_up(void)3473942d3a8SSheetal Tigadoli static void paxb_start_link_up(void)
3483942d3a8SSheetal Tigadoli {
3493942d3a8SSheetal Tigadoli 	unsigned int core_idx;
3503942d3a8SSheetal Tigadoli 	uint32_t val, timeout;
3513942d3a8SSheetal Tigadoli 
3523942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
3533942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
3543942d3a8SSheetal Tigadoli 			continue;
3553942d3a8SSheetal Tigadoli 
3563942d3a8SSheetal Tigadoli 		/* toggle PERST */
3573942d3a8SSheetal Tigadoli 		paxb_perst_ctrl(core_idx, true);
3583942d3a8SSheetal Tigadoli 		paxb_perst_ctrl(core_idx, false);
3593942d3a8SSheetal Tigadoli 
3603942d3a8SSheetal Tigadoli 		timeout = DL_LINK_UP_TIMEOUT_MS;
3613942d3a8SSheetal Tigadoli 		/* wait for Link up */
3623942d3a8SSheetal Tigadoli 		do {
3633942d3a8SSheetal Tigadoli 			val = mmio_read_32(PAXB_OFFSET(core_idx) +
3643942d3a8SSheetal Tigadoli 					   PAXB_CFG_LINK_STATUS_OFFSET);
3653942d3a8SSheetal Tigadoli 			if (val & PAXB_CFG_DL_ACTIVE_MASK)
3663942d3a8SSheetal Tigadoli 				break;
3673942d3a8SSheetal Tigadoli 
3683942d3a8SSheetal Tigadoli 			mdelay(1);
3693942d3a8SSheetal Tigadoli 		} while (--timeout);
3703942d3a8SSheetal Tigadoli 
3713942d3a8SSheetal Tigadoli 		if (!timeout)
3723942d3a8SSheetal Tigadoli 			ERROR("PAXB core %u link is down\n", core_idx);
3733942d3a8SSheetal Tigadoli 	}
3743942d3a8SSheetal Tigadoli }
3753942d3a8SSheetal Tigadoli #endif
3763942d3a8SSheetal Tigadoli 
pcie_core_soft_reset(unsigned int core_idx)3773942d3a8SSheetal Tigadoli static void pcie_core_soft_reset(unsigned int core_idx)
3783942d3a8SSheetal Tigadoli {
3793942d3a8SSheetal Tigadoli 	uint32_t offset = core_idx * PCIE_CORE_PWR_OFFSET;
3803942d3a8SSheetal Tigadoli 	uintptr_t ctrl = (uintptr_t)(PCIE_CORE_SOFT_RST_CFG_BASE + offset);
3813942d3a8SSheetal Tigadoli 
3823942d3a8SSheetal Tigadoli 	/* Put PCIe core in soft reset */
3833942d3a8SSheetal Tigadoli 	mmio_clrbits_32(ctrl, PCIE_CORE_SOFT_RST);
3843942d3a8SSheetal Tigadoli 
3853942d3a8SSheetal Tigadoli 	/* Wait for 1 us before pulling PCIe core out of soft reset */
3863942d3a8SSheetal Tigadoli 	udelay(PCIE_CORE_SOFT_RST_DELAY_US);
3873942d3a8SSheetal Tigadoli 
3883942d3a8SSheetal Tigadoli 	mmio_setbits_32(ctrl, PCIE_CORE_SOFT_RST);
3893942d3a8SSheetal Tigadoli }
3903942d3a8SSheetal Tigadoli 
pcie_core_pwron_switch(uintptr_t ctrl,uintptr_t status,uint32_t mask)3913942d3a8SSheetal Tigadoli static int pcie_core_pwron_switch(uintptr_t ctrl, uintptr_t status,
3923942d3a8SSheetal Tigadoli 				  uint32_t mask)
3933942d3a8SSheetal Tigadoli {
3943942d3a8SSheetal Tigadoli 	uint32_t val;
3953942d3a8SSheetal Tigadoli 	unsigned int timeout = PCIE_CORE_PWR_TIMEOUT_MS;
3963942d3a8SSheetal Tigadoli 
3973942d3a8SSheetal Tigadoli 	/* enable switch */
3983942d3a8SSheetal Tigadoli 	mmio_setbits_32(ctrl, mask);
3993942d3a8SSheetal Tigadoli 
4003942d3a8SSheetal Tigadoli 	/* now wait for it to stabilize */
4013942d3a8SSheetal Tigadoli 	do {
4023942d3a8SSheetal Tigadoli 		val = mmio_read_32(status);
4033942d3a8SSheetal Tigadoli 		if ((val & mask) == mask)
4043942d3a8SSheetal Tigadoli 			return 0;
4053942d3a8SSheetal Tigadoli 		mdelay(1);
4063942d3a8SSheetal Tigadoli 	} while (--timeout);
4073942d3a8SSheetal Tigadoli 
4083942d3a8SSheetal Tigadoli 	return -EIO;
4093942d3a8SSheetal Tigadoli }
4103942d3a8SSheetal Tigadoli 
pcie_core_pwr_seq(uintptr_t ctrl,uintptr_t status)4113942d3a8SSheetal Tigadoli static int pcie_core_pwr_seq(uintptr_t ctrl, uintptr_t status)
4123942d3a8SSheetal Tigadoli {
4133942d3a8SSheetal Tigadoli 	int ret;
4143942d3a8SSheetal Tigadoli 
4153942d3a8SSheetal Tigadoli 	/*
4163942d3a8SSheetal Tigadoli 	 * Enable the switch with the following sequence:
4173942d3a8SSheetal Tigadoli 	 * 1. Array weak switch output switch
4183942d3a8SSheetal Tigadoli 	 * 2. Array strong switch
4193942d3a8SSheetal Tigadoli 	 * 3. Weak switch output acknowledge
4203942d3a8SSheetal Tigadoli 	 * 4. Strong switch output acknowledge
4213942d3a8SSheetal Tigadoli 	 */
4223942d3a8SSheetal Tigadoli 	ret = pcie_core_pwron_switch(ctrl, status, PCIE_CORE_PWR_ARR_POWERON);
4233942d3a8SSheetal Tigadoli 	if (ret)
4243942d3a8SSheetal Tigadoli 		return ret;
4253942d3a8SSheetal Tigadoli 
4263942d3a8SSheetal Tigadoli 	ret = pcie_core_pwron_switch(ctrl, status, PCIE_CORE_PWR_ARR_POWEROK);
4273942d3a8SSheetal Tigadoli 	if (ret)
4283942d3a8SSheetal Tigadoli 		return ret;
4293942d3a8SSheetal Tigadoli 
4303942d3a8SSheetal Tigadoli 	ret = pcie_core_pwron_switch(ctrl, status, PCIE_CORE_PWR_POWERON);
4313942d3a8SSheetal Tigadoli 	if (ret)
4323942d3a8SSheetal Tigadoli 		return ret;
4333942d3a8SSheetal Tigadoli 
4343942d3a8SSheetal Tigadoli 	ret = pcie_core_pwron_switch(ctrl, status, PCIE_CORE_PWR_POWEROK);
4353942d3a8SSheetal Tigadoli 	if (ret)
4363942d3a8SSheetal Tigadoli 		return ret;
4373942d3a8SSheetal Tigadoli 
4383942d3a8SSheetal Tigadoli 	return 0;
4393942d3a8SSheetal Tigadoli }
4403942d3a8SSheetal Tigadoli 
4413942d3a8SSheetal Tigadoli /*
4423942d3a8SSheetal Tigadoli  * This function enables PCIe core and PAXB memory buffer power, and then
4433942d3a8SSheetal Tigadoli  * remove the PCIe core from isolation
4443942d3a8SSheetal Tigadoli  */
pcie_core_pwr_init(unsigned int core_idx)4453942d3a8SSheetal Tigadoli static int pcie_core_pwr_init(unsigned int core_idx)
4463942d3a8SSheetal Tigadoli {
4473942d3a8SSheetal Tigadoli 	int ret;
4483942d3a8SSheetal Tigadoli 	uint32_t offset = core_idx * PCIE_CORE_PWR_OFFSET;
4493942d3a8SSheetal Tigadoli 	uintptr_t ctrl, status;
4503942d3a8SSheetal Tigadoli 
4513942d3a8SSheetal Tigadoli 	/* enable mem power to PCIe core */
4523942d3a8SSheetal Tigadoli 	ctrl = (uintptr_t)(PCIE_CORE_MEM_PWR_BASE + offset);
4533942d3a8SSheetal Tigadoli 	status = (uintptr_t)(PCIE_CORE_MEM_PWR_STATUS_BASE + offset);
4543942d3a8SSheetal Tigadoli 	ret = pcie_core_pwr_seq(ctrl, status);
4553942d3a8SSheetal Tigadoli 	if (ret) {
4563942d3a8SSheetal Tigadoli 		ERROR("PCIe core mem power failed\n");
4573942d3a8SSheetal Tigadoli 		return ret;
4583942d3a8SSheetal Tigadoli 	}
4593942d3a8SSheetal Tigadoli 
4603942d3a8SSheetal Tigadoli 	/* now enable mem power to PAXB wrapper */
4613942d3a8SSheetal Tigadoli 	ctrl = (uintptr_t)(PCIE_PAXB_MEM_PWR_BASE + offset);
4623942d3a8SSheetal Tigadoli 	status = (uintptr_t)(PCIE_PAXB_MEM_PWR_STATUS_BASE + offset);
4633942d3a8SSheetal Tigadoli 	ret = pcie_core_pwr_seq(ctrl, status);
4643942d3a8SSheetal Tigadoli 	if (ret) {
4653942d3a8SSheetal Tigadoli 		ERROR("PAXB mem power failed\n");
4663942d3a8SSheetal Tigadoli 		return ret;
4673942d3a8SSheetal Tigadoli 	}
4683942d3a8SSheetal Tigadoli 
4693942d3a8SSheetal Tigadoli 	/* now remove power isolation */
4703942d3a8SSheetal Tigadoli 	ctrl = (uintptr_t)(PCIE_CORE_ISO_CFG_BASE + offset);
4713942d3a8SSheetal Tigadoli 	mmio_clrbits_32(ctrl, PCIE_CORE_ISO | PCIE_CORE_MEM_ISO);
4723942d3a8SSheetal Tigadoli 
4733942d3a8SSheetal Tigadoli 	return 0;
4743942d3a8SSheetal Tigadoli }
4753942d3a8SSheetal Tigadoli 
pcie_ss_reset(void)4763942d3a8SSheetal Tigadoli static void pcie_ss_reset(void)
4773942d3a8SSheetal Tigadoli {
4783942d3a8SSheetal Tigadoli 	mmio_setbits_32(CDRU_MISC_RESET_CONTROL,
4793942d3a8SSheetal Tigadoli 			1 << CDRU_MISC_RESET_CONTROL__CDRU_PCIE_RESET_N_R);
4803942d3a8SSheetal Tigadoli }
4813942d3a8SSheetal Tigadoli 
4823942d3a8SSheetal Tigadoli /*
4833942d3a8SSheetal Tigadoli  * This function reads the PIPEMUX strap, figures out all the PCIe cores that
4843942d3a8SSheetal Tigadoli  * need to be enabled and enable the mem power for those cores
4853942d3a8SSheetal Tigadoli  */
pcie_cores_init(void)4863942d3a8SSheetal Tigadoli static int pcie_cores_init(void)
4873942d3a8SSheetal Tigadoli {
488*21767166SSheetal Tigadoli 	int ret = 0;
4893942d3a8SSheetal Tigadoli 	uint32_t core_idx;
4903942d3a8SSheetal Tigadoli 
4913942d3a8SSheetal Tigadoli 	if (paxb->pipemux_init) {
4923942d3a8SSheetal Tigadoli 		ret = paxb->pipemux_init();
4933942d3a8SSheetal Tigadoli 		if (ret)
4943942d3a8SSheetal Tigadoli 			return ret;
4953942d3a8SSheetal Tigadoli 	}
4963942d3a8SSheetal Tigadoli 
4973942d3a8SSheetal Tigadoli 	/* bring PCIe subsystem out of reset */
4983942d3a8SSheetal Tigadoli 	pcie_ss_reset();
4993942d3a8SSheetal Tigadoli 
5003942d3a8SSheetal Tigadoli 	/* power up all PCIe cores that will be used as RC */
5013942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
5023942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
5033942d3a8SSheetal Tigadoli 			continue;
5043942d3a8SSheetal Tigadoli 
5053942d3a8SSheetal Tigadoli 		ret = pcie_core_pwr_init(core_idx);
5063942d3a8SSheetal Tigadoli 		if (ret) {
5073942d3a8SSheetal Tigadoli 			ERROR("PCIe core %u power up failed\n", core_idx);
5083942d3a8SSheetal Tigadoli 			return ret;
5093942d3a8SSheetal Tigadoli 		}
5103942d3a8SSheetal Tigadoli 
5113942d3a8SSheetal Tigadoli 		pcie_core_soft_reset(core_idx);
5123942d3a8SSheetal Tigadoli 
5133942d3a8SSheetal Tigadoli 		VERBOSE("PCIe core %u is powered up\n", core_idx);
5143942d3a8SSheetal Tigadoli 	}
5153942d3a8SSheetal Tigadoli 
5163942d3a8SSheetal Tigadoli 	return ret;
5173942d3a8SSheetal Tigadoli }
5183942d3a8SSheetal Tigadoli 
paxb_rc_cfg_write(unsigned int core_idx,unsigned int where,uint32_t val)5193942d3a8SSheetal Tigadoli void paxb_rc_cfg_write(unsigned int core_idx, unsigned int where,
5203942d3a8SSheetal Tigadoli 			      uint32_t val)
5213942d3a8SSheetal Tigadoli {
5223942d3a8SSheetal Tigadoli 	mmio_write_32(PAXB_OFFSET(core_idx) + PAXB_CFG_IND_ADDR_OFFSET,
5233942d3a8SSheetal Tigadoli 		      (where & PAXB_CFG_IND_ADDR_MASK) |
5243942d3a8SSheetal Tigadoli 		      PAXB_CFG_CFG_TYPE_MASK);
5253942d3a8SSheetal Tigadoli 	mmio_write_32(PAXB_OFFSET(core_idx) + PAXB_CFG_IND_DATA_OFFSET, val);
5263942d3a8SSheetal Tigadoli }
5273942d3a8SSheetal Tigadoli 
paxb_rc_cfg_read(unsigned int core_idx,unsigned int where)5283942d3a8SSheetal Tigadoli unsigned int paxb_rc_cfg_read(unsigned int core_idx, unsigned int where)
5293942d3a8SSheetal Tigadoli {
5303942d3a8SSheetal Tigadoli 	unsigned int val;
5313942d3a8SSheetal Tigadoli 
5323942d3a8SSheetal Tigadoli 	mmio_write_32(PAXB_OFFSET(core_idx) + PAXB_CFG_IND_ADDR_OFFSET,
5333942d3a8SSheetal Tigadoli 		      (where & PAXB_CFG_IND_ADDR_MASK) |
5343942d3a8SSheetal Tigadoli 		      PAXB_CFG_CFG_TYPE_MASK);
5353942d3a8SSheetal Tigadoli 	val = mmio_read_32(PAXB_OFFSET(core_idx) + PAXB_CFG_IND_DATA_OFFSET);
5363942d3a8SSheetal Tigadoli 
5373942d3a8SSheetal Tigadoli 	return val;
5383942d3a8SSheetal Tigadoli }
5393942d3a8SSheetal Tigadoli 
paxb_cfg_mps(void)5403942d3a8SSheetal Tigadoli static void paxb_cfg_mps(void)
5413942d3a8SSheetal Tigadoli {
5423942d3a8SSheetal Tigadoli 	uint32_t val, core_idx, mps;
5433942d3a8SSheetal Tigadoli 
5443942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
5453942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
5463942d3a8SSheetal Tigadoli 			continue;
5473942d3a8SSheetal Tigadoli 
5483942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_DEVICE_CAP);
5493942d3a8SSheetal Tigadoli 		val &= ~CFG_RC_DEVICE_CAP_MPS_MASK;
5503942d3a8SSheetal Tigadoli 		mps = CFG_RC_DEVICE_CAP_MPS_256B;
5513942d3a8SSheetal Tigadoli 		if (core_idx == 0 || core_idx == 1 ||
5523942d3a8SSheetal Tigadoli 		    core_idx == 6 || core_idx == 7) {
5533942d3a8SSheetal Tigadoli 			mps = CFG_RC_DEVICE_CAP_MPS_512B;
5543942d3a8SSheetal Tigadoli 		}
5553942d3a8SSheetal Tigadoli 		val |= mps;
5563942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_DEVICE_CAP, val);
5573942d3a8SSheetal Tigadoli 	}
5583942d3a8SSheetal Tigadoli }
5593942d3a8SSheetal Tigadoli 
paxb_cfg_dev_id(void)5603942d3a8SSheetal Tigadoli static void paxb_cfg_dev_id(void)
5613942d3a8SSheetal Tigadoli {
5623942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
5633942d3a8SSheetal Tigadoli 	uint32_t device_id;
5643942d3a8SSheetal Tigadoli 
5653942d3a8SSheetal Tigadoli 	device_id = paxb->device_id;
5663942d3a8SSheetal Tigadoli 
5673942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
5683942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
5693942d3a8SSheetal Tigadoli 			continue;
5703942d3a8SSheetal Tigadoli 
5713942d3a8SSheetal Tigadoli 		/* Set Core in RC mode */
5723942d3a8SSheetal Tigadoli 		mmio_setbits_32(PCIE_CORE_USER_CFG +
5733942d3a8SSheetal Tigadoli 				(core_idx * PCIE_CORE_PWR_OFFSET), 1);
5743942d3a8SSheetal Tigadoli 
5753942d3a8SSheetal Tigadoli 		/* force class to PCI_CLASS_BRIDGE_PCI (0x0604) */
5763942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, PCI_BRIDGE_CTRL_REG_OFFSET);
5773942d3a8SSheetal Tigadoli 		val &= ~PCI_CLASS_BRIDGE_MASK;
5783942d3a8SSheetal Tigadoli 		val |= (PCI_CLASS_BRIDGE_PCI << PCI_CLASS_BRIDGE_SHIFT);
5793942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, PCI_BRIDGE_CTRL_REG_OFFSET, val);
5803942d3a8SSheetal Tigadoli 
5813942d3a8SSheetal Tigadoli 		val = (VENDOR_ID << 16) | device_id;
5823942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_DEV_ID, val);
5833942d3a8SSheetal Tigadoli 
5843942d3a8SSheetal Tigadoli 		val = (device_id << 16) | VENDOR_ID;
5853942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_DEV_SUBID, val);
5863942d3a8SSheetal Tigadoli 	}
5873942d3a8SSheetal Tigadoli }
5883942d3a8SSheetal Tigadoli 
paxb_cfg_tgt_trn(void)5893942d3a8SSheetal Tigadoli static void paxb_cfg_tgt_trn(void)
5903942d3a8SSheetal Tigadoli {
5913942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
5923942d3a8SSheetal Tigadoli 
5933942d3a8SSheetal Tigadoli 	/*
5943942d3a8SSheetal Tigadoli 	 * Disable all mem Rd/Wr size check so it allows target read/write
5953942d3a8SSheetal Tigadoli 	 * transactions to be more than stipulated DW. As a result, PAXB root
5963942d3a8SSheetal Tigadoli 	 * complex will not abort these read/write transcations beyond
5973942d3a8SSheetal Tigadoli 	 * stipulated limit
5983942d3a8SSheetal Tigadoli 	 */
5993942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
6003942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
6013942d3a8SSheetal Tigadoli 			continue;
6023942d3a8SSheetal Tigadoli 
6033942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_TL_CTRL_0);
6043942d3a8SSheetal Tigadoli 		val &= ~(RC_MEM_DW_CHK_MASK);
6053942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_TL_CTRL_0, val);
6063942d3a8SSheetal Tigadoli 	}
6073942d3a8SSheetal Tigadoli }
6083942d3a8SSheetal Tigadoli 
paxb_cfg_pdl_ctrl(void)6093942d3a8SSheetal Tigadoli static void paxb_cfg_pdl_ctrl(void)
6103942d3a8SSheetal Tigadoli {
6113942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
6123942d3a8SSheetal Tigadoli 	uint32_t nph, ph, pd;
6133942d3a8SSheetal Tigadoli 
6143942d3a8SSheetal Tigadoli 	/* increase the credit counter to 4 for non-posted header */
6153942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
6163942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
6173942d3a8SSheetal Tigadoli 			continue;
6183942d3a8SSheetal Tigadoli 
6193942d3a8SSheetal Tigadoli 		nph = NPH_FC_INIT;
6203942d3a8SSheetal Tigadoli 		ph = PH_INIT;
6213942d3a8SSheetal Tigadoli 		pd = PD_FC_INIT;
6223942d3a8SSheetal Tigadoli 
6233942d3a8SSheetal Tigadoli 		if (core_idx == 0 || core_idx == 1 ||
6243942d3a8SSheetal Tigadoli 		    core_idx == 6 || core_idx == 7) {
6253942d3a8SSheetal Tigadoli 			nph = SRP_NPH_FC_INIT;
6263942d3a8SSheetal Tigadoli 			ph = SRP_PH_INIT;
6273942d3a8SSheetal Tigadoli 			pd = SRP_PD_FC_INIT;
6283942d3a8SSheetal Tigadoli 		}
6293942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_PDL_CTRL_4);
6303942d3a8SSheetal Tigadoli 		val &= ~NPH_FC_INIT_MASK;
6313942d3a8SSheetal Tigadoli 		val &= ~PD_FC_INIT_MASK;
6323942d3a8SSheetal Tigadoli 		val = val | (nph << NPH_FC_INIT_SHIFT);
6333942d3a8SSheetal Tigadoli 		val = val | (pd << PD_FC_INIT_SHIFT);
6343942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_PDL_CTRL_4, val);
6353942d3a8SSheetal Tigadoli 
6363942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_PDL_CTRL_5);
6373942d3a8SSheetal Tigadoli 		val &= ~PH_INIT_MASK;
6383942d3a8SSheetal Tigadoli 		val = val | (ph << PH_INIT_SHIFT);
6393942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_PDL_CTRL_5, val);
6403942d3a8SSheetal Tigadoli 
6413942d3a8SSheetal Tigadoli 		/*
6423942d3a8SSheetal Tigadoli 		 * ASIC to give more optmized value after further investigation.
6433942d3a8SSheetal Tigadoli 		 * till then this is important to have to get similar
6443942d3a8SSheetal Tigadoli 		 * performance on all the slots.
6453942d3a8SSheetal Tigadoli 		 */
6463942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_TL_FCIMM_NP_LIMIT,
6473942d3a8SSheetal Tigadoli 				CFG_RC_TL_FCIMM_NP_VAL);
6483942d3a8SSheetal Tigadoli 
6493942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_TL_FCIMM_P_LIMIT,
6503942d3a8SSheetal Tigadoli 				CFG_RC_TL_FCIMM_P_VAL);
6513942d3a8SSheetal Tigadoli 	}
6523942d3a8SSheetal Tigadoli }
6533942d3a8SSheetal Tigadoli 
paxb_cfg_clkreq(void)6543942d3a8SSheetal Tigadoli static void paxb_cfg_clkreq(void)
6553942d3a8SSheetal Tigadoli {
6563942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
6573942d3a8SSheetal Tigadoli 
6583942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
6593942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
6603942d3a8SSheetal Tigadoli 			continue;
6613942d3a8SSheetal Tigadoli 
6623942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_RC_CLKREQ_ENABLED);
6633942d3a8SSheetal Tigadoli 		val &= ~CFG_RC_CLKREQ_ENABLED_MASK;
6643942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_RC_CLKREQ_ENABLED, val);
6653942d3a8SSheetal Tigadoli 	}
6663942d3a8SSheetal Tigadoli }
6673942d3a8SSheetal Tigadoli 
paxb_cfg_dl_active(bool enable)6683942d3a8SSheetal Tigadoli static void paxb_cfg_dl_active(bool enable)
6693942d3a8SSheetal Tigadoli {
6703942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
6713942d3a8SSheetal Tigadoli 
6723942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
6733942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
6743942d3a8SSheetal Tigadoli 			continue;
6753942d3a8SSheetal Tigadoli 
6763942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_LINK_CAP_RC);
6773942d3a8SSheetal Tigadoli 		if (enable)
6783942d3a8SSheetal Tigadoli 			val |= CFG_RC_DL_ACTIVE_MASK;
6793942d3a8SSheetal Tigadoli 		else
6803942d3a8SSheetal Tigadoli 			val &= ~CFG_RC_DL_ACTIVE_MASK;
6813942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_LINK_CAP_RC, val);
6823942d3a8SSheetal Tigadoli 	}
6833942d3a8SSheetal Tigadoli }
6843942d3a8SSheetal Tigadoli 
paxb_cfg_LTR(int enable)6853942d3a8SSheetal Tigadoli static void paxb_cfg_LTR(int enable)
6863942d3a8SSheetal Tigadoli {
6873942d3a8SSheetal Tigadoli 	uint32_t val, core_idx;
6883942d3a8SSheetal Tigadoli 
6893942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
6903942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
6913942d3a8SSheetal Tigadoli 			continue;
6923942d3a8SSheetal Tigadoli 
6933942d3a8SSheetal Tigadoli 		val = paxb_rc_cfg_read(core_idx, CFG_ROOT_CAP_RC);
6943942d3a8SSheetal Tigadoli 		if (enable)
6953942d3a8SSheetal Tigadoli 			val |= CFG_ROOT_CAP_LTR_MASK;
6963942d3a8SSheetal Tigadoli 		else
6973942d3a8SSheetal Tigadoli 			val &= ~CFG_ROOT_CAP_LTR_MASK;
6983942d3a8SSheetal Tigadoli 		paxb_rc_cfg_write(core_idx, CFG_ROOT_CAP_RC, val);
6993942d3a8SSheetal Tigadoli 	}
7003942d3a8SSheetal Tigadoli }
7013942d3a8SSheetal Tigadoli 
paxb_ib_regs_bypass(void)7023942d3a8SSheetal Tigadoli static void paxb_ib_regs_bypass(void)
7033942d3a8SSheetal Tigadoli {
7043942d3a8SSheetal Tigadoli 	unsigned int i, j;
7053942d3a8SSheetal Tigadoli 
7063942d3a8SSheetal Tigadoli 	for (i = 0; i < paxb->num_cores; i++) {
7073942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(i))
7083942d3a8SSheetal Tigadoli 			continue;
7093942d3a8SSheetal Tigadoli 
7103942d3a8SSheetal Tigadoli 		/* Configure Default IMAP window */
7113942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_0_DEFAULT_IMAP,
7123942d3a8SSheetal Tigadoli 			      DEFAULT_ADDR_INVALID);
7133942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_0_DEFAULT_IMAP_AXUSER,
7143942d3a8SSheetal Tigadoli 			      IMAP_AXUSER);
7153942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_0_DEFAULT_IMAP_AXCACHE,
7163942d3a8SSheetal Tigadoli 			      IMAP_AXCACHE);
7173942d3a8SSheetal Tigadoli 
7183942d3a8SSheetal Tigadoli 		/* Configure MSI IMAP window */
7193942d3a8SSheetal Tigadoli 		mmio_setbits_32(PAXB_OFFSET(i) +
7203942d3a8SSheetal Tigadoli 				PAXB_IMAP0_REGS_TYPE_OFFSET,
7213942d3a8SSheetal Tigadoli 				0x1);
7223942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_IARR0_BASE_OFFSET,
7233942d3a8SSheetal Tigadoli 			      GITS_TRANSLATER | OARR_VALID);
7243942d3a8SSheetal Tigadoli 		for (j = 0; j < PAXB_MAX_IMAP_WINDOWS; j++) {
7253942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP0_OFFSET(j),
7263942d3a8SSheetal Tigadoli 				      (GITS_TRANSLATER +
7273942d3a8SSheetal Tigadoli 				       (j * PAXB_IMAP0_WINDOW_SIZE)) |
7283942d3a8SSheetal Tigadoli 				      IMAP_VALID);
7293942d3a8SSheetal Tigadoli 		}
7303942d3a8SSheetal Tigadoli 	}
7313942d3a8SSheetal Tigadoli }
7323942d3a8SSheetal Tigadoli 
paxb_ib_regs_init(void)7333942d3a8SSheetal Tigadoli static void paxb_ib_regs_init(void)
7343942d3a8SSheetal Tigadoli {
7353942d3a8SSheetal Tigadoli 	unsigned int core_idx;
7363942d3a8SSheetal Tigadoli 
7373942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
7383942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
7393942d3a8SSheetal Tigadoli 			continue;
7403942d3a8SSheetal Tigadoli 
7413942d3a8SSheetal Tigadoli 		/* initialize IARR2 to zero */
7423942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(core_idx) + PAXB_IARR2_LOWER_OFFSET,
7433942d3a8SSheetal Tigadoli 			      0x0);
7443942d3a8SSheetal Tigadoli 		mmio_setbits_32(PAXB_OFFSET(core_idx) +
7453942d3a8SSheetal Tigadoli 				PAXB_IMAP0_REGS_TYPE_OFFSET,
7463942d3a8SSheetal Tigadoli 				0x1);
7473942d3a8SSheetal Tigadoli 	}
7483942d3a8SSheetal Tigadoli }
7493942d3a8SSheetal Tigadoli 
paxb_cfg_apb_timeout(void)7503942d3a8SSheetal Tigadoli static void paxb_cfg_apb_timeout(void)
7513942d3a8SSheetal Tigadoli {
7523942d3a8SSheetal Tigadoli 	unsigned int core_idx;
7533942d3a8SSheetal Tigadoli 
7543942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
7553942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
7563942d3a8SSheetal Tigadoli 			continue;
7573942d3a8SSheetal Tigadoli 
7583942d3a8SSheetal Tigadoli 		/* allow unlimited timeout */
7593942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(core_idx) +
7603942d3a8SSheetal Tigadoli 			PAXB_APB_TIMEOUT_COUNT_OFFSET,
7613942d3a8SSheetal Tigadoli 			0xFFFFFFFF);
7623942d3a8SSheetal Tigadoli 	}
7633942d3a8SSheetal Tigadoli }
7643942d3a8SSheetal Tigadoli 
paxb_smmu_cfg(void)7653942d3a8SSheetal Tigadoli static void paxb_smmu_cfg(void)
7663942d3a8SSheetal Tigadoli {
7673942d3a8SSheetal Tigadoli 	unsigned int core_idx;
7683942d3a8SSheetal Tigadoli 	uint32_t offset;
7693942d3a8SSheetal Tigadoli 	uint32_t val;
7703942d3a8SSheetal Tigadoli 
7713942d3a8SSheetal Tigadoli 	for (core_idx = 0; core_idx < paxb->num_cores; core_idx++) {
7723942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(core_idx))
7733942d3a8SSheetal Tigadoli 			continue;
7743942d3a8SSheetal Tigadoli 
7753942d3a8SSheetal Tigadoli 		offset = core_idx * PCIE_CORE_PWR_OFFSET;
7763942d3a8SSheetal Tigadoli 		val = mmio_read_32(PCIE_PAXB_SMMU_SID_CFG + offset);
7773942d3a8SSheetal Tigadoli 		val &= ~(0xFFF00);
7783942d3a8SSheetal Tigadoli 		val |= (PAXB_SMMU_SID_CFG_FUN_WIDTH |
7793942d3a8SSheetal Tigadoli 			PAXB_SMMU_SID_CFG_DEV_WIDTH |
7803942d3a8SSheetal Tigadoli 			PAXB_SMMU_SID_CFG_BUS_WIDTH);
7813942d3a8SSheetal Tigadoli 		mmio_write_32(PCIE_PAXB_SMMU_SID_CFG + offset, val);
7823942d3a8SSheetal Tigadoli 		val = mmio_read_32(PCIE_PAXB_SMMU_SID_CFG + offset);
7833942d3a8SSheetal Tigadoli 		VERBOSE("smmu cfg reg 0x%x\n", val);
7843942d3a8SSheetal Tigadoli 	}
7853942d3a8SSheetal Tigadoli }
7863942d3a8SSheetal Tigadoli 
paxb_cfg_coherency(void)7873942d3a8SSheetal Tigadoli static void paxb_cfg_coherency(void)
7883942d3a8SSheetal Tigadoli {
7893942d3a8SSheetal Tigadoli 	unsigned int i, j;
7903942d3a8SSheetal Tigadoli 
7913942d3a8SSheetal Tigadoli 	for (i = 0; i < paxb->num_cores; i++) {
7923942d3a8SSheetal Tigadoli 		if (!pcie_core_needs_enable(i))
7933942d3a8SSheetal Tigadoli 			continue;
7943942d3a8SSheetal Tigadoli 
7953942d3a8SSheetal Tigadoli #ifdef USE_DDR
7963942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP2_OFFSET,
7973942d3a8SSheetal Tigadoli 			      IMAP_ARCACHE | IMAP_AWCACHE);
7983942d3a8SSheetal Tigadoli #endif
7993942d3a8SSheetal Tigadoli 
8003942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP0_0_AXUSER_OFFSET,
8013942d3a8SSheetal Tigadoli 			      IMAP_AXUSER);
8023942d3a8SSheetal Tigadoli 
8033942d3a8SSheetal Tigadoli 		mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP2_AXUSER_OFFSET,
8043942d3a8SSheetal Tigadoli 			      IMAP_AXUSER);
8053942d3a8SSheetal Tigadoli 
8063942d3a8SSheetal Tigadoli 		for (j = 0; j < PAXB_MAX_IMAP_WINDOWS; j++) {
8073942d3a8SSheetal Tigadoli #ifdef USE_DDR
8083942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP3_OFFSET(j),
8093942d3a8SSheetal Tigadoli 				      IMAP_ARCACHE | IMAP_AWCACHE);
8103942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP4_OFFSET(j),
8113942d3a8SSheetal Tigadoli 				      IMAP_ARCACHE | IMAP_AWCACHE);
8123942d3a8SSheetal Tigadoli #endif
8133942d3a8SSheetal Tigadoli 			/* zero out IMAP0 mapping windows for MSI/MSI-X */
8143942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) + PAXB_IMAP0_OFFSET(j),
8153942d3a8SSheetal Tigadoli 				      0x0);
8163942d3a8SSheetal Tigadoli 
8173942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) +
8183942d3a8SSheetal Tigadoli 				      PAXB_IMAP3_0_AXUSER_OFFSET(j),
8193942d3a8SSheetal Tigadoli 				      IMAP_AXUSER);
8203942d3a8SSheetal Tigadoli 			mmio_write_32(PAXB_OFFSET(i) +
8213942d3a8SSheetal Tigadoli 				      PAXB_IMAP4_0_AXUSER_OFFSET(j),
8223942d3a8SSheetal Tigadoli 				      IMAP_AXUSER);
8233942d3a8SSheetal Tigadoli 		}
8243942d3a8SSheetal Tigadoli 	}
8253942d3a8SSheetal Tigadoli }
8263942d3a8SSheetal Tigadoli 
8273942d3a8SSheetal Tigadoli /*
8283942d3a8SSheetal Tigadoli  * This function configures all PAXB related blocks to allow non-secure access
8293942d3a8SSheetal Tigadoli  */
paxb_ns_init(enum paxb_type type)8303942d3a8SSheetal Tigadoli void paxb_ns_init(enum paxb_type type)
8313942d3a8SSheetal Tigadoli {
8323942d3a8SSheetal Tigadoli 	unsigned int reg;
8333942d3a8SSheetal Tigadoli 
8343942d3a8SSheetal Tigadoli 	switch (type) {
8353942d3a8SSheetal Tigadoli 	case PAXB_SR:
8363942d3a8SSheetal Tigadoli 		for (reg = 0; reg < ARRAY_SIZE(paxb_sec_reg_offset); reg++) {
8373942d3a8SSheetal Tigadoli 
8383942d3a8SSheetal Tigadoli 			mmio_setbits_32(SR_PCIE_NIC_SECURITY_BASE +
8393942d3a8SSheetal Tigadoli 					paxb_sec_reg_offset[reg], 0x1);
8403942d3a8SSheetal Tigadoli 		}
8413942d3a8SSheetal Tigadoli 	/* Enabled all PAXB's relevant IDM blocks access in non-secure mode */
8423942d3a8SSheetal Tigadoli 	mmio_setbits_32(SR_PCIE_NIC_SECURITY_BASE + PAXB_SECURITY_IDM_OFFSET,
8433942d3a8SSheetal Tigadoli 			0xffff);
8443942d3a8SSheetal Tigadoli 		break;
8453942d3a8SSheetal Tigadoli 	case PAXB_NS3Z:
8463942d3a8SSheetal Tigadoli 		mmio_setbits_32(NS3Z_PCIE_NIC_SECURITY_BASE +
8473942d3a8SSheetal Tigadoli 				paxb_sec_reg_offset[0], 0x1);
8483942d3a8SSheetal Tigadoli 		mmio_setbits_32(NS3Z_PCIE_NIC_SECURITY_BASE +
8493942d3a8SSheetal Tigadoli 				PAXB_SECURITY_IDM_OFFSET, 0xffff);
8503942d3a8SSheetal Tigadoli 		mmio_setbits_32(NS3Z_PCIE_NIC_SECURITY_BASE +
8513942d3a8SSheetal Tigadoli 				PAXB_SECURITY_APB_OFFSET, 0x7);
8523942d3a8SSheetal Tigadoli 		mmio_setbits_32(NS3Z_PCIE_NIC_SECURITY_BASE +
8533942d3a8SSheetal Tigadoli 				PAXB_SECURITY_ECAM_OFFSET, 0x1);
8543942d3a8SSheetal Tigadoli 		break;
8553942d3a8SSheetal Tigadoli 	}
8563942d3a8SSheetal Tigadoli }
8573942d3a8SSheetal Tigadoli 
paxb_set_config(void)8583942d3a8SSheetal Tigadoli static int paxb_set_config(void)
8593942d3a8SSheetal Tigadoli {
8603942d3a8SSheetal Tigadoli 	paxb = paxb_get_config(sr);
8613942d3a8SSheetal Tigadoli 	if (paxb)
8623942d3a8SSheetal Tigadoli 		return 0;
8633942d3a8SSheetal Tigadoli 
8643942d3a8SSheetal Tigadoli 	return -ENODEV;
8653942d3a8SSheetal Tigadoli }
8663942d3a8SSheetal Tigadoli 
paxb_init(void)8673942d3a8SSheetal Tigadoli void paxb_init(void)
8683942d3a8SSheetal Tigadoli {
8693942d3a8SSheetal Tigadoli 	int ret;
8703942d3a8SSheetal Tigadoli 
8713942d3a8SSheetal Tigadoli 	ret = paxb_set_config();
8723942d3a8SSheetal Tigadoli 	if (ret)
8733942d3a8SSheetal Tigadoli 		return;
8743942d3a8SSheetal Tigadoli 
8753942d3a8SSheetal Tigadoli 	paxb_ns_init(paxb->type);
8763942d3a8SSheetal Tigadoli 
8773942d3a8SSheetal Tigadoli 	ret = pcie_cores_init();
8783942d3a8SSheetal Tigadoli 	if (ret)
8793942d3a8SSheetal Tigadoli 		return;
8803942d3a8SSheetal Tigadoli 
8813942d3a8SSheetal Tigadoli 	if (paxb->phy_init) {
8823942d3a8SSheetal Tigadoli 		ret = paxb->phy_init();
8833942d3a8SSheetal Tigadoli 		if (ret)
8843942d3a8SSheetal Tigadoli 			return;
8853942d3a8SSheetal Tigadoli 	}
8863942d3a8SSheetal Tigadoli 
8873942d3a8SSheetal Tigadoli 	paxb_cfg_dev_id();
8883942d3a8SSheetal Tigadoli 	paxb_cfg_tgt_trn();
8893942d3a8SSheetal Tigadoli 	paxb_cfg_pdl_ctrl();
8903942d3a8SSheetal Tigadoli 	if (paxb->type == PAXB_SR) {
8913942d3a8SSheetal Tigadoli 		paxb_ib_regs_init();
8923942d3a8SSheetal Tigadoli 		paxb_cfg_coherency();
8933942d3a8SSheetal Tigadoli 	} else
8943942d3a8SSheetal Tigadoli 		paxb_ib_regs_bypass();
8953942d3a8SSheetal Tigadoli 
8963942d3a8SSheetal Tigadoli 	paxb_cfg_apb_timeout();
8973942d3a8SSheetal Tigadoli 	paxb_smmu_cfg();
8983942d3a8SSheetal Tigadoli 	paxb_cfg_clkreq();
8993942d3a8SSheetal Tigadoli 	paxb_rc_link_init();
9003942d3a8SSheetal Tigadoli 
9013942d3a8SSheetal Tigadoli 	/* Stingray Doesn't support LTR */
9023942d3a8SSheetal Tigadoli 	paxb_cfg_LTR(false);
9033942d3a8SSheetal Tigadoli 	paxb_cfg_dl_active(true);
9043942d3a8SSheetal Tigadoli 
9053942d3a8SSheetal Tigadoli 	paxb_cfg_mps();
9063942d3a8SSheetal Tigadoli 
9073942d3a8SSheetal Tigadoli #ifdef PAXB_LINKUP
9083942d3a8SSheetal Tigadoli 	paxb_start_link_up();
9093942d3a8SSheetal Tigadoli #endif
9103942d3a8SSheetal Tigadoli 	INFO("PAXB init done\n");
9113942d3a8SSheetal Tigadoli }
912