ea68046bb9cb1381db127087280822bc04e49a6d
[linux-2.6.git] / Documentation / powerpc / dts-bindings / xilinx.txt
1    d) Xilinx IP cores
2
3    The Xilinx EDK toolchain ships with a set of IP cores (devices) for use
4    in Xilinx Spartan and Virtex FPGAs.  The devices cover the whole range
5    of standard device types (network, serial, etc.) and miscellaneous
6    devices (gpio, LCD, spi, etc).  Also, since these devices are
7    implemented within the fpga fabric every instance of the device can be
8    synthesised with different options that change the behaviour.
9
10    Each IP-core has a set of parameters which the FPGA designer can use to
11    control how the core is synthesized.  Historically, the EDK tool would
12    extract the device parameters relevant to device drivers and copy them
13    into an 'xparameters.h' in the form of #define symbols.  This tells the
14    device drivers how the IP cores are configured, but it requres the kernel
15    to be recompiled every time the FPGA bitstream is resynthesized.
16
17    The new approach is to export the parameters into the device tree and
18    generate a new device tree each time the FPGA bitstream changes.  The
19    parameters which used to be exported as #defines will now become
20    properties of the device node.  In general, device nodes for IP-cores
21    will take the following form:
22
23         (name): (generic-name)@(base-address) {
24                 compatible = "xlnx,(ip-core-name)-(HW_VER)"
25                              [, (list of compatible devices), ...];
26                 reg = <(baseaddr) (size)>;
27                 interrupt-parent = <&interrupt-controller-phandle>;
28                 interrupts = < ... >;
29                 xlnx,(parameter1) = "(string-value)";
30                 xlnx,(parameter2) = <(int-value)>;
31         };
32
33         (generic-name):   an open firmware-style name that describes the
34                         generic class of device.  Preferably, this is one word, such
35                         as 'serial' or 'ethernet'.
36         (ip-core-name): the name of the ip block (given after the BEGIN
37                         directive in system.mhs).  Should be in lowercase
38                         and all underscores '_' converted to dashes '-'.
39         (name):         is derived from the "PARAMETER INSTANCE" value.
40         (parameter#):   C_* parameters from system.mhs.  The C_ prefix is
41                         dropped from the parameter name, the name is converted
42                         to lowercase and all underscore '_' characters are
43                         converted to dashes '-'.
44         (baseaddr):     the baseaddr parameter value (often named C_BASEADDR).
45         (HW_VER):       from the HW_VER parameter.
46         (size):         the address range size (often C_HIGHADDR - C_BASEADDR + 1).
47
48    Typically, the compatible list will include the exact IP core version
49    followed by an older IP core version which implements the same
50    interface or any other device with the same interface.
51
52    'reg', 'interrupt-parent' and 'interrupts' are all optional properties.
53
54    For example, the following block from system.mhs:
55
56         BEGIN opb_uartlite
57                 PARAMETER INSTANCE = opb_uartlite_0
58                 PARAMETER HW_VER = 1.00.b
59                 PARAMETER C_BAUDRATE = 115200
60                 PARAMETER C_DATA_BITS = 8
61                 PARAMETER C_ODD_PARITY = 0
62                 PARAMETER C_USE_PARITY = 0
63                 PARAMETER C_CLK_FREQ = 50000000
64                 PARAMETER C_BASEADDR = 0xEC100000
65                 PARAMETER C_HIGHADDR = 0xEC10FFFF
66                 BUS_INTERFACE SOPB = opb_7
67                 PORT OPB_Clk = CLK_50MHz
68                 PORT Interrupt = opb_uartlite_0_Interrupt
69                 PORT RX = opb_uartlite_0_RX
70                 PORT TX = opb_uartlite_0_TX
71                 PORT OPB_Rst = sys_bus_reset_0
72         END
73
74    becomes the following device tree node:
75
76         opb_uartlite_0: serial@ec100000 {
77                 device_type = "serial";
78                 compatible = "xlnx,opb-uartlite-1.00.b";
79                 reg = <ec100000 10000>;
80                 interrupt-parent = <&opb_intc_0>;
81                 interrupts = <1 0>; // got this from the opb_intc parameters
82                 current-speed = <d#115200>;     // standard serial device prop
83                 clock-frequency = <d#50000000>; // standard serial device prop
84                 xlnx,data-bits = <8>;
85                 xlnx,odd-parity = <0>;
86                 xlnx,use-parity = <0>;
87         };
88
89    Some IP cores actually implement 2 or more logical devices.  In
90    this case, the device should still describe the whole IP core with
91    a single node and add a child node for each logical device.  The
92    ranges property can be used to translate from parent IP-core to the
93    registers of each device.  In addition, the parent node should be
94    compatible with the bus type 'xlnx,compound', and should contain
95    #address-cells and #size-cells, as with any other bus.  (Note: this
96    makes the assumption that both logical devices have the same bus
97    binding.  If this is not true, then separate nodes should be used
98    for each logical device).  The 'cell-index' property can be used to
99    enumerate logical devices within an IP core.  For example, the
100    following is the system.mhs entry for the dual ps2 controller found
101    on the ml403 reference design.
102
103         BEGIN opb_ps2_dual_ref
104                 PARAMETER INSTANCE = opb_ps2_dual_ref_0
105                 PARAMETER HW_VER = 1.00.a
106                 PARAMETER C_BASEADDR = 0xA9000000
107                 PARAMETER C_HIGHADDR = 0xA9001FFF
108                 BUS_INTERFACE SOPB = opb_v20_0
109                 PORT Sys_Intr1 = ps2_1_intr
110                 PORT Sys_Intr2 = ps2_2_intr
111                 PORT Clkin1 = ps2_clk_rx_1
112                 PORT Clkin2 = ps2_clk_rx_2
113                 PORT Clkpd1 = ps2_clk_tx_1
114                 PORT Clkpd2 = ps2_clk_tx_2
115                 PORT Rx1 = ps2_d_rx_1
116                 PORT Rx2 = ps2_d_rx_2
117                 PORT Txpd1 = ps2_d_tx_1
118                 PORT Txpd2 = ps2_d_tx_2
119         END
120
121    It would result in the following device tree nodes:
122
123         opb_ps2_dual_ref_0: opb-ps2-dual-ref@a9000000 {
124                 #address-cells = <1>;
125                 #size-cells = <1>;
126                 compatible = "xlnx,compound";
127                 ranges = <0 a9000000 2000>;
128                 // If this device had extra parameters, then they would
129                 // go here.
130                 ps2@0 {
131                         compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
132                         reg = <0 40>;
133                         interrupt-parent = <&opb_intc_0>;
134                         interrupts = <3 0>;
135                         cell-index = <0>;
136                 };
137                 ps2@1000 {
138                         compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
139                         reg = <1000 40>;
140                         interrupt-parent = <&opb_intc_0>;
141                         interrupts = <3 0>;
142                         cell-index = <0>;
143                 };
144         };
145
146    Also, the system.mhs file defines bus attachments from the processor
147    to the devices.  The device tree structure should reflect the bus
148    attachments.  Again an example; this system.mhs fragment:
149
150         BEGIN ppc405_virtex4
151                 PARAMETER INSTANCE = ppc405_0
152                 PARAMETER HW_VER = 1.01.a
153                 BUS_INTERFACE DPLB = plb_v34_0
154                 BUS_INTERFACE IPLB = plb_v34_0
155         END
156
157         BEGIN opb_intc
158                 PARAMETER INSTANCE = opb_intc_0
159                 PARAMETER HW_VER = 1.00.c
160                 PARAMETER C_BASEADDR = 0xD1000FC0
161                 PARAMETER C_HIGHADDR = 0xD1000FDF
162                 BUS_INTERFACE SOPB = opb_v20_0
163         END
164
165         BEGIN opb_uart16550
166                 PARAMETER INSTANCE = opb_uart16550_0
167                 PARAMETER HW_VER = 1.00.d
168                 PARAMETER C_BASEADDR = 0xa0000000
169                 PARAMETER C_HIGHADDR = 0xa0001FFF
170                 BUS_INTERFACE SOPB = opb_v20_0
171         END
172
173         BEGIN plb_v34
174                 PARAMETER INSTANCE = plb_v34_0
175                 PARAMETER HW_VER = 1.02.a
176         END
177
178         BEGIN plb_bram_if_cntlr
179                 PARAMETER INSTANCE = plb_bram_if_cntlr_0
180                 PARAMETER HW_VER = 1.00.b
181                 PARAMETER C_BASEADDR = 0xFFFF0000
182                 PARAMETER C_HIGHADDR = 0xFFFFFFFF
183                 BUS_INTERFACE SPLB = plb_v34_0
184         END
185
186         BEGIN plb2opb_bridge
187                 PARAMETER INSTANCE = plb2opb_bridge_0
188                 PARAMETER HW_VER = 1.01.a
189                 PARAMETER C_RNG0_BASEADDR = 0x20000000
190                 PARAMETER C_RNG0_HIGHADDR = 0x3FFFFFFF
191                 PARAMETER C_RNG1_BASEADDR = 0x60000000
192                 PARAMETER C_RNG1_HIGHADDR = 0x7FFFFFFF
193                 PARAMETER C_RNG2_BASEADDR = 0x80000000
194                 PARAMETER C_RNG2_HIGHADDR = 0xBFFFFFFF
195                 PARAMETER C_RNG3_BASEADDR = 0xC0000000
196                 PARAMETER C_RNG3_HIGHADDR = 0xDFFFFFFF
197                 BUS_INTERFACE SPLB = plb_v34_0
198                 BUS_INTERFACE MOPB = opb_v20_0
199         END
200
201    Gives this device tree (some properties removed for clarity):
202
203         plb@0 {
204                 #address-cells = <1>;
205                 #size-cells = <1>;
206                 compatible = "xlnx,plb-v34-1.02.a";
207                 device_type = "ibm,plb";
208                 ranges; // 1:1 translation
209
210                 plb_bram_if_cntrl_0: bram@ffff0000 {
211                         reg = <ffff0000 10000>;
212                 }
213
214                 opb@20000000 {
215                         #address-cells = <1>;
216                         #size-cells = <1>;
217                         ranges = <20000000 20000000 20000000
218                                   60000000 60000000 20000000
219                                   80000000 80000000 40000000
220                                   c0000000 c0000000 20000000>;
221
222                         opb_uart16550_0: serial@a0000000 {
223                                 reg = <a00000000 2000>;
224                         };
225
226                         opb_intc_0: interrupt-controller@d1000fc0 {
227                                 reg = <d1000fc0 20>;
228                         };
229                 };
230         };
231
232    That covers the general approach to binding xilinx IP cores into the
233    device tree.  The following are bindings for specific devices:
234
235       i) Xilinx ML300 Framebuffer
236
237       Simple framebuffer device from the ML300 reference design (also on the
238       ML403 reference design as well as others).
239
240       Optional properties:
241        - resolution = <xres yres> : pixel resolution of framebuffer.  Some
242                                     implementations use a different resolution.
243                                     Default is <d#640 d#480>
244        - virt-resolution = <xvirt yvirt> : Size of framebuffer in memory.
245                                            Default is <d#1024 d#480>.
246        - rotate-display (empty) : rotate display 180 degrees.
247
248       ii) Xilinx SystemACE
249
250       The Xilinx SystemACE device is used to program FPGAs from an FPGA
251       bitstream stored on a CF card.  It can also be used as a generic CF
252       interface device.
253
254       Optional properties:
255        - 8-bit (empty) : Set this property for SystemACE in 8 bit mode
256
257       iii) Xilinx EMAC and Xilinx TEMAC
258
259       Xilinx Ethernet devices.  In addition to general xilinx properties
260       listed above, nodes for these devices should include a phy-handle
261       property, and may include other common network device properties
262       like local-mac-address.
263
264       iv) Xilinx Uartlite
265
266       Xilinx uartlite devices are simple fixed speed serial ports.
267
268       Required properties:
269        - current-speed : Baud rate of uartlite
270
271       v) Xilinx hwicap
272
273                 Xilinx hwicap devices provide access to the configuration logic
274                 of the FPGA through the Internal Configuration Access Port
275                 (ICAP).  The ICAP enables partial reconfiguration of the FPGA,
276                 readback of the configuration information, and some control over
277                 'warm boots' of the FPGA fabric.
278
279                 Required properties:
280                 - xlnx,family : The family of the FPGA, necessary since the
281                       capabilities of the underlying ICAP hardware
282                       differ between different families.  May be
283                       'virtex2p', 'virtex4', or 'virtex5'.
284
285       vi) Xilinx Uart 16550
286
287       Xilinx UART 16550 devices are very similar to the NS16550 but with
288       different register spacing and an offset from the base address.
289
290       Required properties:
291        - clock-frequency : Frequency of the clock input
292        - reg-offset : A value of 3 is required
293        - reg-shift : A value of 2 is required
294
295       vii) Xilinx USB Host controller
296
297       The Xilinx USB host controller is EHCI compatible but with a different
298       base address for the EHCI registers, and it is always a big-endian
299       USB Host controller. The hardware can be configured as high speed only,
300       or high speed/full speed hybrid.
301
302       Required properties:
303       - xlnx,support-usb-fs: A value 0 means the core is built as high speed
304                              only. A value 1 means the core also supports
305                              full speed devices.
306