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 */ 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 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 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 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 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 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 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 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 */ 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 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 */ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 */ 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 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 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