xref: /rk3399_rockchip-uboot/board/freescale/mpc8349emds/pci.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
1e58fe957SKim Phillips /*
29993e196SKim Phillips  * Copyright (C) 2006-2009 Freescale Semiconductor, Inc.
39993e196SKim Phillips  *
4*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
5e58fe957SKim Phillips  */
6e58fe957SKim Phillips 
7e58fe957SKim Phillips #include <asm/mmu.h>
8162338e1SIra W. Snyder #include <asm/io.h>
9e58fe957SKim Phillips #include <common.h>
10162338e1SIra W. Snyder #include <mpc83xx.h>
11e58fe957SKim Phillips #include <pci.h>
12e58fe957SKim Phillips #include <i2c.h>
13162338e1SIra W. Snyder #include <asm/fsl_i2c.h>
14e58fe957SKim Phillips 
15e58fe957SKim Phillips DECLARE_GLOBAL_DATA_PTR;
16e58fe957SKim Phillips 
17162338e1SIra W. Snyder static struct pci_region pci1_regions[] = {
18162338e1SIra W. Snyder 	{
196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI1_MEM_BASE,
206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI1_MEM_PHYS,
216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI1_MEM_SIZE,
22162338e1SIra W. Snyder 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
23e58fe957SKim Phillips 	},
24162338e1SIra W. Snyder 	{
256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI1_IO_BASE,
266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI1_IO_PHYS,
276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI1_IO_SIZE,
28162338e1SIra W. Snyder 		flags: PCI_REGION_IO
29162338e1SIra W. Snyder 	},
30162338e1SIra W. Snyder 	{
316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI1_MMIO_BASE,
326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI1_MMIO_PHYS,
336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI1_MMIO_SIZE,
34162338e1SIra W. Snyder 		flags: PCI_REGION_MEM
35162338e1SIra W. Snyder 	},
36162338e1SIra W. Snyder };
37162338e1SIra W. Snyder 
38162338e1SIra W. Snyder #ifdef CONFIG_MPC83XX_PCI2
39162338e1SIra W. Snyder static struct pci_region pci2_regions[] = {
40162338e1SIra W. Snyder 	{
416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI2_MEM_BASE,
426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI2_MEM_PHYS,
436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI2_MEM_SIZE,
44162338e1SIra W. Snyder 		flags: PCI_REGION_MEM | PCI_REGION_PREFETCH
45162338e1SIra W. Snyder 	},
46162338e1SIra W. Snyder 	{
476d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI2_IO_BASE,
486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI2_IO_PHYS,
496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI2_IO_SIZE,
50162338e1SIra W. Snyder 		flags: PCI_REGION_IO
51162338e1SIra W. Snyder 	},
52162338e1SIra W. Snyder 	{
536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		bus_start: CONFIG_SYS_PCI2_MMIO_BASE,
546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		phys_start: CONFIG_SYS_PCI2_MMIO_PHYS,
556d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 		size: CONFIG_SYS_PCI2_MMIO_SIZE,
56162338e1SIra W. Snyder 		flags: PCI_REGION_MEM
57162338e1SIra W. Snyder 	},
58e58fe957SKim Phillips };
59e58fe957SKim Phillips #endif
60e58fe957SKim Phillips 
61447ad576SIra W. Snyder #ifndef CONFIG_PCISLAVE
pib_init(void)62162338e1SIra W. Snyder void pib_init(void)
63e58fe957SKim Phillips {
64e58fe957SKim Phillips 	u8 val8, orig_i2c_bus;
65e58fe957SKim Phillips 	/*
66e58fe957SKim Phillips 	 * Assign PIB PMC slot to desired PCI bus
67e58fe957SKim Phillips 	 */
68e58fe957SKim Phillips 	/* Switch temporarily to I2C bus #2 */
69e58fe957SKim Phillips 	orig_i2c_bus = i2c_get_bus_num();
70e58fe957SKim Phillips 	i2c_set_bus_num(1);
71e58fe957SKim Phillips 
72e58fe957SKim Phillips 	val8 = 0;
73e58fe957SKim Phillips 	i2c_write(0x23, 0x6, 1, &val8, 1);
74e58fe957SKim Phillips 	i2c_write(0x23, 0x7, 1, &val8, 1);
75e58fe957SKim Phillips 	val8 = 0xff;
76e58fe957SKim Phillips 	i2c_write(0x23, 0x2, 1, &val8, 1);
77e58fe957SKim Phillips 	i2c_write(0x23, 0x3, 1, &val8, 1);
78e58fe957SKim Phillips 
79e58fe957SKim Phillips 	val8 = 0;
80e58fe957SKim Phillips 	i2c_write(0x26, 0x6, 1, &val8, 1);
81e58fe957SKim Phillips 	val8 = 0x34;
82e58fe957SKim Phillips 	i2c_write(0x26, 0x7, 1, &val8, 1);
83e58fe957SKim Phillips #if defined(PCI_64BIT)
84e58fe957SKim Phillips 	val8 = 0xf4;	/* PMC2:PCI1/64-bit */
85e58fe957SKim Phillips #elif defined(PCI_ALL_PCI1)
86e58fe957SKim Phillips 	val8 = 0xf3;	/* PMC1:PCI1 PMC2:PCI1 PMC3:PCI1 */
87e58fe957SKim Phillips #elif defined(PCI_ONE_PCI1)
88e58fe957SKim Phillips 	val8 = 0xf9;	/* PMC1:PCI1 PMC2:PCI2 PMC3:PCI2 */
89e58fe957SKim Phillips #else
90e58fe957SKim Phillips 	val8 = 0xf5;	/* PMC1:PCI1 PMC2:PCI1 PMC3:PCI2 */
91e58fe957SKim Phillips #endif
92e58fe957SKim Phillips 	i2c_write(0x26, 0x2, 1, &val8, 1);
93e58fe957SKim Phillips 	val8 = 0xff;
94e58fe957SKim Phillips 	i2c_write(0x26, 0x3, 1, &val8, 1);
95e58fe957SKim Phillips 	val8 = 0;
96e58fe957SKim Phillips 	i2c_write(0x27, 0x6, 1, &val8, 1);
97e58fe957SKim Phillips 	i2c_write(0x27, 0x7, 1, &val8, 1);
98e58fe957SKim Phillips 	val8 = 0xff;
99e58fe957SKim Phillips 	i2c_write(0x27, 0x2, 1, &val8, 1);
100e58fe957SKim Phillips 	val8 = 0xef;
101e58fe957SKim Phillips 	i2c_write(0x27, 0x3, 1, &val8, 1);
102e58fe957SKim Phillips 	asm("eieio");
103e58fe957SKim Phillips 
104e58fe957SKim Phillips #if defined(PCI_64BIT)
105e58fe957SKim Phillips 	printf("PCI1: 64-bit on PMC2\n");
106e58fe957SKim Phillips #elif defined(PCI_ALL_PCI1)
107e58fe957SKim Phillips 	printf("PCI1: 32-bit on PMC1, PMC2, PMC3\n");
108e58fe957SKim Phillips #elif defined(PCI_ONE_PCI1)
109e58fe957SKim Phillips 	printf("PCI1: 32-bit on PMC1\n");
110e58fe957SKim Phillips 	printf("PCI2: 32-bit on PMC2, PMC3\n");
111e58fe957SKim Phillips #else
112e58fe957SKim Phillips 	printf("PCI1: 32-bit on PMC1, PMC2\n");
113e58fe957SKim Phillips 	printf("PCI2: 32-bit on PMC3\n");
114e58fe957SKim Phillips #endif
115e58fe957SKim Phillips 	/* Reset to original I2C bus */
116e58fe957SKim Phillips 	i2c_set_bus_num(orig_i2c_bus);
117e58fe957SKim Phillips }
118e58fe957SKim Phillips 
pci_init_board(void)119162338e1SIra W. Snyder void pci_init_board(void)
120e58fe957SKim Phillips {
1216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
122162338e1SIra W. Snyder 	volatile clk83xx_t *clk = (volatile clk83xx_t *)&immr->clk;
123162338e1SIra W. Snyder 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
124162338e1SIra W. Snyder #ifndef CONFIG_MPC83XX_PCI2
125162338e1SIra W. Snyder 	struct pci_region *reg[] = { pci1_regions };
126162338e1SIra W. Snyder #else
127162338e1SIra W. Snyder 	struct pci_region *reg[] = { pci1_regions, pci2_regions };
128162338e1SIra W. Snyder #endif
129e58fe957SKim Phillips 
130162338e1SIra W. Snyder 	/* initialize the PCA9555PW IO expander on the PIB board */
131e58fe957SKim Phillips 	pib_init();
132e58fe957SKim Phillips 
133162338e1SIra W. Snyder 	/* Enable all 8 PCI_CLK_OUTPUTS */
134e58fe957SKim Phillips 	clk->occr = 0xff000000;
135e58fe957SKim Phillips 	udelay(2000);
136e58fe957SKim Phillips 
137162338e1SIra W. Snyder 	/* Configure PCI Local Access Windows */
1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[0].bar = CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR;
139e58fe957SKim Phillips 	pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G;
140e58fe957SKim Phillips 
1416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[1].bar = CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR;
142e58fe957SKim Phillips 	pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_4M;
143e58fe957SKim Phillips 
144162338e1SIra W. Snyder 	udelay(2000);
145e58fe957SKim Phillips 
146162338e1SIra W. Snyder #ifndef CONFIG_MPC83XX_PCI2
1476aa3d3bfSPeter Tyser 	mpc83xx_pci_init(1, reg);
148162338e1SIra W. Snyder #else
1496aa3d3bfSPeter Tyser 	mpc83xx_pci_init(2, reg);
150e58fe957SKim Phillips #endif
151e58fe957SKim Phillips }
152162338e1SIra W. Snyder 
153447ad576SIra W. Snyder #else
pci_init_board(void)154447ad576SIra W. Snyder void pci_init_board(void)
155447ad576SIra W. Snyder {
1566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	volatile immap_t *immr = (volatile immap_t *)CONFIG_SYS_IMMR;
157447ad576SIra W. Snyder 	volatile law83xx_t *pci_law = immr->sysconf.pcilaw;
158447ad576SIra W. Snyder 	volatile pcictrl83xx_t *pci_ctrl = &immr->pci_ctrl[0];
159447ad576SIra W. Snyder 	struct pci_region *reg[] = { pci1_regions };
160447ad576SIra W. Snyder 
161447ad576SIra W. Snyder 	/* Configure PCI Local Access Windows */
1626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[0].bar = CONFIG_SYS_PCI1_MEM_PHYS & LAWBAR_BAR;
163447ad576SIra W. Snyder 	pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G;
164447ad576SIra W. Snyder 
1656d0f6bcfSJean-Christophe PLAGNIOL-VILLARD 	pci_law[1].bar = CONFIG_SYS_PCI1_IO_PHYS & LAWBAR_BAR;
166447ad576SIra W. Snyder 	pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_4M;
167447ad576SIra W. Snyder 
1686aa3d3bfSPeter Tyser 	mpc83xx_pci_init(1, reg);
169447ad576SIra W. Snyder 
170447ad576SIra W. Snyder 	/* Configure PCI Inbound Translation Windows (3 1MB windows) */
171447ad576SIra W. Snyder 	pci_ctrl->pitar0 = 0x0;
172447ad576SIra W. Snyder 	pci_ctrl->pibar0 = 0x0;
173447ad576SIra W. Snyder 	pci_ctrl->piwar0 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP |
174447ad576SIra W. Snyder 			   PIWAR_WTT_SNOOP | PIWAR_IWS_1M;
175447ad576SIra W. Snyder 
176447ad576SIra W. Snyder 	pci_ctrl->pitar1  = 0x0;
177447ad576SIra W. Snyder 	pci_ctrl->pibar1  = 0x0;
178447ad576SIra W. Snyder 	pci_ctrl->piebar1 = 0x0;
179447ad576SIra W. Snyder 	pci_ctrl->piwar1  = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP |
180447ad576SIra W. Snyder 			    PIWAR_WTT_SNOOP | PIWAR_IWS_1M;
181447ad576SIra W. Snyder 
182447ad576SIra W. Snyder 	pci_ctrl->pitar2  = 0x0;
183447ad576SIra W. Snyder 	pci_ctrl->pibar2  = 0x0;
184447ad576SIra W. Snyder 	pci_ctrl->piebar2 = 0x0;
185447ad576SIra W. Snyder 	pci_ctrl->piwar2  = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP |
186447ad576SIra W. Snyder 			    PIWAR_WTT_SNOOP | PIWAR_IWS_1M;
187447ad576SIra W. Snyder 
188447ad576SIra W. Snyder 	/* Unlock the configuration bit */
189447ad576SIra W. Snyder 	mpc83xx_pcislave_unlock(0);
190447ad576SIra W. Snyder 	printf("PCI:   Agent mode enabled\n");
191447ad576SIra W. Snyder }
192447ad576SIra W. Snyder #endif /* CONFIG_PCISLAVE */
193