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 requires 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' 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 - compatible : should contain "xlnx,xps-hwicap-1.00.a" or 285 "xlnx,opb-hwicap-1.00.b". 286 287 vi) Xilinx Uart 16550 288 289 Xilinx UART 16550 devices are very similar to the NS16550 but with 290 different register spacing and an offset from the base address. 291 292 Required properties: 293 - clock-frequency : Frequency of the clock input 294 - reg-offset : A value of 3 is required 295 - reg-shift : A value of 2 is required 296 297 vii) Xilinx USB Host controller 298 299 The Xilinx USB host controller is EHCI compatible but with a different 300 base address for the EHCI registers, and it is always a big-endian 301 USB Host controller. The hardware can be configured as high speed only, 302 or high speed/full speed hybrid. 303 304 Required properties: 305 - xlnx,support-usb-fs: A value 0 means the core is built as high speed 306 only. A value 1 means the core also supports 307 full speed devices. 308 309