linux/arch/sh/drivers/pci/pcie-sh7786.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Low-Level PCI Express Support for the SH7786
   4 *
   5 *  Copyright (C) 2009 - 2011  Paul Mundt
   6 */
   7#define pr_fmt(fmt) "PCI: " fmt
   8
   9#include <linux/pci.h>
  10#include <linux/init.h>
  11#include <linux/kernel.h>
  12#include <linux/io.h>
  13#include <linux/async.h>
  14#include <linux/delay.h>
  15#include <linux/dma-map-ops.h>
  16#include <linux/slab.h>
  17#include <linux/clk.h>
  18#include <linux/sh_clk.h>
  19#include <linux/sh_intc.h>
  20#include <cpu/sh7786.h>
  21#include "pcie-sh7786.h"
  22#include <linux/sizes.h>
  23
  24struct sh7786_pcie_port {
  25        struct pci_channel      *hose;
  26        struct clk              *fclk, phy_clk;
  27        unsigned int            index;
  28        int                     endpoint;
  29        int                     link;
  30};
  31
  32static struct sh7786_pcie_port *sh7786_pcie_ports;
  33static unsigned int nr_ports;
  34static unsigned long dma_pfn_offset;
  35size_t memsize;
  36u64 memstart;
  37
  38static struct sh7786_pcie_hwops {
  39        int (*core_init)(void);
  40        async_func_t port_init_hw;
  41} *sh7786_pcie_hwops;
  42
  43static struct resource sh7786_pci0_resources[] = {
  44        {
  45                .name   = "PCIe0 MEM 0",
  46                .start  = 0xfd000000,
  47                .end    = 0xfd000000 + SZ_8M - 1,
  48                .flags  = IORESOURCE_MEM,
  49        }, {
  50                .name   = "PCIe0 MEM 1",
  51                .start  = 0xc0000000,
  52                .end    = 0xc0000000 + SZ_512M - 1,
  53                .flags  = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
  54        }, {
  55                .name   = "PCIe0 MEM 2",
  56                .start  = 0x10000000,
  57                .end    = 0x10000000 + SZ_64M - 1,
  58                .flags  = IORESOURCE_MEM,
  59        }, {
  60                .name   = "PCIe0 IO",
  61                .start  = 0xfe100000,
  62                .end    = 0xfe100000 + SZ_1M - 1,
  63                .flags  = IORESOURCE_IO,
  64        },
  65};
  66
  67static struct resource sh7786_pci1_resources[] = {
  68        {
  69                .name   = "PCIe1 MEM 0",
  70                .start  = 0xfd800000,
  71                .end    = 0xfd800000 + SZ_8M - 1,
  72                .flags  = IORESOURCE_MEM,
  73        }, {
  74                .name   = "PCIe1 MEM 1",
  75                .start  = 0xa0000000,
  76                .end    = 0xa0000000 + SZ_512M - 1,
  77                .flags  = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
  78        }, {
  79                .name   = "PCIe1 MEM 2",
  80                .start  = 0x30000000,
  81                .end    = 0x30000000 + SZ_256M - 1,
  82                .flags  = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
  83        }, {
  84                .name   = "PCIe1 IO",
  85                .start  = 0xfe300000,
  86                .end    = 0xfe300000 + SZ_1M - 1,
  87                .flags  = IORESOURCE_IO,
  88        },
  89};
  90
  91static struct resource sh7786_pci2_resources[] = {
  92        {
  93                .name   = "PCIe2 MEM 0",
  94                .start  = 0xfc800000,
  95                .end    = 0xfc800000 + SZ_4M - 1,
  96                .flags  = IORESOURCE_MEM,
  97        }, {
  98                .name   = "PCIe2 MEM 1",
  99                .start  = 0x80000000,
 100                .end    = 0x80000000 + SZ_512M - 1,
 101                .flags  = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
 102        }, {
 103                .name   = "PCIe2 MEM 2",
 104                .start  = 0x20000000,
 105                .end    = 0x20000000 + SZ_256M - 1,
 106                .flags  = IORESOURCE_MEM | IORESOURCE_MEM_32BIT,
 107        }, {
 108                .name   = "PCIe2 IO",
 109                .start  = 0xfcd00000,
 110                .end    = 0xfcd00000 + SZ_1M - 1,
 111                .flags  = IORESOURCE_IO,
 112        },
 113};
 114
 115extern struct pci_ops sh7786_pci_ops;
 116
 117#define DEFINE_CONTROLLER(start, idx)                                   \
 118{                                                                       \
 119        .pci_ops        = &sh7786_pci_ops,                              \
 120        .resources      = sh7786_pci##idx##_resources,                  \
 121        .nr_resources   = ARRAY_SIZE(sh7786_pci##idx##_resources),      \
 122        .reg_base       = start,                                        \
 123        .mem_offset     = 0,                                            \
 124        .io_offset      = 0,                                            \
 125}
 126
 127static struct pci_channel sh7786_pci_channels[] = {
 128        DEFINE_CONTROLLER(0xfe000000, 0),
 129        DEFINE_CONTROLLER(0xfe200000, 1),
 130        DEFINE_CONTROLLER(0xfcc00000, 2),
 131};
 132
 133static struct clk fixed_pciexclkp = {
 134        .rate = 100000000,      /* 100 MHz reference clock */
 135};
 136
 137static void sh7786_pci_fixup(struct pci_dev *dev)
 138{
 139        /*
 140         * Prevent enumeration of root complex resources.
 141         */
 142        if (pci_is_root_bus(dev->bus) && dev->devfn == 0) {
 143                int i;
 144
 145                for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
 146                        dev->resource[i].start  = 0;
 147                        dev->resource[i].end    = 0;
 148                        dev->resource[i].flags  = 0;
 149                }
 150        }
 151}
 152DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_RENESAS, PCI_DEVICE_ID_RENESAS_SH7786,
 153                         sh7786_pci_fixup);
 154
 155static int __init phy_wait_for_ack(struct pci_channel *chan)
 156{
 157        unsigned int timeout = 100;
 158
 159        while (timeout--) {
 160                if (pci_read_reg(chan, SH4A_PCIEPHYADRR) & (1 << BITS_ACK))
 161                        return 0;
 162
 163                udelay(100);
 164        }
 165
 166        return -ETIMEDOUT;
 167}
 168
 169static int __init pci_wait_for_irq(struct pci_channel *chan, unsigned int mask)
 170{
 171        unsigned int timeout = 100;
 172
 173        while (timeout--) {
 174                if ((pci_read_reg(chan, SH4A_PCIEINTR) & mask) == mask)
 175                        return 0;
 176
 177                udelay(100);
 178        }
 179
 180        return -ETIMEDOUT;
 181}
 182
 183static void __init phy_write_reg(struct pci_channel *chan, unsigned int addr,
 184                                 unsigned int lane, unsigned int data)
 185{
 186        unsigned long phyaddr;
 187
 188        phyaddr = (1 << BITS_CMD) + ((lane & 0xf) << BITS_LANE) +
 189                        ((addr & 0xff) << BITS_ADR);
 190
 191        /* Set write data */
 192        pci_write_reg(chan, data, SH4A_PCIEPHYDOUTR);
 193        pci_write_reg(chan, phyaddr, SH4A_PCIEPHYADRR);
 194
 195        phy_wait_for_ack(chan);
 196
 197        /* Clear command */
 198        pci_write_reg(chan, 0, SH4A_PCIEPHYDOUTR);
 199        pci_write_reg(chan, 0, SH4A_PCIEPHYADRR);
 200
 201        phy_wait_for_ack(chan);
 202}
 203
 204static int __init pcie_clk_init(struct sh7786_pcie_port *port)
 205{
 206        struct pci_channel *chan = port->hose;
 207        struct clk *clk;
 208        char fclk_name[16];
 209        int ret;
 210
 211        /*
 212         * First register the fixed clock
 213         */
 214        ret = clk_register(&fixed_pciexclkp);
 215        if (unlikely(ret != 0))
 216                return ret;
 217
 218        /*
 219         * Grab the port's function clock, which the PHY clock depends
 220         * on. clock lookups don't help us much at this point, since no
 221         * dev_id is available this early. Lame.
 222         */
 223        snprintf(fclk_name, sizeof(fclk_name), "pcie%d_fck", port->index);
 224
 225        port->fclk = clk_get(NULL, fclk_name);
 226        if (IS_ERR(port->fclk)) {
 227                ret = PTR_ERR(port->fclk);
 228                goto err_fclk;
 229        }
 230
 231        clk_enable(port->fclk);
 232
 233        /*
 234         * And now, set up the PHY clock
 235         */
 236        clk = &port->phy_clk;
 237
 238        memset(clk, 0, sizeof(struct clk));
 239
 240        clk->parent = &fixed_pciexclkp;
 241        clk->enable_reg = (void __iomem *)(chan->reg_base + SH4A_PCIEPHYCTLR);
 242        clk->enable_bit = BITS_CKE;
 243
 244        ret = sh_clk_mstp_register(clk, 1);
 245        if (unlikely(ret < 0))
 246                goto err_phy;
 247
 248        return 0;
 249
 250err_phy:
 251        clk_disable(port->fclk);
 252        clk_put(port->fclk);
 253err_fclk:
 254        clk_unregister(&fixed_pciexclkp);
 255
 256        return ret;
 257}
 258
 259static int __init phy_init(struct sh7786_pcie_port *port)
 260{
 261        struct pci_channel *chan = port->hose;
 262        unsigned int timeout = 100;
 263
 264        clk_enable(&port->phy_clk);
 265
 266        /* Initialize the phy */
 267        phy_write_reg(chan, 0x60, 0xf, 0x004b008b);
 268        phy_write_reg(chan, 0x61, 0xf, 0x00007b41);
 269        phy_write_reg(chan, 0x64, 0xf, 0x00ff4f00);
 270        phy_write_reg(chan, 0x65, 0xf, 0x09070907);
 271        phy_write_reg(chan, 0x66, 0xf, 0x00000010);
 272        phy_write_reg(chan, 0x74, 0xf, 0x0007001c);
 273        phy_write_reg(chan, 0x79, 0xf, 0x01fc000d);
 274        phy_write_reg(chan, 0xb0, 0xf, 0x00000610);
 275
 276        /* Deassert Standby */
 277        phy_write_reg(chan, 0x67, 0x1, 0x00000400);
 278
 279        /* Disable clock */
 280        clk_disable(&port->phy_clk);
 281
 282        while (timeout--) {
 283                if (pci_read_reg(chan, SH4A_PCIEPHYSR))
 284                        return 0;
 285
 286                udelay(100);
 287        }
 288
 289        return -ETIMEDOUT;
 290}
 291
 292static void __init pcie_reset(struct sh7786_pcie_port *port)
 293{
 294        struct pci_channel *chan = port->hose;
 295
 296        pci_write_reg(chan, 1, SH4A_PCIESRSTR);
 297        pci_write_reg(chan, 0, SH4A_PCIETCTLR);
 298        pci_write_reg(chan, 0, SH4A_PCIESRSTR);
 299        pci_write_reg(chan, 0, SH4A_PCIETXVC0SR);
 300}
 301
 302static int __init pcie_init(struct sh7786_pcie_port *port)
 303{
 304        struct pci_channel *chan = port->hose;
 305        unsigned int data;
 306        phys_addr_t memstart, memend;
 307        int ret, i, win;
 308
 309        /* Begin initialization */
 310        pcie_reset(port);
 311
 312        /*
 313         * Initial header for port config space is type 1, set the device
 314         * class to match. Hardware takes care of propagating the IDSETR
 315         * settings, so there is no need to bother with a quirk.
 316         */
 317        pci_write_reg(chan, PCI_CLASS_BRIDGE_PCI << 16, SH4A_PCIEIDSETR1);
 318
 319        /* Initialize default capabilities. */
 320        data = pci_read_reg(chan, SH4A_PCIEEXPCAP0);
 321        data &= ~(PCI_EXP_FLAGS_TYPE << 16);
 322
 323        if (port->endpoint)
 324                data |= PCI_EXP_TYPE_ENDPOINT << 20;
 325        else
 326                data |= PCI_EXP_TYPE_ROOT_PORT << 20;
 327
 328        data |= PCI_CAP_ID_EXP;
 329        pci_write_reg(chan, data, SH4A_PCIEEXPCAP0);
 330
 331        /* Enable data link layer active state reporting */
 332        pci_write_reg(chan, PCI_EXP_LNKCAP_DLLLARC, SH4A_PCIEEXPCAP3);
 333
 334        /* Enable extended sync and ASPM L0s support */
 335        data = pci_read_reg(chan, SH4A_PCIEEXPCAP4);
 336        data &= ~PCI_EXP_LNKCTL_ASPMC;
 337        data |= PCI_EXP_LNKCTL_ES | 1;
 338        pci_write_reg(chan, data, SH4A_PCIEEXPCAP4);
 339
 340        /* Write out the physical slot number */
 341        data = pci_read_reg(chan, SH4A_PCIEEXPCAP5);
 342        data &= ~PCI_EXP_SLTCAP_PSN;
 343        data |= (port->index + 1) << 19;
 344        pci_write_reg(chan, data, SH4A_PCIEEXPCAP5);
 345
 346        /* Set the completion timer timeout to the maximum 32ms. */
 347        data = pci_read_reg(chan, SH4A_PCIETLCTLR);
 348        data &= ~0x3f00;
 349        data |= 0x32 << 8;
 350        pci_write_reg(chan, data, SH4A_PCIETLCTLR);
 351
 352        /*
 353         * Set fast training sequences to the maximum 255,
 354         * and enable MAC data scrambling.
 355         */
 356        data = pci_read_reg(chan, SH4A_PCIEMACCTLR);
 357        data &= ~PCIEMACCTLR_SCR_DIS;
 358        data |= (0xff << 16);
 359        pci_write_reg(chan, data, SH4A_PCIEMACCTLR);
 360
 361        memstart = __pa(memory_start);
 362        memend   = __pa(memory_end);
 363        memsize = roundup_pow_of_two(memend - memstart);
 364
 365        /*
 366         * The start address must be aligned on its size. So we round
 367         * it down, and then recalculate the size so that it covers
 368         * the entire memory.
 369         */
 370        memstart = ALIGN_DOWN(memstart, memsize);
 371        memsize = roundup_pow_of_two(memend - memstart);
 372
 373        /*
 374         * If there's more than 512MB of memory, we need to roll over to
 375         * LAR1/LAMR1.
 376         */
 377        if (memsize > SZ_512M) {
 378                pci_write_reg(chan, memstart + SZ_512M, SH4A_PCIELAR1);
 379                pci_write_reg(chan, ((memsize - SZ_512M) - SZ_256) | 1,
 380                              SH4A_PCIELAMR1);
 381                memsize = SZ_512M;
 382        } else {
 383                /*
 384                 * Otherwise just zero it out and disable it.
 385                 */
 386                pci_write_reg(chan, 0, SH4A_PCIELAR1);
 387                pci_write_reg(chan, 0, SH4A_PCIELAMR1);
 388        }
 389
 390        /*
 391         * LAR0/LAMR0 covers up to the first 512MB, which is enough to
 392         * cover all of lowmem on most platforms.
 393         */
 394        pci_write_reg(chan, memstart, SH4A_PCIELAR0);
 395        pci_write_reg(chan, (memsize - SZ_256) | 1, SH4A_PCIELAMR0);
 396
 397        /* Finish initialization */
 398        data = pci_read_reg(chan, SH4A_PCIETCTLR);
 399        data |= 0x1;
 400        pci_write_reg(chan, data, SH4A_PCIETCTLR);
 401
 402        /* Let things settle down a bit.. */
 403        mdelay(100);
 404
 405        /* Enable DL_Active Interrupt generation */
 406        data = pci_read_reg(chan, SH4A_PCIEDLINTENR);
 407        data |= PCIEDLINTENR_DLL_ACT_ENABLE;
 408        pci_write_reg(chan, data, SH4A_PCIEDLINTENR);
 409
 410        /* Disable MAC data scrambling. */
 411        data = pci_read_reg(chan, SH4A_PCIEMACCTLR);
 412        data |= PCIEMACCTLR_SCR_DIS | (0xff << 16);
 413        pci_write_reg(chan, data, SH4A_PCIEMACCTLR);
 414
 415        /*
 416         * This will timeout if we don't have a link, but we permit the
 417         * port to register anyways in order to support hotplug on future
 418         * hardware.
 419         */
 420        ret = pci_wait_for_irq(chan, MASK_INT_TX_CTRL);
 421
 422        data = pci_read_reg(chan, SH4A_PCIEPCICONF1);
 423        data &= ~(PCI_STATUS_DEVSEL_MASK << 16);
 424        data |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
 425                (PCI_STATUS_CAP_LIST | PCI_STATUS_DEVSEL_FAST) << 16;
 426        pci_write_reg(chan, data, SH4A_PCIEPCICONF1);
 427
 428        pci_write_reg(chan, 0x80888000, SH4A_PCIETXVC0DCTLR);
 429        pci_write_reg(chan, 0x00222000, SH4A_PCIERXVC0DCTLR);
 430
 431        wmb();
 432
 433        if (ret == 0) {
 434                data = pci_read_reg(chan, SH4A_PCIEMACSR);
 435                printk(KERN_NOTICE "PCI: PCIe#%d x%d link detected\n",
 436                       port->index, (data >> 20) & 0x3f);
 437        } else
 438                printk(KERN_NOTICE "PCI: PCIe#%d link down\n",
 439                       port->index);
 440
 441        for (i = win = 0; i < chan->nr_resources; i++) {
 442                struct resource *res = chan->resources + i;
 443                resource_size_t size;
 444                u32 mask;
 445
 446                /*
 447                 * We can't use the 32-bit mode windows in legacy 29-bit
 448                 * mode, so just skip them entirely.
 449                 */
 450                if ((res->flags & IORESOURCE_MEM_32BIT) && __in_29bit_mode())
 451                        res->flags |= IORESOURCE_DISABLED;
 452
 453                if (res->flags & IORESOURCE_DISABLED)
 454                        continue;
 455
 456                pci_write_reg(chan, 0x00000000, SH4A_PCIEPTCTLR(win));
 457
 458                /*
 459                 * The PAMR mask is calculated in units of 256kB, which
 460                 * keeps things pretty simple.
 461                 */
 462                size = resource_size(res);
 463                mask = (roundup_pow_of_two(size) / SZ_256K) - 1;
 464                pci_write_reg(chan, mask << 18, SH4A_PCIEPAMR(win));
 465
 466                pci_write_reg(chan, upper_32_bits(res->start),
 467                              SH4A_PCIEPARH(win));
 468                pci_write_reg(chan, lower_32_bits(res->start),
 469                              SH4A_PCIEPARL(win));
 470
 471                mask = MASK_PARE;
 472                if (res->flags & IORESOURCE_IO)
 473                        mask |= MASK_SPC;
 474
 475                pci_write_reg(chan, mask, SH4A_PCIEPTCTLR(win));
 476
 477                win++;
 478        }
 479
 480        return 0;
 481}
 482
 483int pcibios_map_platform_irq(const struct pci_dev *pdev, u8 slot, u8 pin)
 484{
 485        return evt2irq(0xae0);
 486}
 487
 488void pcibios_bus_add_device(struct pci_dev *pdev)
 489{
 490        dma_direct_set_offset(&pdev->dev, __pa(memory_start),
 491                              __pa(memory_start) - memstart, memsize);
 492}
 493
 494static int __init sh7786_pcie_core_init(void)
 495{
 496        /* Return the number of ports */
 497        return test_mode_pin(MODE_PIN12) ? 3 : 2;
 498}
 499
 500static void __init sh7786_pcie_init_hw(void *data, async_cookie_t cookie)
 501{
 502        struct sh7786_pcie_port *port = data;
 503        int ret;
 504
 505        /*
 506         * Check if we are configured in endpoint or root complex mode,
 507         * this is a fixed pin setting that applies to all PCIe ports.
 508         */
 509        port->endpoint = test_mode_pin(MODE_PIN11);
 510
 511        /*
 512         * Setup clocks, needed both for PHY and PCIe registers.
 513         */
 514        ret = pcie_clk_init(port);
 515        if (unlikely(ret < 0)) {
 516                pr_err("clock initialization failed for port#%d\n",
 517                       port->index);
 518                return;
 519        }
 520
 521        ret = phy_init(port);
 522        if (unlikely(ret < 0)) {
 523                pr_err("phy initialization failed for port#%d\n",
 524                       port->index);
 525                return;
 526        }
 527
 528        ret = pcie_init(port);
 529        if (unlikely(ret < 0)) {
 530                pr_err("core initialization failed for port#%d\n",
 531                               port->index);
 532                return;
 533        }
 534
 535        /* In the interest of preserving device ordering, synchronize */
 536        async_synchronize_cookie(cookie);
 537
 538        register_pci_controller(port->hose);
 539}
 540
 541static struct sh7786_pcie_hwops sh7786_65nm_pcie_hwops __initdata = {
 542        .core_init      = sh7786_pcie_core_init,
 543        .port_init_hw   = sh7786_pcie_init_hw,
 544};
 545
 546static int __init sh7786_pcie_init(void)
 547{
 548        struct clk *platclk;
 549        u32 mm_sel;
 550        int i;
 551
 552        printk(KERN_NOTICE "PCI: Starting initialization.\n");
 553
 554        sh7786_pcie_hwops = &sh7786_65nm_pcie_hwops;
 555
 556        nr_ports = sh7786_pcie_hwops->core_init();
 557        BUG_ON(nr_ports > ARRAY_SIZE(sh7786_pci_channels));
 558
 559        if (unlikely(nr_ports == 0))
 560                return -ENODEV;
 561
 562        sh7786_pcie_ports = kcalloc(nr_ports, sizeof(struct sh7786_pcie_port),
 563                                    GFP_KERNEL);
 564        if (unlikely(!sh7786_pcie_ports))
 565                return -ENOMEM;
 566
 567        /*
 568         * Fetch any optional platform clock associated with this block.
 569         *
 570         * This is a rather nasty hack for boards with spec-mocking FPGAs
 571         * that have a secondary set of clocks outside of the on-chip
 572         * ones that need to be accounted for before there is any chance
 573         * of touching the existing MSTP bits or CPG clocks.
 574         */
 575        platclk = clk_get(NULL, "pcie_plat_clk");
 576        if (IS_ERR(platclk)) {
 577                /* Sane hardware should probably get a WARN_ON.. */
 578                platclk = NULL;
 579        }
 580
 581        clk_enable(platclk);
 582
 583        mm_sel = sh7786_mm_sel();
 584
 585        /*
 586         * Depending on the MMSELR register value, the PCIe0 MEM 1
 587         * area may not be available. See Table 13.11 of the SH7786
 588         * datasheet.
 589         */
 590        if (mm_sel != 1 && mm_sel != 2 && mm_sel != 5 && mm_sel != 6)
 591                sh7786_pci0_resources[2].flags |= IORESOURCE_DISABLED;
 592
 593        printk(KERN_NOTICE "PCI: probing %d ports.\n", nr_ports);
 594
 595        for (i = 0; i < nr_ports; i++) {
 596                struct sh7786_pcie_port *port = sh7786_pcie_ports + i;
 597
 598                port->index             = i;
 599                port->hose              = sh7786_pci_channels + i;
 600                port->hose->io_map_base = port->hose->resources[0].start;
 601
 602                async_schedule(sh7786_pcie_hwops->port_init_hw, port);
 603        }
 604
 605        async_synchronize_full();
 606
 607        return 0;
 608}
 609arch_initcall(sh7786_pcie_init);
 610