From 1d58dfa04b76e009900abe6a5dac3b20ab5b00cc Mon Sep 17 00:00:00 2001 From: loongson Date: Thu, 25 Jul 2024 14:11:52 +0800 Subject: [PATCH] update to cadd162f 1. support update dtb 2. support install rootfs from ramdisk 3. other fixs --- arch/loongarch/dts/ls2k1000.dtsi | 9 + arch/loongarch/dts/ls2k300.dtsi | 43 +- arch/loongarch/dts/ls2k300_ddr_isocom_1g.dtsi | 46 ++ arch/loongarch/dts/ls2k300_ddr_isocom_2g.dtsi | 46 ++ .../dts/ls2k300_ddr_samsung_512m.dtsi | 45 ++ arch/loongarch/dts/ls2k300_ddr_sinker_1g.dtsi | 46 ++ .../dts/ls2k300_g2k03z0_core_v10.dtsi | 60 ++- arch/loongarch/dts/ls2k300_mini_dp.dts | 2 +- arch/loongarch/dts/ls2k300_pai.dts | 47 +- arch/loongarch/dts/ls2p500.dtsi | 76 +--- arch/loongarch/dts/ls2p500_evb.dts | 26 +- arch/loongarch/dts/ls2p500_gbkpjm0_v10.dts | 151 +++++++ arch/loongarch/mach-loongson/Kconfig | 19 + board/loongson/common/Kconfig | 10 + board/loongson/common/Makefile | 3 + .../common/general_load/cmd_general_load.c | 40 ++ .../common/general_load/cmd_gl_arg_default.h | 4 +- .../loongson/common/general_load/device/net.c | 11 + .../common/loongson_boot_syspart_manager.c | 103 +++++ .../common/loongson_boot_syspart_manager.h | 17 + board/loongson/common/loongson_env_trigger.c | 87 +++- board/loongson/common/loongson_img_fdisk.c | 86 ++++ board/loongson/common/loongson_img_fdisk.h | 6 + board/loongson/common/loongson_update.c | 8 + board/loongson/common/loongson_update_menu.c | 19 +- board/loongson/common/loongson_wdt_setup.c | 87 ++++ board/loongson/common/loongson_wdt_setup.h | 11 + board/loongson/common/platform.c | 1 + board/loongson/common/recover.c | 197 ++++++--- board/loongson/ls2p500/ls2p500.c | 2 +- buildenv.sh | 49 +++ common/console.c | 20 + configs/loongson_2k1000_dp_defconfig | 12 +- configs/loongson_2k300_mini_dp_defconfig | 24 +- configs/loongson_2k300_pai_defconfig | 27 +- configs/loongson_2k500_mini_dp_defconfig | 2 +- configs/loongson_2p500_evb_defconfig | 7 +- configs/loongson_2p500_gbkpjm0_defconfig | 175 ++++++++ drivers/i2c/Kconfig | 17 + drivers/i2c/Makefile | 1 + drivers/i2c/lsfs_i2c.c | 406 ++++++++++++++++++ drivers/ram/loongson/ls_ddr4.c | 5 +- drivers/watchdog/Kconfig | 6 + drivers/watchdog/Makefile | 1 + drivers/watchdog/ls2x_wdt.c | 139 ++++++ include/configs/loongson_2k1000.h | 2 + include/configs/loongson_common.h | 32 +- include/stdio.h | 2 + 48 files changed, 1962 insertions(+), 273 deletions(-) create mode 100644 arch/loongarch/dts/ls2k300_ddr_isocom_1g.dtsi create mode 100644 arch/loongarch/dts/ls2k300_ddr_isocom_2g.dtsi create mode 100644 arch/loongarch/dts/ls2k300_ddr_samsung_512m.dtsi create mode 100644 arch/loongarch/dts/ls2k300_ddr_sinker_1g.dtsi create mode 100644 arch/loongarch/dts/ls2p500_gbkpjm0_v10.dts create mode 100644 board/loongson/common/loongson_boot_syspart_manager.c create mode 100644 board/loongson/common/loongson_boot_syspart_manager.h create mode 100644 board/loongson/common/loongson_img_fdisk.c create mode 100644 board/loongson/common/loongson_img_fdisk.h create mode 100644 board/loongson/common/loongson_wdt_setup.c create mode 100644 board/loongson/common/loongson_wdt_setup.h create mode 100755 buildenv.sh create mode 100644 configs/loongson_2p500_gbkpjm0_defconfig create mode 100644 drivers/i2c/lsfs_i2c.c create mode 100644 drivers/watchdog/ls2x_wdt.c diff --git a/arch/loongarch/dts/ls2k1000.dtsi b/arch/loongarch/dts/ls2k1000.dtsi index 0c1a3821..c267c69e 100644 --- a/arch/loongarch/dts/ls2k1000.dtsi +++ b/arch/loongarch/dts/ls2k1000.dtsi @@ -618,6 +618,15 @@ status = "disable"; }; + // 必须是 watchdog_d 意味着 detect 用于长时间的任务检测 + wdt:watchdog_d{ + compatible = "loongson,ls2x-wdt"; + reg = <0 0x1fe27030 0 0xC>; + clocks = <&apb_clk>; + clock-names = "clk"; + status = "okay"; + }; + pcie@0 { compatible = "loongson,ls2k1000-pci"; #interrupt-cells = <1>; diff --git a/arch/loongarch/dts/ls2k300.dtsi b/arch/loongarch/dts/ls2k300.dtsi index ef90dc1f..f8e6c1b0 100644 --- a/arch/loongarch/dts/ls2k300.dtsi +++ b/arch/loongarch/dts/ls2k300.dtsi @@ -52,30 +52,6 @@ eio_en_off=<27>; }; - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "earlycon"; - }; - - memory { - name = "memory"; - device_type = "memory"; - reg = <0x90000000 0x00000000 0 0x10000000 - 0x90000000 0x90000000 0 0x10000000>; - u-boot,dm-pre-reloc; - }; - - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - - bootparam: bootparam_region { - reg = <0x90000000 0x0f000000 0x0 0x1000000>; - no-map; - }; - }; - clocks { compatible = "simple-bus"; #address-cells = <1>; @@ -231,7 +207,7 @@ status = "disabled"; }; -#if 0 + gmac1: ethernet@0x16030000 { compatible = "snps,dwmac-3.70a", "snps,arc-dwmac-3.70a"; reg = <0 0x16030000 0 0x10000>; @@ -247,7 +223,7 @@ dma-mask = <0xffffffff 0xffffffff>; status = "disabled"; }; -#endif + gpio:gpio@0x16104000 { #address-cells = <1>; #size-cells = <0>; @@ -267,7 +243,6 @@ }; }; - spi0: spi@0x16010000 { compatible = "loongson,ls-spi"; reg = <0 0x16010000 0 0x40000>; @@ -279,7 +254,6 @@ u-boot,dm-pre-reloc; }; -#if 0 spi1: spi@0x16018000 { compatible = "loongson,ls-spi"; reg = <0 0x16018000 0 0x40000>; @@ -299,8 +273,6 @@ interrupts = <14>; clock-frequency = <400000>; reg-shift = <0>; - clocks = <&apb_clk>; - clock-names = "scl"; status = "disabled"; }; @@ -336,7 +308,7 @@ clock-frequency = <400000>; status = "disabled"; }; -#endif + emmc0: emmc@0x16140000 { compatible = "loongson,ls-mmc"; reg = <0 0x16140000 0 0x8000>; @@ -375,5 +347,14 @@ dma-mask = <0x0 0xffffffff>; status = "disabled"; }; + + // 必须是 watchdog_d 意味着 detect 用于长时间的任务检测 + wdt:watchdog_d{ + compatible = "loongson,ls2x-wdt"; + reg = <0 0x16124000 0 0xC>; + clocks = <&apb_clk>; + clock-names = "clk"; + status = "okay"; + }; }; }; diff --git a/arch/loongarch/dts/ls2k300_ddr_isocom_1g.dtsi b/arch/loongarch/dts/ls2k300_ddr_isocom_1g.dtsi new file mode 100644 index 00000000..07da8534 --- /dev/null +++ b/arch/loongarch/dts/ls2k300_ddr_isocom_1g.dtsi @@ -0,0 +1,46 @@ +/ { + memory { + name = "memory"; + device_type = "memory"; + reg = <0x90000000 0x00000000 0 0x10000000 + 0x90000000 0x90000000 0 0x30000000>; + u-boot,dm-pre-reloc; + }; + + // MD4C1001G + mc0: ram@0 { + compatible = "loongson,ls2k0300-ddr"; + u-boot,dm-pre-reloc; + + soc-config-reg = <0x1fe10100>; + mc-disable-offs = <4>; + mc-default-offs = <5>; + + sdram-type = "ddr4"; // ddr4 + dimm-type = "udimm"; // rdimm/udimm/sodimm + + cs-map = <0x1>; // bit map: bit0 -- cs0 + // bit1 -- cs1 + // bit2 -- cs2 + // bit3 -- cs3 + + data-width = <16>; // 8/16 + sdram-width = <16>; // 8/16 + sdram-banks = <4>; // 4/8 + sdram-bank-groups = <2>; // 0/2/4 + sdram-rows = <16>; + sdram-cols = <10>; + + // clk-latency = <0x30>; // + // rd-latency = <0x9>; // + // wr-latency = <0x4>; // + mc-dqs-odt = <0x8>; // + cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. + + // To enable the feature below, uncomment it. + ddr-param-store; + // early-printf; + /* addr-mirror; */ + /* reset-revert; */ + }; +}; diff --git a/arch/loongarch/dts/ls2k300_ddr_isocom_2g.dtsi b/arch/loongarch/dts/ls2k300_ddr_isocom_2g.dtsi new file mode 100644 index 00000000..4ce5ba6c --- /dev/null +++ b/arch/loongarch/dts/ls2k300_ddr_isocom_2g.dtsi @@ -0,0 +1,46 @@ +/ { + memory { + name = "memory"; + device_type = "memory"; + reg = <0x90000000 0x00000000 0 0x10000000 + 0x90000000 0x90000000 0 0x70000000>; + u-boot,dm-pre-reloc; + }; + + // MD4C1002G + mc0: ram@0 { + compatible = "loongson,ls2k0300-ddr"; + u-boot,dm-pre-reloc; + + soc-config-reg = <0x1fe10100>; + mc-disable-offs = <4>; + mc-default-offs = <5>; + + sdram-type = "ddr4"; // ddr4 + dimm-type = "udimm"; // rdimm/udimm/sodimm + + cs-map = <0x1>; // bit map: bit0 -- cs0 + // bit1 -- cs1 + // bit2 -- cs2 + // bit3 -- cs3 + + data-width = <16>; // 8/16 + sdram-width = <16>; // 8/16 + sdram-banks = <4>; // 4/8 + sdram-bank-groups = <2>; // 0/2/4 + sdram-rows = <17>; + sdram-cols = <10>; + + // clk-latency = <0x30>; // + // rd-latency = <0x9>; // + // wr-latency = <0x4>; // + mc-dqs-odt = <0x8>; // + cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. + + // To enable the feature below, uncomment it. + ddr-param-store; + // early-printf; + /* addr-mirror; */ + /* reset-revert; */ + }; +}; diff --git a/arch/loongarch/dts/ls2k300_ddr_samsung_512m.dtsi b/arch/loongarch/dts/ls2k300_ddr_samsung_512m.dtsi new file mode 100644 index 00000000..d48141a9 --- /dev/null +++ b/arch/loongarch/dts/ls2k300_ddr_samsung_512m.dtsi @@ -0,0 +1,45 @@ +/ { + memory { + name = "memory"; + device_type = "memory"; + reg = <0x90000000 0x00000000 0 0x10000000 + 0x90000000 0x90000000 0 0x10000000>; + u-boot,dm-pre-reloc; + }; + + mc0: ram@0 { + compatible = "loongson,ls2k0300-ddr"; + u-boot,dm-pre-reloc; + + soc-config-reg = <0x1fe10100>; + mc-disable-offs = <4>; + mc-default-offs = <5>; + + sdram-type = "ddr4"; // ddr4 + dimm-type = "udimm"; // rdimm/udimm/sodimm + + cs-map = <0x1>; // bit map: bit0 -- cs0 + // bit1 -- cs1 + // bit2 -- cs2 + // bit3 -- cs3 + + data-width = <16>; // 8/16 + sdram-width = <16>; // 8/16 + sdram-banks = <4>; // 4/8 + sdram-bank-groups = <2>; // 0/2/4 + sdram-rows = <15>; + sdram-cols = <10>; + + // clk-latency = <0x30>; // + // rd-latency = <0x9>; // + // wr-latency = <0x4>; // + mc-dqs-odt = <0x8>; // + cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. + + // To enable the feature below, uncomment it. + ddr-param-store; + // early-printf; + /* addr-mirror; */ + /* reset-revert; */ + }; +}; diff --git a/arch/loongarch/dts/ls2k300_ddr_sinker_1g.dtsi b/arch/loongarch/dts/ls2k300_ddr_sinker_1g.dtsi new file mode 100644 index 00000000..e778b687 --- /dev/null +++ b/arch/loongarch/dts/ls2k300_ddr_sinker_1g.dtsi @@ -0,0 +1,46 @@ +/ { + memory { + name = "memory"; + device_type = "memory"; + reg = <0x90000000 0x00000000 0 0x10000000 + 0x90000000 0x90000000 0 0x30000000>; + u-boot,dm-pre-reloc; + }; + + // SNC1216S26SS12 + mc0: ram@0 { + compatible = "loongson,ls2k0300-ddr"; + u-boot,dm-pre-reloc; + + soc-config-reg = <0x1fe10100>; + mc-disable-offs = <4>; + mc-default-offs = <5>; + + sdram-type = "ddr4"; // ddr4 + dimm-type = "udimm"; // rdimm/udimm/sodimm + + cs-map = <0x1>; // bit map: bit0 -- cs0 + // bit1 -- cs1 + // bit2 -- cs2 + // bit3 -- cs3 + + data-width = <16>; // 8/16 + sdram-width = <16>; // 8/16 + sdram-banks = <4>; // 4/8 + sdram-bank-groups = <2>; // 0/2/4 + sdram-rows = <16>; + sdram-cols = <10>; + + // clk-latency = <0x30>; // + // rd-latency = <0x9>; // + // wr-latency = <0x4>; // + mc-dqs-odt = <0x8>; // + cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. + + // To enable the feature below, uncomment it. + ddr-param-store; + // early-printf; + /* addr-mirror; */ + /* reset-revert; */ + }; +}; diff --git a/arch/loongarch/dts/ls2k300_g2k03z0_core_v10.dtsi b/arch/loongarch/dts/ls2k300_g2k03z0_core_v10.dtsi index e7d06202..a3de3831 100644 --- a/arch/loongarch/dts/ls2k300_g2k03z0_core_v10.dtsi +++ b/arch/loongarch/dts/ls2k300_g2k03z0_core_v10.dtsi @@ -1,42 +1,34 @@ #include "ls2k300.dtsi" + +#if defined(CONFIG_LOONGSON_DDR4_ISOCOM_2G) +#include "ls2k300_ddr_isocom_2g.dtsi" +#elif defined(CONFIG_LOONGSON_DDR4_ISOCOM_1G) +#include "ls2k300_ddr_isocom_1g.dtsi" +#elif defined(CONFIG_LOONGSON_DDR4_SINKER_1G) +#include "ls2k300_ddr_sinker_1g.dtsi" +#else +#include "ls2k300_ddr_samsung_512m.dtsi" +#endif + #include / { - mc0: ram@0 { - compatible = "loongson,ls2k0300-ddr"; - u-boot,dm-pre-reloc; - - soc-config-reg = <0x1fe10100>; - mc-disable-offs = <4>; - mc-default-offs = <5>; - - sdram-type = "ddr4"; // ddr4 - dimm-type = "udimm"; // rdimm/udimm/sodimm - - cs-map = <0x1>; // bit map: bit0 -- cs0 - // bit1 -- cs1 - // bit2 -- cs2 - // bit3 -- cs3 - - data-width = <16>; // 8/16 - sdram-width = <16>; // 8/16 - sdram-banks = <4>; // 4/8 - sdram-bank-groups = <2>; // 0/2/4 - sdram-rows = <15>; - sdram-cols = <10>; - - // clk-latency = <0x30>; // - // rd-latency = <0x9>; // - // wr-latency = <0x4>; // - mc-dqs-odt = <0x8>; // - cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. - - // To enable the feature below, uncomment it. - ddr-param-store; - // early-printf; - /* addr-mirror; */ - /* reset-revert; */ + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "earlycon"; }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + bootparam: bootparam_region { + reg = <0x90000000 0x0f000000 0x0 0x1000000>; + no-map; + }; + }; + }; &spi0 { diff --git a/arch/loongarch/dts/ls2k300_mini_dp.dts b/arch/loongarch/dts/ls2k300_mini_dp.dts index ff21e72f..718e7e40 100644 --- a/arch/loongarch/dts/ls2k300_mini_dp.dts +++ b/arch/loongarch/dts/ls2k300_mini_dp.dts @@ -33,7 +33,7 @@ backlight = <&panel_bkl>; display-timings { -#if 1 // 4.3' LCD +#if 0 // 4.3' LCD native-mode = <&atk_md0430r>; atk_md0430r: 800x480 { diff --git a/arch/loongarch/dts/ls2k300_pai.dts b/arch/loongarch/dts/ls2k300_pai.dts index 5b2799f5..1bf225ee 100644 --- a/arch/loongarch/dts/ls2k300_pai.dts +++ b/arch/loongarch/dts/ls2k300_pai.dts @@ -1,44 +1,25 @@ #include "ls2k300.dtsi" +#include "ls2k300_ddr_samsung_512m.dtsi" #include #include / { model = "loongson-2k300"; - mc0: ram@0 { - compatible = "loongson,ls2k0300-ddr"; - u-boot,dm-pre-reloc; + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "earlycon"; + }; - soc-config-reg = <0x1fe10100>; - mc-disable-offs = <4>; - mc-default-offs = <5>; + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; - sdram-type = "ddr4"; // ddr4 - dimm-type = "udimm"; // rdimm/udimm/sodimm - - cs-map = <0x1>; // bit map: bit0 -- cs0 - // bit1 -- cs1 - // bit2 -- cs2 - // bit3 -- cs3 - - data-width = <16>; // 8/16 - sdram-width = <16>; // 8/16 - sdram-banks = <4>; // 4/8 - sdram-bank-groups = <2>; // 0/2/4 - sdram-rows = <15>; - sdram-cols = <10>; - - // clk-latency = <0x30>; // - // rd-latency = <0x9>; // - // wr-latency = <0x4>; // - mc-dqs-odt = <0x8>; // - cmd-timing-mode = <1>; // 0: 1T mode; 1(default): 2T mode; 2: 3T mode. - - // To enable the feature below, uncomment it. - // ddr-param-store; - // early-printf; - /* addr-mirror; */ - /* reset-revert; */ + bootparam: bootparam_region { + reg = <0x90000000 0x0f000000 0x0 0x1000000>; + no-map; + }; }; sysinfo-smbios { @@ -68,7 +49,7 @@ backlight = <&panel_bkl>; display-timings { -#if 1 // 4.3' LCD +#if 0 // 4.3' LCD native-mode = <&atk_md0430r>; atk_md0430r: 800x480 { diff --git a/arch/loongarch/dts/ls2p500.dtsi b/arch/loongarch/dts/ls2p500.dtsi index cf73a03b..7e3e4aaf 100644 --- a/arch/loongarch/dts/ls2p500.dtsi +++ b/arch/loongarch/dts/ls2p500.dtsi @@ -35,24 +35,6 @@ }; - cpuic: interrupt-controller { - compatible = "loongson,cpu-interrupt-controller"; - interrupt-controller; - #interrupt-cells = <1>; - }; - - extioiic: interrupt-controller@0x14001600 { - compatible = "loongson,extioi-interrupt-controller"; - interrupt-controller; - #interrupt-cells = <1>; - interrupt-parent = <&cpuic>; - interrupts = <3>; - interrupt-names = "cascade"; - vec_count=<128>; - misc_func=<0x100>; - eio_en_off=<15>; - }; - clocks { compatible = "simple-bus"; #address-cells = <1>; @@ -138,7 +120,7 @@ }; gmac1_pins: pinmux_gmac1_pins { - pinctrl-single,bits = <0x8 0x00ffffff 0x00ffffff>; + pinctrl-single,bits = <0x8 0x00aaaaaa 0x00ffffff>; }; }; @@ -207,8 +189,6 @@ compatible = "ns16550a"; reg = <0 0x14200000 0 0x10>; clocks = <&apb_clk>; - interrupt-parent = <&extioiic>; - interrupts = <0>; // pinctrl-0 = <&uart0>; // pinctrl-names = "default"; no-loopback-test; @@ -240,29 +220,13 @@ gmac0: ethernet@14140000 { compatible = "snps,dwmac-3.70a", "snps,arc-dwmac-3.70a"; reg = <0 0x14140000 0 0x10000>; - interrupt-parent = <&extioiic>; - interrupts = <118>; - interrupt-names = "macirq"; // mac-address = [ 64 48 48 48 48 60 ];/* [>mac 64:48:48:48:48:60 <]*/ - phy-mode = "rgmii"; bus_id = <0x0>; - phy_addr = <0xffffffff>; - phy-handle = <ð_phy0>; dma-mask = <0xffffffff 0xffffffff>; // snps,pbl = <2>; // snps,fixed-burst; // snps,force_sf_dma_mode; status = "disabled"; - - mdio0: mdio@0 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "snps,dwmac-mdio"; - - eth_phy0: ethernet-phy@0 { - reg = <0>; - }; - }; }; gmac1: ethernet@14020000 { @@ -270,26 +234,13 @@ reg = <0 0x14020000 0 0x10000>; pinctrl-0 = <&gmac1_pins>; pinctrl-names = "default"; - interrupt-parent = <&extioiic>; - interrupts = <119>; - interrupt-names = "macirq"; // mac-address = [ 64 48 48 48 48 61 ];/* [>mac 64:48:48:48:48:61 <]*/ - phy-mode = "rgmii-id"; bus_id = <0x1>; - phy_addr = <0xffffffff>; - phy-handle = <ð_phy1>; dma-mask = <0xffffffff 0xffffffff>; + // snps,pbl = <2>; + // snps,fixed-burst; + // snps,force_sf_dma_mode; status = "disabled"; - - mdio1: mdio@1 { - #address-cells = <1>; - #size-cells = <0>; - compatible = "snps,dwmac-mdio"; - - eth_phy1: ethernet-phy@1 { - reg = <0>; - }; - }; }; gpio@14202000 { @@ -399,8 +350,6 @@ #size-cells = <0>; pinctrl-0 = <&i2c0_pins>; pinctrl-names = "default"; - interrupt-parent = <&extioiic>; - interrupts = <14>; clock-frequency = <400000>; reg-shift = <0>; clocks = <&apb_clk>; @@ -413,8 +362,6 @@ reg = <0 0x14201800 0 0x0800>; #address-cells = <1>; #size-cells = <0>; - interrupt-parent = <&extioiic>; - interrupts = <15>; clock-frequency = <400000>; status = "disabled"; }; @@ -424,8 +371,6 @@ reg = <0 0x15101000 0 0x0800>; #address-cells = <1>; #size-cells = <0>; - interrupt-parent = <&extioiic>; - interrupts = <16>; clock-frequency = <400000>; status = "disabled"; }; @@ -435,8 +380,6 @@ reg = <0 0x15101800 0 0x0800>; #address-cells = <1>; #size-cells = <0>; - interrupt-parent = <&extioiic>; - interrupts = <17>; clock-frequency = <400000>; status = "disabled"; }; @@ -452,8 +395,8 @@ }; sdio1: mmc@14218000 { - compatible = "loongson,ls1x-mmc"; - reg = <0 0x14218000 0 0x2000>; + compatible = "loongson,ls-mmc"; + reg = <0 0x14218000 0 0x8000>; pinctrl-0 = <&sdio1_pins>; pinctrl-names = "default"; cap-sd-highspeed; @@ -473,6 +416,13 @@ dma-mask = <0x0 0xffffffff>; }; + otg: otg@0x14100000 { + compatible = "snps,dwc2"; + reg = <0 0x14100000 0 0x40000>; + dma-mask = <0x0 0xffffffff>; + status = "disabled"; + }; + usb2_phy: usb2phy@xhci { compatible = "usb-dummy-phy"; }; diff --git a/arch/loongarch/dts/ls2p500_evb.dts b/arch/loongarch/dts/ls2p500_evb.dts index a0afb95c..217d595c 100644 --- a/arch/loongarch/dts/ls2p500_evb.dts +++ b/arch/loongarch/dts/ls2p500_evb.dts @@ -109,12 +109,34 @@ &gmac0 { status = "okay"; - phy-mode = "rgmii-txid"; + phy-mode = "rgmii"; + phy-handle = <ð_phy0>; + + mdio0: mdio@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,dwmac-mdio"; + + eth_phy0: ethernet-phy@0 { + reg = <0>; + }; + }; }; &gmac1 { status = "okay"; - phy-mode = "rgmii-txid"; + phy-mode = "rgmii"; + phy-handle = <ð_phy1>; + + mdio1: mdio@1 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,dwmac-mdio"; + + eth_phy1: ethernet-phy@0 { + reg = <0>; + }; + }; }; &emmc0 { diff --git a/arch/loongarch/dts/ls2p500_gbkpjm0_v10.dts b/arch/loongarch/dts/ls2p500_gbkpjm0_v10.dts new file mode 100644 index 00000000..f1831940 --- /dev/null +++ b/arch/loongarch/dts/ls2p500_gbkpjm0_v10.dts @@ -0,0 +1,151 @@ +#include "ls2p500_g2p05z0_v10.dtsi" + +/ { + sysinfo-smbios { + compatible = "u-boot,sysinfo-smbios"; + u-boot,dm-pre-reloc; + + smbios { + system { + manufacturer = "Loongson"; + product = "LS2P500"; + }; + + baseboard { + manufacturer = "Loongson"; + product = "LS2P500-GBKPJM0"; + }; + + chassis { + manufacturer = "Loongson"; + product = "LS2P500-GBKPJM0"; + }; + }; + }; +}; + +&gmac0 { + status = "okay"; + phy-mode = "rgmii"; + phy-handle = <ð_phy0>; + + mdio0: mdio@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,dwmac-mdio"; + + eth_phy0: ethernet-phy@0 { + reg = <0>; + }; + }; +}; + +&gmac1 { + status = "okay"; + phy-mode = "rgmii"; + phy-handle = <ð_phy1>; + + mdio1: mdio@1 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "snps,dwmac-mdio"; + + eth_phy1: ethernet-phy@0 { + reg = <0>; + }; + }; +}; + +&sdio1 { + status = "okay"; + use-sdcard; +}; + +&otg { + status = "okay"; + // force host mode + hnp-srp-disable; +}; + +&pwrc { + domain-node { + bit = <0>; + clock-gate-la364 { + bit = <0>; + }; + clock-gate-iodma { + bit = <1>; + }; + }; + domain-ddr { + bit = <2>; + clock-gate-ddriso { + bit = <20>; + }; + clock-gate-ddrrst { + bit = <21>; + }; + clock-gate-ddr { + bit = <22>; + }; + }; + domain-print { + bit = <4>; + always-on; + clock-gate-prtla132 { + bit = <2>; + clock-gate-off; + }; + clock-gate-prtl1xbar { + bit = <3>; + }; + }; + domain-scan { + bit = <6>; + clock-gate-scala132 { + bit = <4>; + clock-gate-off; + }; + clock-gate-scadev { + bit = <5>; + }; + }; + domain-sys { + bit = <8>; + clock-gate-boot { + bit = <8>; + }; + clock-gate-gmac1 { + bit = <9>; + }; + clock-gate-usb { + bit = <10>; + }; + clock-gate-sdio { + bit = <11>; + }; + clock-gate-apbdev { + bit = <12>; + }; + }; + domain-resume { + bit = <10>; + always-on; + clock-gate-gmac0 { + bit = <16>; + }; + clock-gate-otg { + bit = <17>; + }; + }; + domain-image { + bit = <12>; + dpm-off; + clock-gate-jbig { + bit = <18>; + }; + clock-gate-jpeg { + bit = <19>; + }; + }; +}; diff --git a/arch/loongarch/mach-loongson/Kconfig b/arch/loongarch/mach-loongson/Kconfig index 68f02708..962467c3 100644 --- a/arch/loongarch/mach-loongson/Kconfig +++ b/arch/loongarch/mach-loongson/Kconfig @@ -175,4 +175,23 @@ config CPU_FREQ source "board/loongson/Kconfig" +choice + prompt "DDR4 SDRAM Select" + depends on TARGET_LS2K300_MINI_DP + default LOONGSON_DDR4_DEFAULT + +config LOONGSON_DDR4_DEFAULT + bool "Samsung K4A4G165xx(Default)" + +config LOONGSON_DDR4_SINKER_1G + bool "Sinker SNC1216S26SS12" + +config LOONGSON_DDR4_ISOCOM_1G + bool "Isocom MD4C1001G" + +config LOONGSON_DDR4_ISOCOM_2G + bool "Isocom MD4C1002G" + +endchoice + endmenu diff --git a/board/loongson/common/Kconfig b/board/loongson/common/Kconfig index d3ee7129..8e486d4b 100644 --- a/board/loongson/common/Kconfig +++ b/board/loongson/common/Kconfig @@ -45,4 +45,14 @@ config LOONGSON_GENERAL_LOAD default n select CMD_UNZIP +config LOONGSON_BOARD_SATA_FS + bool "board have sata fs" + default n + select CMD_UNZIP + +config LOONGSON_BOARD_MMC_FS + bool "board have mmc(such as emmc or SD card) fs" + default n + select CMD_UNZIP + endmenu diff --git a/board/loongson/common/Makefile b/board/loongson/common/Makefile index ec57f5be..3fc3ef52 100644 --- a/board/loongson/common/Makefile +++ b/board/loongson/common/Makefile @@ -18,7 +18,10 @@ obj-y += loongson_boot.o obj-y += loongson_env_trigger.o obj-y += loongson_init_env.o obj-y += loongson_stdout_operation.o +obj-y += loongson_boot_syspart_manager.o +obj-y += loongson_wdt_setup.o obj-$(CONFIG_LOONGSON_GENERAL_LOAD) += general_load/ +obj-$(CONFIG_LOONGSON_GENERAL_LOAD) += loongson_img_fdisk.o ifeq ($(CONFIG_MENU), y) obj-$(CONFIG_MACH_LOONGSON) += loongson_update_menu.o diff --git a/board/loongson/common/general_load/cmd_general_load.c b/board/loongson/common/general_load/cmd_general_load.c index 28eb19ce..9a98e233 100644 --- a/board/loongson/common/general_load/cmd_general_load.c +++ b/board/loongson/common/general_load/cmd_general_load.c @@ -3,8 +3,32 @@ #include #include #include +#include #include "cmd_gl_arg.h" #include "general_load.h" +#include "../loongson_boot_syspart_manager.h" +#include "../loongson_img_fdisk.h" + +static void try_to_read_fdisk(gl_target_t* src) +{ + int type; + struct blk_desc* desc; + if (!src) + return; + + type = gl_target_get_type(src); + if (type == GL_DEVICE_NET) + loongson_try_read_img_fdisk("tftp"); + else if (type == GL_DEVICE_BLK) { + desc = gl_target_get_desc(src); + if (!desc) + return; + if (desc->if_type == IF_TYPE_MMC) + loongson_try_read_img_fdisk("mmc"); + else if (desc->if_type == IF_TYPE_USB) + loongson_try_read_img_fdisk("usb"); + } +} // [--from xxx [--fs xxx]] [--to xxx [--fs xxx]] static int do_general_load(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]) @@ -13,6 +37,7 @@ static int do_general_load(struct cmd_tbl *cmdtp, int flag, int argc, char * con gl_target_t* src; gl_target_t* dest; enum gl_extra_e extra = GL_EXTRA_NONE; + int update_rootfs_target; if(argc == 1) goto end; @@ -30,6 +55,21 @@ static int do_general_load(struct cmd_tbl *cmdtp, int flag, int argc, char * con ret = general_load(src, dest, extra); + if (!ret) { + update_rootfs_target = 0; + if (!strncmp(src->get_symbol(src), "rootfs", strlen("rootfs"))) + update_rootfs_target = 1; + if (!strncmp(src->get_symbol(src), "/update/rootfs", strlen("/update/rootfs"))) + update_rootfs_target = 1; + + if (update_rootfs_target) { + print_enable_setup(0); + setup_cur_syspart(SYSPART_FIRST); + print_enable_setup(1); + try_to_read_fdisk(src); + } + } + free_targets: destroy_gl_target(dest); free_src: diff --git a/board/loongson/common/general_load/cmd_gl_arg_default.h b/board/loongson/common/general_load/cmd_gl_arg_default.h index 87c16ed2..c9f391e8 100644 --- a/board/loongson/common/general_load/cmd_gl_arg_default.h +++ b/board/loongson/common/general_load/cmd_gl_arg_default.h @@ -18,7 +18,7 @@ const static struct cmd_gl_default_s __default = .blk_prefix = "/update/", .boot_device = "flash0:1", .root_device = "mmc0", - .kernel_device = "mmc0", + .kernel_device = "mmc0:1", .kernel_fstype = "ext4", .kernel_prefix = "/boot/", } @@ -28,7 +28,7 @@ const static struct cmd_gl_default_s __default = .blk_prefix = "/update/", .boot_device = "flash0:1", .root_device = "scsi0", - .kernel_device = "scsi0", + .kernel_device = "scsi0:1", .kernel_fstype = "ext4", .kernel_prefix = "/boot/", } diff --git a/board/loongson/common/general_load/device/net.c b/board/loongson/common/general_load/device/net.c index 65755cd7..d056291b 100644 --- a/board/loongson/common/general_load/device/net.c +++ b/board/loongson/common/general_load/device/net.c @@ -6,7 +6,18 @@ static int m__net_gl_read(struct net_gl_desc* self, int proto, { int ret; + // netretry yes 本身是做为双网口切换准备的,通常情况下没有问题 + // 因为操作者知道自已的网络设备上是否存在需要的文件或者能够检查网口情况 + // 然而在2K300上竟然有操作者不一定知道的文件需要存在 + // 就是 loongson_try_read_img_fdisk 中需要 fdisk.txt,这个过程是对操作者隐匿的 + // 好在目前只有2K300用 disk.img 模式,暂时需要这样规避 + // 对于其他所有使用 disk.img 的情况,务必、务必修改整体设计结构! + // 禁止存在对操作者隐匿的条件 +#ifdef CONFIG_SOC_LS2K300 + env_set("netretry", "no"); +#else env_set("netretry", "yes"); +#endif env_set("ethrotate", "yes"); copy_filename(net_boot_file_name, filepath, diff --git a/board/loongson/common/loongson_boot_syspart_manager.c b/board/loongson/common/loongson_boot_syspart_manager.c new file mode 100644 index 00000000..1df0c5d6 --- /dev/null +++ b/board/loongson/common/loongson_boot_syspart_manager.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include "bdinfo/bdinfo.h" +#include "loongson_boot_syspart_manager.h" + +static int setup_syspart_uboot_env(char* syspart) +{ + if (!syspart) + return -1; + env_set(SYSPART_FIRST_UBOOT_ENV_NAME, syspart); + + if (!strcmp(syspart, SYSPART_FIRST)) + env_set(SYSPART_SECOND_UBOOT_ENV_NAME, SYSPART_SECOND); + else + env_set(SYSPART_SECOND_UBOOT_ENV_NAME, SYSPART_FIRST); + + env_set(SYSPART_USER_CH_UBOOT_ENV_NAME, "0"); + + env_save(); + return 0; +} + +static int setup_syspart_nvme_env(char* syspart) +{ + if (!syspart) + return -1; + + bdinfo_set(BDI_ID_SYSPART, syspart); + +#ifdef LS_DOUBLE_SYSTEM + if (!strcmp(syspart, SYSPART_FIRST)) + bdinfo_set(BDI_ID_SYSPART_LAST, SYSPART_SECOND); + else + bdinfo_set(BDI_ID_SYSPART_LAST, SYSPART_FIRST); +#endif + + bdinfo_save(); + return 0; +} + +int switch_syspart(void) +{ + int ret = 0; + char *env_val = NULL; + + // from uboot env + env_val = env_get(SYSPART_FIRST_UBOOT_ENV_NAME); + if (!env_val) + return -1; + + if (!strcmp(env_val, SYSPART_FIRST)) + env_val = SYSPART_SECOND; + else + env_val = SYSPART_FIRST; + + ret = setup_syspart_uboot_env(env_val); + if (ret) + printf("%s: setup uboot env failed! (target: %s)", __func__, env_val); + ret = setup_syspart_nvme_env(env_val); + if (ret) + printf("%s: setup nvme env failed! (target: %s)", __func__, env_val); + return ret ? -1 : 0; +} + +int setup_cur_syspart(char* syspart) +{ + int ret = 0; + + if (!syspart) + return -1; + + ret = setup_syspart_uboot_env(syspart); + if (ret) + printf("%s: setup uboot env failed! (target: %s)\n", __func__, syspart); + ret = setup_syspart_nvme_env(syspart); + if (ret) + printf("%s: setup nvme env failed! (target: %s)\n", __func__, syspart); + return ret ? -1 : 0; +} + +int detect_user_change_syspart(void) +{ + int ret = 0; + char *env_val = NULL; + + env_val = env_get(SYSPART_USER_CH_UBOOT_ENV_NAME); + if (!env_val) + return -1; + + if (!strcmp(env_val, SYSPART_USER_CH_DISABLE)) + return 0; + + env_val = env_get(SYSPART_FIRST_UBOOT_ENV_NAME); + if (!env_val) + return -1; + + ret = setup_syspart_nvme_env(env_val); + if (ret) + printf("%s: setup nvme env failed! (target: %s)", __func__, env_val); + return ret ? -1 : 0; +} diff --git a/board/loongson/common/loongson_boot_syspart_manager.h b/board/loongson/common/loongson_boot_syspart_manager.h new file mode 100644 index 00000000..40e6c292 --- /dev/null +++ b/board/loongson/common/loongson_boot_syspart_manager.h @@ -0,0 +1,17 @@ +#ifndef __LOONGSON_BOOT_SYSPART_MANAGER_H__ +#define __LOONGSON_BOOT_SYSPART_MANAGER_H__ + +#define SYSPART_FIRST "1" +#define SYSPART_FIRST_UBOOT_ENV_NAME "syspart" +#define SYSPART_SECOND "4" +#define SYSPART_SECOND_UBOOT_ENV_NAME "syspart_last" + +#define SYSPART_USER_CH_UBOOT_ENV_NAME "syspart_ch" +#define SYSPART_USER_CH_DISABLE "0" +#define SYSPART_USER_CH_ENABLE "1" + +int switch_syspart(void); +int setup_cur_syspart(char* syspart); +int detect_user_change_syspart(void); + +#endif diff --git a/board/loongson/common/loongson_env_trigger.c b/board/loongson/common/loongson_env_trigger.c index 1545302f..57bfbf13 100644 --- a/board/loongson/common/loongson_env_trigger.c +++ b/board/loongson/common/loongson_env_trigger.c @@ -3,6 +3,8 @@ #include #include #include +#include "loongson_boot_syspart_manager.h" +#include "loongson_wdt_setup.h" /* * 这是一个模拟uboot启动的时候的会自动复位的触发器逻辑 @@ -36,11 +38,15 @@ static void loongson_tip_update_rootfs_change(void); static int loongson_handle_update_uboot_change(int index); static void loongson_tip_update_uboot_change(void); +static int loongson_handle_ab_sys_status_change(int index); +static void loongson_tip_ab_sys_status_change(void); + static char* trigger_name_list[] = { "ls_trigger_boot", "ls_trigger_u_kernel", "ls_trigger_u_rootfs", "ls_trigger_u_uboot", + "ls_trigger_ab_sys_status", NULL, }; static loongson_trigger_handle_func trigger_handle_func_list[] = { @@ -48,6 +54,7 @@ static loongson_trigger_handle_func trigger_handle_func_list[] = { loongson_handle_update_kernel_change, loongson_handle_update_rootfs_change, loongson_handle_update_uboot_change, + loongson_handle_ab_sys_status_change, NULL }; static loongson_trigger_tip_func trigger_tip_func_list[] = { @@ -55,9 +62,10 @@ static loongson_trigger_tip_func trigger_tip_func_list[] = { loongson_tip_update_kernel_change, loongson_tip_update_rootfs_change, loongson_tip_update_uboot_change, + loongson_tip_ab_sys_status_change, NULL }; -static char* trigger_default_value_list[] = {"0", "0", "0", "0", NULL}; +static char* trigger_default_value_list[] = {"0", "0", "0", "0", "0", NULL}; static int trigger_first_check(int index, char* env_value_bak, int buffer_len) { @@ -116,6 +124,27 @@ static int loongson_handle_boot_change(int index) #else return -1; #endif + } else if (!strcmp(env_value, "mmc")) { + #ifdef EMMC_BOOT_ENV + printf("set boot system from mmc0 .....\r\n"); + ret = run_command(EMMC_BOOT_ENV, 0); + #else + return -1; + #endif + } else if (!strcmp(env_value, "mmc0")) { + #ifdef EMMC_BOOT_ENV + printf("set boot system from mmc0 .....\r\n"); + ret = run_command(EMMC_BOOT_ENV, 0); + #else + return -1; + #endif + } else if (!strcmp(env_value, "mmc1")) { + #ifdef SDCARD_BOOT_ENV + printf("set boot system from mmc1 .....\r\n"); + ret = run_command(SDCARD_BOOT_ENV, 0); + #else + return -1; + #endif } else return -1; @@ -125,9 +154,12 @@ static int loongson_handle_boot_change(int index) static void loongson_tip_boot_change(void) { printf("\tvalue:\n"); - printf("\t\t0 : no handle\n"); - printf("\t\tnand: set boot from nand default\n"); - printf("\t\tssd : set boot from ssd default\n"); + printf("\t\t0 : no handle\n"); + printf("\t\tnand : set boot from nand default\n"); + printf("\t\tssd : set boot from ssd default\n"); + printf("\t\tmmc : set boot from mmc0 default\n"); + printf("\t\tmmc0 : set boot from mmc0 default\n"); + printf("\t\tmmc1 : set boot from mmc1 default\n"); printf("\n"); } @@ -246,6 +278,53 @@ static void loongson_tip_update_uboot_change(void) printf("\n"); } +static int loongson_handle_ab_sys_status_change(int index) +{ + int ret; + char env_value[32]; + + ret = trigger_first_check(index, env_value, 32); + if (ret == -1) + return -1; + else if (ret == 1) + return 0; + + ret = 0; + if (!strcmp(env_value, "boot1")) { + printf("Detected new system ...\n"); + // setup env ls_trigger_ab_sys_status boot2 + ret = run_command("setenv ls_trigger_ab_sys_status boot2;saveenv", 0); + } else if (!strcmp(env_value, "boot1_wdt")) { + printf("Detected new system (with boot failed detect)...\n"); + // setup watchdog 34s 2k max is 34 s + ls_wdt_start(LS_WDT_DEFAULT_TIMEOUT_MS); + // setup env ls_trigger_ab_sys_status boot2 + ret = run_command("setenv ls_trigger_ab_sys_status boot2;saveenv", 0); + } else if (!strcmp(env_value, "boot2")) { + printf("Detected new system boot failed! run back to last system...\n"); + // switch last boot part + switch_syspart(); + ret = run_command("setenv ls_trigger_ab_sys_status boot4;saveenv", 0); + } else if (!strcmp(env_value, "boot4")) { + // just wait last part start... and need set this value to be 0 + ret = 0; + } else + return -1; + + return ret; +} + +static void loongson_tip_ab_sys_status_change(void) +{ + printf("\tvalue:\n"); + printf("\t\t0 : no handle\n"); + printf("\t\tboot1 : new system first boot(uboot will change it to be boot2)\n"); + printf("\t\boot1_wdt: new system first boot and use watchdog detect auto run back(uboot will change it to be boot2)\n"); + printf("\t\tboot2 : new system first boot failed(system need set this value to be 0, either uboot will boot last disk)\n"); + printf("\t\boot4 : to old system known install ab system failed\n"); + printf("\n"); +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////底层逻辑实现//////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/board/loongson/common/loongson_img_fdisk.c b/board/loongson/common/loongson_img_fdisk.c new file mode 100644 index 00000000..413d4484 --- /dev/null +++ b/board/loongson/common/loongson_img_fdisk.c @@ -0,0 +1,86 @@ + +#include +#include +#include + +#define TARGET_FDISK_TXT_PATH "/usr/local/ls_resize/fdisk.txt" + +static void try_read_block(char* block_type) +{ + int ret; +#if defined(CONFIG_SOC_LS2K300) || defined(CONFIG_SOC_LS2P500) + char* target_block = "mmc0:1"; +#else + char* target_block = "scsi0:1"; +#endif + char cmd[256]; + + memset(cmd, 0 , 256); + sprintf(cmd, "general_load --if %s%s --fmt fat32 --sym /update/fdisk.txt --of %s --fmt ext4 --sym %s --force", block_type, "0:1", target_block, TARGET_FDISK_TXT_PATH); + ret = run_command(cmd, 0); + + if (!ret) + return; + + memset(cmd, 0 , 256); + sprintf(cmd, "general_load --if %s%s --fmt fat32 --sym /update/fdisk.txt --of %s --fmt ext4 --sym %s --force", block_type, "0", target_block, TARGET_FDISK_TXT_PATH); + ret = run_command(cmd, 0); + + if (!ret) + return; + + memset(cmd, 0 , 256); + sprintf(cmd, "general_load --if %s%s --fmt ext4 --sym /update/fdisk.txt --of %s --fmt ext4 --sym %s --force", block_type, "0:1", target_block, TARGET_FDISK_TXT_PATH); + ret = run_command(cmd, 0); + + if (!ret) + return; + + memset(cmd, 0 , 256); + sprintf(cmd, "general_load --if %s%s --fmt ext4 --sym /update/fdisk.txt --of %s --fmt ext4 --sym %s --force", block_type, "0", target_block, TARGET_FDISK_TXT_PATH); + ret = run_command(cmd, 0); + + if (!ret) + return; +} + +static void try_read_tftp(void) +{ + char* server_ip = NULL; +#if defined(CONFIG_SOC_LS2K300) || defined(CONFIG_SOC_LS2P500) + char* target_block = "mmc0:1"; +#else + char* target_block = "scsi0:1"; +#endif + char cmd[256]; + // general_load --if net:192.168.1.2 --fmt tftp --sym fdisk.txt --of mmc0:1 --fmt ext4 --sym /root/fdisk.txt --force + + server_ip = env_get("serverip"); + + // fdisk.txt 是隐匿的,应快速超时 + env_set("tftptimeout", "1"); + env_set("tftptimeoutcountmax", "1"); + + memset(cmd, 0 , 256); + sprintf(cmd, "general_load --if net:%s --fmt tftp --sym fdisk.txt --of %s --fmt ext4 --sym %s --force", server_ip, target_block, TARGET_FDISK_TXT_PATH); + run_command(cmd, 0); + + return; +} + +int loongson_try_read_img_fdisk(char* read_way) +{ + if (!read_way) + return -1; + + print_enable_setup(0); + if (!strcmp(read_way, "usb")) { + try_read_block(read_way); + } else if (!strcmp(read_way, "mmc")) { + try_read_block(read_way); + } else if (!strcmp(read_way, "tftp")) { + try_read_tftp(); + } + print_enable_setup(1); + return 0; +} diff --git a/board/loongson/common/loongson_img_fdisk.h b/board/loongson/common/loongson_img_fdisk.h new file mode 100644 index 00000000..4d8d4829 --- /dev/null +++ b/board/loongson/common/loongson_img_fdisk.h @@ -0,0 +1,6 @@ +#ifndef __LOONGSON_IMG_FDISK_H__ +#define __LOONGSON_IMG_FDISK_H__ + +int loongson_try_read_img_fdisk(char* read_way); + +#endif diff --git a/board/loongson/common/loongson_update.c b/board/loongson/common/loongson_update.c index f43ba64c..45ba273f 100644 --- a/board/loongson/common/loongson_update.c +++ b/board/loongson/common/loongson_update.c @@ -277,9 +277,17 @@ static int update_uboot(int dev) /* * erase uboot_env */ + printf("Erase uboot_env partition ... "); sprintf(cmd, "mtd erase uboot_env"); run_command(cmd, 0); + /* + * erase u-boot ddr param + */ + printf("Erase ddr_context partition ... "); + sprintf(cmd, "mtd erase ddr_context"); + run_command(cmd, 0); + user_env_save(); out: diff --git a/board/loongson/common/loongson_update_menu.c b/board/loongson/common/loongson_update_menu.c index 7d932d48..e67033b1 100644 --- a/board/loongson/common/loongson_update_menu.c +++ b/board/loongson/common/loongson_update_menu.c @@ -61,11 +61,11 @@ static char *updatemenu_rootfs[] = { #endif #ifdef CONFIG_LOONGSON_GENERAL_LOAD #ifdef CONFIG_USB_STORAGE - "Update rootfs (rootfs.img) (by usb)=general_load --if usb --sym rootfs.img --decompress\0", + "Update rootfs (rootfs.img) (by usb)=general_load --if usb --sym rootfs.img --decompress;\0", #endif - "Update rootfs (rootfs.img) (by tftp)=general_load --if net --sym rootfs.img --decompress\0", + "Update rootfs (rootfs.img) (by tftp)=general_load --if net --sym rootfs.img --decompress;\0", #ifdef CONFIG_MMC - "Update rootfs (rootfs.img) (by mmc)=general_load --if mmc1 --sym rootfs.img --decompress\0", + "Update rootfs (rootfs.img) (by mmc)=general_load --if mmc1 --sym rootfs.img --decompress;\0", #endif #endif @@ -103,7 +103,18 @@ static char *updatemenu_all[] = { }; static char *updatemenu_system[] = { -#ifdef CONFIG_AHCI +#ifdef CONFIG_LOONGSON_BOARD_MMC_FS + "System install to mmc device (by usb)=recover_cmd usb 1 mmc\0", + "System install to mmc device (by tftp)=recover_cmd tftp 1 mmc\0", + #ifdef CONFIG_MMC + "System install to mmc device (by mmc)=recover_cmd mmc 1 mmc\0", + #endif + "System recover from mmc disk=recover_cmd mmc_r\0", + #ifdef LS_DOUBLE_SYSTEM + "System recover last time boot=recover_cmd last\0", + #endif +#endif +#ifdef CONFIG_LOONGSON_BOARD_SATA_FS "System install to sata disk (by usb)=recover_cmd usb\0", "System install to sata disk (by usb iso)=bootcfg usb\0", "System install to sata disk (by tftp)=recover_cmd tftp\0", diff --git a/board/loongson/common/loongson_wdt_setup.c b/board/loongson/common/loongson_wdt_setup.c new file mode 100644 index 00000000..39bf7eb1 --- /dev/null +++ b/board/loongson/common/loongson_wdt_setup.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include "loongson_wdt_setup.h" + +#ifdef CONFIG_WDT +static struct udevice *currdev = NULL; + +static int init_wdt_dev(void) +{ + int ret; + + if (currdev) + return 0; + + ret = uclass_get_device_by_name(UCLASS_WDT, LS_WDT_NODE_NAME, &currdev); + if (ret) { + printf("%s: Can't get the watchdog timer: %s\n", __func__, LS_WDT_NODE_NAME); + currdev = NULL; + return -1; + } + + return 0; +} + +int ls_wdt_start(int ms) +{ + int ret; + ret = init_wdt_dev(); + if (ret) + return -1; + + ret = wdt_start(currdev, ms, 0); + if (ret == -ENOSYS) { + printf("%s Starting watchdog timer not supported.\n", __func__); + return -1; + } else if (ret) { + printf("%s Starting watchdog timer failed (%d)\n", __func__, ret); + return -1; + } + + return 0; +} + +int ls_wdt_stop(void) +{ + int ret; + ret = init_wdt_dev(); + if (ret) + return -1; + + ret = wdt_stop(currdev); + if (ret == -ENOSYS) { + printf("%s Stopping watchdog timer not supported.\n", __func__); + return -1; + } else if (ret) { + printf("%s Stopping watchdog timer failed (%d)\n", __func__, ret); + return -1; + } + + return 0; +} + +int ls_wdt_restart(void) +{ + int ret; + ret = init_wdt_dev(); + if (ret) + return -1; + + ret = wdt_reset(currdev); + if (ret == -ENOSYS) { + printf("%s Resetting watchdog timer not supported.\n", __func__); + return -1; + } else if (ret) { + printf("%s Resetting watchdog timer failed (%d)\n", __func__, ret); + return -1; + } + + return 0; +} +#else +int ls_wdt_start(int ms) {return 0;} +int ls_wdt_stop(void) {return 0;} +int ls_wdt_restart(void) {return 0;} +#endif diff --git a/board/loongson/common/loongson_wdt_setup.h b/board/loongson/common/loongson_wdt_setup.h new file mode 100644 index 00000000..af9d2a2e --- /dev/null +++ b/board/loongson/common/loongson_wdt_setup.h @@ -0,0 +1,11 @@ +#ifndef __LOONGSON_WDT_SETUP_H__ +#define __LOONGSON_WDT_SETUP_H__ + +#define LS_WDT_NODE_NAME "watchdog_d" +#define LS_WDT_DEFAULT_TIMEOUT_MS 34000 + +int ls_wdt_start(int ms); +int ls_wdt_stop(void); +int ls_wdt_restart(void); + +#endif diff --git a/board/loongson/common/platform.c b/board/loongson/common/platform.c index 2913479c..92275fca 100644 --- a/board/loongson/common/platform.c +++ b/board/loongson/common/platform.c @@ -306,6 +306,7 @@ static void loongson_env_trigger(void) run_command("loongson_env_trigger ls_trigger_u_rootfs", 0); run_command("loongson_env_trigger ls_trigger_u_uboot", 0); run_command("loongson_env_trigger ls_trigger_boot", 0); + run_command("loongson_env_trigger ls_trigger_ab_sys_status", 0); } #ifdef CONFIG_BOARD_EARLY_INIT_F diff --git a/board/loongson/common/recover.c b/board/loongson/common/recover.c index d62219c3..7a466c97 100644 --- a/board/loongson/common/recover.c +++ b/board/loongson/common/recover.c @@ -7,6 +7,17 @@ #include #include "loongson_storage_read_file.h" #include "bdinfo/bdinfo.h" +#include "loongson_boot_syspart_manager.h" + +typedef enum recover_network { + NETWORK_TFTP = 0, + NETWORK_DHCP, + NETWORK_UNKNOWN, +} recover_network; + +// 0 is scsi default +// 1 is mmc +static int install_target=0; static int run_recover_cmd(char *cmd) { @@ -67,6 +78,7 @@ static int run_recover_cmd_for_storage(enum if_type if_type) char* type; enum if_type if_type_set[] = {IF_TYPE_USB, IF_TYPE_MMC}; char* type_set[] = {"usb", "mmc", NULL}; + char* ins_target_set[] = {"scsi", "mmc", NULL}; int status; status = 0; @@ -111,7 +123,7 @@ static int run_recover_cmd_for_storage(enum if_type if_type) // set bootargs env by loongson env memset(cmdbuf, 0, 256); - sprintf(cmdbuf, "setenv bootargs ${bootargs} ins_way=%s;", type); + sprintf(cmdbuf, "setenv bootargs ${bootargs} ins_way=%s ins_target=%s;", type, ins_target_set[install_target]); ret = run_command(cmdbuf, 0); if (ret) { status = 3; @@ -135,6 +147,65 @@ reset_start_failed: return ret; } +/* + * network_way + * 0 tftp + * 1 dhcp + */ +static int run_recover_cmd_for_network(recover_network network_way) +{ + int ret = -1; + char cmdbuf[256]; /* working copy of cmd */ + char* ins_target_set[] = {"scsi", "mmc", NULL}; + char* download_cmd[] = {RECOVER_TFTP_DOWNLOAD_CMD, RECOVER_DHCP_DOWNLOAD_CMD, NULL}; + int status; + + status = 0; + + if (network_way >= NETWORK_UNKNOWN) { + status = 2; + goto reset_failed; + } + + // read kernel and ramdisk + ret = run_command(download_cmd[network_way], 0); + if (ret) { + status = 2; + goto reset_failed; + } + + // set bootargs env + ret = run_command(RECOVER_FRONT_BOOTARGS, 0); + if (ret) { + status = 3; + goto reset_failed; + }; + + // set bootargs env by loongson env + memset(cmdbuf, 0, 256); + sprintf(cmdbuf, "setenv bootargs ${bootargs} ins_way=tftp ins_target=%s u_ip=${ipaddr} u_sip=${serverip};", ins_target_set[install_target]); + ret = run_command(cmdbuf, 0); + if (ret) { + status = 3; + goto reset_failed; + } + + // boot kernel and ramdisk.gz + ret = run_command(RECOVER_START, 0); + if (ret) { + status = 3; + goto reset_failed; + } + return ret; + +reset_failed: + printf("##################################################################\n"); + if (status == 2) + printf("### Error download kernel or ramdisk.gz\n"); + printf("##################################################################\n"); + return ret; +} + static int do_recover_from_usb(void) { printf("Install System By USB .....\r\n"); @@ -146,13 +217,13 @@ static int do_recover_from_tftp(void) { // char cmd[]= "tftpboot ${loadaddr} uImage;tftpboot ${rd_start} ramdisk.gz;"RECOVER_DEFAULT_ENV""; printf("Install System By tftp .....\r\n"); - return run_recover_cmd(RECOVER_TFTP_DEFAULT); + return run_recover_cmd_for_network(NETWORK_TFTP); } static int do_recover_from_dhcp(void) { printf("Install System By dhcp .....\r\n"); - return run_recover_cmd(RECOVER_DHCP_DEFAULT); + return run_recover_cmd_for_network(NETWORK_DHCP); } #ifdef CONFIG_MMC @@ -177,6 +248,19 @@ static int do_recover_from_sata(char *part_id) #endif } +static int do_recover_from_mmc_r(char *part_id) +{ +#ifdef RECOVER_SATA_DEFAULT + printf("Recover System By SATA .....\r\n"); + return run_recover_cmd(RECOVER_SATA_DEFAULT); +#else + char cmd[CONFIG_SYS_CBSIZE] = {0}; + snprintf(cmd, sizeof(cmd), "ext4load mmc 0:%s ${loadaddr} uImage;ext4load mmc 0:%s ${rd_start} ramdisk.gz;%s setenv bootargs ${bootargs} rec_sys=1 rec_target=mmc; %s" + , part_id, part_id, RECOVER_FRONT_BOOTARGS, RECOVER_START); + return run_recover_cmd(cmd); +#endif +} + /* 上电时长按按钮3秒进入recover功能, recover优先顺序usb>mmc>sata 按键使用 LS_RECOVER_GPIO_BUTTON 定义的gpio */ int recover(void) @@ -207,71 +291,18 @@ int recover(void) #ifdef LS_DOUBLE_SYSTEM -static void do_recover_to_last_save_bdinfo(void) -{ - char *env; - char *env_buf; - - env = env_get("syspart"); - env_buf = env_get("syspart_last"); - bdinfo_set(BDI_ID_SYSPART, env); - bdinfo_set(BDI_ID_SYSPART_LAST, env_buf); - bdinfo_save(); -} - -static void do_recover_to_last_save_env_bdinfo(char* cur_syspart) -{ - if (!cur_syspart) - cur_syspart = "1"; - - if (!strcmp(cur_syspart, "1")) { - env_set("syspart", "4"); - env_set("syspart_last", "1"); - } else { - env_set("syspart", "1"); - env_set("syspart_last", "4"); - } - env_save(); - do_recover_to_last_save_bdinfo(); -} - -static int do_recover_to_last_handle_error(void) -{ - char *env; - char *env_last; - - env = env_get("syspart"); - env_last = env_get("syspart_last"); - - // 不相等证明没问题 - if (strcmp(env, env_last)) - return 1; - - do_recover_to_last_save_env_bdinfo(env); - return 0; -} - static int do_recover_to_last(void) { char *env; int ret; env = env_get("bootcmd"); - if (strstr(env, "scsi") == NULL) { + if (!strstr(env, "scsi") && !strstr(env, "mmc") ) { printf("current maybe is boot by nand\n"); return -1; } - // 没有发现异常 (syspart != syspart_last) - if (do_recover_to_last_handle_error()) { - //两个启动盘的情况 是 两个盘符之间的转换 - env = env_get("syspart"); - do_recover_to_last_save_env_bdinfo(env); - } - - ret = run_command(BOOT_SATA_DEFAULT, 0); - if (ret) - printf("recover last time system failed!\n"); + ret = switch_syspart(); return ret; } @@ -296,6 +327,16 @@ static int do_recover_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char * cons return ret; } + install_target = 0; + if (!argv[3]) + install_target = 0; + else { + if (!strcmp(argv[3], "scsi")) + install_target = 0; + else if (!strcmp(argv[3], "mmc")) + install_target = 1; + } + if (strcmp(argv[1], "usb") == 0) { ret = do_recover_from_usb(); } @@ -320,6 +361,16 @@ static int do_recover_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char * cons printf("part_id:%s\n", part_id); ret = do_recover_from_sata(part_id); } + else if (strcmp(argv[1], "mmc_r") == 0) { + char part_id[4] = "4"; + if (argc == 3) { + memset(part_id, 0, sizeof(part_id)); + int len = strlen(argv[2]) > sizeof(part_id) ? sizeof(part_id) : strlen(argv[2]); + strncpy(part_id, argv[2], len); + } + printf("part_id:%s\n", part_id); + ret = do_recover_from_mmc_r(part_id); + } #ifdef LS_DOUBLE_SYSTEM else if (strcmp(argv[1], "last") == 0) { ret = do_recover_to_last(); @@ -330,12 +381,12 @@ static int do_recover_cmd(struct cmd_tbl *cmdtp, int flag, int argc, char * cons } #define RECOVER_CMD_TIP_HEAD "recover system by usb or backup partition.\n"\ - "recover_cmd