1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
3*4882a593Smuzhiyun * reserved.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This software is available to you under a choice of one of two
6*4882a593Smuzhiyun * licenses. You may choose to be licensed under the terms of the GNU
7*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file
8*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the NetLogic
9*4882a593Smuzhiyun * license below:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without
12*4882a593Smuzhiyun * modification, are permitted provided that the following conditions
13*4882a593Smuzhiyun * are met:
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright
16*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer.
17*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce the above copyright
18*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in
19*4882a593Smuzhiyun * the documentation and/or other materials provided with the
20*4882a593Smuzhiyun * distribution.
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
23*4882a593Smuzhiyun * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24*4882a593Smuzhiyun * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*4882a593Smuzhiyun * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
26*4882a593Smuzhiyun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27*4882a593Smuzhiyun * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28*4882a593Smuzhiyun * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29*4882a593Smuzhiyun * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30*4882a593Smuzhiyun * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31*4882a593Smuzhiyun * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
32*4882a593Smuzhiyun * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*4882a593Smuzhiyun */
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #ifndef __NLM_HAL_IOMAP_H__
36*4882a593Smuzhiyun #define __NLM_HAL_IOMAP_H__
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define XLP_DEFAULT_IO_BASE 0x18000000
39*4882a593Smuzhiyun #define XLP_DEFAULT_PCI_ECFG_BASE XLP_DEFAULT_IO_BASE
40*4882a593Smuzhiyun #define XLP_DEFAULT_PCI_CFG_BASE 0x1c000000
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define NMI_BASE 0xbfc00000
43*4882a593Smuzhiyun #define XLP_IO_CLK 133333333
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun #define XLP_PCIE_CFG_SIZE 0x1000 /* 4K */
46*4882a593Smuzhiyun #define XLP_PCIE_DEV_BLK_SIZE (8 * XLP_PCIE_CFG_SIZE)
47*4882a593Smuzhiyun #define XLP_PCIE_BUS_BLK_SIZE (256 * XLP_PCIE_DEV_BLK_SIZE)
48*4882a593Smuzhiyun #define XLP_IO_SIZE (64 << 20) /* ECFG space size */
49*4882a593Smuzhiyun #define XLP_IO_PCI_HDRSZ 0x100
50*4882a593Smuzhiyun #define XLP_IO_DEV(node, dev) ((dev) + (node) * 8)
51*4882a593Smuzhiyun #define XLP_IO_PCI_OFFSET(b, d, f) (((b) << 20) | ((d) << 15) | ((f) << 12))
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #define XLP_HDR_OFFSET(node, bus, dev, fn) \
54*4882a593Smuzhiyun XLP_IO_PCI_OFFSET(bus, XLP_IO_DEV(node, dev), fn)
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define XLP_IO_BRIDGE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 0)
57*4882a593Smuzhiyun /* coherent inter chip */
58*4882a593Smuzhiyun #define XLP_IO_CIC0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 1)
59*4882a593Smuzhiyun #define XLP_IO_CIC1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 2)
60*4882a593Smuzhiyun #define XLP_IO_CIC2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 3)
61*4882a593Smuzhiyun #define XLP_IO_PIC_OFFSET(node) XLP_HDR_OFFSET(node, 0, 0, 4)
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun #define XLP_IO_PCIE_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 1, i)
64*4882a593Smuzhiyun #define XLP_IO_PCIE0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 0)
65*4882a593Smuzhiyun #define XLP_IO_PCIE1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 1)
66*4882a593Smuzhiyun #define XLP_IO_PCIE2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 2)
67*4882a593Smuzhiyun #define XLP_IO_PCIE3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 1, 3)
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun #define XLP_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 2, i)
70*4882a593Smuzhiyun #define XLP_IO_USB_EHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 0)
71*4882a593Smuzhiyun #define XLP_IO_USB_OHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 1)
72*4882a593Smuzhiyun #define XLP_IO_USB_OHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 2)
73*4882a593Smuzhiyun #define XLP_IO_USB_EHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 3)
74*4882a593Smuzhiyun #define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 4)
75*4882a593Smuzhiyun #define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 5)
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun #define XLP_IO_SATA_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 2)
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun /* XLP2xx has an updated USB block */
80*4882a593Smuzhiyun #define XLP2XX_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 4, i)
81*4882a593Smuzhiyun #define XLP2XX_IO_USB_XHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 1)
82*4882a593Smuzhiyun #define XLP2XX_IO_USB_XHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 2)
83*4882a593Smuzhiyun #define XLP2XX_IO_USB_XHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 3)
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun #define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 0)
86*4882a593Smuzhiyun #define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 1)
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define XLP_IO_CMS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 0)
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #define XLP_IO_DMA_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 1)
91*4882a593Smuzhiyun #define XLP_IO_SEC_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 2)
92*4882a593Smuzhiyun #define XLP_IO_CMP_OFFSET(node) XLP_HDR_OFFSET(node, 0, 5, 3)
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun #define XLP_IO_UART_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 6, i)
95*4882a593Smuzhiyun #define XLP_IO_UART0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 0)
96*4882a593Smuzhiyun #define XLP_IO_UART1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 1)
97*4882a593Smuzhiyun #define XLP_IO_I2C_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 6, 2 + i)
98*4882a593Smuzhiyun #define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 2)
99*4882a593Smuzhiyun #define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 3)
100*4882a593Smuzhiyun #define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 4)
101*4882a593Smuzhiyun /* on 2XX, all I2C busses are on the same block */
102*4882a593Smuzhiyun #define XLP2XX_IO_I2C_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 7)
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* system management */
105*4882a593Smuzhiyun #define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 5)
106*4882a593Smuzhiyun #define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 6)
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /* Flash */
109*4882a593Smuzhiyun #define XLP_IO_NOR_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 0)
110*4882a593Smuzhiyun #define XLP_IO_NAND_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 1)
111*4882a593Smuzhiyun #define XLP_IO_SPI_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 2)
112*4882a593Smuzhiyun #define XLP_IO_MMC_OFFSET(node) XLP_HDR_OFFSET(node, 0, 7, 3)
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun /* Things have changed drastically in XLP 9XX */
115*4882a593Smuzhiyun #define XLP9XX_HDR_OFFSET(n, d, f) \
116*4882a593Smuzhiyun XLP_IO_PCI_OFFSET(xlp9xx_get_socbus(n), d, f)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun #define XLP9XX_IO_BRIDGE_OFFSET(node) XLP_IO_PCI_OFFSET(0, 0, node)
119*4882a593Smuzhiyun #define XLP9XX_IO_PIC_OFFSET(node) XLP9XX_HDR_OFFSET(node, 2, 0)
120*4882a593Smuzhiyun #define XLP9XX_IO_UART_OFFSET(node) XLP9XX_HDR_OFFSET(node, 2, 2)
121*4882a593Smuzhiyun #define XLP9XX_IO_SYS_OFFSET(node) XLP9XX_HDR_OFFSET(node, 6, 0)
122*4882a593Smuzhiyun #define XLP9XX_IO_FUSE_OFFSET(node) XLP9XX_HDR_OFFSET(node, 6, 1)
123*4882a593Smuzhiyun #define XLP9XX_IO_CLOCK_OFFSET(node) XLP9XX_HDR_OFFSET(node, 6, 2)
124*4882a593Smuzhiyun #define XLP9XX_IO_POWER_OFFSET(node) XLP9XX_HDR_OFFSET(node, 6, 3)
125*4882a593Smuzhiyun #define XLP9XX_IO_JTAG_OFFSET(node) XLP9XX_HDR_OFFSET(node, 6, 4)
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun #define XLP9XX_IO_PCIE_OFFSET(node, i) XLP9XX_HDR_OFFSET(node, 1, i)
128*4882a593Smuzhiyun #define XLP9XX_IO_PCIE0_OFFSET(node) XLP9XX_HDR_OFFSET(node, 1, 0)
129*4882a593Smuzhiyun #define XLP9XX_IO_PCIE2_OFFSET(node) XLP9XX_HDR_OFFSET(node, 1, 2)
130*4882a593Smuzhiyun #define XLP9XX_IO_PCIE3_OFFSET(node) XLP9XX_HDR_OFFSET(node, 1, 3)
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun /* XLP9xx USB block */
133*4882a593Smuzhiyun #define XLP9XX_IO_USB_OFFSET(node, i) XLP9XX_HDR_OFFSET(node, 4, i)
134*4882a593Smuzhiyun #define XLP9XX_IO_USB_XHCI0_OFFSET(node) XLP9XX_HDR_OFFSET(node, 4, 1)
135*4882a593Smuzhiyun #define XLP9XX_IO_USB_XHCI1_OFFSET(node) XLP9XX_HDR_OFFSET(node, 4, 2)
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun /* XLP9XX on-chip SATA controller */
138*4882a593Smuzhiyun #define XLP9XX_IO_SATA_OFFSET(node) XLP9XX_HDR_OFFSET(node, 3, 2)
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* Flash */
141*4882a593Smuzhiyun #define XLP9XX_IO_NOR_OFFSET(node) XLP9XX_HDR_OFFSET(node, 7, 0)
142*4882a593Smuzhiyun #define XLP9XX_IO_NAND_OFFSET(node) XLP9XX_HDR_OFFSET(node, 7, 1)
143*4882a593Smuzhiyun #define XLP9XX_IO_SPI_OFFSET(node) XLP9XX_HDR_OFFSET(node, 7, 2)
144*4882a593Smuzhiyun #define XLP9XX_IO_MMC_OFFSET(node) XLP9XX_HDR_OFFSET(node, 7, 3)
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun /* PCI config header register id's */
147*4882a593Smuzhiyun #define XLP_PCI_CFGREG0 0x00
148*4882a593Smuzhiyun #define XLP_PCI_CFGREG1 0x01
149*4882a593Smuzhiyun #define XLP_PCI_CFGREG2 0x02
150*4882a593Smuzhiyun #define XLP_PCI_CFGREG3 0x03
151*4882a593Smuzhiyun #define XLP_PCI_CFGREG4 0x04
152*4882a593Smuzhiyun #define XLP_PCI_CFGREG5 0x05
153*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG0 0x30
154*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG1 0x31
155*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG2 0x32
156*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG3 0x33
157*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG4 0x34
158*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG5 0x35
159*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG6 0x36
160*4882a593Smuzhiyun #define XLP_PCI_DEVINFO_REG7 0x37
161*4882a593Smuzhiyun #define XLP_PCI_DEVSCRATCH_REG0 0x38
162*4882a593Smuzhiyun #define XLP_PCI_DEVSCRATCH_REG1 0x39
163*4882a593Smuzhiyun #define XLP_PCI_DEVSCRATCH_REG2 0x3a
164*4882a593Smuzhiyun #define XLP_PCI_DEVSCRATCH_REG3 0x3b
165*4882a593Smuzhiyun #define XLP_PCI_MSGSTN_REG 0x3c
166*4882a593Smuzhiyun #define XLP_PCI_IRTINFO_REG 0x3d
167*4882a593Smuzhiyun #define XLP_PCI_UCODEINFO_REG 0x3e
168*4882a593Smuzhiyun #define XLP_PCI_SBB_WT_REG 0x3f
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /* PCI IDs for SoC device */
171*4882a593Smuzhiyun #define PCI_VENDOR_NETLOGIC 0x184e
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_ROOT 0x1001
174*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_ICI 0x1002
175*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_PIC 0x1003
176*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_PCIE 0x1004
177*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_EHCI 0x1007
178*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_OHCI 0x1008
179*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_NAE 0x1009
180*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_POE 0x100A
181*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_FMN 0x100B
182*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_RAID 0x100D
183*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_SAE 0x100D
184*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_RSA 0x100E
185*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_CMP 0x100F
186*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_UART 0x1010
187*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_I2C 0x1011
188*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_NOR 0x1015
189*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_NAND 0x1016
190*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_MMC 0x1018
191*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_SATA 0x101A
192*4882a593Smuzhiyun #define PCI_DEVICE_ID_NLM_XHCI 0x101D
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun #define PCI_DEVICE_ID_XLP9XX_MMC 0x9018
195*4882a593Smuzhiyun #define PCI_DEVICE_ID_XLP9XX_SATA 0x901A
196*4882a593Smuzhiyun #define PCI_DEVICE_ID_XLP9XX_XHCI 0x901D
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun #ifndef __ASSEMBLY__
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun #define nlm_read_pci_reg(b, r) nlm_read_reg(b, r)
201*4882a593Smuzhiyun #define nlm_write_pci_reg(b, r, v) nlm_write_reg(b, r, v)
202*4882a593Smuzhiyun
xlp9xx_get_socbus(int node)203*4882a593Smuzhiyun static inline int xlp9xx_get_socbus(int node)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun uint64_t socbridge;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun if (node == 0)
208*4882a593Smuzhiyun return 1;
209*4882a593Smuzhiyun socbridge = nlm_pcicfg_base(XLP9XX_IO_BRIDGE_OFFSET(node));
210*4882a593Smuzhiyun return (nlm_read_pci_reg(socbridge, 0x6) >> 8) & 0xff;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun #endif /* !__ASSEMBLY */
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun #endif /* __NLM_HAL_IOMAP_H__ */
215