1*e9be4292SMarek Vasut /* 2*e9be4292SMarek Vasut * Freescale i.MX6 PCI Express Root-Complex driver 3*e9be4292SMarek Vasut * 4*e9be4292SMarek Vasut * Copyright (C) 2013 Marek Vasut <marex@denx.de> 5*e9be4292SMarek Vasut * 6*e9be4292SMarek Vasut * Based on upstream Linux kernel driver: 7*e9be4292SMarek Vasut * pci-imx6.c: Sean Cross <xobs@kosagi.com> 8*e9be4292SMarek Vasut * pcie-designware.c: Jingoo Han <jg1.han@samsung.com> 9*e9be4292SMarek Vasut * 10*e9be4292SMarek Vasut * SPDX-License-Identifier: GPL-2.0 11*e9be4292SMarek Vasut */ 12*e9be4292SMarek Vasut 13*e9be4292SMarek Vasut #include <common.h> 14*e9be4292SMarek Vasut #include <pci.h> 15*e9be4292SMarek Vasut #include <asm/arch/clock.h> 16*e9be4292SMarek Vasut #include <asm/arch/iomux.h> 17*e9be4292SMarek Vasut #include <asm/arch/crm_regs.h> 18*e9be4292SMarek Vasut #include <asm/io.h> 19*e9be4292SMarek Vasut #include <asm/sizes.h> 20*e9be4292SMarek Vasut #include <errno.h> 21*e9be4292SMarek Vasut 22*e9be4292SMarek Vasut #define PCI_ACCESS_READ 0 23*e9be4292SMarek Vasut #define PCI_ACCESS_WRITE 1 24*e9be4292SMarek Vasut 25*e9be4292SMarek Vasut #define MX6_DBI_ADDR 0x01ffc000 26*e9be4292SMarek Vasut #define MX6_DBI_SIZE 0x4000 27*e9be4292SMarek Vasut #define MX6_IO_ADDR 0x01000000 28*e9be4292SMarek Vasut #define MX6_IO_SIZE 0x100000 29*e9be4292SMarek Vasut #define MX6_MEM_ADDR 0x01100000 30*e9be4292SMarek Vasut #define MX6_MEM_SIZE 0xe00000 31*e9be4292SMarek Vasut #define MX6_ROOT_ADDR 0x01f00000 32*e9be4292SMarek Vasut #define MX6_ROOT_SIZE 0xfc000 33*e9be4292SMarek Vasut 34*e9be4292SMarek Vasut /* PCIe Port Logic registers (memory-mapped) */ 35*e9be4292SMarek Vasut #define PL_OFFSET 0x700 36*e9be4292SMarek Vasut #define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28) 37*e9be4292SMarek Vasut #define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c) 38*e9be4292SMarek Vasut #define PCIE_PHY_DEBUG_R1_LINK_UP (1 << 4) 39*e9be4292SMarek Vasut #define PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING (1 << 29) 40*e9be4292SMarek Vasut 41*e9be4292SMarek Vasut #define PCIE_PHY_CTRL (PL_OFFSET + 0x114) 42*e9be4292SMarek Vasut #define PCIE_PHY_CTRL_DATA_LOC 0 43*e9be4292SMarek Vasut #define PCIE_PHY_CTRL_CAP_ADR_LOC 16 44*e9be4292SMarek Vasut #define PCIE_PHY_CTRL_CAP_DAT_LOC 17 45*e9be4292SMarek Vasut #define PCIE_PHY_CTRL_WR_LOC 18 46*e9be4292SMarek Vasut #define PCIE_PHY_CTRL_RD_LOC 19 47*e9be4292SMarek Vasut 48*e9be4292SMarek Vasut #define PCIE_PHY_STAT (PL_OFFSET + 0x110) 49*e9be4292SMarek Vasut #define PCIE_PHY_STAT_DATA_LOC 0 50*e9be4292SMarek Vasut #define PCIE_PHY_STAT_ACK_LOC 16 51*e9be4292SMarek Vasut 52*e9be4292SMarek Vasut /* PHY registers (not memory-mapped) */ 53*e9be4292SMarek Vasut #define PCIE_PHY_RX_ASIC_OUT 0x100D 54*e9be4292SMarek Vasut 55*e9be4292SMarek Vasut #define PHY_RX_OVRD_IN_LO 0x1005 56*e9be4292SMarek Vasut #define PHY_RX_OVRD_IN_LO_RX_DATA_EN (1 << 5) 57*e9be4292SMarek Vasut #define PHY_RX_OVRD_IN_LO_RX_PLL_EN (1 << 3) 58*e9be4292SMarek Vasut 59*e9be4292SMarek Vasut /* iATU registers */ 60*e9be4292SMarek Vasut #define PCIE_ATU_VIEWPORT 0x900 61*e9be4292SMarek Vasut #define PCIE_ATU_REGION_INBOUND (0x1 << 31) 62*e9be4292SMarek Vasut #define PCIE_ATU_REGION_OUTBOUND (0x0 << 31) 63*e9be4292SMarek Vasut #define PCIE_ATU_REGION_INDEX1 (0x1 << 0) 64*e9be4292SMarek Vasut #define PCIE_ATU_REGION_INDEX0 (0x0 << 0) 65*e9be4292SMarek Vasut #define PCIE_ATU_CR1 0x904 66*e9be4292SMarek Vasut #define PCIE_ATU_TYPE_MEM (0x0 << 0) 67*e9be4292SMarek Vasut #define PCIE_ATU_TYPE_IO (0x2 << 0) 68*e9be4292SMarek Vasut #define PCIE_ATU_TYPE_CFG0 (0x4 << 0) 69*e9be4292SMarek Vasut #define PCIE_ATU_TYPE_CFG1 (0x5 << 0) 70*e9be4292SMarek Vasut #define PCIE_ATU_CR2 0x908 71*e9be4292SMarek Vasut #define PCIE_ATU_ENABLE (0x1 << 31) 72*e9be4292SMarek Vasut #define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30) 73*e9be4292SMarek Vasut #define PCIE_ATU_LOWER_BASE 0x90C 74*e9be4292SMarek Vasut #define PCIE_ATU_UPPER_BASE 0x910 75*e9be4292SMarek Vasut #define PCIE_ATU_LIMIT 0x914 76*e9be4292SMarek Vasut #define PCIE_ATU_LOWER_TARGET 0x918 77*e9be4292SMarek Vasut #define PCIE_ATU_BUS(x) (((x) & 0xff) << 24) 78*e9be4292SMarek Vasut #define PCIE_ATU_DEV(x) (((x) & 0x1f) << 19) 79*e9be4292SMarek Vasut #define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) 80*e9be4292SMarek Vasut #define PCIE_ATU_UPPER_TARGET 0x91C 81*e9be4292SMarek Vasut 82*e9be4292SMarek Vasut /* 83*e9be4292SMarek Vasut * PHY access functions 84*e9be4292SMarek Vasut */ 85*e9be4292SMarek Vasut static int pcie_phy_poll_ack(void __iomem *dbi_base, int exp_val) 86*e9be4292SMarek Vasut { 87*e9be4292SMarek Vasut u32 val; 88*e9be4292SMarek Vasut u32 max_iterations = 10; 89*e9be4292SMarek Vasut u32 wait_counter = 0; 90*e9be4292SMarek Vasut 91*e9be4292SMarek Vasut do { 92*e9be4292SMarek Vasut val = readl(dbi_base + PCIE_PHY_STAT); 93*e9be4292SMarek Vasut val = (val >> PCIE_PHY_STAT_ACK_LOC) & 0x1; 94*e9be4292SMarek Vasut wait_counter++; 95*e9be4292SMarek Vasut 96*e9be4292SMarek Vasut if (val == exp_val) 97*e9be4292SMarek Vasut return 0; 98*e9be4292SMarek Vasut 99*e9be4292SMarek Vasut udelay(1); 100*e9be4292SMarek Vasut } while (wait_counter < max_iterations); 101*e9be4292SMarek Vasut 102*e9be4292SMarek Vasut return -ETIMEDOUT; 103*e9be4292SMarek Vasut } 104*e9be4292SMarek Vasut 105*e9be4292SMarek Vasut static int pcie_phy_wait_ack(void __iomem *dbi_base, int addr) 106*e9be4292SMarek Vasut { 107*e9be4292SMarek Vasut u32 val; 108*e9be4292SMarek Vasut int ret; 109*e9be4292SMarek Vasut 110*e9be4292SMarek Vasut val = addr << PCIE_PHY_CTRL_DATA_LOC; 111*e9be4292SMarek Vasut writel(val, dbi_base + PCIE_PHY_CTRL); 112*e9be4292SMarek Vasut 113*e9be4292SMarek Vasut val |= (0x1 << PCIE_PHY_CTRL_CAP_ADR_LOC); 114*e9be4292SMarek Vasut writel(val, dbi_base + PCIE_PHY_CTRL); 115*e9be4292SMarek Vasut 116*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 1); 117*e9be4292SMarek Vasut if (ret) 118*e9be4292SMarek Vasut return ret; 119*e9be4292SMarek Vasut 120*e9be4292SMarek Vasut val = addr << PCIE_PHY_CTRL_DATA_LOC; 121*e9be4292SMarek Vasut writel(val, dbi_base + PCIE_PHY_CTRL); 122*e9be4292SMarek Vasut 123*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 0); 124*e9be4292SMarek Vasut if (ret) 125*e9be4292SMarek Vasut return ret; 126*e9be4292SMarek Vasut 127*e9be4292SMarek Vasut return 0; 128*e9be4292SMarek Vasut } 129*e9be4292SMarek Vasut 130*e9be4292SMarek Vasut /* Read from the 16-bit PCIe PHY control registers (not memory-mapped) */ 131*e9be4292SMarek Vasut static int pcie_phy_read(void __iomem *dbi_base, int addr , int *data) 132*e9be4292SMarek Vasut { 133*e9be4292SMarek Vasut u32 val, phy_ctl; 134*e9be4292SMarek Vasut int ret; 135*e9be4292SMarek Vasut 136*e9be4292SMarek Vasut ret = pcie_phy_wait_ack(dbi_base, addr); 137*e9be4292SMarek Vasut if (ret) 138*e9be4292SMarek Vasut return ret; 139*e9be4292SMarek Vasut 140*e9be4292SMarek Vasut /* assert Read signal */ 141*e9be4292SMarek Vasut phy_ctl = 0x1 << PCIE_PHY_CTRL_RD_LOC; 142*e9be4292SMarek Vasut writel(phy_ctl, dbi_base + PCIE_PHY_CTRL); 143*e9be4292SMarek Vasut 144*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 1); 145*e9be4292SMarek Vasut if (ret) 146*e9be4292SMarek Vasut return ret; 147*e9be4292SMarek Vasut 148*e9be4292SMarek Vasut val = readl(dbi_base + PCIE_PHY_STAT); 149*e9be4292SMarek Vasut *data = val & 0xffff; 150*e9be4292SMarek Vasut 151*e9be4292SMarek Vasut /* deassert Read signal */ 152*e9be4292SMarek Vasut writel(0x00, dbi_base + PCIE_PHY_CTRL); 153*e9be4292SMarek Vasut 154*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 0); 155*e9be4292SMarek Vasut if (ret) 156*e9be4292SMarek Vasut return ret; 157*e9be4292SMarek Vasut 158*e9be4292SMarek Vasut return 0; 159*e9be4292SMarek Vasut } 160*e9be4292SMarek Vasut 161*e9be4292SMarek Vasut static int pcie_phy_write(void __iomem *dbi_base, int addr, int data) 162*e9be4292SMarek Vasut { 163*e9be4292SMarek Vasut u32 var; 164*e9be4292SMarek Vasut int ret; 165*e9be4292SMarek Vasut 166*e9be4292SMarek Vasut /* write addr */ 167*e9be4292SMarek Vasut /* cap addr */ 168*e9be4292SMarek Vasut ret = pcie_phy_wait_ack(dbi_base, addr); 169*e9be4292SMarek Vasut if (ret) 170*e9be4292SMarek Vasut return ret; 171*e9be4292SMarek Vasut 172*e9be4292SMarek Vasut var = data << PCIE_PHY_CTRL_DATA_LOC; 173*e9be4292SMarek Vasut writel(var, dbi_base + PCIE_PHY_CTRL); 174*e9be4292SMarek Vasut 175*e9be4292SMarek Vasut /* capture data */ 176*e9be4292SMarek Vasut var |= (0x1 << PCIE_PHY_CTRL_CAP_DAT_LOC); 177*e9be4292SMarek Vasut writel(var, dbi_base + PCIE_PHY_CTRL); 178*e9be4292SMarek Vasut 179*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 1); 180*e9be4292SMarek Vasut if (ret) 181*e9be4292SMarek Vasut return ret; 182*e9be4292SMarek Vasut 183*e9be4292SMarek Vasut /* deassert cap data */ 184*e9be4292SMarek Vasut var = data << PCIE_PHY_CTRL_DATA_LOC; 185*e9be4292SMarek Vasut writel(var, dbi_base + PCIE_PHY_CTRL); 186*e9be4292SMarek Vasut 187*e9be4292SMarek Vasut /* wait for ack de-assertion */ 188*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 0); 189*e9be4292SMarek Vasut if (ret) 190*e9be4292SMarek Vasut return ret; 191*e9be4292SMarek Vasut 192*e9be4292SMarek Vasut /* assert wr signal */ 193*e9be4292SMarek Vasut var = 0x1 << PCIE_PHY_CTRL_WR_LOC; 194*e9be4292SMarek Vasut writel(var, dbi_base + PCIE_PHY_CTRL); 195*e9be4292SMarek Vasut 196*e9be4292SMarek Vasut /* wait for ack */ 197*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 1); 198*e9be4292SMarek Vasut if (ret) 199*e9be4292SMarek Vasut return ret; 200*e9be4292SMarek Vasut 201*e9be4292SMarek Vasut /* deassert wr signal */ 202*e9be4292SMarek Vasut var = data << PCIE_PHY_CTRL_DATA_LOC; 203*e9be4292SMarek Vasut writel(var, dbi_base + PCIE_PHY_CTRL); 204*e9be4292SMarek Vasut 205*e9be4292SMarek Vasut /* wait for ack de-assertion */ 206*e9be4292SMarek Vasut ret = pcie_phy_poll_ack(dbi_base, 0); 207*e9be4292SMarek Vasut if (ret) 208*e9be4292SMarek Vasut return ret; 209*e9be4292SMarek Vasut 210*e9be4292SMarek Vasut writel(0x0, dbi_base + PCIE_PHY_CTRL); 211*e9be4292SMarek Vasut 212*e9be4292SMarek Vasut return 0; 213*e9be4292SMarek Vasut } 214*e9be4292SMarek Vasut 215*e9be4292SMarek Vasut static int imx6_pcie_link_up(void) 216*e9be4292SMarek Vasut { 217*e9be4292SMarek Vasut u32 rc, ltssm; 218*e9be4292SMarek Vasut int rx_valid, temp; 219*e9be4292SMarek Vasut 220*e9be4292SMarek Vasut /* link is debug bit 36, debug register 1 starts at bit 32 */ 221*e9be4292SMarek Vasut rc = readl(MX6_DBI_ADDR + PCIE_PHY_DEBUG_R1); 222*e9be4292SMarek Vasut if ((rc & PCIE_PHY_DEBUG_R1_LINK_UP) && 223*e9be4292SMarek Vasut !(rc & PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING)) 224*e9be4292SMarek Vasut return -EAGAIN; 225*e9be4292SMarek Vasut 226*e9be4292SMarek Vasut /* 227*e9be4292SMarek Vasut * From L0, initiate MAC entry to gen2 if EP/RC supports gen2. 228*e9be4292SMarek Vasut * Wait 2ms (LTSSM timeout is 24ms, PHY lock is ~5us in gen2). 229*e9be4292SMarek Vasut * If (MAC/LTSSM.state == Recovery.RcvrLock) 230*e9be4292SMarek Vasut * && (PHY/rx_valid==0) then pulse PHY/rx_reset. Transition 231*e9be4292SMarek Vasut * to gen2 is stuck 232*e9be4292SMarek Vasut */ 233*e9be4292SMarek Vasut pcie_phy_read((void *)MX6_DBI_ADDR, PCIE_PHY_RX_ASIC_OUT, &rx_valid); 234*e9be4292SMarek Vasut ltssm = readl(MX6_DBI_ADDR + PCIE_PHY_DEBUG_R0) & 0x3F; 235*e9be4292SMarek Vasut 236*e9be4292SMarek Vasut if (rx_valid & 0x01) 237*e9be4292SMarek Vasut return 0; 238*e9be4292SMarek Vasut 239*e9be4292SMarek Vasut if (ltssm != 0x0d) 240*e9be4292SMarek Vasut return 0; 241*e9be4292SMarek Vasut 242*e9be4292SMarek Vasut printf("transition to gen2 is stuck, reset PHY!\n"); 243*e9be4292SMarek Vasut 244*e9be4292SMarek Vasut pcie_phy_read((void *)MX6_DBI_ADDR, PHY_RX_OVRD_IN_LO, &temp); 245*e9be4292SMarek Vasut temp |= (PHY_RX_OVRD_IN_LO_RX_DATA_EN | PHY_RX_OVRD_IN_LO_RX_PLL_EN); 246*e9be4292SMarek Vasut pcie_phy_write((void *)MX6_DBI_ADDR, PHY_RX_OVRD_IN_LO, temp); 247*e9be4292SMarek Vasut 248*e9be4292SMarek Vasut udelay(3000); 249*e9be4292SMarek Vasut 250*e9be4292SMarek Vasut pcie_phy_read((void *)MX6_DBI_ADDR, PHY_RX_OVRD_IN_LO, &temp); 251*e9be4292SMarek Vasut temp &= ~(PHY_RX_OVRD_IN_LO_RX_DATA_EN | PHY_RX_OVRD_IN_LO_RX_PLL_EN); 252*e9be4292SMarek Vasut pcie_phy_write((void *)MX6_DBI_ADDR, PHY_RX_OVRD_IN_LO, temp); 253*e9be4292SMarek Vasut 254*e9be4292SMarek Vasut return 0; 255*e9be4292SMarek Vasut } 256*e9be4292SMarek Vasut 257*e9be4292SMarek Vasut /* 258*e9be4292SMarek Vasut * iATU region setup 259*e9be4292SMarek Vasut */ 260*e9be4292SMarek Vasut static int imx_pcie_regions_setup(void) 261*e9be4292SMarek Vasut { 262*e9be4292SMarek Vasut /* 263*e9be4292SMarek Vasut * i.MX6 defines 16MB in the AXI address map for PCIe. 264*e9be4292SMarek Vasut * 265*e9be4292SMarek Vasut * That address space excepted the pcie registers is 266*e9be4292SMarek Vasut * split and defined into different regions by iATU, 267*e9be4292SMarek Vasut * with sizes and offsets as follows: 268*e9be4292SMarek Vasut * 269*e9be4292SMarek Vasut * 0x0100_0000 --- 0x010F_FFFF 1MB IORESOURCE_IO 270*e9be4292SMarek Vasut * 0x0110_0000 --- 0x01EF_FFFF 14MB IORESOURCE_MEM 271*e9be4292SMarek Vasut * 0x01F0_0000 --- 0x01FF_FFFF 1MB Cfg + Registers 272*e9be4292SMarek Vasut */ 273*e9be4292SMarek Vasut 274*e9be4292SMarek Vasut /* CMD reg:I/O space, MEM space, and Bus Master Enable */ 275*e9be4292SMarek Vasut setbits_le32(MX6_DBI_ADDR | PCI_COMMAND, 276*e9be4292SMarek Vasut PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); 277*e9be4292SMarek Vasut 278*e9be4292SMarek Vasut /* Set the CLASS_REV of RC CFG header to PCI_CLASS_BRIDGE_PCI */ 279*e9be4292SMarek Vasut setbits_le32(MX6_DBI_ADDR + PCI_CLASS_REVISION, 280*e9be4292SMarek Vasut PCI_CLASS_BRIDGE_PCI << 16); 281*e9be4292SMarek Vasut 282*e9be4292SMarek Vasut /* Region #0 is used for Outbound CFG space access. */ 283*e9be4292SMarek Vasut writel(0, MX6_DBI_ADDR + PCIE_ATU_VIEWPORT); 284*e9be4292SMarek Vasut 285*e9be4292SMarek Vasut writel(MX6_ROOT_ADDR, MX6_DBI_ADDR + PCIE_ATU_LOWER_BASE); 286*e9be4292SMarek Vasut writel(0, MX6_DBI_ADDR + PCIE_ATU_UPPER_BASE); 287*e9be4292SMarek Vasut writel(MX6_ROOT_ADDR + MX6_ROOT_SIZE, MX6_DBI_ADDR + PCIE_ATU_LIMIT); 288*e9be4292SMarek Vasut 289*e9be4292SMarek Vasut writel(0, MX6_DBI_ADDR + PCIE_ATU_LOWER_TARGET); 290*e9be4292SMarek Vasut writel(0, MX6_DBI_ADDR + PCIE_ATU_UPPER_TARGET); 291*e9be4292SMarek Vasut writel(PCIE_ATU_TYPE_CFG0, MX6_DBI_ADDR + PCIE_ATU_CR1); 292*e9be4292SMarek Vasut writel(PCIE_ATU_ENABLE, MX6_DBI_ADDR + PCIE_ATU_CR2); 293*e9be4292SMarek Vasut 294*e9be4292SMarek Vasut return 0; 295*e9be4292SMarek Vasut } 296*e9be4292SMarek Vasut 297*e9be4292SMarek Vasut /* 298*e9be4292SMarek Vasut * PCI Express accessors 299*e9be4292SMarek Vasut */ 300*e9be4292SMarek Vasut static uint32_t get_bus_address(pci_dev_t d, int where) 301*e9be4292SMarek Vasut { 302*e9be4292SMarek Vasut uint32_t va_address; 303*e9be4292SMarek Vasut 304*e9be4292SMarek Vasut /* Reconfigure Region #0 */ 305*e9be4292SMarek Vasut writel(0, MX6_DBI_ADDR + PCIE_ATU_VIEWPORT); 306*e9be4292SMarek Vasut 307*e9be4292SMarek Vasut if (PCI_BUS(d) < 2) 308*e9be4292SMarek Vasut writel(PCIE_ATU_TYPE_CFG0, MX6_DBI_ADDR + PCIE_ATU_CR1); 309*e9be4292SMarek Vasut else 310*e9be4292SMarek Vasut writel(PCIE_ATU_TYPE_CFG1, MX6_DBI_ADDR + PCIE_ATU_CR1); 311*e9be4292SMarek Vasut 312*e9be4292SMarek Vasut if (PCI_BUS(d) == 0) { 313*e9be4292SMarek Vasut va_address = MX6_DBI_ADDR; 314*e9be4292SMarek Vasut } else { 315*e9be4292SMarek Vasut writel(d << 8, MX6_DBI_ADDR + PCIE_ATU_LOWER_TARGET); 316*e9be4292SMarek Vasut va_address = MX6_IO_ADDR + SZ_16M - SZ_1M; 317*e9be4292SMarek Vasut } 318*e9be4292SMarek Vasut 319*e9be4292SMarek Vasut va_address += (where & ~0x3); 320*e9be4292SMarek Vasut 321*e9be4292SMarek Vasut return va_address; 322*e9be4292SMarek Vasut } 323*e9be4292SMarek Vasut 324*e9be4292SMarek Vasut static int imx_pcie_addr_valid(pci_dev_t d) 325*e9be4292SMarek Vasut { 326*e9be4292SMarek Vasut if ((PCI_BUS(d) == 0) && (PCI_DEV(d) > 1)) 327*e9be4292SMarek Vasut return -EINVAL; 328*e9be4292SMarek Vasut if ((PCI_BUS(d) == 1) && (PCI_DEV(d) > 0)) 329*e9be4292SMarek Vasut return -EINVAL; 330*e9be4292SMarek Vasut return 0; 331*e9be4292SMarek Vasut } 332*e9be4292SMarek Vasut 333*e9be4292SMarek Vasut /* 334*e9be4292SMarek Vasut * Replace the original ARM DABT handler with a simple jump-back one. 335*e9be4292SMarek Vasut * 336*e9be4292SMarek Vasut * The problem here is that if we have a PCIe bridge attached to this PCIe 337*e9be4292SMarek Vasut * controller, but no PCIe device is connected to the bridges' downstream 338*e9be4292SMarek Vasut * port, the attempt to read/write from/to the config space will produce 339*e9be4292SMarek Vasut * a DABT. This is a behavior of the controller and can not be disabled 340*e9be4292SMarek Vasut * unfortuatelly. 341*e9be4292SMarek Vasut * 342*e9be4292SMarek Vasut * To work around the problem, we backup the current DABT handler address 343*e9be4292SMarek Vasut * and replace it with our own DABT handler, which only bounces right back 344*e9be4292SMarek Vasut * into the code. 345*e9be4292SMarek Vasut */ 346*e9be4292SMarek Vasut static void imx_pcie_fix_dabt_handler(bool set) 347*e9be4292SMarek Vasut { 348*e9be4292SMarek Vasut extern uint32_t *_data_abort; 349*e9be4292SMarek Vasut uint32_t *data_abort_addr = (uint32_t *)&_data_abort; 350*e9be4292SMarek Vasut 351*e9be4292SMarek Vasut static const uint32_t data_abort_bounce_handler = 0xe25ef004; 352*e9be4292SMarek Vasut uint32_t data_abort_bounce_addr = (uint32_t)&data_abort_bounce_handler; 353*e9be4292SMarek Vasut 354*e9be4292SMarek Vasut static uint32_t data_abort_backup; 355*e9be4292SMarek Vasut 356*e9be4292SMarek Vasut if (set) { 357*e9be4292SMarek Vasut data_abort_backup = *data_abort_addr; 358*e9be4292SMarek Vasut *data_abort_addr = data_abort_bounce_addr; 359*e9be4292SMarek Vasut } else { 360*e9be4292SMarek Vasut *data_abort_addr = data_abort_backup; 361*e9be4292SMarek Vasut } 362*e9be4292SMarek Vasut } 363*e9be4292SMarek Vasut 364*e9be4292SMarek Vasut static int imx_pcie_read_config(struct pci_controller *hose, pci_dev_t d, 365*e9be4292SMarek Vasut int where, u32 *val) 366*e9be4292SMarek Vasut { 367*e9be4292SMarek Vasut uint32_t va_address; 368*e9be4292SMarek Vasut int ret; 369*e9be4292SMarek Vasut 370*e9be4292SMarek Vasut ret = imx_pcie_addr_valid(d); 371*e9be4292SMarek Vasut if (ret) { 372*e9be4292SMarek Vasut *val = 0xffffffff; 373*e9be4292SMarek Vasut return ret; 374*e9be4292SMarek Vasut } 375*e9be4292SMarek Vasut 376*e9be4292SMarek Vasut va_address = get_bus_address(d, where); 377*e9be4292SMarek Vasut 378*e9be4292SMarek Vasut /* 379*e9be4292SMarek Vasut * Read the PCIe config space. We must replace the DABT handler 380*e9be4292SMarek Vasut * here in case we got data abort from the PCIe controller, see 381*e9be4292SMarek Vasut * imx_pcie_fix_dabt_handler() description. Note that writing the 382*e9be4292SMarek Vasut * "val" with valid value is also imperative here as in case we 383*e9be4292SMarek Vasut * did got DABT, the val would contain random value. 384*e9be4292SMarek Vasut */ 385*e9be4292SMarek Vasut imx_pcie_fix_dabt_handler(true); 386*e9be4292SMarek Vasut writel(0xffffffff, val); 387*e9be4292SMarek Vasut *val = readl(va_address); 388*e9be4292SMarek Vasut imx_pcie_fix_dabt_handler(false); 389*e9be4292SMarek Vasut 390*e9be4292SMarek Vasut return 0; 391*e9be4292SMarek Vasut } 392*e9be4292SMarek Vasut 393*e9be4292SMarek Vasut static int imx_pcie_write_config(struct pci_controller *hose, pci_dev_t d, 394*e9be4292SMarek Vasut int where, u32 val) 395*e9be4292SMarek Vasut { 396*e9be4292SMarek Vasut uint32_t va_address = 0; 397*e9be4292SMarek Vasut int ret; 398*e9be4292SMarek Vasut 399*e9be4292SMarek Vasut ret = imx_pcie_addr_valid(d); 400*e9be4292SMarek Vasut if (ret) 401*e9be4292SMarek Vasut return ret; 402*e9be4292SMarek Vasut 403*e9be4292SMarek Vasut va_address = get_bus_address(d, where); 404*e9be4292SMarek Vasut 405*e9be4292SMarek Vasut /* 406*e9be4292SMarek Vasut * Write the PCIe config space. We must replace the DABT handler 407*e9be4292SMarek Vasut * here in case we got data abort from the PCIe controller, see 408*e9be4292SMarek Vasut * imx_pcie_fix_dabt_handler() description. 409*e9be4292SMarek Vasut */ 410*e9be4292SMarek Vasut imx_pcie_fix_dabt_handler(true); 411*e9be4292SMarek Vasut writel(val, va_address); 412*e9be4292SMarek Vasut imx_pcie_fix_dabt_handler(false); 413*e9be4292SMarek Vasut 414*e9be4292SMarek Vasut return 0; 415*e9be4292SMarek Vasut } 416*e9be4292SMarek Vasut 417*e9be4292SMarek Vasut /* 418*e9be4292SMarek Vasut * Initial bus setup 419*e9be4292SMarek Vasut */ 420*e9be4292SMarek Vasut static int imx6_pcie_assert_core_reset(void) 421*e9be4292SMarek Vasut { 422*e9be4292SMarek Vasut struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; 423*e9be4292SMarek Vasut 424*e9be4292SMarek Vasut setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_TEST_POWERDOWN); 425*e9be4292SMarek Vasut clrbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_REF_SSP_EN); 426*e9be4292SMarek Vasut 427*e9be4292SMarek Vasut return 0; 428*e9be4292SMarek Vasut } 429*e9be4292SMarek Vasut 430*e9be4292SMarek Vasut static int imx6_pcie_init_phy(void) 431*e9be4292SMarek Vasut { 432*e9be4292SMarek Vasut struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; 433*e9be4292SMarek Vasut 434*e9be4292SMarek Vasut clrbits_le32(&iomuxc_regs->gpr[12], IOMUXC_GPR12_APPS_LTSSM_ENABLE); 435*e9be4292SMarek Vasut 436*e9be4292SMarek Vasut clrsetbits_le32(&iomuxc_regs->gpr[12], 437*e9be4292SMarek Vasut IOMUXC_GPR12_DEVICE_TYPE_MASK, 438*e9be4292SMarek Vasut IOMUXC_GPR12_DEVICE_TYPE_RC); 439*e9be4292SMarek Vasut clrsetbits_le32(&iomuxc_regs->gpr[12], 440*e9be4292SMarek Vasut IOMUXC_GPR12_LOS_LEVEL_MASK, 441*e9be4292SMarek Vasut IOMUXC_GPR12_LOS_LEVEL_9); 442*e9be4292SMarek Vasut 443*e9be4292SMarek Vasut writel((0x0 << IOMUXC_GPR8_PCS_TX_DEEMPH_GEN1_OFFSET) | 444*e9be4292SMarek Vasut (0x0 << IOMUXC_GPR8_PCS_TX_DEEMPH_GEN2_3P5DB_OFFSET) | 445*e9be4292SMarek Vasut (20 << IOMUXC_GPR8_PCS_TX_DEEMPH_GEN2_6DB_OFFSET) | 446*e9be4292SMarek Vasut (127 << IOMUXC_GPR8_PCS_TX_SWING_FULL_OFFSET) | 447*e9be4292SMarek Vasut (127 << IOMUXC_GPR8_PCS_TX_SWING_LOW_OFFSET), 448*e9be4292SMarek Vasut &iomuxc_regs->gpr[8]); 449*e9be4292SMarek Vasut 450*e9be4292SMarek Vasut return 0; 451*e9be4292SMarek Vasut } 452*e9be4292SMarek Vasut 453*e9be4292SMarek Vasut static int imx6_pcie_deassert_core_reset(void) 454*e9be4292SMarek Vasut { 455*e9be4292SMarek Vasut struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; 456*e9be4292SMarek Vasut 457*e9be4292SMarek Vasut /* FIXME: Power-up GPIO goes here. */ 458*e9be4292SMarek Vasut 459*e9be4292SMarek Vasut /* Enable PCIe */ 460*e9be4292SMarek Vasut clrbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_TEST_POWERDOWN); 461*e9be4292SMarek Vasut setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_REF_SSP_EN); 462*e9be4292SMarek Vasut 463*e9be4292SMarek Vasut enable_pcie_clock(); 464*e9be4292SMarek Vasut 465*e9be4292SMarek Vasut /* 466*e9be4292SMarek Vasut * Wait for the clock to settle a bit, when the clock are sourced 467*e9be4292SMarek Vasut * from the CPU, we need about 30mS to settle. 468*e9be4292SMarek Vasut */ 469*e9be4292SMarek Vasut mdelay(30); 470*e9be4292SMarek Vasut 471*e9be4292SMarek Vasut /* FIXME: GPIO reset goes here */ 472*e9be4292SMarek Vasut mdelay(100); 473*e9be4292SMarek Vasut 474*e9be4292SMarek Vasut return 0; 475*e9be4292SMarek Vasut } 476*e9be4292SMarek Vasut 477*e9be4292SMarek Vasut static int imx_pcie_link_up(void) 478*e9be4292SMarek Vasut { 479*e9be4292SMarek Vasut struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR; 480*e9be4292SMarek Vasut uint32_t tmp; 481*e9be4292SMarek Vasut int count = 0; 482*e9be4292SMarek Vasut 483*e9be4292SMarek Vasut imx6_pcie_assert_core_reset(); 484*e9be4292SMarek Vasut imx6_pcie_init_phy(); 485*e9be4292SMarek Vasut imx6_pcie_deassert_core_reset(); 486*e9be4292SMarek Vasut 487*e9be4292SMarek Vasut imx_pcie_regions_setup(); 488*e9be4292SMarek Vasut 489*e9be4292SMarek Vasut /* 490*e9be4292SMarek Vasut * FIXME: Force the PCIe RC to Gen1 operation 491*e9be4292SMarek Vasut * The RC must be forced into Gen1 mode before bringing the link 492*e9be4292SMarek Vasut * up, otherwise no downstream devices are detected. After the 493*e9be4292SMarek Vasut * link is up, a managed Gen1->Gen2 transition can be initiated. 494*e9be4292SMarek Vasut */ 495*e9be4292SMarek Vasut tmp = readl(MX6_DBI_ADDR + 0x7c); 496*e9be4292SMarek Vasut tmp &= ~0xf; 497*e9be4292SMarek Vasut tmp |= 0x1; 498*e9be4292SMarek Vasut writel(tmp, MX6_DBI_ADDR + 0x7c); 499*e9be4292SMarek Vasut 500*e9be4292SMarek Vasut /* LTSSM enable, starting link. */ 501*e9be4292SMarek Vasut setbits_le32(&iomuxc_regs->gpr[12], IOMUXC_GPR12_APPS_LTSSM_ENABLE); 502*e9be4292SMarek Vasut 503*e9be4292SMarek Vasut while (!imx6_pcie_link_up()) { 504*e9be4292SMarek Vasut udelay(10); 505*e9be4292SMarek Vasut count++; 506*e9be4292SMarek Vasut if (count >= 2000) { 507*e9be4292SMarek Vasut debug("phy link never came up\n"); 508*e9be4292SMarek Vasut debug("DEBUG_R0: 0x%08x, DEBUG_R1: 0x%08x\n", 509*e9be4292SMarek Vasut readl(MX6_DBI_ADDR + PCIE_PHY_DEBUG_R0), 510*e9be4292SMarek Vasut readl(MX6_DBI_ADDR + PCIE_PHY_DEBUG_R1)); 511*e9be4292SMarek Vasut return -EINVAL; 512*e9be4292SMarek Vasut } 513*e9be4292SMarek Vasut } 514*e9be4292SMarek Vasut 515*e9be4292SMarek Vasut return 0; 516*e9be4292SMarek Vasut } 517*e9be4292SMarek Vasut 518*e9be4292SMarek Vasut void imx_pcie_init(void) 519*e9be4292SMarek Vasut { 520*e9be4292SMarek Vasut /* Static instance of the controller. */ 521*e9be4292SMarek Vasut static struct pci_controller pcc; 522*e9be4292SMarek Vasut struct pci_controller *hose = &pcc; 523*e9be4292SMarek Vasut int ret; 524*e9be4292SMarek Vasut 525*e9be4292SMarek Vasut memset(&pcc, 0, sizeof(pcc)); 526*e9be4292SMarek Vasut 527*e9be4292SMarek Vasut /* PCI I/O space */ 528*e9be4292SMarek Vasut pci_set_region(&hose->regions[0], 529*e9be4292SMarek Vasut MX6_IO_ADDR, MX6_IO_ADDR, 530*e9be4292SMarek Vasut MX6_IO_SIZE, PCI_REGION_IO); 531*e9be4292SMarek Vasut 532*e9be4292SMarek Vasut /* PCI memory space */ 533*e9be4292SMarek Vasut pci_set_region(&hose->regions[1], 534*e9be4292SMarek Vasut MX6_MEM_ADDR, MX6_MEM_ADDR, 535*e9be4292SMarek Vasut MX6_MEM_SIZE, PCI_REGION_MEM); 536*e9be4292SMarek Vasut 537*e9be4292SMarek Vasut /* System memory space */ 538*e9be4292SMarek Vasut pci_set_region(&hose->regions[2], 539*e9be4292SMarek Vasut MMDC0_ARB_BASE_ADDR, MMDC0_ARB_BASE_ADDR, 540*e9be4292SMarek Vasut 0xefffffff, PCI_REGION_MEM | PCI_REGION_SYS_MEMORY); 541*e9be4292SMarek Vasut 542*e9be4292SMarek Vasut hose->region_count = 3; 543*e9be4292SMarek Vasut 544*e9be4292SMarek Vasut pci_set_ops(hose, 545*e9be4292SMarek Vasut pci_hose_read_config_byte_via_dword, 546*e9be4292SMarek Vasut pci_hose_read_config_word_via_dword, 547*e9be4292SMarek Vasut imx_pcie_read_config, 548*e9be4292SMarek Vasut pci_hose_write_config_byte_via_dword, 549*e9be4292SMarek Vasut pci_hose_write_config_word_via_dword, 550*e9be4292SMarek Vasut imx_pcie_write_config); 551*e9be4292SMarek Vasut 552*e9be4292SMarek Vasut /* Start the controller. */ 553*e9be4292SMarek Vasut ret = imx_pcie_link_up(); 554*e9be4292SMarek Vasut 555*e9be4292SMarek Vasut if (!ret) { 556*e9be4292SMarek Vasut pci_register_hose(hose); 557*e9be4292SMarek Vasut hose->last_busno = pci_hose_scan(hose); 558*e9be4292SMarek Vasut } 559*e9be4292SMarek Vasut } 560*e9be4292SMarek Vasut 561*e9be4292SMarek Vasut /* Probe function. */ 562*e9be4292SMarek Vasut void pci_init_board(void) 563*e9be4292SMarek Vasut { 564*e9be4292SMarek Vasut imx_pcie_init(); 565*e9be4292SMarek Vasut } 566