Skip to content
Snippets Groups Projects
Commit c2d15c4b authored by Tom Rini's avatar Tom Rini
Browse files
- board: fix support for icicle
- board: support Star64 board
- andes: minor fixes
- riscv: deprecate cache enablement in start.S
parents b1d2af98 1d29c718
No related branches found
No related tags found
No related merge requests found
......@@ -43,9 +43,7 @@ static void cache_ops(int (*ops)(struct udevice *dev))
void flush_dcache_all(void)
{
#if CONFIG_IS_ENABLED(RISCV_MMODE)
csr_write(CSR_MCCTLCOMMAND, CCTL_L1D_WBINVAL_ALL);
#endif
csr_write(CSR_UCCTLCOMMAND, CCTL_L1D_WBINVAL_ALL);
}
void flush_dcache_range(unsigned long start, unsigned long end)
......
......@@ -210,10 +210,6 @@ wait_for_gd_init:
bnez s2, secondary_hart_loop
#endif
/* Enable cache */
jal icache_enable
jal dcache_enable
#ifdef CONFIG_DEBUG_UART
jal debug_uart_init
#endif
......
......@@ -12,7 +12,7 @@
#define CSR_MCACHE_CTL 0x7ca
#define CSR_MMISC_CTL 0x7d0
#define CSR_MCCTLCOMMAND 0x7cc
#define CSR_UCCTLCOMMAND 0x80c
/* mcache_ctl register */
......
......@@ -73,25 +73,13 @@ int board_early_init_f(void)
int board_late_init(void)
{
u32 ret;
u32 node;
int node;
u8 idx;
u8 device_serial_number[16] = { 0 };
unsigned char mac_addr[6];
char icicle_mac_addr[20];
void *blob = (void *)gd->fdt_blob;
node = fdt_path_offset(blob, "/soc/ethernet@20112000");
if (node < 0) {
printf("No ethernet0 path offset\n");
return -ENODEV;
}
ret = fdtdec_get_byte_array(blob, node, "local-mac-address", mac_addr, 6);
if (ret) {
printf("No local-mac-address property for ethernet@20112000\n");
return -EINVAL;
}
read_device_serial_number(device_serial_number, 16);
/* Update MAC address with device serial number */
......@@ -102,10 +90,13 @@ int board_late_init(void)
mac_addr[4] = device_serial_number[1];
mac_addr[5] = device_serial_number[0];
ret = fdt_setprop(blob, node, "local-mac-address", mac_addr, 6);
if (ret) {
printf("Error setting local-mac-address property for ethernet@20112000\n");
return -ENODEV;
node = fdt_path_offset(blob, "/soc/ethernet@20112000");
if (node >= 0) {
ret = fdt_setprop(blob, node, "local-mac-address", mac_addr, 6);
if (ret) {
printf("Error setting local-mac-address property for ethernet@20112000\n");
return -ENODEV;
}
}
icicle_mac_addr[0] = '[';
......
......@@ -86,6 +86,43 @@ static const struct starfive_vf2_pro starfive_verb[] = {
"tx-internal-delay-ps", "0"},
};
static const struct starfive_vf2_pro star64_pine64[] = {
{"/soc/ethernet@16030000", "starfive,tx-use-rgmii-clk", NULL},
{"/soc/ethernet@16040000", "starfive,tx-use-rgmii-clk", NULL},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,tx-clk-adj-enabled", NULL},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,tx-clk-10-inverted", NULL},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,tx-clk-100-inverted", NULL},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,tx-clk-1000-inverted", NULL},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,rx-clk-drv-microamp", "2910"},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"motorcomm,rx-data-drv-microamp", "2910"},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"rx-internal-delay-ps", "1900"},
{"/soc/ethernet@16030000/mdio/ethernet-phy@0",
"tx-internal-delay-ps", "1500"},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"motorcomm,tx-clk-adj-enabled", NULL},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"motorcomm,tx-clk-10-inverted", NULL},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"motorcomm,tx-clk-100-inverted", NULL},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"motorcomm,rx-clk-drv-microamp", "2910"},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"motorcomm,rx-data-drv-microamp", "2910"},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"rx-internal-delay-ps", "0"},
{"/soc/ethernet@16040000/mdio/ethernet-phy@1",
"tx-internal-delay-ps", "300"},
};
void spl_fdt_fixup_mars(void *fdt)
{
static const char compat[] = "milkv,mars\0starfive,jh7110";
......@@ -250,6 +287,56 @@ void spl_fdt_fixup_version_b(void *fdt)
}
}
void spl_fdt_fixup_star64(void *fdt)
{
static const char compat[] = "pine64,star64\0starfive,jh7110";
u32 phandle;
u8 i;
int offset;
int ret;
fdt_setprop(fdt, fdt_path_offset(fdt, "/"), "compatible", compat, sizeof(compat));
fdt_setprop_string(fdt, fdt_path_offset(fdt, "/"), "model",
"Pine64 Star64");
/* gmac0 */
offset = fdt_path_offset(fdt, "/soc/clock-controller@17000000");
phandle = fdt_get_phandle(fdt, offset);
offset = fdt_path_offset(fdt, "/soc/ethernet@16030000");
fdt_setprop_u32(fdt, offset, "assigned-clocks", phandle);
fdt_appendprop_u32(fdt, offset, "assigned-clocks", JH7110_AONCLK_GMAC0_TX);
fdt_setprop_u32(fdt, offset, "assigned-clock-parents", phandle);
fdt_appendprop_u32(fdt, offset, "assigned-clock-parents",
JH7110_AONCLK_GMAC0_RMII_RTX);
/* gmac1 */
offset = fdt_path_offset(fdt, "/soc/clock-controller@13020000");
phandle = fdt_get_phandle(fdt, offset);
offset = fdt_path_offset(fdt, "/soc/ethernet@16040000");
fdt_setprop_u32(fdt, offset, "assigned-clocks", phandle);
fdt_appendprop_u32(fdt, offset, "assigned-clocks", JH7110_SYSCLK_GMAC1_TX);
fdt_setprop_u32(fdt, offset, "assigned-clock-parents", phandle);
fdt_appendprop_u32(fdt, offset, "assigned-clock-parents",
JH7110_SYSCLK_GMAC1_RMII_RTX);
for (i = 0; i < ARRAY_SIZE(star64_pine64); i++) {
offset = fdt_path_offset(fdt, star64_pine64[i].path);
if (star64_pine64[i].value)
ret = fdt_setprop_u32(fdt, offset, star64_pine64[i].name,
dectoul(star64_pine64[i].value, NULL));
else
ret = fdt_setprop_empty(fdt, offset, star64_pine64[i].name);
if (ret) {
pr_err("%s set prop %s fail.\n", __func__, star64_pine64[i].name);
break;
}
}
}
void spl_perform_fixups(struct spl_image_info *spl_image)
{
u8 version;
......@@ -278,6 +365,8 @@ void spl_perform_fixups(struct spl_image_info *spl_image)
spl_fdt_fixup_version_b(spl_image->fdt_addr);
break;
};
} else if (!strncmp(product_id, "STAR64", 6)) {
spl_fdt_fixup_star64(spl_image->fdt_addr);
} else {
pr_err("Unknown product %s\n", product_id);
};
......
......@@ -27,6 +27,8 @@ DECLARE_GLOBAL_DATA_PTR;
"starfive/jh7110-starfive-visionfive-2-v1.2a.dtb"
#define FDTFILE_VISIONFIVE2_1_3B \
"starfive/jh7110-starfive-visionfive-2-v1.3b.dtb"
#define FDTFILE_PINE64_STAR64 \
"starfive/jh7110-pine64-star64.dtb"
/* enable U74-mc hart1~hart4 prefetcher */
static void enable_prefetcher(void)
......@@ -87,6 +89,8 @@ static void set_fdtfile(void)
fdtfile = FDTFILE_VISIONFIVE2_1_3B;
break;
}
} else if (!strncmp(product_id, "STAR64", 6)) {
fdtfile = FDTFILE_PINE64_STAR64;
} else {
log_err("Unknown product\n");
return;
......
......@@ -8,4 +8,5 @@ StarFive
milk-v_mars
milk-v_mars_cm
pine64_star64
visionfive2
.. SPDX-License-Identifier: GPL-2.0+
Pine64 Star64
=============
U-Boot for the Star64 uses the same U-Boot binaries as the VisionFive 2 board.
In U-Boot SPL the actual board is detected and the device-tree patched
accordingly.
Building
~~~~~~~~
1. Add the RISC-V toolchain to your PATH.
2. Setup ARCH & cross compilation environment variable:
.. code-block:: none
export CROSS_COMPILE=<riscv64 toolchain prefix>
The M-mode software OpenSBI provides the supervisor binary interface (SBI) and
is responsible for the switch to S-Mode. It is a prerequisite to build U-Boot.
Support for the JH7110 was introduced in OpenSBI 1.2. It is recommended to use
a current release.
.. code-block:: console
git clone https://github.com/riscv/opensbi.git
cd opensbi
make PLATFORM=generic FW_TEXT_START=0x40000000
Now build the U-Boot SPL and U-Boot proper.
.. code-block:: console
cd <U-Boot-dir>
make starfive_visionfive2_defconfig
make OPENSBI=$(opensbi_dir)/build/platform/generic/firmware/fw_dynamic.bin
This will generate the U-Boot SPL image (spl/u-boot-spl.bin.normal.out) as well
as the FIT image (u-boot.itb) with OpenSBI and U-Boot.
Device-tree selection
~~~~~~~~~~~~~~~~~~~~~
U-Boot will set variable $fdtfile to starfive/jh7110-pine64-star64.dtb.
To overrule this selection the variable can be set manually and saved in the
environment
::
env set fdtfile my_device-tree.dtb
env save
or the configuration variable CONFIG_DEFAULT_FDT_FILE can be used to set to
provide a default value.
Boot source selection
~~~~~~~~~~~~~~~~~~~~~
Boot mode is selected by an MSEL-DIP marked S1804 and GPIO_0 position adjacent
to the 40pin GPIO header. ON/ONKE and number markings of the MSEL-DIP are
misleading; Instead refer to the ``L`` (0) and ``H`` (1) silkscreen for
accurate selection.
+ (QSPI) Flash: 00
+ SD: 01
+ EMMC: 10
+ UART: 11
Preparing the SD-Card
~~~~~~~~~~~~~~~~~~~~~
The device firmware loads U-Boot SPL (u-boot-spl.bin.normal.out) from the
partition with type GUID 2E54B353-1271-4842-806F-E436D6AF6985. You are free
to choose any partition number.
With the default configuration U-Boot SPL loads the U-Boot FIT image
(u-boot.itb) from partition 2 (CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x2).
When formatting it is recommended to use GUID
BC13C2FF-59E6-4262-A352-B275FD6F7172 for this partition.
The FIT image (u-boot.itb) is a combination of OpenSBI's fw_dynamic.bin,
u-boot-nodtb.bin and the device tree blob.
Format the SD card (make sure the disk has GPT, otherwise use gdisk to switch)
.. code-block:: bash
sudo sgdisk --clear \
--set-alignment=2 \
--new=1:4096:8191 --change-name=1:spl --typecode=1:2E54B353-1271-4842-806F-E436D6AF6985\
--new=2:8192:16383 --change-name=2:uboot --typecode=2:BC13C2FF-59E6-4262-A352-B275FD6F7172 \
--new=3:16384:1654784 --change-name=3:system --typecode=3:EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 \
/dev/sdb
Copy U-Boot to the SD card
.. code-block:: bash
sudo dd if=u-boot-spl.bin.normal.out of=/dev/sdb1
sudo dd if=u-boot.itb of=/dev/sdb2
sudo mount /dev/sdb3 /mnt/
sudo cp u-boot-spl.bin.normal.out /mnt/
sudo cp u-boot.itb /mnt/
sudo cp Image.gz /mnt/
sudo cp initramfs.cpio.gz /mnt/
sudo cp jh7110-starfive-visionfive-2.dtb /mnt/
sudo umount /mnt
Booting
~~~~~~~
Once you plugin the sdcard and power up, you should see the U-Boot prompt.
Serial Number and MAC address issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
U-Boot requires valid EEPROM data to determine which board-specific fix-up to
apply at runtime. This affects the size of memory initialized, network mac
address numbering, and tuning of the network PHYs.
The Star64 does not currently ship with unique serial numbers per-device.
Devices follow a pattern where the last mac address bytes are a sum of 0x7558
and the serial number (lower port mac0), or a sum of 0x7559 and the serial
number (upper port mac1).
As tested there are several 4gb model units where the serial number and network
mac addresses collide with other devices (serial
``STAR64V1-2310-D004E000-00000005``, MACs ``6c:cf:39:00:75:61``,
``6c:cf:39:00:75:62``)
Some early Star64 boards shipped with an uninitialized EEPROM and no write
protect pull-up resistor in place. Later units of all 4gb and 8gb models
sharing the same serial number in EEPROM data will have this problem that the
network mac addresses are alike between different models and this may be
corrected by defeating the write protect resistor to write new values. As an
alternative to this, it may be worked around by overriding the mac addresses
via U-Boot environment variables.
It is required for any unit having uninitialized EEPROM and recommended for
all later Star64 4gb model units (not properly serialized) to have decided on a
new 6-byte serial number. This serial number should be high enough to
avoid collision with other JH7110 boards and low enough not to overflow i.e.
between ``cafe00`` and ``f00d00``.
Update EEPROM values
^^^^^^^^^^^^^^^^^^^^
1. Prepare EEPROM data in memory
::
## When there is no error to load existing data:
mac read_eeprom
## When there is an error to load non-existing data:
# "DRAM: Not a StarFive EEPROM data format - magic error"
mac initialize
2. Set Star64 values
::
## Common values
mac vendor PINE64
mac pcb_revision c1
mac bom_revision A
## Device-specific values
# Year 2023 week 10 production date, 8GB DRAM, optional eMMC, serial cdef01
mac product_id STAR64V1-2310-D008E000-00cdef01
# Last three bytes mac0: 0x7558 + serial number 0xcdef01
mac mac0_address 6c:cf:39:ce:64:59
# Last three bytes mac1: 0x7559 + serial number 0xcdef01
mac mac1_address 6c:cf:39:ce:64:5a
3. Defeat write-protect pull-up resistor (if installed) and write to EEPROM
::
mac write_eeprom
Set Variables in U-Boot
^^^^^^^^^^^^^^^^^^^^^^^
.. note:: Changing just the serial number will not alter your MAC address
The MAC addresses may be "set" as follows by writing as a custom config to SPI
(Change the last 3 bytes of MAC addreses as appropriate):
::
env set serial# STAR64V1-2310-D008E000-00cdef01
env set ethaddr 6c:cf:39:ce:64:59
env set eth1addr 6c:cf:39:ce:64:5a
env save
reset
......@@ -30,7 +30,7 @@ struct l2cache {
volatile u64 cctl_command2;
volatile u64 cctl_access_line2;
volatile u64 cctl_command3;
volatile u64 cctl_access_line4;
volatile u64 cctl_access_line3;
volatile u64 cctl_status;
};
......@@ -97,13 +97,15 @@ static int andes_l2_disable(struct udevice *dev)
struct andes_l2_plat *plat = dev_get_plat(dev);
volatile struct l2cache *regs = plat->regs;
u8 hart = gd->arch.boot_hart;
void __iomem *cctlcmd = (void __iomem *)CCTL_CMD_REG(regs, hart);
void __iomem *cctlstatus = (void __iomem *)CCTL_STATUS_REG(regs, hart);
if ((regs) && (readl(&regs->control) & L2_ENABLE)) {
writel(L2_WBINVAL_ALL, cctlcmd);
while ((readl(&regs->cctl_status) & CCTL_STATUS_MSK(hart))) {
if ((readl(&regs->cctl_status) & CCTL_STATUS_ILLEGAL(hart))) {
while ((readl(cctlstatus) & CCTL_STATUS_MSK(hart))) {
if ((readl(cctlstatus) & CCTL_STATUS_ILLEGAL(hart))) {
printf("L2 flush illegal! hanging...");
hang();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment