blob: c72e49fbe1afa198742c564eccc0d9f16746932f [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Dave Liu19580e62007-09-18 12:37:57 +08002/*
Kim Phillips9993e192009-07-18 18:42:13 -05003 * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
Dave Liu19580e62007-09-18 12:37:57 +08004 */
5
Simon Glass2cf431c2019-11-14 12:57:47 -07006#include <init.h>
Dave Liu19580e62007-09-18 12:37:57 +08007#include <asm/mmu.h>
8#include <asm/io.h>
9#include <common.h>
Simon Glass7b51b572019-08-01 09:46:52 -060010#include <env.h>
Dave Liu19580e62007-09-18 12:37:57 +080011#include <mpc83xx.h>
12#include <pci.h>
13#include <i2c.h>
Anton Vorontsov8b345572009-01-08 04:26:19 +030014#include <fdt_support.h>
Dave Liu19580e62007-09-18 12:37:57 +080015#include <asm/fsl_i2c.h>
Kumar Gala7e1afb62010-04-20 10:02:24 -050016#include <asm/fsl_mpc83xx_serdes.h>
Dave Liu19580e62007-09-18 12:37:57 +080017
Dave Liu19580e62007-09-18 12:37:57 +080018static struct pci_region pci_regions[] = {
19 {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020020 bus_start: CONFIG_SYS_PCI_MEM_BASE,
21 phys_start: CONFIG_SYS_PCI_MEM_PHYS,
22 size: CONFIG_SYS_PCI_MEM_SIZE,
Dave Liu19580e62007-09-18 12:37:57 +080023 flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
24 },
25 {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020026 bus_start: CONFIG_SYS_PCI_MMIO_BASE,
27 phys_start: CONFIG_SYS_PCI_MMIO_PHYS,
28 size: CONFIG_SYS_PCI_MMIO_SIZE,
Dave Liu19580e62007-09-18 12:37:57 +080029 flags: PCI_REGION_MEM
30 },
31 {
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020032 bus_start: CONFIG_SYS_PCI_IO_BASE,
33 phys_start: CONFIG_SYS_PCI_IO_PHYS,
34 size: CONFIG_SYS_PCI_IO_SIZE,
Dave Liu19580e62007-09-18 12:37:57 +080035 flags: PCI_REGION_IO
36 }
37};
38
Anton Vorontsov8b345572009-01-08 04:26:19 +030039static struct pci_region pcie_regions_0[] = {
40 {
41 .bus_start = CONFIG_SYS_PCIE1_MEM_BASE,
42 .phys_start = CONFIG_SYS_PCIE1_MEM_PHYS,
43 .size = CONFIG_SYS_PCIE1_MEM_SIZE,
44 .flags = PCI_REGION_MEM,
45 },
46 {
47 .bus_start = CONFIG_SYS_PCIE1_IO_BASE,
48 .phys_start = CONFIG_SYS_PCIE1_IO_PHYS,
49 .size = CONFIG_SYS_PCIE1_IO_SIZE,
50 .flags = PCI_REGION_IO,
51 },
52};
53
54static struct pci_region pcie_regions_1[] = {
55 {
56 .bus_start = CONFIG_SYS_PCIE2_MEM_BASE,
57 .phys_start = CONFIG_SYS_PCIE2_MEM_PHYS,
58 .size = CONFIG_SYS_PCIE2_MEM_SIZE,
59 .flags = PCI_REGION_MEM,
60 },
61 {
62 .bus_start = CONFIG_SYS_PCIE2_IO_BASE,
63 .phys_start = CONFIG_SYS_PCIE2_IO_PHYS,
64 .size = CONFIG_SYS_PCIE2_IO_SIZE,
65 .flags = PCI_REGION_IO,
66 },
67};
68
69static int is_pex_x2(void)
70{
Simon Glass00caae62017-08-03 12:22:12 -060071 const char *pex_x2 = env_get("pex_x2");
Anton Vorontsov8b345572009-01-08 04:26:19 +030072
73 if (pex_x2 && !strcmp(pex_x2, "yes"))
74 return 1;
75 return 0;
76}
77
Dave Liu19580e62007-09-18 12:37:57 +080078void pci_init_board(void)
79{
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020080 volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
Anton Vorontsov8b345572009-01-08 04:26:19 +030081 volatile sysconf83xx_t *sysconf = &immr->sysconf;
Dave Liu19580e62007-09-18 12:37:57 +080082 volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
83 volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
Anton Vorontsov8b345572009-01-08 04:26:19 +030084 volatile law83xx_t *pcie_law = sysconf->pcielaw;
Dave Liu19580e62007-09-18 12:37:57 +080085 struct pci_region *reg[] = { pci_regions };
Anton Vorontsov8b345572009-01-08 04:26:19 +030086 struct pci_region *pcie_reg[] = { pcie_regions_0, pcie_regions_1, };
87 u32 spridr = in_be32(&immr->sysconf.spridr);
88 int pex2 = is_pex_x2();
Dave Liu19580e62007-09-18 12:37:57 +080089
Anton Vorontsov00f7bba2008-10-02 19:17:33 +040090 if (board_pci_host_broken())
Anton Vorontsov8b345572009-01-08 04:26:19 +030091 goto skip_pci;
Anton Vorontsov00f7bba2008-10-02 19:17:33 +040092
Dave Liu19580e62007-09-18 12:37:57 +080093 /* Enable all 5 PCI_CLK_OUTPUTS */
94 clk->occr |= 0xf8000000;
95 udelay(2000);
96
97 /* Configure PCI Local Access Windows */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020098 pci_law[0].bar = CONFIG_SYS_PCI_MEM_PHYS & LAWBAR_BAR;
Dave Liu19580e62007-09-18 12:37:57 +080099 pci_law[0].ar = LBLAWAR_EN | LBLAWAR_512MB;
100
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200101 pci_law[1].bar = CONFIG_SYS_PCI_IO_PHYS & LAWBAR_BAR;
Dave Liu19580e62007-09-18 12:37:57 +0800102 pci_law[1].ar = LBLAWAR_EN | LBLAWAR_1MB;
103
104 udelay(2000);
105
Peter Tyser6aa3d3b2010-09-14 19:13:50 -0500106 mpc83xx_pci_init(1, reg);
Anton Vorontsov8b345572009-01-08 04:26:19 +0300107skip_pci:
108 /* There is no PEX in MPC8379 parts. */
109 if (PARTID_NO_E(spridr) == SPR_8379)
110 return;
111
Anton Vorontsov7e2ec1d2009-02-19 18:20:39 +0300112 if (pex2)
113 fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX_X2,
114 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
115 else
116 fsl_setup_serdes(CONFIG_FSL_SERDES2, FSL_SERDES_PROTO_PEX,
117 FSL_SERDES_CLK_100, FSL_SERDES_VDD_1V);
118
Anton Vorontsov8b345572009-01-08 04:26:19 +0300119 /* Configure the clock for PCIE controller */
120 clrsetbits_be32(&clk->sccr, SCCR_PCIEXP1CM | SCCR_PCIEXP2CM,
121 SCCR_PCIEXP1CM_1 | SCCR_PCIEXP2CM_1);
122
123 /* Deassert the resets in the control register */
124 out_be32(&sysconf->pecr1, 0xE0008000);
125 if (!pex2)
126 out_be32(&sysconf->pecr2, 0xE0008000);
127 udelay(2000);
128
129 /* Configure PCI Express Local Access Windows */
130 out_be32(&pcie_law[0].bar, CONFIG_SYS_PCIE1_BASE & LAWBAR_BAR);
131 out_be32(&pcie_law[0].ar, LBLAWAR_EN | LBLAWAR_512MB);
132
133 out_be32(&pcie_law[1].bar, CONFIG_SYS_PCIE2_BASE & LAWBAR_BAR);
134 out_be32(&pcie_law[1].ar, LBLAWAR_EN | LBLAWAR_512MB);
135
Kim Phillipse2229352010-09-30 13:40:34 -0500136 mpc83xx_pcie_init(pex2 ? 1 : 2, pcie_reg);
Anton Vorontsov8b345572009-01-08 04:26:19 +0300137}
138
139void ft_pcie_fixup(void *blob, bd_t *bd)
140{
141 const char *status = "disabled (PCIE1 is x2)";
142
143 if (!is_pex_x2())
144 return;
145
146 do_fixup_by_path(blob, "pci2", "status", status,
147 strlen(status) + 1, 1);
Dave Liu19580e62007-09-18 12:37:57 +0800148}