
On Mon, Dec 14, 2020 at 7:08 PM Padmarao Begari padmarao.begari@microchip.com wrote:
This patch adds Microchip MPFS Icicle Kit support. For now, only NS16550 Serial, Microchip clock, Cadence eMMC and MACB drivers are enabled. The Microchip MPFS Icicle defconfig by default builds U-Boot for S-Mode because U-Boot on Microchip PolarFire SoC will run in S-Mode as payload of HSS + OpenSBI.
Signed-off-by: Padmarao Begari padmarao.begari@microchip.com Reviewed-by: Anup Patel anup.patel@wdc.com
board/microchip/mpfs_icicle/Kconfig | 23 ++++++ board/microchip/mpfs_icicle/mpfs_icicle.c | 99 ++++++++++++++++++++++- configs/microchip_mpfs_icicle_defconfig | 9 ++- include/configs/microchip_mpfs_icicle.h | 60 +++++--------- 4 files changed, 146 insertions(+), 45 deletions(-)
diff --git a/board/microchip/mpfs_icicle/Kconfig b/board/microchip/mpfs_icicle/Kconfig index bf8e1a13ec..4678462378 100644 --- a/board/microchip/mpfs_icicle/Kconfig +++ b/board/microchip/mpfs_icicle/Kconfig @@ -20,7 +20,30 @@ config BOARD_SPECIFIC_OPTIONS # dummy def_bool y select GENERIC_RISCV select BOARD_EARLY_INIT_F
select BOARD_LATE_INIT imply SMP
imply CLK_CCF
imply CLK_MPFS imply SYS_NS16550
imply CMD_DHCP
imply CMD_EXT2
imply CMD_EXT4
imply CMD_FAT
imply CMD_FS_GENERIC
imply CMD_NET
imply CMD_PING
imply CMD_MMC
imply DOS_PARTITION
imply EFI_PARTITION
imply IP_DYN
imply ISO_PARTITION
imply MACB
imply MII
imply PHY_LIB
imply PHY_VITESSE
imply MMC
imply MMC_WRITE
imply MMC_SDHCI
imply MMC_SDHCI_CADENCE
endif diff --git a/board/microchip/mpfs_icicle/mpfs_icicle.c b/board/microchip/mpfs_icicle/mpfs_icicle.c index 8381361ec3..0e34409067 100644 --- a/board/microchip/mpfs_icicle/mpfs_icicle.c +++ b/board/microchip/mpfs_icicle/mpfs_icicle.c @@ -6,10 +6,49 @@
#include <common.h> #include <dm.h> +#include <env.h> #include <init.h> #include <asm/io.h>
-#define MPFS_SYSREG_SOFT_RESET ((unsigned int *)0x20002088) +DECLARE_GLOBAL_DATA_PTR;
+#define MPFS_SYSREG_SOFT_RESET ((unsigned int *)0x20002088) +#define MPFS_SYS_SERVICE_CR ((unsigned int *)0x37020050) +#define MPFS_SYS_SERVICE_SR ((unsigned int *)0x37020054) +#define MPFS_SYS_SERVICE_MAILBOX ((unsigned char *)0x37020800)
+#define PERIPH_RESET_VALUE 0x1e8u +#define SERVICE_CR_REQ 0x1u +#define SERVICE_SR_BUSY 0x2u
+static void read_device_serial_number(u8 *response, u8 response_size) +{
u8 idx;
u8 *response_buf;
unsigned int val;
response_buf = (u8 *)response;
writel(SERVICE_CR_REQ, MPFS_SYS_SERVICE_CR);
/*
* REQ bit will remain set till the system controller starts
* processing.
*/
do {
val = readl(MPFS_SYS_SERVICE_CR);
} while (SERVICE_CR_REQ == (val & SERVICE_CR_REQ));
/*
* Once system controller starts processing the busy bit will
* go high and service is completed when busy bit is gone low
*/
do {
val = readl(MPFS_SYS_SERVICE_SR);
} while (SERVICE_SR_BUSY == (val & SERVICE_SR_BUSY));
for (idx = 0; idx < response_size; idx++)
response_buf[idx] = readb(MPFS_SYS_SERVICE_MAILBOX + idx);
+}
int board_init(void) { @@ -22,10 +61,64 @@ int board_early_init_f(void) { unsigned int val;
/* Reset uart peripheral */
/* Reset uart, mmc peripheral */ val = readl(MPFS_SYSREG_SOFT_RESET);
val = (val & ~(1u << 5u));
val = (val & ~(PERIPH_RESET_VALUE)); writel(val, MPFS_SYSREG_SOFT_RESET); return 0;
}
+int board_late_init(void) +{
u32 ret;
u32 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, "ethernet0");
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\n");
return -EINVAL;
}
read_device_serial_number(device_serial_number, 16);
/* Update MAC address with device serial number */
mac_addr[0] = 0x00;
mac_addr[1] = 0x04;
mac_addr[2] = 0xA3;
mac_addr[3] = device_serial_number[2];
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\n");
return -ENODEV;
}
icicle_mac_addr[0] = '[';
sprintf(&icicle_mac_addr[1], "%pM", mac_addr);
icicle_mac_addr[18] = ']';
icicle_mac_addr[19] = '\0';
for (idx = 0; idx < 20; idx++) {
if (icicle_mac_addr[idx] == ':')
icicle_mac_addr[idx] = ' ';
}
env_set("icicle_mac_addr", icicle_mac_addr);
I am still not convinced this "ad-hoc" environment variable is needed. What happens if both 2 GEMs are enabled in the future?
return 0;
+}
[snip]
Anyway, we can address that if something changes in the future.
Reviewed-by: Bin Meng bin.meng@windriver.com Tested-by: Bin Meng bin.meng@windriver.com
Regards, Bin