blob: 654ef8a026999f8da1ced428b311cd4dc2b05c21 [file] [log] [blame]
Andre Przywara35f3ef92021-12-14 17:47:00 +00001Calxeda Highbank/Midway board support
2=====================================
3
4The Calxeda ECX-1000 ("Highbank") and ECX-2000 ("Midway") were ARM based
5servers, providing high-density cluster systems. A single motherboard could
6host between 12 and 48 nodes, each with their own quad-core ARMv7
7processor, private DRAM and peripherals, connected through a high-bandwith
8and low-latency "fabric" network. Multiple motherboards could be connected
9together, to extend this fabric.
10
11For the purpose of U-Boot we just care about a single node, this can be
12used as a single system, just using the fabric to connect to some Ethernet
13network. Each node boots on its own, either from a local hard disk, or
14via the network.
15
16The earlier ECX-1000 nodes ("Highbank") contain four ARM Cortex-A9 cores,
17a Cortex-M3 system controller, three 10GBit/s MACs and five SATA
18controllers. The DRAM is limited to 4GB.
19
20The later ECX-2000 nodes ("Midway") use four Cortex-A15 cores, alongside
21two Cortex-A7 management cores, and support up to 32GB of DRAM, while
22keeping the other peripherals.
23
24For the purpose of U-Boot those two SoCs are very similar, so we offer
25one build target. The subtle differences are handled at runtime.
26Calxeda as a company is long defunct, and the remaining systems are
27considered legacy at this point.
28
29Bgilding U-Boot
30---------------
31There is only one defconfig to cover both systems::
32
33 $ make highbank_defconfig
34 $ make
35
36This will create ``u-boot.bin``, which could become part of the firmware update
37package, or could be chainloaded by the existing U-Boot, see below for more
38details.
39
40Boot process
41------------
42Upon powering up a node (which would be controlled by some BMC style
43management controller on the motherboard), the system controller ("ECME")
44would start and do some system initialisation (fabric registration,
45DRAM init, clock setup). It would load the device tree binary, some secure
46monitor code (``a9boot``/``a15boot``) and a U-Boot binary from SPI flash
47into DRAM, then power up the actual application cores (ARM Cortex-A9/A15).
48They would start executing ``a9boot``/``a15boot``, registering the PSCI SMC
49handlers, then dropping into U-Boot, but in non-secure state (HYP mode on
50the A15s).
51
52U-Boot would act as a mere loader, trying to find some ``boot.scr`` file on
53the local hard disks, or reverting to PXE boot.
54
55Updating U-Boot
56---------------
57The U-Boot binary is loaded from SPI flash, which is controlled exclusively
58by the ECME. This can be reached via IPMI using the LANplus transport protocol.
59Updating the SPI flash content requires vendor specific additions to the
60IPMI protocol, support for which was never upstreamed to ipmitool or
61FreeIPMI. Some older repositories for `ipmitool`_, the `pyipmi`_ library and
62a Python `management script`_ to update the SPI flash can be found on Github.
63
64A simpler and safer way to get an up-to-date U-Boot running, is chainloading
65it via the legacy U-Boot::
66
67 $ mkimage -A arm -O u-boot -T standalone -C none -a 0x8000 -e 0x8000 \
68 -n U-Boot -d u-boot.bin u-boot-highbank.img
69
70Then load this image file, either from hard disk, or via TFTP, from the
71existing U-Boot, and execute it with bootm::
72
73 => tftpboot 0x8000 u-boot-highbank.img
74 => bootm
75
76.. _`ipmitool`: https://github.com/Cynerva/ipmitool
77.. _`pyipmi`: https://pypi.org/project/pyipmi/
78.. _`management script`: https://github.com/Cynerva/cxmanage