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
|
/*
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _QUARK_H_
#define _QUARK_H_
/* Message Bus Ports */
#define MSG_PORT_MEM_ARBITER 0x00
#define MSG_PORT_HOST_BRIDGE 0x03
#define MSG_PORT_RMU 0x04
#define MSG_PORT_MEM_MGR 0x05
#define MSG_PORT_USB_AFE 0x14
#define MSG_PORT_PCIE_AFE 0x16
#define MSG_PORT_SOC_UNIT 0x31
/* Port 0x00: Memory Arbiter Message Port Registers */
/* Enhanced Configuration Space */
#define AEC_CTRL 0x00
/* Port 0x03: Host Bridge Message Port Registers */
/* Host Miscellaneous Controls 2 */
#define HMISC2 0x03
#define HMISC2_SEGE 0x00000002
#define HMISC2_SEGF 0x00000004
#define HMISC2_SEGAB 0x00000010
/* Host Memory I/O Boundary */
#define HM_BOUND 0x08
/* Extended Configuration Space */
#define HEC_REG 0x09
/* Port 0x04: Remote Management Unit Message Port Registers */
/* ACPI PBLK Base Address Register */
#define PBLK_BA 0x70
/* SPI DMA Base Address Register */
#define SPI_DMA_BA 0x7a
/* Port 0x05: Memory Manager Message Port Registers */
/* eSRAM Block Page Control */
#define ESRAM_BLK_CTRL 0x82
#define ESRAM_BLOCK_MODE 0x10000000
/* Port 0x14: USB2 AFE Unit Port Registers */
#define USB2_GLOBAL_PORT 0x4001
#define USB2_PLL1 0x7f02
#define USB2_PLL2 0x7f03
#define USB2_COMPBG 0x7f04
/* Port 0x16: PCIe AFE Unit Port Registers */
#define PCIE_RXPICTRL0_L0 0x2080
#define PCIE_RXPICTRL0_L1 0x2180
/* Port 0x31: SoC Unit Port Registers */
/* PCIe Controller Config */
#define PCIE_CFG 0x36
#define PCIE_CTLR_PRI_RST 0x00010000
#define PCIE_PHY_SB_RST 0x00020000
#define PCIE_CTLR_SB_RST 0x00040000
#define PCIE_PHY_LANE_RST 0x00090000
#define PCIE_CTLR_MAIN_RST 0x00100000
/* DRAM */
#define DRAM_BASE 0x00000000
#define DRAM_MAX_SIZE 0x80000000
/* eSRAM */
#define ESRAM_SIZE 0x80000
/* Memory BAR Enable */
#define MEM_BAR_EN 0x00000001
/* I/O BAR Enable */
#define IO_BAR_EN 0x80000000
/* 64KiB of RMU binary in flash */
#define RMU_BINARY_SIZE 0x10000
/* Legacy Bridge PCI Configuration Registers */
#define LB_GBA 0x44
#define LB_PM1BLK 0x48
#define LB_GPE0BLK 0x4c
#define LB_ACTL 0x58
#define LB_PABCDRC 0x60
#define LB_PEFGHRC 0x64
#define LB_WDTBA 0x84
#define LB_BCE 0xd4
#define LB_BC 0xd8
#define LB_RCBA 0xf0
#ifndef __ASSEMBLY__
/* Root Complex Register Block */
struct quark_rcba {
u32 rctl;
u32 esd;
u32 rsvd1[3150];
u16 rmu_ir;
u16 d23_ir;
u16 core_ir;
u16 d20d21_ir;
};
#include <asm/io.h>
#include <asm/pci.h>
/**
* qrk_pci_read_config_dword() - Read a configuration value
*
* @dev: PCI device address: bus, device and function
* @offset: Dword offset within the device's configuration space
* @valuep: Place to put the returned value
*
* Note: This routine is inlined to provide better performance on Quark
*/
static inline void qrk_pci_read_config_dword(pci_dev_t dev, int offset,
u32 *valuep)
{
outl(dev | offset | PCI_CFG_EN, PCI_REG_ADDR);
*valuep = inl(PCI_REG_DATA);
}
/**
* qrk_pci_write_config_dword() - Write a PCI configuration value
*
* @dev: PCI device address: bus, device and function
* @offset: Dword offset within the device's configuration space
* @value: Value to write
*
* Note: This routine is inlined to provide better performance on Quark
*/
static inline void qrk_pci_write_config_dword(pci_dev_t dev, int offset,
u32 value)
{
outl(dev | offset | PCI_CFG_EN, PCI_REG_ADDR);
outl(value, PCI_REG_DATA);
}
/**
* board_assert_perst() - Assert the PERST# pin
*
* The CPU interface to the PERST# signal on Quark is platform dependent.
* Board-specific codes need supply this routine to assert PCIe slot reset.
*
* The tricky part in this routine is that any APIs that may trigger PCI
* enumeration process are strictly forbidden, as any access to PCIe root
* port's configuration registers will cause system hang while it is held
* in reset.
*/
void board_assert_perst(void);
/**
* board_deassert_perst() - De-assert the PERST# pin
*
* The CPU interface to the PERST# signal on Quark is platform dependent.
* Board-specific codes need supply this routine to de-assert PCIe slot reset.
*
* The tricky part in this routine is that any APIs that may trigger PCI
* enumeration process are strictly forbidden, as any access to PCIe root
* port's configuration registers will cause system hang while it is held
* in reset.
*/
void board_deassert_perst(void);
#endif /* __ASSEMBLY__ */
#endif /* _QUARK_H_ */
|