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