Blame view

include/imx8_hsio.h 8.62 KB
99c90ff2d   Ye Li   MLK-14938-17 pcie...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  /*
   * Copyright (C) 2016 Freescale Semiconductor, Inc. All Rights Reserved.
   */
  /*
   * The code contained herein is licensed under the GNU General Public
   * License. You may obtain a copy of the GNU General Public License
   * Version 2 or later at the following locations:
   *
   * http://www.opensource.org/licenses/gpl-license.html
   * http://www.gnu.org/copyleft/gpl.html
   */
  
  #ifndef _IMX8_HSIO_H_
  #define _IMX8_HSIO_H_
  
  #define PCIEA_CFG_CPU_BASE	0x60000000
  #define PCIEA_CFG_PCI_BASE	0x40000000
  #define PCIEB_CFG_CPU_BASE	0x70000000
  #define PCIEB_CFG_PCI_BASE	0x80000000
  #define PCIE_CFG_MEM_SIZE	0x4000
  
  #define PCIE_DBI_BASE_ADDR	0x5f000000
  #define PCIE_CTRLA_BASE_ADDR	PCIE_DBI_BASE_ADDR
  #define PCIE_CTRLB_BASE_ADDR	(PCIE_DBI_BASE_ADDR + 0x10000)
  
  /* For 8DV */
  #define DEVICE_TYPE_RC		BIT(14)
  #define REFCLK_SEL		BIT(4)
  #define CMN_REG_RST		BIT(3)
  
  #define HSIO_BASE_ADDR                  0x5F070000
  #define HSIO_GPR_PCIE_CTRL0_ADDR	(HSIO_BASE_ADDR + 0x00000000)
  #define HSIO_GPR_PCIE_CTRL1_ADDR	(HSIO_BASE_ADDR + 0x00000004)
  #define HSIO_GPR_PCIE_STATUS0_ADDR	(HSIO_BASE_ADDR + 0x00000008)
  
  /* For 8QM */
  #define AHCI_BASE_ADDR			0x5F020000
  #define HW_SATA_CTRL0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00040000)
  #define HW_SATA_CTRL0_ADDR_MASK		0x000017fb
  #define HW_SATA_CTRL0_ADDR_RESET	0x0
  #define HW_SATA_CTRL0_PHY_FOMREQ	BIT(0)
  #define HW_SATA_CTRL0_PHY_PMA_DRVN	BIT(1)
  #define HW_SATA_CTRL0_EPCS_SKIPBIT	BIT(3)
  #define HW_SATA_CTRL0_EPCS_RXERR	BIT(4)
  #define HW_SATA_CTRL0_EPCS_TXDEEMP	BIT(5)
  #define HW_SATA_CTRL0_EPCS_TXDEEMP_SEL	BIT(6)
  #define HW_SATA_CTRL0_PHY_RESET		BIT(7)
  #define HW_SATA_CTRL0_EPCS_PHYRESET_SEL	BIT(8)
  #define HW_SATA_CTRL0_EPCS_RXOOB	BIT(9)
  #define HW_SATA_CTRL0_EPCS_RXOOB_SEL	BIT(10)
  #define HW_SATA_CTRL0_RESET		BIT(12)
  
  #define HSIO_LPCG_BASE_ADDR		0x5F050000
  #define HSIO_GPIO_BASE_ADDR		0x5F170000
  
  #define GPR_LPCG_PCIEA_CTRL_MSTR_ACLK (HSIO_LPCG_BASE_ADDR + 0x00000000)
  #define GPR_LPCG_PCIEB_CTRL_MSTR_ACLK (HSIO_LPCG_BASE_ADDR + 0x00010000)
  #define GPR_LPCG_PHYX2APB_0_APB       (HSIO_LPCG_BASE_ADDR + 0x00030000)
  #define GPR_LPCG_PHYX1_APB            (HSIO_LPCG_BASE_ADDR + 0x00040000)
  #define GPR_LPCG_CRR_0                (HSIO_LPCG_BASE_ADDR + 0x00050000)
  #define GPR_LPCG_CRR_1                (HSIO_LPCG_BASE_ADDR + 0x00060000)
  #define GPR_LPCG_CRR_2                (HSIO_LPCG_BASE_ADDR + 0x00070000)
  #define GPR_LPCG_CRR_3                (HSIO_LPCG_BASE_ADDR + 0x00080000)
  #define GPR_LPCG_CRR_4                (HSIO_LPCG_BASE_ADDR + 0x00090000)
  #define GPR_LPCG_CRR_5                (HSIO_LPCG_BASE_ADDR + 0x000a0000)
  #define GPR_LPCG_GPIO                 (HSIO_LPCG_BASE_ADDR + 0x000b0000)
  
  #define HSIO_CRR_BASE_ADDR		0x5F110000
  
  #define HW_PHYX2_CTRL0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00000000)
  #define HW_PHYX2_CTRL0_APB_RSTN_0	BIT(0)
  #define HW_PHYX2_CTRL0_APB_RSTN_1	BIT(1)
  #define HW_PHYX2_CTRL0_PIPE_LN2LK_MASK	(0xF << 13)
  #define HW_PHYX2_CTRL0_PIPE_LN2LK_0	BIT(13)
  #define HW_PHYX2_CTRL0_PIPE_LN2LK_1	BIT(14)
  #define HW_PHYX2_CTRL0_PIPE_LN2LK_2	BIT(15)
  #define HW_PHYX2_CTRL0_PIPE_LN2LK_3	BIT(16)
  
  #define HW_PHYX2_STTS0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00000004)
  #define HW_PHYX2_STTS0_LANE0_TX_PLL_LOCK	BIT(4)
  #define HW_PHYX2_STTS0_LANE1_TX_PLL_LOCK	BIT(12)
  
  #define HW_PHYX1_CTRL0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00010000)
  #define HW_PHYX1_CTRL0_APB_RSTN		BIT(0)
  #define HW_PHYX1_CTRL0_PIPE_LN2LK_MASK  (0xF << 13)
  #define HW_PHYX1_CTRL0_PIPE_LN2LK_0     BIT(13)
  #define HW_PHYX1_CTRL0_PIPE_LN2LK_1     BIT(14)
  #define HW_PHYX1_CTRL0_PIPE_LN2LK_2     BIT(15)
  #define HW_PHYX1_CTRL0_PIPE_LN2LK_3     BIT(16)
  
  #define HW_PHYX1_STTS0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00010004)
  #define HW_PHYX1_STTS0_LANE0_TX_PLL_LOCK	BIT(4)
  #define HW_PHYX1_STTS0_LANE0_RX_PLL_LOCK	BIT(5)
  
  #define HW_MISC_CTRL0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00050000)
  #define HW_MISC_CTRL0_IOB_RXENA		BIT(0)
  #define HW_MISC_CTRL0_IOB_TXENA		BIT(1)
  #define HW_MISC_CTRL0_FAST_INIT		BIT(11)
  #define HW_MISC_CTRL0_PHY_X1_EPCS_SEL	BIT(12)
  #define HW_MISC_CTRL0_PCIE_AB_SELECT	BIT(13)
  
  #define HW_PCIEX2_CTRL0_ADDR			(HSIO_CRR_BASE_ADDR + 0x00020000)
  #define HW_PCIEX2_CTRL0_DEVICE_TYPE_MASK	(0xF << 24)
  #define HW_PCIEX2_CTRL0_DEVICE_TYPE_RC		BIT(26)
  
  #define HW_PCIEX2_CTRL2_ADDR			(HSIO_CRR_BASE_ADDR + 0x00020008)
  #define HW_PCIEX2_CTRL2_APP_LTSSM_ENABLE	BIT(4)
  #define HW_PCIEX2_CTRL2_BUTTON_RST_N		BIT(21)
  #define HW_PCIEX2_CTRL2_PERST_N			BIT(22)
  #define HW_PCIEX2_CTRL2_POWER_UP_RST_N		BIT(23)
  
  #define HW_PCIEX2_STTS0_ADDR		(HSIO_CRR_BASE_ADDR + 0x0002000C)
  #define HW_PCIEX2_STTS0_PM_REQ_CORE_RST BIT(19)
  
  #define HW_PCIEX1_CTRL0_ADDR		(HSIO_CRR_BASE_ADDR + 0x00030000)
  #define HW_PCIEX1_CTRL0_DEVICE_TYPE_MASK	(0xF << 24)
  #define HW_PCIEX1_CTRL0_DEVICE_TYPE_RC		BIT(26)
  
  #define HW_PCIEX1_CTRL2_ADDR		(HSIO_CRR_BASE_ADDR + 0x00030008)
  #define HW_PCIEX1_CTRL2_APP_LTSSM_ENABLE	BIT(4)
  #define HW_PCIEX1_CTRL2_BUTTON_RST_N		BIT(21)
  #define HW_PCIEX1_CTRL2_PERST_N			BIT(22)
  #define HW_PCIEX1_CTRL2_POWER_UP_RST_N		BIT(23)
  
  #define HW_PCIEX1_STTS0_ADDR		(HSIO_CRR_BASE_ADDR + 0x0003000c)
  #define HW_PCIEX1_STTS0_PM_REQ_CORE_RST BIT(19)
  
  /* PCIe Port Logic registers (memory-mapped) */
  #define PF0_PORT_LOGIC			(PCIE_CTRLA_BASE_ADDR + 0x700)
  #define PF1_PORT_LOGIC			(PCIE_CTRLB_BASE_ADDR + 0x700)
  
  #define PORT0_LINK_CTRL			(PF0_PORT_LOGIC + 0x10)
  #define PORT1_LINK_CTRL			(PF1_PORT_LOGIC + 0x10)
  #define PORT_LINK_CTRL_LNK_EN_MASK	(0x3F << 16)
  #define PORT_LINK_CTRL_LNK_LANE1	(0x1 << 16)
  #define PORT_LINK_CTRL_LNK_LANE2	(0x3 << 16)
  #define PORT_LINK_CTRL_LNK_FAST_LNK	BIT(7)
  
  #define PORT0_LINK_DEBUG1		(PF0_PORT_LOGIC + 0x2C)
  #define PORT1_LINK_DEBUG1		(PF1_PORT_LOGIC + 0x2C)
  #define PORT_LINK_DEBUG1_LINK_UP	BIT(4)
  
  #define PORT0_GEN2_CTRL			(PF0_PORT_LOGIC + 0x10C)
  #define PORT1_GEN2_CTRL			(PF1_PORT_LOGIC + 0x10C)
  #define PORT_GEN2_CTRL_NUM_LANES_MASK	(0xFF << 8)
  #define PORT_GEN2_CTRL_NUM_LANES_1	(0x1 << 8)
  #define PORT_GEN2_CTRL_NUM_LANES_2	(0x2 << 8)
  
  #define PORT0_MISC_CONTROL_1		(PF0_PORT_LOGIC + 0x1BC)
  #define PORT1_MISC_CONTROL_1		(PF1_PORT_LOGIC + 0x1BC)
  
  #define PORT0_DBI_LNK_STS_CTRL2		(PCIE_CTRLA_BASE_ADDR + 0xA0)
  
  #define PF0_TYPE1_HDR			(PCIE_CTRLA_BASE_ADDR + 0x0)
  #define PF0_TYPE1_STATUS_COMMAND_REG	(PF0_TYPE1_HDR + 0x4)
  #define PF1_TYPE1_HDR			(PCIE_CTRLB_BASE_ADDR + 0x0)
  #define PF1_TYPE1_STATUS_COMMAND_REG	(PF1_TYPE1_HDR + 0x4)
  
  #define PF0_PCIE_CAP				(PCIE_CTRLA_BASE_ADDR + 0x70)
  #define PF0_LINK_CONTROL_LINK_STATUS_REG	(PF0_PCIE_CAP + 0x10)
  #define PF1_PCIE_CAP				(PCIE_CTRLB_BASE_ADDR + 0x70)
  #define PF1_LINK_CONTROL_LINK_STATUS_REG	(PF1_PCIE_CAP + 0x10)
  
  #define PF0_SPICE_CAP			(PCIE_CTRLA_BASE_ADDR + 0x148)
  #define PF0_SPCIE_CAP_OFF_0CH_REG	(PF0_SPICE_CAP + 0xC)
  #define PF1_SPICE_CAP			(PCIE_CTRLB_BASE_ADDR + 0x148)
  #define PF1_SPCIE_CAP_OFF_0CH_REG	(PF1_SPICE_CAP + 0xC)
  
  /* iATU registers */
  #define PCIE0_ATU_VIEWPORT		(PCIE_CTRLA_BASE_ADDR + 0x900)
  #define PCIE1_ATU_VIEWPORT		(PCIE_CTRLB_BASE_ADDR + 0x900)
  #define PCIE_ATU_REGION_INBOUND		(0x1 << 31)
  #define PCIE_ATU_REGION_OUTBOUND	(0x0 << 31)
  #define PCIE_ATU_REGION_INDEX1		(0x1 << 0)
  #define PCIE_ATU_REGION_INDEX0		(0x0 << 0)
  #define PCIE0_ATU_CR1			(PCIE_CTRLA_BASE_ADDR + 0x904)
  #define PCIE1_ATU_CR1			(PCIE_CTRLB_BASE_ADDR + 0x904)
  #define PCIE_ATU_TYPE_MEM		(0x0 << 0)
  #define PCIE_ATU_TYPE_IO		(0x2 << 0)
  #define PCIE_ATU_TYPE_CFG0		(0x4 << 0)
  #define PCIE_ATU_TYPE_CFG1		(0x5 << 0)
  #define PCIE0_ATU_CR2			(PCIE_CTRLA_BASE_ADDR + 0x908)
  #define PCIE1_ATU_CR2			(PCIE_CTRLB_BASE_ADDR + 0x908)
  #define PCIE_ATU_ENABLE			(0x1 << 31)
  #define PCIE_ATU_BAR_MODE_ENABLE	(0x1 << 30)
  #define PCIE0_ATU_LOWER_BASE	        (PCIE_CTRLA_BASE_ADDR + 0x90C)
  #define PCIE0_ATU_UPPER_BASE	        (PCIE_CTRLA_BASE_ADDR + 0x910)
  #define PCIE0_ATU_LIMIT		        (PCIE_CTRLA_BASE_ADDR + 0x914)
  #define PCIE0_ATU_LOWER_TARGET		(PCIE_CTRLA_BASE_ADDR + 0x918)
  #define PCIE0_ATU_UPPER_TARGET		(PCIE_CTRLA_BASE_ADDR + 0x91C)
  #define PCIE1_ATU_LOWER_BASE	        (PCIE_CTRLB_BASE_ADDR + 0x90C)
  #define PCIE1_ATU_UPPER_BASE	        (PCIE_CTRLB_BASE_ADDR + 0x910)
  #define PCIE1_ATU_LIMIT		        (PCIE_CTRLB_BASE_ADDR + 0x914)
  #define PCIE1_ATU_LOWER_TARGET		(PCIE_CTRLB_BASE_ADDR + 0x918)
  #define PCIE1_ATU_UPPER_TARGET		(PCIE_CTRLB_BASE_ADDR + 0x91C)
  
  #define  PCI_COMMAND_IO		0x1 /* Enable response in I/O space */
  #define  PCI_COMMAND_MEMORY	0x2 /* Enable response in Memory space */
  #define  PCI_COMMAND_MASTER	0x4 /* Enable bus mastering */
  
  #define pcie_readl(x)			readl((unsigned long)x)
  #define pcie_writel(v, c)		writel(v, (unsigned long)c)
  #define pcie_clrbits_le32(addr, clear)	clrbits_le32((unsigned long)addr, clear)
  
  void mx8x_pcie_controller_reset(sc_ipc_t ipc, u32 SC_R_PCIE);
  void mx8x_pcie_ctrla_setup_regions(void);
  void mx8x_pcie_ctrlb_setup_regions(void);
  
  void mx8dv_pcie_init(void);
  void mx8qm_pcie_init(void);
  void mx8qxp_pcie_init(void);
  
  int sata_init(void);
  
  #endif	/* _IMX8_HSIO_H_ */