[
  {
    "path": ".github/workflows/openwrt-rockchip.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n\nname: OpenWRT-snapshot\n\non:\n#  release:\n#    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/openwrt-rockchip.yml'\n      - 'step/01-prepare_package.sh'\n      - 'step/00-prepare_5.10.sh'\n      - 'seed/rockchip.seed'\n  schedule:\n    - cron: 35 20 * * 2,5\n  watch:\n    types: started\n\njobs:\n    openwrt-master:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@main\n\n      - name: Show CPU Model and Free Space\n        run: |\n          echo -e \"Total CPU cores\\t: $(nproc)\"\n          cat /proc/cpuinfo | grep 'model name'\n          free -h\n\n      - name: Set env\n        run: |\n          echo \"SSH_ACTIONS=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_BIN_DIR=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_FIRMWARE=true\" >> $GITHUB_ENV\n          echo \"UPLOAD_RELEASE=true\" >> $GITHUB_ENV\n          echo \"TZ=Asia/Shanghai\" >>$GITHUB_ENV\n          echo \"Build_Date=$(date +%Y.%m.%d)\" >> $GITHUB_ENV\n          \n      - name: Show env\n        run: echo $GITHUB_ENV\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo -E rm -rf /etc/apt/sources.list.d\n          sudo -E apt-get update -y\n          sudo -E apt-get install -y build-essential rsync asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python3 python3-pip python3-ply haveged lrzsz device-tree-compiler scons\n          wget -qO - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | sed 's/python-/python3-/g' | /bin/bash\n          sudo -E apt-get clean -y\n          git config --global user.name 'GitHub Actions' && git config --global user.email 'noreply@github.com'\n          df -h\n\n      - name: Install OpenWrt source\n        run: |\n          git clone -b master --single-branch https://git.openwrt.org/openwrt/openwrt.git openwrt\n\n      - name: Prepare openwrt\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 00-prepare_5.10.sh\n\n      - name: Prepare application packages\n        run: |\n          cd openwrt\n          /bin/bash 01-prepare_package.sh\n\n      - name: Add ACL\n        run: |\n          cd openwrt\n          /bin/bash 03-create_acl_for_luci.sh -a\n\n      - name: Load Multiple devices Config\n        run: |\n          cd openwrt\n          mv ../seed/rockchip.seed .config\n          make defconfig\n          cp .config  rockchip_multi.config\n\n#      - name: Download package\n#        id: package\n#        run: |\n#          cd openwrt\n#          make download -j10\n#          find dl -size -1024c -exec ls -l {} \\;\n#          find dl -size -1024c -exec rm -f {} \\;\n#\n#      - name: Make toolchain-aarch64\n#        id: compiletoolchain\n#        continue-on-error: true\n#        run: |\n#          cd openwrt\n#          let make_process=$(nproc)+1\n#          make toolchain/install -j${make_process} V=s\n\n#      - name: If toolchain Error\n#        if: steps.compiletoolchain.outcome == 'failure'\n#        run: |\n#          echo '================================================================'\n#          cd openwrt && make toolchain/install -j1 V=s\n\n\n      - name: Compile OpenWRT for R2S & R4S & R1 plus\n        id: compileopenwrt\n        continue-on-error: true\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: If compile openwrt Error\n        if: steps.compileopenwrt.outcome == 'failure'\n        run: |\n          cat openwrt/.config\n          echo '================================================================'\n          cd openwrt && make -j1 V=s\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/rockchip/armv8/*sysupgrade.img* ./artifact/\n          cd ./artifact/\n          ls -Ahl\n          gzip -d *.gz && exit 0\n          gzip *.img\n          sha256sum openwrt*r2s* | tee R2S-QC-$(date +%Y-%m-%d).sha256sum\n          sha256sum openwrt*r4s* | tee R4S-QC-$(date +%Y-%m-%d).sha256sum\n          sha256sum openwrt*r1-plus* | tee R1-plus-QC-$(date +%Y-%m-%d).sha256sum\n          ls -Ahl\n          zip R2S-QC-$(date +%Y-%m-%d)-snapshot.zip *r2s* R2S*.sha256sum\n          zip R4S-QC-$(date +%Y-%m-%d)-snapshot.zip *r4s* R4S*.sha256sum\n          zip R1-plus-QC-$(date +%Y-%m-%d)-snapshot.zip *r1-plus* R1-plus*.sha256sum        \n          cp ../openwrt/*.config ./\n          ls -Ahl\n\n      - name: Upload artifact master\n        uses: actions/upload-artifact@main\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWRT_NanoPi_firmware\n          path: ./artifact/*.zip\n\n\n      - name: Compile OpenWRT for kernel 5.14\n        id: compile514\n        run: |\n          cd openwrt\n          /bin/bash 04-k5.14.sh\n          mv ../seed/k514.seed .config\n          make defconfig\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: If compile openwrt 5.14 Error\n        if: steps.compile514.outcome == 'failure'\n        run: |\n          cat openwrt/.config\n          echo '================================================================'\n          cd openwrt && make -j1 V=s\n\n      - name: Organize k5.14 files\n        id: organize514\n        run: |\n          rm -rf ./artifact514/\n          mkdir -p ./artifact514/\n          mv openwrt/bin/targets/rockchip/armv8/*sysupgrade.img* ./artifact514/\n          cd ./artifact514/\n          ls -Ahl\n          gzip -d *.gz && exit 0\n          gzip *.img\n          sha256sum openwrt*r2s* | tee R2S-QC-k514.sha256sum\n          sha256sum openwrt*r4s* | tee R4S-QC-k514.sha256sum\n          sha256sum openwrt*r1-plus* | tee R1-plus-QC-k514.sha256sum\n          ls -Ahl\n          zip R2S-QC-$(date +%Y-%m-%d)-k514.zip *r2s* R2S*.sha256sum\n          zip R4S-QC-$(date +%Y-%m-%d)-k514.zip *r4s* R4S*.sha256sum\n          zip R1-plus-QC-$(date +%Y-%m-%d)-k514.zip *r1-plus* R1-plus*.sha256sum        \n          ls -Ahl\n\n      - name: Upload k5.14 firmware\n        uses: actions/upload-artifact@main\n        with:\n          name: openwrt kernel 5.14 firmware\n          path: ./artifact514/*.zip\n\n      - name: Create release for master\n        id: create_release\n        uses: ncipollo/release-action@v1.8.8\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWRT-rockchip-kernel 5.10 daily update\n          allowUpdates: true\n          tag: snapshot\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ./artifact/*.zip,./artifact/*.config\n\n    Cleanup-Old-Artifacts:\n      needs: [openwrt-master]\n      runs-on: ubuntu-18.04\n      steps:\n      - name: Cleanup Old Action Artifacts\n        uses: kolpav/purge-artifacts-action@v1\n        with:\n          token: ${{ github.token }}\n          expire-in: 14d\n    Cleanup-Workflow-Runs:\n      needs: Cleanup-Old-Artifacts\n      runs-on: ubuntu-18.04\n      steps:\n      - name: Cleanup Workflow Runs\n        uses: GitRML/delete-workflow-runs@v1.2.1\n        with:\n          token: ${{ github.token }}\n          repository: ${{ github.repository }}\n          retain_days: 14\n"
  },
  {
    "path": ".gitignore",
    "content": "\n*/.DS_Store\n.DS_Store\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 quintus\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "## OpenWrt for Rockchip rk3328/rk3399, include Nanopi R2S/R4S and OrangePi R1 plus \n#### ⚠ WARNING: USE IT UNDER YOUR OWN RISK. Non profit use only ⚠ \n[![OpenWRT-snapshot](https://github.com/quintus-lab/OpenWRT-Rockchip/actions/workflows/openwrt-rockchip.yml/badge.svg?branch=master)](https://github.com/quintus-lab/OpenWRT-Rockchip/actions/workflows/openwrt-rockchip.yml)\n[![OpenWRT-21.02](https://github.com/quintus-lab/OpenWRT-Rockchip/actions/workflows/openwrt-rockchip-2102.yml/badge.svg?branch=21.02)](https://github.com/quintus-lab/OpenWRT-Rockchip/actions/workflows/openwrt-rockchip-2102.yml)\n\n##### Download: [Releases](https://github.com/quintus-lab/OpenWRT-R2S-R4S/releases) or [Actions](https://github.com/quintus-lab/Openwrt-R2S-R4S/actions) \\(Login Needed\\)\n- - -\n## Introduction\n- ### Usage\n0. OpenWRT Official master source code + CTCGFW & Lean's packages code <br/>\n1. Default Management IP addr is [192.168.1.1](192.168.1.1), username: `root`  , no password<br/>\n Please setup the login password **as soon as possible** once you logined.\n2. Once you flashed the firmware into SD card, you may simply use \"Upgrade\" function<br/>\n in LuCI (no need to decompress the **.gz** archive) if you want to update it.\n3. Support USB LTE Hilink Dongle and USB Tethering. \n4. Can keeping configurations in upgrade is **suggested**, it's totally unnecessary to drop them.\n\n- ### Applications\n  AccessControl, ADbyby, CFDisk, DDNS, DiskMan, FRP, Gost, SpeedTest-CLI, SSRPlus, Socat, Stress-ng, Tmate, UPNP, Wake-On-LAN, WireGuard, ZeroTier etc.\n- - -\n\n### Thanks to Bigwigs:\n\n- [CN_SZTL](https://github.com/1715173329)\n- [QiuSimons](https://github.com/QiuSimons)\n- [CTCGFW](https://github.com/project-openwrt/openwrt)\n- [AmadeusGhost](https://github.com/AmadeusGhost)\n- [Lean](https://github.com/coolsnowwolf/lede)\n\n### License\n[MIT](https://github.com/quintus-lab/Openwrt-R2S-R4S/blob/master/LICENSE)\n\n🇹🇼🇨🇦🇺🇸🇭🇰\n\n\n#### Screenshot\n![R2S](pic/r2s.png)\n![R4S](pic/r4s.png)\n![R2S NAT Throughput](pic/NAT_Throughput.jpg)\n"
  },
  {
    "path": "body-origin.md",
    "content": "***OpenWRT master with Kernel 5.10 daily update***\nsupport: nanopi-r2s nanopi-r4s orangepi-r1-plus"
  },
  {
    "path": "not_use_file/0002-rockchip-rngd.patch",
    "content": "From a13fecb3fdaf3ed707400d6950dd8934304ba563 Mon Sep 17 00:00:00 2001\nFrom: CN_SZTL <cnsztl@project-openwrt.eu.org>\nDate: Sun, 29 Nov 2020 11:30:32 +0800\nSubject: [PATCH] rockchip: move hwRNG driver to files\n\n---\n .../drivers/char/hw_random/rockchip-rng.c     | 340 +++++++++++++++++\n 1 files changed, 340 insertions(+)\n create mode 100644 target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\n\ndiff --git a/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c b/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\nnew file mode 100644\nindex 0000000000..718762f996\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\n@@ -0,0 +1,340 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * rockchip-rng.c Random Number Generator driver for the Rockchip\n+ *\n+ * Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd.\n+ * Author: Lin Jinhan <troy.lin@rock-chips.com>\n+ *\n+ */\n+#include <linux/clk.h>\n+#include <linux/hw_random.h>\n+#include <linux/iopoll.h>\n+#include <linux/module.h>\n+#include <linux/mod_devicetable.h>\n+#include <linux/of.h>\n+#include <linux/platform_device.h>\n+#include <linux/pm_runtime.h>\n+\n+#define _SBF(s, v)\t((v) << (s))\n+#define HIWORD_UPDATE(val, mask, shift) \\\n+\t\t\t((val) << (shift) | (mask) << ((shift) + 16))\n+\n+#define ROCKCHIP_AUTOSUSPEND_DELAY\t\t100\n+#define ROCKCHIP_POLL_PERIOD_US\t\t\t100\n+#define ROCKCHIP_POLL_TIMEOUT_US\t\t10000\n+#define RK_MAX_RNG_BYTE\t\t\t\t(32)\n+\n+/* start of CRYPTO V1 register define */\n+#define CRYPTO_V1_CTRL\t\t\t\t0x0008\n+#define CRYPTO_V1_RNG_START\t\t\tBIT(8)\n+#define CRYPTO_V1_RNG_FLUSH\t\t\tBIT(9)\n+\n+#define CRYPTO_V1_TRNG_CTRL\t\t\t0x0200\n+#define CRYPTO_V1_OSC_ENABLE\t\t\tBIT(16)\n+#define CRYPTO_V1_TRNG_SAMPLE_PERIOD(x)\t\t(x)\n+\n+#define CRYPTO_V1_TRNG_DOUT_0\t\t\t0x0204\n+/* end of CRYPTO V1 register define */\n+\n+/* start of CRYPTO V2 register define */\n+#define CRYPTO_V2_RNG_CTL\t\t\t0x0400\n+#define CRYPTO_V2_RNG_64_BIT_LEN\t\t_SBF(4, 0x00)\n+#define CRYPTO_V2_RNG_128_BIT_LEN\t\t_SBF(4, 0x01)\n+#define CRYPTO_V2_RNG_192_BIT_LEN\t\t_SBF(4, 0x02)\n+#define CRYPTO_V2_RNG_256_BIT_LEN\t\t_SBF(4, 0x03)\n+#define CRYPTO_V2_RNG_FATESY_SOC_RING\t\t_SBF(2, 0x00)\n+#define CRYPTO_V2_RNG_SLOWER_SOC_RING_0\t\t_SBF(2, 0x01)\n+#define CRYPTO_V2_RNG_SLOWER_SOC_RING_1\t\t_SBF(2, 0x02)\n+#define CRYPTO_V2_RNG_SLOWEST_SOC_RING\t\t_SBF(2, 0x03)\n+#define CRYPTO_V2_RNG_ENABLE\t\t\tBIT(1)\n+#define CRYPTO_V2_RNG_START\t\t\tBIT(0)\n+#define CRYPTO_V2_RNG_SAMPLE_CNT\t\t0x0404\n+#define CRYPTO_V2_RNG_DOUT_0\t\t\t0x0410\n+/* end of CRYPTO V2 register define */\n+\n+struct rk_rng_soc_data {\n+\tconst char * const *clks;\n+\tint clks_num;\n+\tint (*rk_rng_read)(struct hwrng *rng, void *buf, size_t max, bool wait);\n+};\n+\n+struct rk_rng {\n+\tstruct device\t\t*dev;\n+\tstruct hwrng\t\trng;\n+\tvoid __iomem\t\t*mem;\n+\tstruct rk_rng_soc_data\t*soc_data;\n+\tu32\t\t\tclk_num;\n+\tstruct clk_bulk_data\t*clk_bulks;\n+};\n+\n+static const char * const rk_rng_v1_clks[] = {\n+\t\"hclk_crypto\",\n+\t\"clk_crypto\",\n+};\n+\n+static const char * const rk_rng_v2_clks[] = {\n+\t\"hclk_crypto\",\n+\t\"aclk_crypto\",\n+\t\"clk_crypto\",\n+\t\"clk_crypto_apk\",\n+};\n+\n+static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset)\n+{\n+\t__raw_writel(val, rng->mem + offset);\n+}\n+\n+static u32 rk_rng_readl(struct rk_rng *rng, u32 offset)\n+{\n+\treturn __raw_readl(rng->mem + offset);\n+}\n+\n+static int rk_rng_init(struct hwrng *rng)\n+{\n+\tint ret;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tdev_dbg(rk_rng->dev, \"clk_bulk_prepare_enable.\\n\");\n+\n+\tret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks);\n+\tif (ret < 0) {\n+\t\tdev_err(rk_rng->dev, \"failed to enable clks %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void rk_rng_cleanup(struct hwrng *rng)\n+{\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tdev_dbg(rk_rng->dev, \"clk_bulk_disable_unprepare.\\n\");\n+\tclk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks);\n+}\n+\n+static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf,\n+\t\t\t     size_t size)\n+{\n+\tu32 i;\n+\n+\tfor (i = 0; i < size; i += 4)\n+\t\t*(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));\n+}\n+\n+static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n+{\n+\tint ret = 0;\n+\tu32 reg_ctrl = 0;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tret = pm_runtime_get_sync(rk_rng->dev);\n+\tif (ret < 0) {\n+\t\tpm_runtime_put_noidle(rk_rng->dev);\n+\t\treturn ret;\n+\t}\n+\n+\t/* enable osc_ring to get entropy, sample period is set as 100 */\n+\treg_ctrl = CRYPTO_V1_OSC_ENABLE | CRYPTO_V1_TRNG_SAMPLE_PERIOD(100);\n+\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_TRNG_CTRL);\n+\n+\treg_ctrl = HIWORD_UPDATE(CRYPTO_V1_RNG_START, CRYPTO_V1_RNG_START, 0);\n+\n+\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_CTRL);\n+\n+\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V1_CTRL, reg_ctrl,\n+\t\t\t\t !(reg_ctrl & CRYPTO_V1_RNG_START),\n+\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n+\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n+\tif (ret < 0)\n+\t\tgoto out;\n+\n+\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n+\n+\trk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret);\n+\n+out:\n+\t/* close TRNG */\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, CRYPTO_V1_RNG_START, 0),\n+\t\t      CRYPTO_V1_CTRL);\n+\n+\tpm_runtime_mark_last_busy(rk_rng->dev);\n+\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n+\n+\treturn ret;\n+}\n+\n+static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n+{\n+\tint ret = 0;\n+\tu32 reg_ctrl = 0;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tret = pm_runtime_get_sync(rk_rng->dev);\n+\tif (ret < 0) {\n+\t\tpm_runtime_put_noidle(rk_rng->dev);\n+\t\treturn ret;\n+\t}\n+\n+\t/* enable osc_ring to get entropy, sample period is set as 100 */\n+\trk_rng_writel(rk_rng, 100, CRYPTO_V2_RNG_SAMPLE_CNT);\n+\n+\treg_ctrl |= CRYPTO_V2_RNG_256_BIT_LEN;\n+\treg_ctrl |= CRYPTO_V2_RNG_SLOWER_SOC_RING_0;\n+\treg_ctrl |= CRYPTO_V2_RNG_ENABLE;\n+\treg_ctrl |= CRYPTO_V2_RNG_START;\n+\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0),\n+\t\t\tCRYPTO_V2_RNG_CTL);\n+\n+\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V2_RNG_CTL, reg_ctrl,\n+\t\t\t\t !(reg_ctrl & CRYPTO_V2_RNG_START),\n+\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n+\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n+\tif (ret < 0)\n+\t\tgoto out;\n+\n+\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n+\n+\trk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret);\n+\n+out:\n+\t/* close TRNG */\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), CRYPTO_V2_RNG_CTL);\n+\n+\tpm_runtime_mark_last_busy(rk_rng->dev);\n+\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n+\n+\treturn ret;\n+}\n+\n+static const struct rk_rng_soc_data rk_rng_v1_soc_data = {\n+\t.clks_num = ARRAY_SIZE(rk_rng_v1_clks),\n+\t.clks = rk_rng_v1_clks,\n+\t.rk_rng_read = rk_rng_v1_read,\n+};\n+\n+static const struct rk_rng_soc_data rk_rng_v2_soc_data = {\n+\t.clks_num = ARRAY_SIZE(rk_rng_v2_clks),\n+\t.clks = rk_rng_v2_clks,\n+\t.rk_rng_read = rk_rng_v2_read,\n+};\n+\n+static const struct of_device_id rk_rng_dt_match[] = {\n+\t{\n+\t\t.compatible = \"rockchip,cryptov1-rng\",\n+\t\t.data = (void *)&rk_rng_v1_soc_data,\n+\t},\n+\t{\n+\t\t.compatible = \"rockchip,cryptov2-rng\",\n+\t\t.data = (void *)&rk_rng_v2_soc_data,\n+\t},\n+\t{ },\n+};\n+\n+MODULE_DEVICE_TABLE(of, rk_rng_dt_match);\n+\n+static int rk_rng_probe(struct platform_device *pdev)\n+{\n+\tint i;\n+\tint ret;\n+\tstruct rk_rng *rk_rng;\n+\tstruct device_node *np = pdev->dev.of_node;\n+\tconst struct of_device_id *match;\n+\n+\tdev_dbg(&pdev->dev, \"probing...\\n\");\n+\trk_rng = devm_kzalloc(&pdev->dev, sizeof(struct rk_rng), GFP_KERNEL);\n+\tif (!rk_rng)\n+\t\treturn -ENOMEM;\n+\n+\tmatch = of_match_node(rk_rng_dt_match, np);\n+\trk_rng->soc_data = (struct rk_rng_soc_data *)match->data;\n+\n+\trk_rng->dev = &pdev->dev;\n+\trk_rng->rng.name    = \"rockchip\";\n+#ifndef CONFIG_PM\n+\trk_rng->rng.init    = rk_rng_init;\n+\trk_rng->rng.cleanup = rk_rng_cleanup,\n+#endif\n+\trk_rng->rng.read    = rk_rng->soc_data->rk_rng_read;\n+\trk_rng->rng.quality = 1000;\n+\n+\trk_rng->clk_bulks =\n+\t\tdevm_kzalloc(&pdev->dev, sizeof(*rk_rng->clk_bulks) *\n+\t\t\t     rk_rng->soc_data->clks_num, GFP_KERNEL);\n+\n+\trk_rng->clk_num = rk_rng->soc_data->clks_num;\n+\n+\tfor (i = 0; i < rk_rng->soc_data->clks_num; i++)\n+\t\trk_rng->clk_bulks[i].id = rk_rng->soc_data->clks[i];\n+\n+\trk_rng->mem = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL);\n+\tif (IS_ERR(rk_rng->mem))\n+\t\treturn PTR_ERR(rk_rng->mem);\n+\n+\tret = devm_clk_bulk_get(&pdev->dev, rk_rng->clk_num,\n+\t\t\t\trk_rng->clk_bulks);\n+\tif (ret) {\n+\t\tdev_err(&pdev->dev, \"failed to get clks property\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tplatform_set_drvdata(pdev, rk_rng);\n+\n+\tpm_runtime_set_autosuspend_delay(&pdev->dev,\n+\t\t\t\t\tROCKCHIP_AUTOSUSPEND_DELAY);\n+\tpm_runtime_use_autosuspend(&pdev->dev);\n+\tpm_runtime_enable(&pdev->dev);\n+\n+\tret = devm_hwrng_register(&pdev->dev, &rk_rng->rng);\n+\tif (ret) {\n+\t\tpm_runtime_dont_use_autosuspend(&pdev->dev);\n+\t\tpm_runtime_disable(&pdev->dev);\n+\t}\n+\n+\treturn ret;\n+}\n+\n+#ifdef CONFIG_PM\n+static int rk_rng_runtime_suspend(struct device *dev)\n+{\n+\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n+\n+\trk_rng_cleanup(&rk_rng->rng);\n+\n+\treturn 0;\n+}\n+\n+static int rk_rng_runtime_resume(struct device *dev)\n+{\n+\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n+\n+\treturn rk_rng_init(&rk_rng->rng);\n+}\n+\n+static const struct dev_pm_ops rk_rng_pm_ops = {\n+\tSET_RUNTIME_PM_OPS(rk_rng_runtime_suspend,\n+\t\t\t\trk_rng_runtime_resume, NULL)\n+\tSET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,\n+\t\t\t\tpm_runtime_force_resume)\n+};\n+\n+#endif\n+\n+static struct platform_driver rk_rng_driver = {\n+\t.driver\t= {\n+\t\t.name\t= \"rockchip-rng\",\n+#ifdef CONFIG_PM\n+\t\t.pm\t= &rk_rng_pm_ops,\n+#endif\n+\t\t.of_match_table = rk_rng_dt_match,\n+\t},\n+\t.probe\t= rk_rng_probe,\n+};\n+\n+module_platform_driver(rk_rng_driver);\n+\n+MODULE_DESCRIPTION(\"ROCKCHIP H/W Random Number Generator driver\");\n+MODULE_AUTHOR(\"Lin Jinhan <troy.lin@rock-chips.com>\");\n+MODULE_LICENSE(\"GPL v2\");\n+\n"
  },
  {
    "path": "not_use_file/0003-add_rockchip_k510_support.patch",
    "content": "From 6ecff10072972d26d4b63c007516d4b8cd0cb07d Thu Mar 4 5:25:25 2021\nFrom: quintus-lab<noreply@github.com>\nDate: Thu, 4 Mar 2021 17:25:25 +0800\nSubject: [PATCH] add_rockchip_k5.10_support \t\n\nHardware\n--------\nRockChip RK3399 ARM64 (6 cores)\n1GB DDR3 or 4GB LPDDR4 RAM\n2x 1000 Base-T\n3 LEDs (LAN / WAN / SYS)\n1 Button (Reset)\nMicro-SD slot\n2x USB 3.0 Port\n\nInstallation\n------------\nUncompress the OpenWrt sysupgrade and write it to a micro SD card using dd.\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\nCo-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\nSigned-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\nCo-authored-by: Marty Jones <mj8263788@gmail.com>\nSigned-off-by: Marty Jones <mj8263788@gmail.com>\n--------\nmodified:   package/boot/uboot-rockchip/Makefile \t\nnew file:   package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\nnew file:   package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\nnew file:   package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file:   target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file:   target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nmodified:   target/linux/rockchip/Makefile \t\nmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/01_leds \t\nmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/02_network \t\nmodified:   target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity \nmodified:   target/linux/rockchip/armv8/config-5.10 \t\nmodified:   target/linux/rockchip/image/armv8.mk \t\nnew file:   target/linux/rockchip/image/nanopi-r4s.bootscript \t\nnew file:   target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nnew file:   target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file:   target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file:   target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file:   target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file:   target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file:   target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file:   target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n\n---\n package/boot/uboot-rockchip/Makefile          |  11 +\n ...split-nanopi-r4-rk3399-out-of-evb_rk.patch | 509 ++++++++++++++++++\n ...9-Add-support-for-multiple-DDR-types.patch | 256 +++++++++\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 313 +++++++++++\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |  38 ++\n ...k-events-support-multiple-registrant.patch | 291 ++++++++++\n target/linux/rockchip/Makefile                |   2 +-\n .../armv8/base-files/etc/board.d/01_leds      |   3 +-\n .../armv8/base-files/etc/board.d/02_network   |  12 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   4 +\n target/linux/rockchip/armv8/config-5.10       |   4 +\n target/linux/rockchip/image/armv8.mk          |  10 +\n .../rockchip/image/nanopi-r4s.bootscript      |   8 +\n ...add-compatible-to-NanoPi-R2S-etherne.patch |  25 +\n ...-initial-signal-voltage-on-power-off.patch |  35 ++\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 218 ++++++++\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 +\n ...-for-rockchip-hardware-random-number.patch |  45 ++\n ...ip-add-hardware-random-number-genera.patch |  50 ++\n ...adjust-default-coherent_pool-to-2MiB.patch |  28 +\n ...ip-add-more-cpu-operating-points-for.patch |  44 ++\n ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 186 +++++++\n 22 files changed, 2107 insertions(+), 7 deletions(-)\n create mode 100644 package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n create mode 100644 package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n create mode 100644 package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/rockchip/image/nanopi-r4s.bootscript\n create mode 100644 target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n create mode 100644 target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n create mode 100644 target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n create mode 100644 target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n create mode 100644 target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n create mode 100644 target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n create mode 100644 target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 393e8c3a9f..6253679834 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -38,6 +38,16 @@ endef\n \n # RK3399 boards\n \n+define U-Boot/nanopi-r4s-rk3399\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=NanoPi R4S\n+  BUILD_DEVICES:= \\\n+    friendlyarm_nanopi-r4s\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n+  ATF:=rk3399_bl31.elf\n+endef\n+\n define U-Boot/rock-pi-4-rk3399\n   BUILD_SUBTARGET:=armv8\n   NAME:=Rock Pi 4\n@@ -59,6 +69,7 @@ define U-Boot/rockpro64-rk3399\n endef\n \n UBOOT_TARGETS := \\\n+  nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n   nanopi-r2s-rk3328\ndiff --git a/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\nnew file mode 100644\nindex 0000000000..d8a118dd2e\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n@@ -0,0 +1,509 @@\n+From a765bb2678b6d1666caafef0fcf88fba88b5b26f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Fri, 18 Dec 2020 17:10:35 +0800\n+Subject: [PATCH] rockchip: rk3399: split nanopi-r4-rk3399 out of evb_rk3399\n+\n+nanopi-r4-rk3399 board has multiple DDR types. Currently we don't have any code\n+are compatible with these devices. Since multiple DDR types is specific to\n+nanopi-r4-rk3399 board, split it into its own board file and add code\n+support here.\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[Improved commit message and Kconfig description]\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm/mach-rockchip/rk3399/Kconfig |  15 +++\n+ board/friendlyarm/nanopi4/Kconfig     |  15 +++\n+ board/friendlyarm/nanopi4/MAINTAINERS |   5 +\n+ board/friendlyarm/nanopi4/Makefile    |   8 ++\n+ board/friendlyarm/nanopi4/hwrev.c     | 185 ++++++++++++++++++++++++++\n+ board/friendlyarm/nanopi4/hwrev.h     |  27 ++++\n+ board/friendlyarm/nanopi4/nanopi4.c   | 148 +++++++++++++++++++++\n+ drivers/clk/rockchip/clk_rk3399.c     |   2 +\n+ include/configs/nanopi4.h             |  24 ++++\n+ 9 files changed, 429 insertions(+)\n+ create mode 100644 board/friendlyarm/nanopi4/Kconfig\n+ create mode 100644 board/friendlyarm/nanopi4/MAINTAINERS\n+ create mode 100644 board/friendlyarm/nanopi4/Makefile\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.c\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.h\n+ create mode 100644 board/friendlyarm/nanopi4/nanopi4.c\n+ create mode 100644 include/configs/nanopi4.h\n+\n+--- a/arch/arm/mach-rockchip/rk3399/Kconfig\n++++ b/arch/arm/mach-rockchip/rk3399/Kconfig\n+@@ -109,6 +109,20 @@ config TARGET_ROC_PC_RK3399\n+ \t   * wide voltage input(5V-15V), dual cell battery\n+ \t   * Wifi/BT accessible via expansion board M.2\n+ \n++config TARGET_NANOPI4_RK3399\n++\tbool \"FriendlyElec NanoPi4 board\"\n++\thelp\n++\t  NanoPi4 is SBC produced by FriendlyElec. Key features:\n++\n++\t   * Rockchip RK3399\n++\t   * 1/2/4GB Dual-Channel DDR3/LPDDR4\n++\t   * SD card slot\n++\t   * Gigabit ethernet\n++\t   * PCIe\n++\t   * USB 3.0, 2.0\n++\t   * USB Type C power\n++\t   * GPIO expansion ports\n++\n+ endchoice\n+ \n+ config ROCKCHIP_BOOT_MODE_REG\n+@@ -152,6 +166,7 @@ config SYS_BOOTCOUNT_ADDR\n+ endif # BOOTCOUNT_LIMIT\n+ \n+ source \"board/firefly/roc-pc-rk3399/Kconfig\"\n++source \"board/friendlyarm/nanopi4/Kconfig\"\n+ source \"board/google/gru/Kconfig\"\n+ source \"board/pine64/pinebook-pro-rk3399/Kconfig\"\n+ source \"board/pine64/rockpro64_rk3399/Kconfig\"\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Kconfig\n+@@ -0,0 +1,15 @@\n++if TARGET_NANOPI4_RK3399\n++\n++config SYS_BOARD\n++\tdefault \"nanopi4\"\n++\n++config SYS_VENDOR\n++\tdefault \"friendlyarm\"\n++\n++config SYS_CONFIG_NAME\n++\tdefault \"nanopi4\"\n++\n++config BOARD_SPECIFIC_OPTIONS\n++\tdef_bool y\n++\n++endif\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -0,0 +1,5 @@\n++NanoPi 4 Series\n++M:      FriendlyElec <support@friendlyarm.com>\n++S:      Maintained\n++F:      board/friendlyarm/nanopi4/\n++F:      include/configs/nanopi4.h\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Makefile\n+@@ -0,0 +1,8 @@\n++#\n++# Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++# (http://www.friendlyarm.com)\n++#\n++# SPDX-License-Identifier:     GPL-2.0+\n++#\n++\n++obj-y\t+= nanopi4.o hwrev.o\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.c\n+@@ -0,0 +1,185 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <linux/delay.h>\n++#include <log.h>\n++#include <asm/io.h>\n++#include <asm/gpio.h>\n++#include <asm/arch-rockchip/gpio.h>\n++\n++/*\n++ * ID info:\n++ *  ID : Volts : ADC value :   Bucket\n++ *  ==   =====   =========   ===========\n++ *   0 : 0.102V:        58 :    0 -   81\n++ *   1 : 0.211V:       120 :   82 -  150\n++ *   2 : 0.319V:       181 :  151 -  211\n++ *   3 : 0.427V:       242 :  212 -  274\n++ *   4 : 0.542V:       307 :  275 -  342\n++ *   5 : 0.666V:       378 :  343 -  411\n++ *   6 : 0.781V:       444 :  412 -  477\n++ *   7 : 0.900V:       511 :  478 -  545\n++ *   8 : 1.023V:       581 :  546 -  613\n++ *   9 : 1.137V:       646 :  614 -  675\n++ *  10 : 1.240V:       704 :  676 -  733\n++ *  11 : 1.343V:       763 :  734 -  795\n++ *  12 : 1.457V:       828 :  796 -  861\n++ *  13 : 1.576V:       895 :  862 -  925\n++ *  14 : 1.684V:       956 :  926 -  989\n++ *  15 : 1.800V:      1023 :  990 - 1023\n++ */\n++static const int id_readings[] = {\n++\t 81, 150, 211, 274, 342, 411, 477, 545,\n++\t613, 675, 733, 795, 861, 925, 989, 1023\n++};\n++\n++static int cached_board_id = -1;\n++\n++#define SARADC_BASE\t\t0xFF100000\n++#define SARADC_DATA\t\t(SARADC_BASE + 0)\n++#define SARADC_CTRL\t\t(SARADC_BASE + 8)\n++\n++static u32 get_saradc_value(int chn)\n++{\n++\tint timeout = 0;\n++\tu32 adc_value = 0;\n++\n++\twritel(0, SARADC_CTRL);\n++\tudelay(2);\n++\n++\twritel(0x28 | chn, SARADC_CTRL);\n++\tudelay(50);\n++\n++\ttimeout = 0;\n++\tdo {\n++\t\tif (readl(SARADC_CTRL) & 0x40) {\n++\t\t\tadc_value = readl(SARADC_DATA) & 0x3FF;\n++\t\t\tgoto stop_adc;\n++\t\t}\n++\n++\t\tudelay(10);\n++\t} while (timeout++ < 100);\n++\n++stop_adc:\n++\twritel(0, SARADC_CTRL);\n++\n++\treturn adc_value;\n++}\n++\n++static uint32_t get_adc_index(int chn)\n++{\n++\tint i;\n++\tint adc_reading;\n++\n++\tif (cached_board_id != -1)\n++\t\treturn cached_board_id;\n++\n++\tadc_reading = get_saradc_value(chn);\n++\tfor (i = 0; i < ARRAY_SIZE(id_readings); i++) {\n++\t\tif (adc_reading <= id_readings[i]) {\n++\t\t\tdebug(\"ADC reading %d, ID %d\\n\", adc_reading, i);\n++\t\t\tcached_board_id = i;\n++\t\t\treturn i;\n++\t\t}\n++\t}\n++\n++\t/* should die for impossible value */\n++\treturn 0;\n++}\n++\n++/*\n++ * Board revision list: <GPIO4_D1 | GPIO4_D0>\n++ *  0b00 - NanoPC-T4\n++ *  0b01 - NanoPi M4\n++ *\n++ * Extended by ADC_IN4\n++ * Group A:\n++ *  0x04 - NanoPi NEO4\n++ *  0x06 - SOC-RK3399\n++ *  0x07 - SOC-RK3399 V2\n++ *  0x09 - NanoPi R4S 1GB\n++ *  0x0A - NanoPi R4S 4GB\n++ *\n++ * Group B:\n++ *  0x21 - NanoPi M4 Ver2.0\n++ *  0x22 - NanoPi M4B\n++ */\n++static int pcb_rev = -1;\n++\n++void bd_hwrev_init(void)\n++{\n++#define GPIO4_BASE\t0xff790000\n++\tstruct rockchip_gpio_regs *regs = (void *)GPIO4_BASE;\n++\n++#ifdef CONFIG_SPL_BUILD\n++\tstruct udevice *dev;\n++\n++\tif (uclass_get_device_by_driver(UCLASS_CLK,\n++\t\t\t\tDM_GET_DRIVER(clk_rk3399), &dev))\n++\t\treturn;\n++#endif\n++\n++\tif (pcb_rev >= 0)\n++\t\treturn;\n++\n++\t/* D1, D0: input mode */\n++\tclrbits_le32(&regs->swport_ddr, (0x3 << 24));\n++\tpcb_rev = (readl(&regs->ext_port) >> 24) & 0x3;\n++\n++\tif (pcb_rev == 0x3) {\n++\t\t/* Revision group A: 0x04 ~ 0x13 */\n++\t\tpcb_rev = 0x4 + get_adc_index(4);\n++\n++\t} else if (pcb_rev == 0x1) {\n++\t\tint idx = get_adc_index(4);\n++\n++\t\t/* Revision group B: 0x21 ~ 0x2f */\n++\t\tif (idx > 0) {\n++\t\t\tpcb_rev = 0x20 + idx;\n++\t\t}\n++\t}\n++}\n++\n++#ifdef CONFIG_SPL_BUILD\n++static struct board_ddrtype {\n++\tint rev;\n++\tconst char *type;\n++} ddrtypes[] = {\n++\t{ 0x00, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x01, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x04,   \"ddr3-1866\" },\n++\t{ 0x06,   \"ddr3-1866\" },\n++\t{ 0x07, \"lpddr4-100\"  },\n++\t{ 0x09,   \"ddr3-1866\" },\n++\t{ 0x0a, \"lpddr4-100\"  },\n++\t{ 0x21, \"lpddr4-100\"  },\n++\t{ 0x22,   \"ddr3-1866\" },\n++};\n++\n++const char *rk3399_get_ddrtype(void) {\n++\tint i;\n++\n++\tbd_hwrev_init();\n++\tprintf(\"Board: rev%02x\\n\", pcb_rev);\n++\n++\tfor (i = 0; i < ARRAY_SIZE(ddrtypes); i++) {\n++\t\tif (ddrtypes[i].rev == pcb_rev)\n++\t\t\treturn ddrtypes[i].type;\n++\t}\n++\n++\t/* fallback to first subnode (ie, first included dtsi) */\n++\treturn NULL;\n++}\n++#endif\n++\n++/* To override __weak symbols */\n++u32 get_board_rev(void)\n++{\n++\treturn pcb_rev;\n++}\n++\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.h\n+@@ -0,0 +1,27 @@\n++/*\n++ * Copyright (C) Guangzhou FriendlyARM Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * This program is free software; you can redistribute it and/or\n++ * modify it under the terms of the GNU General Public License\n++ * as published by the Free Software Foundation; either version 2\n++ * of the License, or (at your option) any later version.\n++ *\n++ * This program is distributed in the hope that it will be useful,\n++ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n++ * GNU General Public License for more details.\n++ *\n++ * You should have received a copy of the GNU General Public License\n++ * along with this program; if not, you can access it online at\n++ * http://www.gnu.org/licenses/gpl-2.0.html.\n++ */\n++\n++#ifndef __BD_HW_REV_H__\n++#define __BD_HW_REV_H__\n++\n++extern void bd_hwrev_config_gpio(void);\n++extern void bd_hwrev_init(void);\n++extern u32 get_board_rev(void);\n++\n++#endif /* __BD_HW_REV_H__ */\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/nanopi4.c\n+@@ -0,0 +1,148 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <env.h>\n++#include <hash.h>\n++#include <linux/bitops.h>\n++#include <i2c.h>\n++#include <init.h>\n++#include <net.h>\n++#include <netdev.h>\n++#include <syscon.h>\n++#include <asm/arch-rockchip/bootrom.h>\n++#include <asm/arch-rockchip/clock.h>\n++#include <asm/arch-rockchip/grf_rk3399.h>\n++#include <asm/arch-rockchip/hardware.h>\n++#include <asm/arch-rockchip/misc.h>\n++#include <asm/io.h>\n++#include <asm/setup.h>\n++#include <u-boot/sha256.h>\n++\n++#ifdef CONFIG_MISC_INIT_R\n++static void setup_iodomain(void)\n++{\n++\tstruct rk3399_grf_regs *grf =\n++\t    syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n++\n++\t/* BT565 and AUDIO is in 1.8v domain */\n++\trk_setreg(&grf->io_vsel, BIT(0) | BIT(1));\n++}\n++\n++static int __maybe_unused mac_read_from_generic_eeprom(u8 *addr)\n++{\n++\tstruct udevice *i2c_dev;\n++\tint ret;\n++\n++\t/* Microchip 24AA02xxx EEPROMs with EUI-48 Node Identity */\n++\tret = i2c_get_chip_for_busnum(2, 0x51, 1, &i2c_dev);\n++\tif (!ret)\n++\t\tret = dm_i2c_read(i2c_dev, 0xfa, addr, 6);\n++\n++\treturn ret;\n++}\n++\n++static void setup_macaddr(void)\n++{\n++#if CONFIG_IS_ENABLED(CMD_NET)\n++\tint ret;\n++\tconst char *cpuid = env_get(\"cpuid#\");\n++\tu8 hash[SHA256_SUM_LEN];\n++\tint size = sizeof(hash);\n++\tu8 mac_addr[6];\n++\tint from_eeprom = 0;\n++\tint lockdown = 0;\n++\n++#ifndef CONFIG_ENV_IS_NOWHERE\n++\tlockdown = env_get_yesno(\"lockdown\") == 1;\n++#endif\n++\tif (lockdown && env_get(\"ethaddr\"))\n++\t\treturn;\n++\n++\tret = mac_read_from_generic_eeprom(mac_addr);\n++\tif (!ret && is_valid_ethaddr(mac_addr)) {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\t\tfrom_eeprom = 1;\n++\t}\n++\n++\tif (!cpuid) {\n++\t\tdebug(\"%s: could not retrieve 'cpuid#'\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\tret = hash_block(\"sha256\", (void *)cpuid, strlen(cpuid), hash, &size);\n++\tif (ret) {\n++\t\tdebug(\"%s: failed to calculate SHA256\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\t/* Copy 6 bytes of the hash to base the MAC address on */\n++\tmemcpy(mac_addr, hash, 6);\n++\n++\t/* Make this a valid MAC address and set it */\n++\tmac_addr[0] &= 0xfe;  /* clear multicast bit */\n++\tmac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */\n++\n++\tif (from_eeprom) {\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t} else {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\n++\t\tif (lockdown && env_get(\"eth1addr\"))\n++\t\t\treturn;\n++\n++\t\t/* Ugly, copy another 4 bytes to generate a similar address */\n++\t\tmemcpy(mac_addr + 2, hash + 8, 4);\n++\t\tif (!memcmp(hash + 2, hash + 8, 4))\n++\t\t\tmac_addr[5] ^= 0xff;\n++\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t}\n++#endif\n++\n++\treturn;\n++}\n++\n++int misc_init_r(void)\n++{\n++\tconst u32 cpuid_offset = 0x7;\n++\tconst u32 cpuid_length = 0x10;\n++\tu8 cpuid[cpuid_length];\n++\tint ret;\n++\n++\tsetup_iodomain();\n++\n++\tret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = rockchip_cpuid_set(cpuid, cpuid_length);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tsetup_macaddr();\n++\tbd_hwrev_init();\n++\n++\treturn 0;\n++}\n++#endif\n++\n++#ifdef CONFIG_SERIAL_TAG\n++void get_board_serial(struct tag_serialnr *serialnr)\n++{\n++\tchar *serial_string;\n++\tu64 serial = 0;\n++\n++\tserial_string = env_get(\"serial#\");\n++\n++\tif (serial_string)\n++\t\tserial = simple_strtoull(serial_string, NULL, 16);\n++\n++\tserialnr->high = (u32)(serial >> 32);\n++\tserialnr->low = (u32)(serial & 0xffffffff);\n++}\n++#endif\n+diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c\n+index 22c373a623..38975c0c65 100644\n+--- a/drivers/clk/rockchip/clk_rk3399.c\n++++ b/drivers/clk/rockchip/clk_rk3399.c\n+@@ -1351,6 +1351,8 @@ static void rkclk_init(struct rockchip_cru *cru)\n+ \t\t     pclk_div << PCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     hclk_div << HCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     HCLK_PERILP1_PLL_SEL_GPLL << HCLK_PERILP1_PLL_SEL_SHIFT);\n++\n++\trk3399_saradc_set_clk(cru, 1000000);\n+ }\n+ #endif\n+ \n+--- /dev/null\n++++ b/include/configs/nanopi4.h\n+@@ -0,0 +1,24 @@\n++/* SPDX-License-Identifier: GPL-2.0+ */\n++/*\n++ * Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * (C) Copyright 2016 Rockchip Electronics Co., Ltd\n++ */\n++\n++#ifndef __CONFIG_NANOPI4_H__\n++#define __CONFIG_NANOPI4_H__\n++\n++#define ROCKCHIP_DEVICE_SETTINGS \\\n++\t\t\"stdin=serial,usbkbd\\0\" \\\n++\t\t\"stdout=serial,vidconsole\\0\" \\\n++\t\t\"stderr=serial,vidconsole\\0\"\n++\n++#include <configs/rk3399_common.h>\n++\n++#define SDRAM_BANK_SIZE\t\t\t(2UL << 30)\n++\n++#define CONFIG_SERIAL_TAG\n++#define CONFIG_REVISION_TAG\n++\n++#endif\ndiff --git a/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\nnew file mode 100644\nindex 0000000000..b624bcc763\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n@@ -0,0 +1,256 @@\n+From a9447b7b60a3c5195d0fabbe5aa9c32d047ec997 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Sat, 19 Dec 2020 19:39:14 +0800\n+Subject: [PATCH] ram: rk3399: Add support for multiple DDR types\n+\n+Move rockchip,sdram-params to named subnode to include\n+multiple sdram parameters, and then read the parameters\n+(by subnode name, first subnode or current node) before\n+rk3399_dmc_init().\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi      |  6 ++-\n+ arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi      |  5 +-\n+ arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi      |  6 ++-\n+ .../arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi |  3 ++\n+ .../arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi |  3 ++\n+ .../rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi |  3 ++\n+ arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi     |  3 ++\n+ drivers/ram/rockchip/sdram_rk3399.c           | 49 +++++++++++++++----\n+ 8 files changed, 64 insertions(+), 14 deletions(-)\n+\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1333 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1600 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1866 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n+@@ -5,6 +5,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-2GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+@@ -1537,4 +1539,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-4GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-samsung-4GB-1866 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1543,4 +1545,5 @@\n+ \t\t0x01010000\t/* DENALI_PHY_957_DATA */\n+ \t\t0x00000000\t/* DENALI_PHY_958_DATA */\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n+@@ -6,6 +6,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr4-100 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1538,4 +1540,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/drivers/ram/rockchip/sdram_rk3399.c\n++++ b/drivers/ram/rockchip/sdram_rk3399.c\n+@@ -1625,7 +1625,6 @@ static void set_ddr_stride(struct rk3399_pmusgrf_regs *pmusgrf, u32 stride)\n+ \trk_clrsetreg(&pmusgrf->soc_con4, 0x1f << 10, stride << 10);\n+ }\n+ \n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank,\n+ \t\t\t       struct rk3399_sdram_params *params)\n+ {\n+@@ -1715,8 +1714,8 @@ void modify_param(const struct chan_info *chan,\n+ \tclrsetbits_le32(&denali_pi_params[76], 0x1 << 24, 0x1 << 24);\n+ \tclrsetbits_le32(&denali_pi_params[77], 0x1, 0x1);\n+ }\n+-#else\n+ \n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n+ struct rk3399_sdram_params dfs_cfgs_lpddr4[] = {\n+ #include \"sdram-rk3399-lpddr4-400.inc\"\n+ #include \"sdram-rk3399-lpddr4-800.inc\"\n+@@ -3011,20 +3010,40 @@ static int sdram_init(struct dram_info *dram,\n+ \treturn 0;\n+ }\n+ \n++__weak const char *rk3399_get_ddrtype(void)\n++{\n++\treturn NULL;\n++}\n++\n+ static int rk3399_dmc_ofdata_to_platdata(struct udevice *dev)\n+ {\n+ #if !CONFIG_IS_ENABLED(OF_PLATDATA)\n+ \tstruct rockchip_dmc_plat *plat = dev_get_platdata(dev);\n++\tofnode node = { .np = NULL };\n++\tconst char *name;\n+ \tint ret;\n+ \n+-\tret = dev_read_u32_array(dev, \"rockchip,sdram-params\",\n+-\t\t\t\t (u32 *)&plat->sdram_params,\n+-\t\t\t\t sizeof(plat->sdram_params) / sizeof(u32));\n++\tname = rk3399_get_ddrtype();\n++\tif (name)\n++\t\tnode = dev_read_subnode(dev, name);\n++\tif (!ofnode_valid(node)) {\n++\t\tdebug(\"Failed to read subnode %s\\n\", name);\n++\t\tnode = dev_read_first_subnode(dev);\n++\t}\n++\n++\t/* fallback to current node */\n++\tif (!ofnode_valid(node))\n++\t\tnode = dev_ofnode(dev);\n++\n++\tret = ofnode_read_u32_array(node, \"rockchip,sdram-params\",\n++\t\t\t\t    (u32 *)&plat->sdram_params,\n++\t\t\t\t    sizeof(plat->sdram_params) / sizeof(u32));\n+ \tif (ret) {\n+ \t\tprintf(\"%s: Cannot read rockchip,sdram-params %d\\n\",\n+ \t\t       __func__, ret);\n+ \t\treturn ret;\n+ \t}\n++\n+ \tret = regmap_init_mem(dev_ofnode(dev), &plat->map);\n+ \tif (ret)\n+ \t\tprintf(\"%s: regmap failed %d\\n\", __func__, ret);\n+@@ -3051,18 +3070,20 @@ static int conv_of_platdata(struct udevice *dev)\n+ #endif\n+ \n+ static const struct sdram_rk3399_ops rk3399_ops = {\n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ \t.data_training_first = data_training_first,\n+ \t.set_rate_index = switch_to_phy_index1,\n+ \t.modify_param = modify_param,\n+ \t.get_phy_index_params = get_phy_index_params,\n+-#else\n++};\n++\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++static const struct sdram_rk3399_ops lpddr4_ops = {\n+ \t.data_training_first = lpddr4_mr_detect,\n+ \t.set_rate_index = lpddr4_set_rate,\n+ \t.modify_param = lpddr4_modify_param,\n+ \t.get_phy_index_params = lpddr4_get_phy_index_params,\n+-#endif\n+ };\n++#endif\n+ \n+ static int rk3399_dmc_init(struct udevice *dev)\n+ {\n+@@ -3081,7 +3102,17 @@ static int rk3399_dmc_init(struct udevice *dev)\n+ \t\treturn ret;\n+ #endif\n+ \n+-\tpriv->ops = &rk3399_ops;\n++\tif (params->base.dramtype == LPDDR4) {\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++\t\tpriv->ops = &lpddr4_ops;\n++#else\n++\t\tprintf(\"LPDDR4 support is disable\\n\");\n++\t\treturn -EINVAL;\n++#endif\n++\t} else {\n++\t\tpriv->ops = &rk3399_ops;\n++\t}\n++\n+ \tpriv->cic = syscon_get_first_range(ROCKCHIP_SYSCON_CIC);\n+ \tpriv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n+ \tpriv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);\ndiff --git a/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..74c7c3f4a5\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,313 @@\n+From 8dc76bbce30c3f63f290f008f8410c00fee13c9a Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 05:55:50 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm/dts/Makefile                      |   1 +\n+ arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi |   9 ++\n+ arch/arm/dts/rk3399-nanopi-r4s.dts         | 178 +++++++++++++++++++++\n+ board/friendlyarm/nanopi4/MAINTAINERS      |   6 +\n+ configs/nanopi-r4s-rk3399_defconfig        |  63 ++++++++\n+ 5 files changed, 257 insertions(+)\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s.dts\n+ create mode 100644 configs/nanopi-r4s-rk3399_defconfig\n+\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -132,6 +132,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \\\n+ \trk3399-nanopi-m4.dtb \\\n+ \trk3399-nanopi-m4-2gb.dtb \\\n+ \trk3399-nanopi-neo4.dtb \\\n++\trk3399-nanopi-r4s.dtb \\\n+ \trk3399-orangepi.dtb \\\n+ \trk3399-pinebook-pro.dtb \\\n+ \trk3399-puma-haikou.dtb \\\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+@@ -0,0 +1,9 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * (C) Copyright 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ */\n++\n++#include \"rk3399-nanopi4-u-boot.dtsi\"\n++#include \"rk3399-sdram-lpddr4-100.dtsi\"\n++#include \"rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\"\n++#include \"rk3399-sdram-ddr3-1866.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\n+--- a/board/friendlyarm/nanopi4/MAINTAINERS\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -3,3 +3,9 @@ M:      FriendlyElec <support@friendlyarm.com>\n+ S:      Maintained\n+ F:      board/friendlyarm/nanopi4/\n+ F:      include/configs/nanopi4.h\n++\n++NANOPI-R4S\n++M:      Tianling Shen <cnsztl@gmail.com>\n++S:      Maintained\n++F:      configs/nanopi-r4s-rk3399_defconfig\n++F:      arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+--- /dev/null\n++++ b/configs/nanopi-r4s-rk3399_defconfig\n+@@ -0,0 +1,63 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3399=y\n++CONFIG_TARGET_NANOPI4_RK3399=y\n++CONFIG_DEBUG_UART_BASE=0xFF1A0000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3399-nanopi-r4s\"\n++CONFIG_DEBUG_UART=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3399-nanopi-r4s.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000\n++CONFIG_TPL=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_OF_SPL_REMOVE_PROPS=\"pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_SYS_MMC_ENV_DEV=1\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_MMC_SDHCI=y\n++CONFIG_MMC_SDHCI_ROCKCHIP=y\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM_RK3399_LPDDR4=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_KEYBOARD=y\n++CONFIG_USB_HOST_ETHER=y\n++CONFIG_USB_ETHER_ASIX=y\n++CONFIG_USB_ETHER_ASIX88179=y\n++CONFIG_USB_ETHER_MCS7830=y\n++CONFIG_USB_ETHER_RTL8152=y\n++CONFIG_USB_ETHER_SMSC95XX=y\n++CONFIG_DM_VIDEO=y\n++CONFIG_DISPLAY=y\n++CONFIG_VIDEO_ROCKCHIP=y\n++CONFIG_DISPLAY_ROCKCHIP_HDMI=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\ndiff --git a/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..70cfadca9c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -148,9 +148,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..2981c3d906\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2748,6 +2748,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3783,9 +3790,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex 7aeb0a3d55..f7b6995911 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk\n \n BOARD:=rockchip\n BOARDNAME:=Rockchip\n-FEATURES:=ext4 audio usb usbgadget display gpio fpu rootfs-part boot-part squashfs\n+FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n KERNEL_PATCHVER=5.4\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex bba3e2aa56..77655d426a 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -9,7 +9,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+friendlyarm,nanopi-r4s)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 48133c81a1..d8acaabe27 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -8,7 +8,8 @@ rockchip_setup_interfaces()\n \tlocal board=\"$1\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -17,9 +18,9 @@ rockchip_setup_interfaces()\n \tesac\n }\n \n-nanopi_r2s_generate_mac()\n+nanopi_generate_mac()\n {\n-\tlocal sd_hash=$(sha256sum /sys/devices/platform/ff500000.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n+\tlocal sd_hash=$(sha256sum /sys/devices/platform/*.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n \tlocal mac_base=$(macaddr_canonicalize \"$(echo \"${sd_hash}\" | dd bs=1 count=12 2>/dev/null)\")\n \techo \"$(macaddr_unsetbit_mc \"$(macaddr_setbit_la \"${mac_base}\")\")\"\n }\n@@ -32,8 +33,9 @@ rockchip_setup_macs()\n \tlocal label_mac=\"\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n-\t\twan_mac=$(nanopi_r2s_generate_mac)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n+\t\twan_mac=$(nanopi_generate_mac)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n \t\t;;\n \tesac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 44716258bf..9e4a4cf4fc 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -26,5 +26,9 @@ friendlyarm,nanopi-r2s)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tset_interface_core 10 \"eth0\"\n+\tset_interface_core 20 \"eth1\"\n+\t;;\n esac\n \ndiff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex eaef238c92..c29c76a345 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -162,6 +162,10 @@ CONFIG_CRYPTO_AEAD2=y\n CONFIG_CRYPTO_CRC32=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+# CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n CONFIG_CRYPTO_HASH=y\n CONFIG_CRYPTO_HASH2=y\n CONFIG_CRYPTO_MANAGER=y\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex 24b1c38137..23a29ccaac 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -12,6 +12,16 @@ define Device/friendlyarm_nanopi-r2s\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\n \n+define Device/friendlyarm_nanopi-r4s\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi R4S\n+  SOC := rk3399\n+  UBOOT_DEVICE_NAME := nanopi-r4s-rk3399\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-r8169 -urngd\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-r4s\n+\n define Device/pine64_rockpro64\n   DEVICE_VENDOR := Pine64\n   DEVICE_MODEL := RockPro64\ndiff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript\nnew file mode 100644\nindex 0000000000..abe9c24ee3\n--- /dev/null\n+++ b/target/linux/rockchip/image/nanopi-r4s.bootscript\n@@ -0,0 +1,8 @@\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\ndiff --git a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nnew file mode 100644\nindex 0000000000..897a42fea2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -134,6 +134,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..69c880db9f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,218 @@\n+From 11c2b38cf0a04b0edb3eabae24fb1484489725e2 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 07:12:30 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 178 ++++++++++++++++++\n+ 2 files changed, 179 insertions(+)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-le\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..28798047fd\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -165,6 +165,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..16ca6279e7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -398,6 +398,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..1de560e33f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -297,6 +297,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1906,6 +1906,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff --git a/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..f589ce2a7b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -192,13 +192,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..c85da5fb07\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tamba: bus {\ndiff --git a/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..9d393c5771\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,186 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,156 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1150000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++ \t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1300000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \tchosen {\n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0003-new_rk33xx_support_with_ARMv8_CE_k5.10.patch",
    "content": "From b569c89c51e21a9c4bc753e466e19aebde2b7b8b Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Wed, 28 Apr 2021 02:59:14 +0800\nSubject: [PATCH] new_rk33xx_support_with_ARMv8_CE_k5.10\n\n This introduces rockchip ddrloader firmware, which allows users to control the memory frequency\n runtime. This introduces rockchip ddrloader firmware, which allows users to control the memory frequency runtime.\n Signed-off-by: AmadeusGhost <amadeus@immortalwrt.org>\n Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n\n R4S support from:\n Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n Co-authored-by: Marty Jones <mj8263788@gmail.com>\n Signed-off-by: Marty Jones <mj8263788@gmail.com>\n\n \tnew file:   package/boot/arm-trusted-firmware-rk3328/Makefile\n \tnew file:   package/boot/arm-trusted-firmware-rk3328/src/trust.ini \t\n \tmodified:   package/boot/uboot-rockchip/Makefile \t\n \tnew file:   package/boot/uboot-rockchip/patches/102-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n \tnew file:   package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n \tnew file:   package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Kconfig \t\n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/MAINTAINERS\n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Makefile \t\n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.c  \n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.h\n \tnew file:   package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/nanopi4.c \t\n \tnew file:   package/boot/uboot-rockchip/src/include/configs/nanopi4.h \t\n \tnew file:   target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n \tnew file:   target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n \tmodified:   target/linux/rockchip/Makefile \t\n \tmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/01_leds \t\n \tmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/02_network \t\n \tmodified:   target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity  \n \tmodified:   target/linux/rockchip/armv8/config-5.10 \t\n \tnew file:   target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n \tnew file:   target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c \n \tnew file:   target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h \t\n \tnew file:   target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h \n \tmodified:   target/linux/rockchip/image/Makefile \t\n \tmodified:   target/linux/rockchip/image/armv8.mk \t\n \tnew file:   target/linux/rockchip/image/nanopi-r4s.bootscript \t\n \tnew file:   target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n \tnew file:   target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n \tnew file:   target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n \tnew file:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n \tnew file:   target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n \tnew file:   target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n \tnew file:   target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n \tnew file:   target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n \tnew file:   target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n \tnew file:   target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n \tnew file:   target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n \tnew file:   target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n \tnew file:   target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n \tnew file:   target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n---\n .../boot/arm-trusted-firmware-rk3328/Makefile |  55 ++\n .../arm-trusted-firmware-rk3328/src/trust.ini |  15 +\n package/boot/uboot-rockchip/Makefile          |  25 +-\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 257 ++++++\n ...split-nanopi-r4-rk3399-out-of-evb_rk.patch |  74 ++\n ...9-Add-support-for-multiple-DDR-types.patch | 256 ++++++\n .../src/board/friendlyarm/nanopi4/Kconfig     |  15 +\n .../src/board/friendlyarm/nanopi4/MAINTAINERS |   5 +\n .../src/board/friendlyarm/nanopi4/Makefile    |   8 +\n .../src/board/friendlyarm/nanopi4/hwrev.c     | 185 ++++\n .../src/board/friendlyarm/nanopi4/hwrev.h     |  27 +\n .../src/board/friendlyarm/nanopi4/nanopi4.c   | 148 +++\n .../src/include/configs/nanopi4.h             |  24 +\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |  38 +\n ...k-events-support-multiple-registrant.patch | 291 ++++++\n target/linux/rockchip/Makefile                |   2 +-\n .../armv8/base-files/etc/board.d/01_leds      |   4 +\n .../armv8/base-files/etc/board.d/02_network   |   7 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   4 +\n target/linux/rockchip/armv8/config-5.10       |  50 +\n .../rockchip/rk3328-dram-nanopi2-timing.dtsi  | 311 +++++++\n .../files/drivers/devfreq/rk3328_dmc.c        | 852 ++++++++++++++++++\n .../include/dt-bindings/clock/rockchip-ddr.h  |  63 ++\n .../include/dt-bindings/memory/rk3328-dram.h  | 159 ++++\n target/linux/rockchip/image/Makefile          |  20 +\n target/linux/rockchip/image/armv8.mk          |  12 +-\n .../rockchip/image/nanopi-r4s.bootscript      |   8 +\n ...add-compatible-to-NanoPi-R2S-etherne.patch |  25 +\n ...-initial-signal-voltage-on-power-off.patch |  35 +\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 218 +++++\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 +\n ...-for-rockchip-hardware-random-number.patch |  45 +\n ...ip-add-hardware-random-number-genera.patch |  50 +\n ...ip-add-devfreq-driver-for-rk3328-dmc.patch |  44 +\n ...setting-ddr-clock-via-SIP-Version-2-.patch | 218 +++++\n ...eq-rockchip-dfi-add-more-soc-support.patch | 662 ++++++++++++++\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |  27 +\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 +++\n ...adjust-default-coherent_pool-to-2MiB.patch |  28 +\n ...ip-add-more-cpu-operating-points-for.patch |  44 +\n ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 182 ++++\n 41 files changed, 4635 insertions(+), 6 deletions(-)\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/Makefile\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n create mode 100644 package/boot/uboot-rockchip/patches/102-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n create mode 100644 package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Kconfig\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/MAINTAINERS\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Makefile\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.c\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.h\n create mode 100644 package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/nanopi4.c\n create mode 100644 package/boot/uboot-rockchip/src/include/configs/nanopi4.h\n create mode 100644 target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n create mode 100644 target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n create mode 100644 target/linux/rockchip/image/nanopi-r4s.bootscript\n create mode 100644 target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n create mode 100644 target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n create mode 100644 target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n create mode 100644 target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n create mode 100644 target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n create mode 100644 target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n create mode 100644 target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n create mode 100644 target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n create mode 100644 target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n create mode 100644 target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n create mode 100644 target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n create mode 100644 target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/Makefile b/package/boot/arm-trusted-firmware-rk3328/Makefile\nnew file mode 100644\nindex 0000000000..243fcac9c9\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/Makefile\n@@ -0,0 +1,55 @@\n+#\n+# Copyright (C) 2021 ImmortalWrt\n+# (https://immortalwrt.org)\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+\n+include $(TOPDIR)/rules.mk\n+\n+PKG_NAME:=arm-trusted-firmware-rk3328\n+PKG_RELEASE:=1\n+\n+PKG_SOURCE_PROTO:=git\n+PKG_SOURCE_URL=https://github.com/rockchip-linux/rkbin.git\n+PKG_SOURCE_DATE:=2020-10-30\n+PKG_SOURCE_VERSION:=0bb1c512492386a72a3a0b5a0e18e49c636577b9\n+PKG_MIRROR_HASH:=6dffe95b83f37a280f98c105fce529f45e39ce333b24709a9645aac1352457ce\n+\n+PKG_MAINTAINER:=AmadeusGhost <amadeus@immortalwrt.org>\n+\n+MAKE_PATH:=$(PKG_NAME)\n+\n+include $(INCLUDE_DIR)/package.mk\n+\n+define Package/arm-trusted-firmware-rk3328\n+    SECTION:=boot\n+    CATEGORY:=Boot Loaders\n+    TITLE:=ARM Trusted Firmware for Rockchip\n+    DEPENDS:=@TARGET_rockchip_armv8\n+endef\n+\n+define Build/Configure\n+\t$(SED) 's,$$$$(PKG_BUILD_DIR),$(PKG_BUILD_DIR),g' $(PKG_BUILD_DIR)/trust.ini\n+\t$(call Build/Configure/Default)\n+endef\n+\n+define Build/Compile\n+\tmkimage -n rk3328 -T rksd -d $(PKG_BUILD_DIR)/bin/rk33/rk3328_ddr_333MHz_v1.16.bin $(PKG_BUILD_DIR)/idbloader.bin\n+\tcat $(PKG_BUILD_DIR)/bin/rk33/rk322xh_miniloader_v2.50.bin >> $(PKG_BUILD_DIR)/idbloader.bin\n+\t$(PKG_BUILD_DIR)/tools/trust_merger --replace bl31.elf $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.44.elf $(PKG_BUILD_DIR)/trust.ini\n+endef\n+\n+define Build/InstallDev\n+\t$(INSTALL_DIR) -p $(STAGING_DIR_IMAGE)\n+\t$(CP) $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.44.elf $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/tools/loaderimage $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/idbloader.bin $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/trust.bin $(STAGING_DIR_IMAGE)/\n+endef\n+\n+define Package/arm-trusted-firmware-rk3328/install\n+endef\n+\n+$(eval $(call BuildPackage,arm-trusted-firmware-rk3328))\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/src/trust.ini b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\nnew file mode 100644\nindex 0000000000..b95797427e\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n@@ -0,0 +1,15 @@\n+[VERSION]\n+MAJOR=1\n+MINOR=0\n+[BL30_OPTION]\n+SEC=0\n+[BL31_OPTION]\n+SEC=1\n+PATH=bl31.elf\n+ADDR=0x10000\n+[BL32_OPTION]\n+SEC=0\n+[BL33_OPTION]\n+SEC=0\n+[OUTPUT]\n+PATH=$(PKG_BUILD_DIR)/trust.bin\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 645422aca4..9d240e464c 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -29,15 +29,26 @@ define U-Boot/nanopi-r2s-rk3328\n   NAME:=NanoPi R2S\n   BUILD_DEVICES:= \\\n     friendlyarm_nanopi-r2s\n-  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rockchip\n-  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n-  ATF:=rk3328_bl31.elf\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rk3328\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rk3328\n+  ATF:=rk322xh_bl31_v1.44.elf\n+  USE_RKBIN:=1\n   OF_PLATDATA:=$(1)\n endef\n \n \n # RK3399 boards\n \n+define U-Boot/nanopi-r4s-rk3399\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=NanoPi R4S\n+  BUILD_DEVICES:= \\\n+    friendlyarm_nanopi-r4s\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n+  ATF:=rk3399_bl31.elf\n+endef\n+\n define U-Boot/rock-pi-4-rk3399\n   BUILD_SUBTARGET:=armv8\n   NAME:=Rock Pi 4\n@@ -59,6 +70,7 @@ define U-Boot/rockpro64-rk3399\n endef\n \n UBOOT_TARGETS := \\\n+  nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n   nanopi-r2s-rk3328\n@@ -85,8 +97,15 @@ endef\n \n define Build/InstallDev\n \t$(INSTALL_DIR) $(STAGING_DIR_IMAGE)\n+ifneq ($(USE_RKBIN),)\n+\t$(STAGING_DIR_IMAGE)/loaderimage --pack --uboot $(PKG_BUILD_DIR)/u-boot-dtb.bin $(PKG_BUILD_DIR)/uboot.img 0x200000\n+\t$(CP) $(PKG_BUILD_DIR)/uboot.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-uboot.img\n+\t$(CP) $(STAGING_DIR_IMAGE)/idbloader.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.bin\n+\t$(CP) $(STAGING_DIR_IMAGE)/trust.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-trust.bin\n+else\n \t$(CP) $(PKG_BUILD_DIR)/idbloader.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.img\n \t$(CP) $(PKG_BUILD_DIR)/u-boot.itb $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-u-boot.itb\n+endif\n endef\n \n define Package/u-boot/install/default\ndiff --git a/package/boot/uboot-rockchip/patches/102-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/package/boot/uboot-rockchip/patches/102-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..2988ea2248\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/102-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,257 @@\n+From 2dd6b01ec665c376e6be7d37b513fb4d05df60db Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 05:55:50 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Co-developed-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+[minor adjustments]\n+Co-developed-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+[further adjustments, fixed format issues]\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm/dts/Makefile                      |   1 +\n+ arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi |   9 ++\n+ arch/arm/dts/rk3399-nanopi-r4s.dts         | 133 +++++++++++++++++++++\n+ configs/nanopi-r4s-rk3399_defconfig        |  63 ++++++++++\n+ 4 files changed, 206 insertions(+)\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s.dts\n+ create mode 100644 configs/nanopi-r4s-rk3399_defconfig\n+\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -132,6 +132,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \\\n+ \trk3399-nanopi-m4.dtb \\\n+ \trk3399-nanopi-m4-2gb.dtb \\\n+ \trk3399-nanopi-neo4.dtb \\\n++\trk3399-nanopi-r4s.dtb \\\n+ \trk3399-orangepi.dtb \\\n+ \trk3399-pinebook-pro.dtb \\\n+ \trk3399-puma-haikou.dtb \\\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+@@ -0,0 +1,9 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * (C) Copyright 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ */\n++\n++#include \"rk3399-nanopi4-u-boot.dtsi\"\n++#include \"rk3399-sdram-lpddr4-100.dtsi\"\n++#include \"rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\"\n++#include \"rk3399-sdram-ddr3-1866.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,133 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * FriendlyElec NanoPC-T4 board device tree source\n++ *\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * Copyright (c) 2018 Collabora Ltd.\n++ *\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2021 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\t/delete-node/ display-subsystem;\n++\n++\tgpio-leds {\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\n++\t\t/delete-node/ status;\n++\n++\t\tlan_led: led-lan {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-sys {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"red:sys\";\n++\t\t\tdefault-state = \"on\";\n++\t\t};\n++\n++\t\twan_led: led-wan {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"green:wan\";\n++\t\t};\n++\t};\n++\n++\tgpio-keys {\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\t/delete-node/ power;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&i2c4 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++};\n++\n++&pinctrl {\n++\tgpio-leds {\n++\t\t/delete-node/ leds-gpio;\n++\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\trockchip-key {\n++\t\t/delete-node/ power-key;\n++\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&uart0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\n+--- /dev/null\n++++ b/configs/nanopi-r4s-rk3399_defconfig\n+@@ -0,0 +1,63 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3399=y\n++CONFIG_TARGET_NANOPI4_RK3399=y\n++CONFIG_DEBUG_UART_BASE=0xFF1A0000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3399-nanopi-r4s\"\n++CONFIG_DEBUG_UART=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3399-nanopi-r4s.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000\n++CONFIG_TPL=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_OF_SPL_REMOVE_PROPS=\"pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_SYS_MMC_ENV_DEV=1\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_MMC_SDHCI=y\n++CONFIG_MMC_SDHCI_ROCKCHIP=y\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM_RK3399_LPDDR4=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_KEYBOARD=y\n++CONFIG_USB_HOST_ETHER=y\n++CONFIG_USB_ETHER_ASIX=y\n++CONFIG_USB_ETHER_ASIX88179=y\n++CONFIG_USB_ETHER_MCS7830=y\n++CONFIG_USB_ETHER_RTL8152=y\n++CONFIG_USB_ETHER_SMSC95XX=y\n++CONFIG_DM_VIDEO=y\n++CONFIG_DISPLAY=y\n++CONFIG_VIDEO_ROCKCHIP=y\n++CONFIG_DISPLAY_ROCKCHIP_HDMI=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\ndiff --git a/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\nnew file mode 100644\nindex 0000000000..3580ade7b7\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n@@ -0,0 +1,74 @@\n+From a765bb2678b6d1666caafef0fcf88fba88b5b26f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Fri, 18 Dec 2020 17:10:35 +0800\n+Subject: [PATCH] rockchip: rk3399: split nanopi-r4-rk3399 out of evb_rk3399\n+\n+nanopi-r4-rk3399 board has multiple DDR types. Currently we don't have any code\n+are compatible with these devices. Since multiple DDR types is specific to\n+nanopi-r4-rk3399 board, split it into its own board file and add code\n+support here.\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[Improved commit message and Kconfig description]\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm/mach-rockchip/rk3399/Kconfig |  15 +++\n+ board/friendlyarm/nanopi4/Kconfig     |  15 +++\n+ board/friendlyarm/nanopi4/MAINTAINERS |   5 +\n+ board/friendlyarm/nanopi4/Makefile    |   8 ++\n+ board/friendlyarm/nanopi4/hwrev.c     | 185 ++++++++++++++++++++++++++\n+ board/friendlyarm/nanopi4/hwrev.h     |  27 ++++\n+ board/friendlyarm/nanopi4/nanopi4.c   | 148 +++++++++++++++++++++\n+ drivers/clk/rockchip/clk_rk3399.c     |   2 +\n+ include/configs/nanopi4.h             |  24 ++++\n+ 9 files changed, 429 insertions(+)\n+ create mode 100644 board/friendlyarm/nanopi4/Kconfig\n+ create mode 100644 board/friendlyarm/nanopi4/MAINTAINERS\n+ create mode 100644 board/friendlyarm/nanopi4/Makefile\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.c\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.h\n+ create mode 100644 board/friendlyarm/nanopi4/nanopi4.c\n+ create mode 100644 include/configs/nanopi4.h\n+\n+--- a/arch/arm/mach-rockchip/rk3399/Kconfig\n++++ b/arch/arm/mach-rockchip/rk3399/Kconfig\n+@@ -109,6 +109,20 @@ config TARGET_ROC_PC_RK3399\n+ \t   * wide voltage input(5V-15V), dual cell battery\n+ \t   * Wifi/BT accessible via expansion board M.2\n+ \n++config TARGET_NANOPI4_RK3399\n++\tbool \"FriendlyElec NanoPi4 board\"\n++\thelp\n++\t  NanoPi4 is SBC produced by FriendlyElec. Key features:\n++\n++\t   * Rockchip RK3399\n++\t   * 1/2/4GB Dual-Channel DDR3/LPDDR4\n++\t   * SD card slot\n++\t   * Gigabit ethernet\n++\t   * PCIe\n++\t   * USB 3.0, 2.0\n++\t   * USB Type C power\n++\t   * GPIO expansion ports\n++\n+ endchoice\n+ \n+ config ROCKCHIP_BOOT_MODE_REG\n+@@ -152,6 +166,7 @@ config SYS_BOOTCOUNT_ADDR\n+ endif # BOOTCOUNT_LIMIT\n+ \n+ source \"board/firefly/roc-pc-rk3399/Kconfig\"\n++source \"board/friendlyarm/nanopi4/Kconfig\"\n+ source \"board/google/gru/Kconfig\"\n+ source \"board/pine64/pinebook-pro-rk3399/Kconfig\"\n+ source \"board/pine64/rockpro64_rk3399/Kconfig\"\n+--- a/drivers/clk/rockchip/clk_rk3399.c\n++++ b/drivers/clk/rockchip/clk_rk3399.c\n+@@ -1372,6 +1372,8 @@ static void rkclk_init(struct rockchip_c\n+ \t\t     pclk_div << PCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     hclk_div << HCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     HCLK_PERILP1_PLL_SEL_GPLL << HCLK_PERILP1_PLL_SEL_SHIFT);\n++\n++\trk3399_saradc_set_clk(cru, 1000000);\n+ }\n+ \n+ static int rk3399_clk_probe(struct udevice *dev)\ndiff --git a/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\nnew file mode 100644\nindex 0000000000..ba1a143268\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n@@ -0,0 +1,256 @@\n+From a9447b7b60a3c5195d0fabbe5aa9c32d047ec997 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Sat, 19 Dec 2020 19:39:14 +0800\n+Subject: [PATCH] ram: rk3399: Add support for multiple DDR types\n+\n+Move rockchip,sdram-params to named subnode to include\n+multiple sdram parameters, and then read the parameters\n+(by subnode name, first subnode or current node) before\n+rk3399_dmc_init().\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi      |  6 ++-\n+ arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi      |  5 +-\n+ arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi      |  6 ++-\n+ .../arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi |  3 ++\n+ .../arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi |  3 ++\n+ .../rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi |  3 ++\n+ arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi     |  3 ++\n+ drivers/ram/rockchip/sdram_rk3399.c           | 49 +++++++++++++++----\n+ 8 files changed, 64 insertions(+), 14 deletions(-)\n+\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1333 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1600 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1866 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n+@@ -5,6 +5,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-2GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+@@ -1537,4 +1539,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-4GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-samsung-4GB-1866 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1543,4 +1545,5 @@\n+ \t\t0x01010000\t/* DENALI_PHY_957_DATA */\n+ \t\t0x00000000\t/* DENALI_PHY_958_DATA */\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n+@@ -6,6 +6,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr4-100 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1538,4 +1540,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/drivers/ram/rockchip/sdram_rk3399.c\n++++ b/drivers/ram/rockchip/sdram_rk3399.c\n+@@ -1625,7 +1625,6 @@ static void set_ddr_stride(struct rk3399_pmusgrf_regs *pmusgrf, u32 stride)\n+ \trk_clrsetreg(&pmusgrf->soc_con4, 0x1f << 10, stride << 10);\n+ }\n+ \n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank,\n+ \t\t\t       struct rk3399_sdram_params *params)\n+ {\n+@@ -1715,8 +1714,8 @@ void modify_param(const struct chan_info *chan,\n+ \tclrsetbits_le32(&denali_pi_params[76], 0x1 << 24, 0x1 << 24);\n+ \tclrsetbits_le32(&denali_pi_params[77], 0x1, 0x1);\n+ }\n+-#else\n+ \n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n+ struct rk3399_sdram_params dfs_cfgs_lpddr4[] = {\n+ #include \"sdram-rk3399-lpddr4-400.inc\"\n+ #include \"sdram-rk3399-lpddr4-800.inc\"\n+@@ -3011,20 +3010,40 @@ static int sdram_init(struct dram_info *dram,\n+ \treturn 0;\n+ }\n+ \n++__weak const char *rk3399_get_ddrtype(void)\n++{\n++\treturn NULL;\n++}\n++\n+ static int rk3399_dmc_of_to_plat(struct udevice *dev)\n+ {\n+ #if !CONFIG_IS_ENABLED(OF_PLATDATA)\n+ \tstruct rockchip_dmc_plat *plat = dev_get_plat(dev);\n++\tofnode node = { .np = NULL };\n++\tconst char *name;\n+ \tint ret;\n+ \n+-\tret = dev_read_u32_array(dev, \"rockchip,sdram-params\",\n+-\t\t\t\t (u32 *)&plat->sdram_params,\n+-\t\t\t\t sizeof(plat->sdram_params) / sizeof(u32));\n++\tname = rk3399_get_ddrtype();\n++\tif (name)\n++\t\tnode = dev_read_subnode(dev, name);\n++\tif (!ofnode_valid(node)) {\n++\t\tdebug(\"Failed to read subnode %s\\n\", name);\n++\t\tnode = dev_read_first_subnode(dev);\n++\t}\n++\n++\t/* fallback to current node */\n++\tif (!ofnode_valid(node))\n++\t\tnode = dev_ofnode(dev);\n++\n++\tret = ofnode_read_u32_array(node, \"rockchip,sdram-params\",\n++\t\t\t\t    (u32 *)&plat->sdram_params,\n++\t\t\t\t    sizeof(plat->sdram_params) / sizeof(u32));\n+ \tif (ret) {\n+ \t\tprintf(\"%s: Cannot read rockchip,sdram-params %d\\n\",\n+ \t\t       __func__, ret);\n+ \t\treturn ret;\n+ \t}\n++\n+ \tret = regmap_init_mem(dev_ofnode(dev), &plat->map);\n+ \tif (ret)\n+ \t\tprintf(\"%s: regmap failed %d\\n\", __func__, ret);\n+@@ -3050,18 +3069,20 @@ static int conv_of_plat(struct udevice *dev)\n+ #endif\n+ \n+ static const struct sdram_rk3399_ops rk3399_ops = {\n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ \t.data_training_first = data_training_first,\n+ \t.set_rate_index = switch_to_phy_index1,\n+ \t.modify_param = modify_param,\n+ \t.get_phy_index_params = get_phy_index_params,\n+-#else\n++};\n++\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++static const struct sdram_rk3399_ops lpddr4_ops = {\n+ \t.data_training_first = lpddr4_mr_detect,\n+ \t.set_rate_index = lpddr4_set_rate,\n+ \t.modify_param = lpddr4_modify_param,\n+ \t.get_phy_index_params = lpddr4_get_phy_index_params,\n+-#endif\n+ };\n++#endif\n+ \n+ static int rk3399_dmc_init(struct udevice *dev)\n+ {\n+@@ -3080,7 +3101,17 @@ static int rk3399_dmc_init(struct udevice *dev)\n+ \t\treturn ret;\n+ #endif\n+ \n+-\tpriv->ops = &rk3399_ops;\n++\tif (params->base.dramtype == LPDDR4) {\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++\t\tpriv->ops = &lpddr4_ops;\n++#else\n++\t\tprintf(\"LPDDR4 support is disable\\n\");\n++\t\treturn -EINVAL;\n++#endif\n++\t} else {\n++\t\tpriv->ops = &rk3399_ops;\n++\t}\n++\n+ \tpriv->cic = syscon_get_first_range(ROCKCHIP_SYSCON_CIC);\n+ \tpriv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n+ \tpriv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Kconfig b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Kconfig\nnew file mode 100644\nindex 0000000000..80a735d4c2\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Kconfig\n@@ -0,0 +1,15 @@\n+if TARGET_NANOPI4_RK3399\n+\n+config SYS_BOARD\n+\tdefault \"nanopi4\"\n+\n+config SYS_VENDOR\n+\tdefault \"friendlyarm\"\n+\n+config SYS_CONFIG_NAME\n+\tdefault \"nanopi4\"\n+\n+config BOARD_SPECIFIC_OPTIONS\n+\tdef_bool y\n+\n+endif\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/MAINTAINERS b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/MAINTAINERS\nnew file mode 100644\nindex 0000000000..cbc4da4273\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/MAINTAINERS\n@@ -0,0 +1,5 @@\n+NanoPi 4 Series\n+M:      FriendlyElec <support@friendlyarm.com>\n+S:      Maintained\n+F:      board/friendlyarm/nanopi4/\n+F:      include/configs/nanopi4.h\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Makefile b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Makefile\nnew file mode 100644\nindex 0000000000..33a1466567\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/Makefile\n@@ -0,0 +1,8 @@\n+#\n+# Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n+# (http://www.friendlyarm.com)\n+#\n+# SPDX-License-Identifier:     GPL-2.0+\n+#\n+\n+obj-y\t+= nanopi4.o hwrev.o\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.c b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.c\nnew file mode 100644\nindex 0000000000..a3713ef18c\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.c\n@@ -0,0 +1,185 @@\n+// SPDX-License-Identifier: GPL-2.0+\n+/*\n+ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n+ * (http://www.friendlyarm.com)\n+ */\n+\n+#include <common.h>\n+#include <dm.h>\n+#include <linux/delay.h>\n+#include <log.h>\n+#include <asm/io.h>\n+#include <asm/gpio.h>\n+#include <asm/arch-rockchip/gpio.h>\n+\n+/*\n+ * ID info:\n+ *  ID : Volts : ADC value :   Bucket\n+ *  ==   =====   =========   ===========\n+ *   0 : 0.102V:        58 :    0 -   81\n+ *   1 : 0.211V:       120 :   82 -  150\n+ *   2 : 0.319V:       181 :  151 -  211\n+ *   3 : 0.427V:       242 :  212 -  274\n+ *   4 : 0.542V:       307 :  275 -  342\n+ *   5 : 0.666V:       378 :  343 -  411\n+ *   6 : 0.781V:       444 :  412 -  477\n+ *   7 : 0.900V:       511 :  478 -  545\n+ *   8 : 1.023V:       581 :  546 -  613\n+ *   9 : 1.137V:       646 :  614 -  675\n+ *  10 : 1.240V:       704 :  676 -  733\n+ *  11 : 1.343V:       763 :  734 -  795\n+ *  12 : 1.457V:       828 :  796 -  861\n+ *  13 : 1.576V:       895 :  862 -  925\n+ *  14 : 1.684V:       956 :  926 -  989\n+ *  15 : 1.800V:      1023 :  990 - 1023\n+ */\n+static const int id_readings[] = {\n+\t 81, 150, 211, 274, 342, 411, 477, 545,\n+\t613, 675, 733, 795, 861, 925, 989, 1023\n+};\n+\n+static int cached_board_id = -1;\n+\n+#define SARADC_BASE\t\t0xFF100000\n+#define SARADC_DATA\t\t(SARADC_BASE + 0)\n+#define SARADC_CTRL\t\t(SARADC_BASE + 8)\n+\n+static u32 get_saradc_value(int chn)\n+{\n+\tint timeout = 0;\n+\tu32 adc_value = 0;\n+\n+\twritel(0, SARADC_CTRL);\n+\tudelay(2);\n+\n+\twritel(0x28 | chn, SARADC_CTRL);\n+\tudelay(50);\n+\n+\ttimeout = 0;\n+\tdo {\n+\t\tif (readl(SARADC_CTRL) & 0x40) {\n+\t\t\tadc_value = readl(SARADC_DATA) & 0x3FF;\n+\t\t\tgoto stop_adc;\n+\t\t}\n+\n+\t\tudelay(10);\n+\t} while (timeout++ < 100);\n+\n+stop_adc:\n+\twritel(0, SARADC_CTRL);\n+\n+\treturn adc_value;\n+}\n+\n+static uint32_t get_adc_index(int chn)\n+{\n+\tint i;\n+\tint adc_reading;\n+\n+\tif (cached_board_id != -1)\n+\t\treturn cached_board_id;\n+\n+\tadc_reading = get_saradc_value(chn);\n+\tfor (i = 0; i < ARRAY_SIZE(id_readings); i++) {\n+\t\tif (adc_reading <= id_readings[i]) {\n+\t\t\tdebug(\"ADC reading %d, ID %d\\n\", adc_reading, i);\n+\t\t\tcached_board_id = i;\n+\t\t\treturn i;\n+\t\t}\n+\t}\n+\n+\t/* should die for impossible value */\n+\treturn 0;\n+}\n+\n+/*\n+ * Board revision list: <GPIO4_D1 | GPIO4_D0>\n+ *  0b00 - NanoPC-T4\n+ *  0b01 - NanoPi M4\n+ *\n+ * Extended by ADC_IN4\n+ * Group A:\n+ *  0x04 - NanoPi NEO4\n+ *  0x06 - SOC-RK3399\n+ *  0x07 - SOC-RK3399 V2\n+ *  0x09 - NanoPi R4S 1GB\n+ *  0x0A - NanoPi R4S 4GB\n+ *\n+ * Group B:\n+ *  0x21 - NanoPi M4 Ver2.0\n+ *  0x22 - NanoPi M4B\n+ */\n+static int pcb_rev = -1;\n+\n+void bd_hwrev_init(void)\n+{\n+#define GPIO4_BASE\t0xff790000\n+\tstruct rockchip_gpio_regs *regs = (void *)GPIO4_BASE;\n+\n+#ifdef CONFIG_SPL_BUILD\n+\tstruct udevice *dev;\n+\n+\tif (uclass_get_device_by_driver(UCLASS_CLK,\n+\t\t\t\tDM_DRIVER_GET(clk_rk3399), &dev))\n+\t\treturn;\n+#endif\n+\n+\tif (pcb_rev >= 0)\n+\t\treturn;\n+\n+\t/* D1, D0: input mode */\n+\tclrbits_le32(&regs->swport_ddr, (0x3 << 24));\n+\tpcb_rev = (readl(&regs->ext_port) >> 24) & 0x3;\n+\n+\tif (pcb_rev == 0x3) {\n+\t\t/* Revision group A: 0x04 ~ 0x13 */\n+\t\tpcb_rev = 0x4 + get_adc_index(4);\n+\n+\t} else if (pcb_rev == 0x1) {\n+\t\tint idx = get_adc_index(4);\n+\n+\t\t/* Revision group B: 0x21 ~ 0x2f */\n+\t\tif (idx > 0) {\n+\t\t\tpcb_rev = 0x20 + idx;\n+\t\t}\n+\t}\n+}\n+\n+#ifdef CONFIG_SPL_BUILD\n+static struct board_ddrtype {\n+\tint rev;\n+\tconst char *type;\n+} ddrtypes[] = {\n+\t{ 0x00, \"lpddr3-samsung-4GB-1866\" },\n+\t{ 0x01, \"lpddr3-samsung-4GB-1866\" },\n+\t{ 0x04,   \"ddr3-1866\" },\n+\t{ 0x06,   \"ddr3-1866\" },\n+\t{ 0x07, \"lpddr4-100\"  },\n+\t{ 0x09,   \"ddr3-1866\" },\n+\t{ 0x0a, \"lpddr4-100\"  },\n+\t{ 0x21, \"lpddr4-100\"  },\n+\t{ 0x22,   \"ddr3-1866\" },\n+};\n+\n+const char *rk3399_get_ddrtype(void) {\n+\tint i;\n+\n+\tbd_hwrev_init();\n+\tprintf(\"Board: rev%02x\\n\", pcb_rev);\n+\n+\tfor (i = 0; i < ARRAY_SIZE(ddrtypes); i++) {\n+\t\tif (ddrtypes[i].rev == pcb_rev)\n+\t\t\treturn ddrtypes[i].type;\n+\t}\n+\n+\t/* fallback to first subnode (ie, first included dtsi) */\n+\treturn NULL;\n+}\n+#endif\n+\n+/* To override __weak symbols */\n+u32 get_board_rev(void)\n+{\n+\treturn pcb_rev;\n+}\n+\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.h b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.h\nnew file mode 100644\nindex 0000000000..23b3c7a557\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/hwrev.h\n@@ -0,0 +1,27 @@\n+/*\n+ * Copyright (C) Guangzhou FriendlyARM Computer Tech. Co., Ltd.\n+ * (http://www.friendlyarm.com)\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU General Public License\n+ * as published by the Free Software Foundation; either version 2\n+ * of the License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program; if not, you can access it online at\n+ * http://www.gnu.org/licenses/gpl-2.0.html.\n+ */\n+\n+#ifndef __BD_HW_REV_H__\n+#define __BD_HW_REV_H__\n+\n+extern void bd_hwrev_config_gpio(void);\n+extern void bd_hwrev_init(void);\n+extern u32 get_board_rev(void);\n+\n+#endif /* __BD_HW_REV_H__ */\ndiff --git a/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/nanopi4.c b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/nanopi4.c\nnew file mode 100644\nindex 0000000000..a140370ca2\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/board/friendlyarm/nanopi4/nanopi4.c\n@@ -0,0 +1,148 @@\n+// SPDX-License-Identifier: GPL-2.0+\n+/*\n+ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n+ * (http://www.friendlyarm.com)\n+ */\n+\n+#include <common.h>\n+#include <dm.h>\n+#include <env.h>\n+#include <hash.h>\n+#include <linux/bitops.h>\n+#include <i2c.h>\n+#include <init.h>\n+#include <net.h>\n+#include <netdev.h>\n+#include <syscon.h>\n+#include <asm/arch-rockchip/bootrom.h>\n+#include <asm/arch-rockchip/clock.h>\n+#include <asm/arch-rockchip/grf_rk3399.h>\n+#include <asm/arch-rockchip/hardware.h>\n+#include <asm/arch-rockchip/misc.h>\n+#include <asm/io.h>\n+#include <asm/setup.h>\n+#include <u-boot/sha256.h>\n+\n+#ifdef CONFIG_MISC_INIT_R\n+static void setup_iodomain(void)\n+{\n+\tstruct rk3399_grf_regs *grf =\n+\t    syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n+\n+\t/* BT565 and AUDIO is in 1.8v domain */\n+\trk_setreg(&grf->io_vsel, BIT(0) | BIT(1));\n+}\n+\n+static int __maybe_unused mac_read_from_generic_eeprom(u8 *addr)\n+{\n+\tstruct udevice *i2c_dev;\n+\tint ret;\n+\n+\t/* Microchip 24AA02xxx EEPROMs with EUI-48 Node Identity */\n+\tret = i2c_get_chip_for_busnum(2, 0x51, 1, &i2c_dev);\n+\tif (!ret)\n+\t\tret = dm_i2c_read(i2c_dev, 0xfa, addr, 6);\n+\n+\treturn ret;\n+}\n+\n+static void setup_macaddr(void)\n+{\n+#if CONFIG_IS_ENABLED(CMD_NET)\n+\tint ret;\n+\tconst char *cpuid = env_get(\"cpuid#\");\n+\tu8 hash[SHA256_SUM_LEN];\n+\tint size = sizeof(hash);\n+\tu8 mac_addr[6];\n+\tint from_eeprom = 0;\n+\tint lockdown = 0;\n+\n+#ifndef CONFIG_ENV_IS_NOWHERE\n+\tlockdown = env_get_yesno(\"lockdown\") == 1;\n+#endif\n+\tif (lockdown && env_get(\"ethaddr\"))\n+\t\treturn;\n+\n+\tret = mac_read_from_generic_eeprom(mac_addr);\n+\tif (!ret && is_valid_ethaddr(mac_addr)) {\n+\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n+\t\tfrom_eeprom = 1;\n+\t}\n+\n+\tif (!cpuid) {\n+\t\tdebug(\"%s: could not retrieve 'cpuid#'\\n\", __func__);\n+\t\treturn;\n+\t}\n+\n+\tret = hash_block(\"sha256\", (void *)cpuid, strlen(cpuid), hash, &size);\n+\tif (ret) {\n+\t\tdebug(\"%s: failed to calculate SHA256\\n\", __func__);\n+\t\treturn;\n+\t}\n+\n+\t/* Copy 6 bytes of the hash to base the MAC address on */\n+\tmemcpy(mac_addr, hash, 6);\n+\n+\t/* Make this a valid MAC address and set it */\n+\tmac_addr[0] &= 0xfe;  /* clear multicast bit */\n+\tmac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */\n+\n+\tif (from_eeprom) {\n+\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n+\t} else {\n+\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n+\n+\t\tif (lockdown && env_get(\"eth1addr\"))\n+\t\t\treturn;\n+\n+\t\t/* Ugly, copy another 4 bytes to generate a similar address */\n+\t\tmemcpy(mac_addr + 2, hash + 8, 4);\n+\t\tif (!memcmp(hash + 2, hash + 8, 4))\n+\t\t\tmac_addr[5] ^= 0xff;\n+\n+\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n+\t}\n+#endif\n+\n+\treturn;\n+}\n+\n+int misc_init_r(void)\n+{\n+\tconst u32 cpuid_offset = 0x7;\n+\tconst u32 cpuid_length = 0x10;\n+\tu8 cpuid[cpuid_length];\n+\tint ret;\n+\n+\tsetup_iodomain();\n+\n+\tret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = rockchip_cpuid_set(cpuid, cpuid_length);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tsetup_macaddr();\n+\tbd_hwrev_init();\n+\n+\treturn 0;\n+}\n+#endif\n+\n+#ifdef CONFIG_SERIAL_TAG\n+void get_board_serial(struct tag_serialnr *serialnr)\n+{\n+\tchar *serial_string;\n+\tu64 serial = 0;\n+\n+\tserial_string = env_get(\"serial#\");\n+\n+\tif (serial_string)\n+\t\tserial = simple_strtoull(serial_string, NULL, 16);\n+\n+\tserialnr->high = (u32)(serial >> 32);\n+\tserialnr->low = (u32)(serial & 0xffffffff);\n+}\n+#endif\ndiff --git a/package/boot/uboot-rockchip/src/include/configs/nanopi4.h b/package/boot/uboot-rockchip/src/include/configs/nanopi4.h\nnew file mode 100644\nindex 0000000000..a86d38976a\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/include/configs/nanopi4.h\n@@ -0,0 +1,24 @@\n+/* SPDX-License-Identifier: GPL-2.0+ */\n+/*\n+ * Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n+ * (http://www.friendlyarm.com)\n+ *\n+ * (C) Copyright 2016 Rockchip Electronics Co., Ltd\n+ */\n+\n+#ifndef __CONFIG_NANOPI4_H__\n+#define __CONFIG_NANOPI4_H__\n+\n+#define ROCKCHIP_DEVICE_SETTINGS \\\n+\t\t\"stdin=serial,usbkbd\\0\" \\\n+\t\t\"stdout=serial,vidconsole\\0\" \\\n+\t\t\"stderr=serial,vidconsole\\0\"\n+\n+#include <configs/rk3399_common.h>\n+\n+#define SDRAM_BANK_SIZE\t\t\t(2UL << 30)\n+\n+#define CONFIG_SERIAL_TAG\n+#define CONFIG_REVISION_TAG\n+\n+#endif\ndiff --git a/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..70cfadca9c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -148,9 +148,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..2981c3d906\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2748,6 +2748,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3783,9 +3790,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex 7aeb0a3d55..f7b6995911 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk\n \n BOARD:=rockchip\n BOARDNAME:=Rockchip\n-FEATURES:=ext4 audio usb usbgadget display gpio fpu rootfs-part boot-part squashfs\n+FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n KERNEL_PATCHVER=5.4\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex e97ea3312d..b10c43ba60 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -12,6 +12,10 @@ friendlyarm,nanopi-r2s)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n+\tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n+\t;;\n esac\n \n board_config_flush\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex f5e88cc148..b4e623532b 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -7,7 +7,8 @@ rockchip_setup_interfaces()\n \tlocal board=\"$1\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -35,6 +36,10 @@ rockchip_setup_macs()\n \t\twan_mac=$(nanopi_r2s_generate_mac)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n \t\t;;\n+\tfriendlyarm,nanopi-r4s)\n+\t\twan_mac=$(cat /sys/class/net/eth0/address)\n+\t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n+\t\t;;\n \tesac\n \n \t[ -n \"$lan_mac\" ] && ucidef_set_interface_macaddr \"lan\" $lan_mac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 44716258bf..9e4a4cf4fc 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -26,5 +26,9 @@ friendlyarm,nanopi-r2s)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tset_interface_core 10 \"eth0\"\n+\tset_interface_core 20 \"eth1\"\n+\t;;\n esac\n \ndiff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex c85984a982..c9a7887750 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -18,6 +18,7 @@ CONFIG_ARC_EMAC_CORE=y\n CONFIG_ARM64=y\n CONFIG_ARM64_4K_PAGES=y\n CONFIG_ARM64_CNP=y\n+CONFIG_ARM64_CRYPTO=y\n # CONFIG_ARM64_ERRATUM_1165522 is not set\n # CONFIG_ARM64_ERRATUM_1286807 is not set\n # CONFIG_ARM64_ERRATUM_1418040 is not set\n@@ -61,6 +62,7 @@ CONFIG_ARM_MHU=y\n CONFIG_ARM_PSCI_CPUIDLE=y\n CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y\n CONFIG_ARM_PSCI_FW=y\n+CONFIG_ARM_RK3328_DMC_DEVFREQ=y\n # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set\n # CONFIG_ARM_SCMI_PROTOCOL is not set\n CONFIG_ARM_SCPI_CPUFREQ=y\n@@ -158,18 +160,63 @@ CONFIG_CRC_T10DIF=y\n CONFIG_CROSS_MEMORY_ATTACH=y\n CONFIG_CRYPTO_AEAD=y\n CONFIG_CRYPTO_AEAD2=y\n+CONFIG_CRYPTO_AES_ARM64=y\n+CONFIG_CRYPTO_AES_ARM64_BS=y\n+CONFIG_CRYPTO_AES_ARM64_CE=y\n+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y\n+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y\n+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\n+CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y\n+CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y\n+CONFIG_CRYPTO_CCM=y\n+CONFIG_CRYPTO_CHACHA20_NEON=y\n CONFIG_CRYPTO_CRC32=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=\n+CONFIG_CRYPTO_CRYPTD=y\n+CONFIG_CRYPTO_CTR=y\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_GCM=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_GHASH=y\n+CONFIG_CRYPTO_GHASH_ARM64_CE=y\n # CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n CONFIG_CRYPTO_HASH=y\n CONFIG_CRYPTO_HASH2=y\n+CONFIG_CRYPTO_HMAC=y\n+CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y\n+CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y\n+CONFIG_CRYPTO_LIB_SHA256=y\n CONFIG_CRYPTO_MANAGER=y\n CONFIG_CRYPTO_MANAGER2=y\n+CONFIG_CRYPTO_NHPOLY1305=y\n+CONFIG_CRYPTO_NHPOLY1305_NEON=y\n+CONFIG_CRYPTO_NULL=y\n CONFIG_CRYPTO_NULL2=y\n+CONFIG_CRYPTO_POLY1305_NEON=y\n+CONFIG_CRYPTO_RNG=y\n CONFIG_CRYPTO_RNG2=y\n+CONFIG_CRYPTO_SHA1=y\n+CONFIG_CRYPTO_SHA1_ARM64_CE=y\n+CONFIG_CRYPTO_SHA256=y\n+CONFIG_CRYPTO_SHA256_ARM64=y\n+CONFIG_CRYPTO_SHA2_ARM64_CE=y\n+CONFIG_CRYPTO_SHA3=y\n+CONFIG_CRYPTO_SHA3_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64_CE=y\n+CONFIG_CRYPTO_SIMD=y\n+CONFIG_CRYPTO_SM3=y\n+CONFIG_CRYPTO_SM3_ARM64_CE=y\n+CONFIG_CRYPTO_SM4=y\n+CONFIG_CRYPTO_SM4_ARM64_CE=y\n CONFIG_DCACHE_WORD_ACCESS=y\n CONFIG_DEBUG_BUGVERBOSE=y\n+CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y\n # CONFIG_DEVFREQ_GOV_PASSIVE is not set\n CONFIG_DEVFREQ_GOV_PERFORMANCE=y\n CONFIG_DEVFREQ_GOV_POWERSAVE=y\n@@ -270,6 +317,8 @@ CONFIG_HUGETLB_PAGE=y\n CONFIG_HWMON=y\n CONFIG_HWSPINLOCK=y\n CONFIG_HW_CONSOLE=y\n+CONFIG_HW_RANDOM=y\n+CONFIG_HW_RANDOM_ROCKCHIP=y\n CONFIG_I2C=y\n CONFIG_I2C_BOARDINFO=y\n CONFIG_I2C_CHARDEV=y\n@@ -450,6 +499,7 @@ CONFIG_PM=y\n CONFIG_PM_CLK=y\n CONFIG_PM_DEVFREQ=y\n # CONFIG_PM_DEVFREQ_EVENT is not set\n+CONFIG_PM_DEVFREQ_EVENT=y\n CONFIG_PM_GENERIC_DOMAINS=y\n CONFIG_PM_GENERIC_DOMAINS_OF=y\n CONFIG_PM_OPP=y\ndiff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\nnew file mode 100644\nindex 0000000000..a3f5ff4bdc\n--- /dev/null\n+++ b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n@@ -0,0 +1,311 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#include <dt-bindings/clock/rockchip-ddr.h>\n+#include <dt-bindings/memory/rk3328-dram.h>\n+\n+/ {\n+\tddr_timing: ddr_timing {\n+\t\tcompatible = \"rockchip,ddr-timing\";\n+\t\tddr3_speed_bin = <DDR3_DEFAULT>;\n+\t\tddr4_speed_bin = <DDR4_DEFAULT>;\n+\t\tpd_idle = <0>;\n+\t\tsr_idle = <0>;\n+\t\tsr_mc_gate_idle = <0>;\n+\t\tsrpd_lite_idle\t= <0>;\n+\t\tstandby_idle = <0>;\n+\n+\t\tauto_pd_dis_freq = <1066>;\n+\t\tauto_sr_dis_freq = <800>;\n+\t\tddr3_dll_dis_freq = <300>;\n+\t\tddr4_dll_dis_freq = <625>;\n+\t\tphy_dll_dis_freq = <400>;\n+\n+\t\tddr3_odt_dis_freq = <100>;\n+\t\tphy_ddr3_odt_dis_freq = <100>;\n+\t\tddr3_drv = <DDR3_DS_40ohm>;\n+\t\tddr3_odt = <DDR3_ODT_120ohm>;\n+\t\tphy_ddr3_ca_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_ck_drv = <PHY_DDR3_RON_RTT_45ohm>;\n+\t\tphy_ddr3_dq_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_odt = <PHY_DDR3_RON_RTT_225ohm>;\n+\n+\t\tlpddr3_odt_dis_freq = <666>;\n+\t\tphy_lpddr3_odt_dis_freq = <666>;\n+\t\tlpddr3_drv = <LP3_DS_40ohm>;\n+\t\tlpddr3_odt = <LP3_ODT_240ohm>;\n+\t\tphy_lpddr3_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_lpddr3_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\tlpddr4_odt_dis_freq = <800>;\n+\t\tphy_lpddr4_odt_dis_freq = <800>;\n+\t\tlpddr4_drv = <LP4_PDDS_60ohm>;\n+\t\tlpddr4_dq_odt = <LP4_DQ_ODT_40ohm>;\n+\t\tlpddr4_ca_odt = <LP4_CA_ODT_40ohm>;\n+\t\tphy_lpddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_40ohm>;\n+\t\tphy_lpddr4_ck_cs_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_60ohm>;\n+\n+\t\tddr4_odt_dis_freq = <666>;\n+\t\tphy_ddr4_odt_dis_freq = <666>;\n+\t\tddr4_drv = <DDR4_DS_34ohm>;\n+\t\tddr4_odt = <DDR4_RTT_NOM_240ohm>;\n+\t\tphy_ddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_ddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\t/* CA de-skew, one step is 47.8ps, range 0-15 */\n+\t\tddr3a1_ddr4a9_de-skew = <7>;\n+\t\tddr3a0_ddr4a10_de-skew = <7>;\n+\t\tddr3a3_ddr4a6_de-skew = <8>;\n+\t\tddr3a2_ddr4a4_de-skew = <8>;\n+\t\tddr3a5_ddr4a8_de-skew = <7>;\n+\t\tddr3a4_ddr4a5_de-skew = <9>;\n+\t\tddr3a7_ddr4a11_de-skew = <7>;\n+\t\tddr3a6_ddr4a7_de-skew = <9>;\n+\t\tddr3a9_ddr4a0_de-skew = <8>;\n+\t\tddr3a8_ddr4a13_de-skew = <7>;\n+\t\tddr3a11_ddr4a3_de-skew = <9>;\n+\t\tddr3a10_ddr4cs0_de-skew = <7>;\n+\t\tddr3a13_ddr4a2_de-skew = <8>;\n+\t\tddr3a12_ddr4ba1_de-skew = <7>;\n+\t\tddr3a15_ddr4odt0_de-skew = <7>;\n+\t\tddr3a14_ddr4a1_de-skew = <8>;\n+\t\tddr3ba1_ddr4a15_de-skew = <7>;\n+\t\tddr3ba0_ddr4bg0_de-skew = <7>;\n+\t\tddr3ras_ddr4cke_de-skew = <7>;\n+\t\tddr3ba2_ddr4ba0_de-skew = <8>;\n+\t\tddr3we_ddr4bg1_de-skew = <8>;\n+\t\tddr3cas_ddr4a12_de-skew = <7>;\n+\t\tddr3ckn_ddr4ckn_de-skew = <8>;\n+\t\tddr3ckp_ddr4ckp_de-skew = <8>;\n+\t\tddr3cke_ddr4a16_de-skew = <8>;\n+\t\tddr3odt0_ddr4a14_de-skew = <7>;\n+\t\tddr3cs0_ddr4act_de-skew = <8>;\n+\t\tddr3reset_ddr4reset_de-skew = <7>;\n+\t\tddr3cs1_ddr4cs1_de-skew = <7>;\n+\t\tddr3odt1_ddr4odt1_de-skew = <7>;\n+\n+\t\t/* DATA de-skew\n+\t\t * RX one step is 25.1ps, range 0-15\n+\t\t * TX one step is 47.8ps, range 0-15\n+\t\t */\n+\t\tcs0_dm0_rx_de-skew = <7>;\n+\t\tcs0_dm0_tx_de-skew = <8>;\n+\t\tcs0_dq0_rx_de-skew = <7>;\n+\t\tcs0_dq0_tx_de-skew = <8>;\n+\t\tcs0_dq1_rx_de-skew = <7>;\n+\t\tcs0_dq1_tx_de-skew = <8>;\n+\t\tcs0_dq2_rx_de-skew = <7>;\n+\t\tcs0_dq2_tx_de-skew = <8>;\n+\t\tcs0_dq3_rx_de-skew = <7>;\n+\t\tcs0_dq3_tx_de-skew = <8>;\n+\t\tcs0_dq4_rx_de-skew = <7>;\n+\t\tcs0_dq4_tx_de-skew = <8>;\n+\t\tcs0_dq5_rx_de-skew = <7>;\n+\t\tcs0_dq5_tx_de-skew = <8>;\n+\t\tcs0_dq6_rx_de-skew = <7>;\n+\t\tcs0_dq6_tx_de-skew = <8>;\n+\t\tcs0_dq7_rx_de-skew = <7>;\n+\t\tcs0_dq7_tx_de-skew = <8>;\n+\t\tcs0_dqs0_rx_de-skew = <6>;\n+\t\tcs0_dqs0p_tx_de-skew = <9>;\n+\t\tcs0_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm1_rx_de-skew = <7>;\n+\t\tcs0_dm1_tx_de-skew = <7>;\n+\t\tcs0_dq8_rx_de-skew = <7>;\n+\t\tcs0_dq8_tx_de-skew = <8>;\n+\t\tcs0_dq9_rx_de-skew = <7>;\n+\t\tcs0_dq9_tx_de-skew = <7>;\n+\t\tcs0_dq10_rx_de-skew = <7>;\n+\t\tcs0_dq10_tx_de-skew = <8>;\n+\t\tcs0_dq11_rx_de-skew = <7>;\n+\t\tcs0_dq11_tx_de-skew = <7>;\n+\t\tcs0_dq12_rx_de-skew = <7>;\n+\t\tcs0_dq12_tx_de-skew = <8>;\n+\t\tcs0_dq13_rx_de-skew = <7>;\n+\t\tcs0_dq13_tx_de-skew = <7>;\n+\t\tcs0_dq14_rx_de-skew = <7>;\n+\t\tcs0_dq14_tx_de-skew = <8>;\n+\t\tcs0_dq15_rx_de-skew = <7>;\n+\t\tcs0_dq15_tx_de-skew = <7>;\n+\t\tcs0_dqs1_rx_de-skew = <7>;\n+\t\tcs0_dqs1p_tx_de-skew = <9>;\n+\t\tcs0_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm2_rx_de-skew = <7>;\n+\t\tcs0_dm2_tx_de-skew = <8>;\n+\t\tcs0_dq16_rx_de-skew = <7>;\n+\t\tcs0_dq16_tx_de-skew = <8>;\n+\t\tcs0_dq17_rx_de-skew = <7>;\n+\t\tcs0_dq17_tx_de-skew = <8>;\n+\t\tcs0_dq18_rx_de-skew = <7>;\n+\t\tcs0_dq18_tx_de-skew = <8>;\n+\t\tcs0_dq19_rx_de-skew = <7>;\n+\t\tcs0_dq19_tx_de-skew = <8>;\n+\t\tcs0_dq20_rx_de-skew = <7>;\n+\t\tcs0_dq20_tx_de-skew = <8>;\n+\t\tcs0_dq21_rx_de-skew = <7>;\n+\t\tcs0_dq21_tx_de-skew = <8>;\n+\t\tcs0_dq22_rx_de-skew = <7>;\n+\t\tcs0_dq22_tx_de-skew = <8>;\n+\t\tcs0_dq23_rx_de-skew = <7>;\n+\t\tcs0_dq23_tx_de-skew = <8>;\n+\t\tcs0_dqs2_rx_de-skew = <6>;\n+\t\tcs0_dqs2p_tx_de-skew = <9>;\n+\t\tcs0_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm3_rx_de-skew = <7>;\n+\t\tcs0_dm3_tx_de-skew = <7>;\n+\t\tcs0_dq24_rx_de-skew = <7>;\n+\t\tcs0_dq24_tx_de-skew = <8>;\n+\t\tcs0_dq25_rx_de-skew = <7>;\n+\t\tcs0_dq25_tx_de-skew = <7>;\n+\t\tcs0_dq26_rx_de-skew = <7>;\n+\t\tcs0_dq26_tx_de-skew = <7>;\n+\t\tcs0_dq27_rx_de-skew = <7>;\n+\t\tcs0_dq27_tx_de-skew = <7>;\n+\t\tcs0_dq28_rx_de-skew = <7>;\n+\t\tcs0_dq28_tx_de-skew = <7>;\n+\t\tcs0_dq29_rx_de-skew = <7>;\n+\t\tcs0_dq29_tx_de-skew = <7>;\n+\t\tcs0_dq30_rx_de-skew = <7>;\n+\t\tcs0_dq30_tx_de-skew = <7>;\n+\t\tcs0_dq31_rx_de-skew = <7>;\n+\t\tcs0_dq31_tx_de-skew = <7>;\n+\t\tcs0_dqs3_rx_de-skew = <7>;\n+\t\tcs0_dqs3p_tx_de-skew = <9>;\n+\t\tcs0_dqs3n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm0_rx_de-skew = <7>;\n+\t\tcs1_dm0_tx_de-skew = <8>;\n+\t\tcs1_dq0_rx_de-skew = <7>;\n+\t\tcs1_dq0_tx_de-skew = <8>;\n+\t\tcs1_dq1_rx_de-skew = <7>;\n+\t\tcs1_dq1_tx_de-skew = <8>;\n+\t\tcs1_dq2_rx_de-skew = <7>;\n+\t\tcs1_dq2_tx_de-skew = <8>;\n+\t\tcs1_dq3_rx_de-skew = <7>;\n+\t\tcs1_dq3_tx_de-skew = <8>;\n+\t\tcs1_dq4_rx_de-skew = <7>;\n+\t\tcs1_dq4_tx_de-skew = <8>;\n+\t\tcs1_dq5_rx_de-skew = <7>;\n+\t\tcs1_dq5_tx_de-skew = <8>;\n+\t\tcs1_dq6_rx_de-skew = <7>;\n+\t\tcs1_dq6_tx_de-skew = <8>;\n+\t\tcs1_dq7_rx_de-skew = <7>;\n+\t\tcs1_dq7_tx_de-skew = <8>;\n+\t\tcs1_dqs0_rx_de-skew = <6>;\n+\t\tcs1_dqs0p_tx_de-skew = <9>;\n+\t\tcs1_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm1_rx_de-skew = <7>;\n+\t\tcs1_dm1_tx_de-skew = <7>;\n+\t\tcs1_dq8_rx_de-skew = <7>;\n+\t\tcs1_dq8_tx_de-skew = <8>;\n+\t\tcs1_dq9_rx_de-skew = <7>;\n+\t\tcs1_dq9_tx_de-skew = <7>;\n+\t\tcs1_dq10_rx_de-skew = <7>;\n+\t\tcs1_dq10_tx_de-skew = <8>;\n+\t\tcs1_dq11_rx_de-skew = <7>;\n+\t\tcs1_dq11_tx_de-skew = <7>;\n+\t\tcs1_dq12_rx_de-skew = <7>;\n+\t\tcs1_dq12_tx_de-skew = <8>;\n+\t\tcs1_dq13_rx_de-skew = <7>;\n+\t\tcs1_dq13_tx_de-skew = <7>;\n+\t\tcs1_dq14_rx_de-skew = <7>;\n+\t\tcs1_dq14_tx_de-skew = <8>;\n+\t\tcs1_dq15_rx_de-skew = <7>;\n+\t\tcs1_dq15_tx_de-skew = <7>;\n+\t\tcs1_dqs1_rx_de-skew = <7>;\n+\t\tcs1_dqs1p_tx_de-skew = <9>;\n+\t\tcs1_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm2_rx_de-skew = <7>;\n+\t\tcs1_dm2_tx_de-skew = <8>;\n+\t\tcs1_dq16_rx_de-skew = <7>;\n+\t\tcs1_dq16_tx_de-skew = <8>;\n+\t\tcs1_dq17_rx_de-skew = <7>;\n+\t\tcs1_dq17_tx_de-skew = <8>;\n+\t\tcs1_dq18_rx_de-skew = <7>;\n+\t\tcs1_dq18_tx_de-skew = <8>;\n+\t\tcs1_dq19_rx_de-skew = <7>;\n+\t\tcs1_dq19_tx_de-skew = <8>;\n+\t\tcs1_dq20_rx_de-skew = <7>;\n+\t\tcs1_dq20_tx_de-skew = <8>;\n+\t\tcs1_dq21_rx_de-skew = <7>;\n+\t\tcs1_dq21_tx_de-skew = <8>;\n+\t\tcs1_dq22_rx_de-skew = <7>;\n+\t\tcs1_dq22_tx_de-skew = <8>;\n+\t\tcs1_dq23_rx_de-skew = <7>;\n+\t\tcs1_dq23_tx_de-skew = <8>;\n+\t\tcs1_dqs2_rx_de-skew = <6>;\n+\t\tcs1_dqs2p_tx_de-skew = <9>;\n+\t\tcs1_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm3_rx_de-skew = <7>;\n+\t\tcs1_dm3_tx_de-skew = <7>;\n+\t\tcs1_dq24_rx_de-skew = <7>;\n+\t\tcs1_dq24_tx_de-skew = <8>;\n+\t\tcs1_dq25_rx_de-skew = <7>;\n+\t\tcs1_dq25_tx_de-skew = <7>;\n+\t\tcs1_dq26_rx_de-skew = <7>;\n+\t\tcs1_dq26_tx_de-skew = <7>;\n+\t\tcs1_dq27_rx_de-skew = <7>;\n+\t\tcs1_dq27_tx_de-skew = <7>;\n+\t\tcs1_dq28_rx_de-skew = <7>;\n+\t\tcs1_dq28_tx_de-skew = <7>;\n+\t\tcs1_dq29_rx_de-skew = <7>;\n+\t\tcs1_dq29_tx_de-skew = <7>;\n+\t\tcs1_dq30_rx_de-skew = <7>;\n+\t\tcs1_dq30_tx_de-skew = <7>;\n+\t\tcs1_dq31_rx_de-skew = <7>;\n+\t\tcs1_dq31_tx_de-skew = <7>;\n+\t\tcs1_dqs3_rx_de-skew = <7>;\n+\t\tcs1_dqs3p_tx_de-skew = <9>;\n+\t\tcs1_dqs3n_tx_de-skew = <9>;\n+\t};\n+};\ndiff --git a/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\nnew file mode 100644\nindex 0000000000..72601a0904\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n@@ -0,0 +1,852 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd.\n+ * Author: Lin Huang <hl@rock-chips.com>\n+ */\n+\n+#include <linux/arm-smccc.h>\n+#include <linux/clk.h>\n+#include <linux/delay.h>\n+#include <linux/devfreq.h>\n+#include <linux/devfreq-event.h>\n+#include <linux/interrupt.h>\n+#include <linux/iversion.h>\n+#include <linux/mfd/syscon.h>\n+#include <linux/module.h>\n+#include <linux/of.h>\n+#include <linux/platform_device.h>\n+#include <linux/pm_opp.h>\n+#include <linux/regmap.h>\n+#include <linux/regulator/consumer.h>\n+#include <linux/rwsem.h>\n+#include <linux/suspend.h>\n+#include <linux/version.h>\n+\n+#include <soc/rockchip/rockchip_sip.h>\n+\n+#define DTS_PAR_OFFSET\t\t(4096)\n+\n+struct share_params {\n+\tu32 hz;\n+\tu32 lcdc_type;\n+\tu32 vop;\n+\tu32 vop_dclk_mode;\n+\tu32 sr_idle_en;\n+\tu32 addr_mcu_el3;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag1;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag0;\n+\tu32 complt_hwirq;\n+\t/* if need, add parameter after */\n+};\n+\n+static struct share_params *ddr_psci_param;\n+\n+/* hope this define can adapt all future platform */\n+static const char * const rk3328_dts_timing[] = {\n+\t\"ddr3_speed_bin\",\n+\t\"ddr4_speed_bin\",\n+\t\"pd_idle\",\n+\t\"sr_idle\",\n+\t\"sr_mc_gate_idle\",\n+\t\"srpd_lite_idle\",\n+\t\"standby_idle\",\n+\n+\t\"auto_pd_dis_freq\",\n+\t\"auto_sr_dis_freq\",\n+\t\"ddr3_dll_dis_freq\",\n+\t\"ddr4_dll_dis_freq\",\n+\t\"phy_dll_dis_freq\",\n+\n+\t\"ddr3_odt_dis_freq\",\n+\t\"phy_ddr3_odt_dis_freq\",\n+\t\"ddr3_drv\",\n+\t\"ddr3_odt\",\n+\t\"phy_ddr3_ca_drv\",\n+\t\"phy_ddr3_ck_drv\",\n+\t\"phy_ddr3_dq_drv\",\n+\t\"phy_ddr3_odt\",\n+\n+\t\"lpddr3_odt_dis_freq\",\n+\t\"phy_lpddr3_odt_dis_freq\",\n+\t\"lpddr3_drv\",\n+\t\"lpddr3_odt\",\n+\t\"phy_lpddr3_ca_drv\",\n+\t\"phy_lpddr3_ck_drv\",\n+\t\"phy_lpddr3_dq_drv\",\n+\t\"phy_lpddr3_odt\",\n+\n+\t\"lpddr4_odt_dis_freq\",\n+\t\"phy_lpddr4_odt_dis_freq\",\n+\t\"lpddr4_drv\",\n+\t\"lpddr4_dq_odt\",\n+\t\"lpddr4_ca_odt\",\n+\t\"phy_lpddr4_ca_drv\",\n+\t\"phy_lpddr4_ck_cs_drv\",\n+\t\"phy_lpddr4_dq_drv\",\n+\t\"phy_lpddr4_odt\",\n+\n+\t\"ddr4_odt_dis_freq\",\n+\t\"phy_ddr4_odt_dis_freq\",\n+\t\"ddr4_drv\",\n+\t\"ddr4_odt\",\n+\t\"phy_ddr4_ca_drv\",\n+\t\"phy_ddr4_ck_drv\",\n+\t\"phy_ddr4_dq_drv\",\n+\t\"phy_ddr4_odt\",\n+};\n+\n+static const char * const rk3328_dts_ca_timing[] = {\n+\t\"ddr3a1_ddr4a9_de-skew\",\n+\t\"ddr3a0_ddr4a10_de-skew\",\n+\t\"ddr3a3_ddr4a6_de-skew\",\n+\t\"ddr3a2_ddr4a4_de-skew\",\n+\t\"ddr3a5_ddr4a8_de-skew\",\n+\t\"ddr3a4_ddr4a5_de-skew\",\n+\t\"ddr3a7_ddr4a11_de-skew\",\n+\t\"ddr3a6_ddr4a7_de-skew\",\n+\t\"ddr3a9_ddr4a0_de-skew\",\n+\t\"ddr3a8_ddr4a13_de-skew\",\n+\t\"ddr3a11_ddr4a3_de-skew\",\n+\t\"ddr3a10_ddr4cs0_de-skew\",\n+\t\"ddr3a13_ddr4a2_de-skew\",\n+\t\"ddr3a12_ddr4ba1_de-skew\",\n+\t\"ddr3a15_ddr4odt0_de-skew\",\n+\t\"ddr3a14_ddr4a1_de-skew\",\n+\t\"ddr3ba1_ddr4a15_de-skew\",\n+\t\"ddr3ba0_ddr4bg0_de-skew\",\n+\t\"ddr3ras_ddr4cke_de-skew\",\n+\t\"ddr3ba2_ddr4ba0_de-skew\",\n+\t\"ddr3we_ddr4bg1_de-skew\",\n+\t\"ddr3cas_ddr4a12_de-skew\",\n+\t\"ddr3ckn_ddr4ckn_de-skew\",\n+\t\"ddr3ckp_ddr4ckp_de-skew\",\n+\t\"ddr3cke_ddr4a16_de-skew\",\n+\t\"ddr3odt0_ddr4a14_de-skew\",\n+\t\"ddr3cs0_ddr4act_de-skew\",\n+\t\"ddr3reset_ddr4reset_de-skew\",\n+\t\"ddr3cs1_ddr4cs1_de-skew\",\n+\t\"ddr3odt1_ddr4odt1_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs0_timing[] = {\n+\t\"cs0_dm0_rx_de-skew\",\n+\t\"cs0_dm0_tx_de-skew\",\n+\t\"cs0_dq0_rx_de-skew\",\n+\t\"cs0_dq0_tx_de-skew\",\n+\t\"cs0_dq1_rx_de-skew\",\n+\t\"cs0_dq1_tx_de-skew\",\n+\t\"cs0_dq2_rx_de-skew\",\n+\t\"cs0_dq2_tx_de-skew\",\n+\t\"cs0_dq3_rx_de-skew\",\n+\t\"cs0_dq3_tx_de-skew\",\n+\t\"cs0_dq4_rx_de-skew\",\n+\t\"cs0_dq4_tx_de-skew\",\n+\t\"cs0_dq5_rx_de-skew\",\n+\t\"cs0_dq5_tx_de-skew\",\n+\t\"cs0_dq6_rx_de-skew\",\n+\t\"cs0_dq6_tx_de-skew\",\n+\t\"cs0_dq7_rx_de-skew\",\n+\t\"cs0_dq7_tx_de-skew\",\n+\t\"cs0_dqs0_rx_de-skew\",\n+\t\"cs0_dqs0p_tx_de-skew\",\n+\t\"cs0_dqs0n_tx_de-skew\",\n+\n+\t\"cs0_dm1_rx_de-skew\",\n+\t\"cs0_dm1_tx_de-skew\",\n+\t\"cs0_dq8_rx_de-skew\",\n+\t\"cs0_dq8_tx_de-skew\",\n+\t\"cs0_dq9_rx_de-skew\",\n+\t\"cs0_dq9_tx_de-skew\",\n+\t\"cs0_dq10_rx_de-skew\",\n+\t\"cs0_dq10_tx_de-skew\",\n+\t\"cs0_dq11_rx_de-skew\",\n+\t\"cs0_dq11_tx_de-skew\",\n+\t\"cs0_dq12_rx_de-skew\",\n+\t\"cs0_dq12_tx_de-skew\",\n+\t\"cs0_dq13_rx_de-skew\",\n+\t\"cs0_dq13_tx_de-skew\",\n+\t\"cs0_dq14_rx_de-skew\",\n+\t\"cs0_dq14_tx_de-skew\",\n+\t\"cs0_dq15_rx_de-skew\",\n+\t\"cs0_dq15_tx_de-skew\",\n+\t\"cs0_dqs1_rx_de-skew\",\n+\t\"cs0_dqs1p_tx_de-skew\",\n+\t\"cs0_dqs1n_tx_de-skew\",\n+\n+\t\"cs0_dm2_rx_de-skew\",\n+\t\"cs0_dm2_tx_de-skew\",\n+\t\"cs0_dq16_rx_de-skew\",\n+\t\"cs0_dq16_tx_de-skew\",\n+\t\"cs0_dq17_rx_de-skew\",\n+\t\"cs0_dq17_tx_de-skew\",\n+\t\"cs0_dq18_rx_de-skew\",\n+\t\"cs0_dq18_tx_de-skew\",\n+\t\"cs0_dq19_rx_de-skew\",\n+\t\"cs0_dq19_tx_de-skew\",\n+\t\"cs0_dq20_rx_de-skew\",\n+\t\"cs0_dq20_tx_de-skew\",\n+\t\"cs0_dq21_rx_de-skew\",\n+\t\"cs0_dq21_tx_de-skew\",\n+\t\"cs0_dq22_rx_de-skew\",\n+\t\"cs0_dq22_tx_de-skew\",\n+\t\"cs0_dq23_rx_de-skew\",\n+\t\"cs0_dq23_tx_de-skew\",\n+\t\"cs0_dqs2_rx_de-skew\",\n+\t\"cs0_dqs2p_tx_de-skew\",\n+\t\"cs0_dqs2n_tx_de-skew\",\n+\n+\t\"cs0_dm3_rx_de-skew\",\n+\t\"cs0_dm3_tx_de-skew\",\n+\t\"cs0_dq24_rx_de-skew\",\n+\t\"cs0_dq24_tx_de-skew\",\n+\t\"cs0_dq25_rx_de-skew\",\n+\t\"cs0_dq25_tx_de-skew\",\n+\t\"cs0_dq26_rx_de-skew\",\n+\t\"cs0_dq26_tx_de-skew\",\n+\t\"cs0_dq27_rx_de-skew\",\n+\t\"cs0_dq27_tx_de-skew\",\n+\t\"cs0_dq28_rx_de-skew\",\n+\t\"cs0_dq28_tx_de-skew\",\n+\t\"cs0_dq29_rx_de-skew\",\n+\t\"cs0_dq29_tx_de-skew\",\n+\t\"cs0_dq30_rx_de-skew\",\n+\t\"cs0_dq30_tx_de-skew\",\n+\t\"cs0_dq31_rx_de-skew\",\n+\t\"cs0_dq31_tx_de-skew\",\n+\t\"cs0_dqs3_rx_de-skew\",\n+\t\"cs0_dqs3p_tx_de-skew\",\n+\t\"cs0_dqs3n_tx_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs1_timing[] = {\n+\t\"cs1_dm0_rx_de-skew\",\n+\t\"cs1_dm0_tx_de-skew\",\n+\t\"cs1_dq0_rx_de-skew\",\n+\t\"cs1_dq0_tx_de-skew\",\n+\t\"cs1_dq1_rx_de-skew\",\n+\t\"cs1_dq1_tx_de-skew\",\n+\t\"cs1_dq2_rx_de-skew\",\n+\t\"cs1_dq2_tx_de-skew\",\n+\t\"cs1_dq3_rx_de-skew\",\n+\t\"cs1_dq3_tx_de-skew\",\n+\t\"cs1_dq4_rx_de-skew\",\n+\t\"cs1_dq4_tx_de-skew\",\n+\t\"cs1_dq5_rx_de-skew\",\n+\t\"cs1_dq5_tx_de-skew\",\n+\t\"cs1_dq6_rx_de-skew\",\n+\t\"cs1_dq6_tx_de-skew\",\n+\t\"cs1_dq7_rx_de-skew\",\n+\t\"cs1_dq7_tx_de-skew\",\n+\t\"cs1_dqs0_rx_de-skew\",\n+\t\"cs1_dqs0p_tx_de-skew\",\n+\t\"cs1_dqs0n_tx_de-skew\",\n+\n+\t\"cs1_dm1_rx_de-skew\",\n+\t\"cs1_dm1_tx_de-skew\",\n+\t\"cs1_dq8_rx_de-skew\",\n+\t\"cs1_dq8_tx_de-skew\",\n+\t\"cs1_dq9_rx_de-skew\",\n+\t\"cs1_dq9_tx_de-skew\",\n+\t\"cs1_dq10_rx_de-skew\",\n+\t\"cs1_dq10_tx_de-skew\",\n+\t\"cs1_dq11_rx_de-skew\",\n+\t\"cs1_dq11_tx_de-skew\",\n+\t\"cs1_dq12_rx_de-skew\",\n+\t\"cs1_dq12_tx_de-skew\",\n+\t\"cs1_dq13_rx_de-skew\",\n+\t\"cs1_dq13_tx_de-skew\",\n+\t\"cs1_dq14_rx_de-skew\",\n+\t\"cs1_dq14_tx_de-skew\",\n+\t\"cs1_dq15_rx_de-skew\",\n+\t\"cs1_dq15_tx_de-skew\",\n+\t\"cs1_dqs1_rx_de-skew\",\n+\t\"cs1_dqs1p_tx_de-skew\",\n+\t\"cs1_dqs1n_tx_de-skew\",\n+\n+\t\"cs1_dm2_rx_de-skew\",\n+\t\"cs1_dm2_tx_de-skew\",\n+\t\"cs1_dq16_rx_de-skew\",\n+\t\"cs1_dq16_tx_de-skew\",\n+\t\"cs1_dq17_rx_de-skew\",\n+\t\"cs1_dq17_tx_de-skew\",\n+\t\"cs1_dq18_rx_de-skew\",\n+\t\"cs1_dq18_tx_de-skew\",\n+\t\"cs1_dq19_rx_de-skew\",\n+\t\"cs1_dq19_tx_de-skew\",\n+\t\"cs1_dq20_rx_de-skew\",\n+\t\"cs1_dq20_tx_de-skew\",\n+\t\"cs1_dq21_rx_de-skew\",\n+\t\"cs1_dq21_tx_de-skew\",\n+\t\"cs1_dq22_rx_de-skew\",\n+\t\"cs1_dq22_tx_de-skew\",\n+\t\"cs1_dq23_rx_de-skew\",\n+\t\"cs1_dq23_tx_de-skew\",\n+\t\"cs1_dqs2_rx_de-skew\",\n+\t\"cs1_dqs2p_tx_de-skew\",\n+\t\"cs1_dqs2n_tx_de-skew\",\n+\n+\t\"cs1_dm3_rx_de-skew\",\n+\t\"cs1_dm3_tx_de-skew\",\n+\t\"cs1_dq24_rx_de-skew\",\n+\t\"cs1_dq24_tx_de-skew\",\n+\t\"cs1_dq25_rx_de-skew\",\n+\t\"cs1_dq25_tx_de-skew\",\n+\t\"cs1_dq26_rx_de-skew\",\n+\t\"cs1_dq26_tx_de-skew\",\n+\t\"cs1_dq27_rx_de-skew\",\n+\t\"cs1_dq27_tx_de-skew\",\n+\t\"cs1_dq28_rx_de-skew\",\n+\t\"cs1_dq28_tx_de-skew\",\n+\t\"cs1_dq29_rx_de-skew\",\n+\t\"cs1_dq29_tx_de-skew\",\n+\t\"cs1_dq30_rx_de-skew\",\n+\t\"cs1_dq30_tx_de-skew\",\n+\t\"cs1_dq31_rx_de-skew\",\n+\t\"cs1_dq31_tx_de-skew\",\n+\t\"cs1_dqs3_rx_de-skew\",\n+\t\"cs1_dqs3p_tx_de-skew\",\n+\t\"cs1_dqs3n_tx_de-skew\",\n+};\n+\n+struct rk3328_ddr_dts_config_timing {\n+\tunsigned int ddr3_speed_bin;\n+\tunsigned int ddr4_speed_bin;\n+\tunsigned int pd_idle;\n+\tunsigned int sr_idle;\n+\tunsigned int sr_mc_gate_idle;\n+\tunsigned int srpd_lite_idle;\n+\tunsigned int standby_idle;\n+\n+\tunsigned int auto_pd_dis_freq;\n+\tunsigned int auto_sr_dis_freq;\n+\t/* for ddr3 only */\n+\tunsigned int ddr3_dll_dis_freq;\n+\t/* for ddr4 only */\n+\tunsigned int ddr4_dll_dis_freq;\n+\tunsigned int phy_dll_dis_freq;\n+\n+\tunsigned int ddr3_odt_dis_freq;\n+\tunsigned int phy_ddr3_odt_dis_freq;\n+\tunsigned int ddr3_drv;\n+\tunsigned int ddr3_odt;\n+\tunsigned int phy_ddr3_ca_drv;\n+\tunsigned int phy_ddr3_ck_drv;\n+\tunsigned int phy_ddr3_dq_drv;\n+\tunsigned int phy_ddr3_odt;\n+\n+\tunsigned int lpddr3_odt_dis_freq;\n+\tunsigned int phy_lpddr3_odt_dis_freq;\n+\tunsigned int lpddr3_drv;\n+\tunsigned int lpddr3_odt;\n+\tunsigned int phy_lpddr3_ca_drv;\n+\tunsigned int phy_lpddr3_ck_drv;\n+\tunsigned int phy_lpddr3_dq_drv;\n+\tunsigned int phy_lpddr3_odt;\n+\n+\tunsigned int lpddr4_odt_dis_freq;\n+\tunsigned int phy_lpddr4_odt_dis_freq;\n+\tunsigned int lpddr4_drv;\n+\tunsigned int lpddr4_dq_odt;\n+\tunsigned int lpddr4_ca_odt;\n+\tunsigned int phy_lpddr4_ca_drv;\n+\tunsigned int phy_lpddr4_ck_cs_drv;\n+\tunsigned int phy_lpddr4_dq_drv;\n+\tunsigned int phy_lpddr4_odt;\n+\n+\tunsigned int ddr4_odt_dis_freq;\n+\tunsigned int phy_ddr4_odt_dis_freq;\n+\tunsigned int ddr4_drv;\n+\tunsigned int ddr4_odt;\n+\tunsigned int phy_ddr4_ca_drv;\n+\tunsigned int phy_ddr4_ck_drv;\n+\tunsigned int phy_ddr4_dq_drv;\n+\tunsigned int phy_ddr4_odt;\n+\n+\tunsigned int ca_skew[15];\n+\tunsigned int cs0_skew[44];\n+\tunsigned int cs1_skew[44];\n+\n+\tunsigned int available;\n+};\n+\n+struct rk3328_ddr_de_skew_setting {\n+\tunsigned int ca_de_skew[30];\n+\tunsigned int cs0_de_skew[84];\n+\tunsigned int cs1_de_skew[84];\n+};\n+\n+struct rk3328_dmcfreq {\n+\tstruct device *dev;\n+\tstruct devfreq *devfreq;\n+\tstruct devfreq_simple_ondemand_data ondemand_data;\n+\tstruct clk *dmc_clk;\n+\tstruct devfreq_event_dev *edev;\n+\tstruct mutex lock;\n+\tstruct regulator *vdd_center;\n+\tunsigned long rate, target_rate;\n+\tunsigned long volt, target_volt;\n+\n+\tint (*set_auto_self_refresh)(u32 en);\n+};\n+\n+static void\n+rk3328_de_skew_setting_2_register(struct rk3328_ddr_de_skew_setting *de_skew,\n+\t\t\t\t  struct rk3328_ddr_dts_config_timing *tim)\n+{\n+\tu32 n;\n+\tu32 offset;\n+\tu32 shift;\n+\n+\tmemset_io(tim->ca_skew, 0, sizeof(tim->ca_skew));\n+\tmemset_io(tim->cs0_skew, 0, sizeof(tim->cs0_skew));\n+\tmemset_io(tim->cs1_skew, 0, sizeof(tim->cs1_skew));\n+\n+\t/* CA de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->ca_de_skew); n++) {\n+\t\toffset = n / 2;\n+\t\tshift = n % 2;\n+\t\t/* 0 => 4; 1 => 0 */\n+\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->ca_skew[offset] &= ~(0xf << shift);\n+\t\ttim->ca_skew[offset] |= (de_skew->ca_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS0 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs0_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs0_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs0_skew[offset] |= (de_skew->cs0_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS1 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs1_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs1_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs1_skew[offset] |= (de_skew->cs1_de_skew[n] << shift);\n+\t}\n+}\n+\n+static void of_get_rk3328_timings(struct device *dev,\n+\t\t\t\t  struct device_node *np, uint32_t *timing)\n+{\n+\tstruct device_node *np_tim;\n+\tu32 *p;\n+\tstruct rk3328_ddr_dts_config_timing *dts_timing;\n+\tstruct rk3328_ddr_de_skew_setting *de_skew;\n+\tint ret = 0;\n+\tu32 i;\n+\n+\tdts_timing =\n+\t\t(struct rk3328_ddr_dts_config_timing *)(timing +\n+\t\t\t\t\t\t\tDTS_PAR_OFFSET / 4);\n+\n+\tnp_tim = of_parse_phandle(np, \"ddr_timing\", 0);\n+\tif (!np_tim) {\n+\t\tret = -EINVAL;\n+\t\tgoto end;\n+\t}\n+\tde_skew = kmalloc(sizeof(*de_skew), GFP_KERNEL);\n+\tif (!de_skew) {\n+\t\tret = -ENOMEM;\n+\t\tgoto end;\n+\t}\n+\n+\tp = (u32 *)dts_timing;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->ca_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_ca_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_ca_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs0_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs0_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs0_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs1_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs1_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs1_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tif (!ret)\n+\t\trk3328_de_skew_setting_2_register(de_skew, dts_timing);\n+\n+\tkfree(de_skew);\n+end:\n+\tif (!ret) {\n+\t\tdts_timing->available = 1;\n+\t} else {\n+\t\tdts_timing->available = 0;\n+\t\tdev_err(dev, \"of_get_ddr_timings: fail\\n\");\n+\t}\n+\n+\tof_node_put(np_tim);\n+}\n+\n+static int rockchip_ddr_set_auto_self_refresh(uint32_t en)\n+{\n+\tstruct arm_smccc_res res;\n+\n+\tddr_psci_param->sr_idle_en = en;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR,\n+\t\t      0, 0, 0, 0, &res);\n+\n+\treturn res.a0;\n+}\n+\n+static int rk3328_dmc_init(struct platform_device *pdev,\n+\t\t\t   struct rk3328_dmcfreq *dmcfreq)\n+{\n+\tstruct arm_smccc_res res;\n+\tu32 size, page_num;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      0, 0, ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 || (res.a1 < 0x101)) {\n+\t\tdev_err(&pdev->dev,\n+\t\t\t\"trusted firmware need to update or is invalid\\n\");\n+\t\treturn -ENXIO;\n+\t}\n+\n+\tdev_notice(&pdev->dev, \"current ATF version 0x%lx\\n\", res.a1);\n+\n+\t/*\n+\t * first 4KB is used for interface parameters\n+\t * after 4KB * N is dts parameters\n+\t */\n+\tsize = sizeof(struct rk3328_ddr_dts_config_timing);\n+\tpage_num = DIV_ROUND_UP(size, 4096) + 1;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n+\t\t      page_num, SHARE_PAGE_TYPE_DDR, 0,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 != 0) {\n+\t\tdev_err(&pdev->dev, \"no ATF memory for init\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tddr_psci_param = ioremap(res.a1, page_num << 12);\n+\tof_get_rk3328_timings(&pdev->dev, pdev->dev.of_node,\n+\t\t\t      (uint32_t *)ddr_psci_param);\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_INIT,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0) {\n+\t\tdev_err(&pdev->dev, \"Rockchip dram init error %lx\\n\", res.a0);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tdmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh;\n+\n+\treturn 0;\n+}\n+\n+static int rk3328_dmcfreq_target(struct device *dev, unsigned long *freq,\n+\t\t\t\t u32 flags)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct dev_pm_opp *opp;\n+\tunsigned long old_clk_rate = dmcfreq->rate;\n+\tunsigned long target_volt, target_rate;\n+\tint err;\n+\n+\topp = devfreq_recommended_opp(dev, freq, flags);\n+\tif (IS_ERR(opp))\n+\t\treturn PTR_ERR(opp);\n+\n+\ttarget_rate = dev_pm_opp_get_freq(opp);\n+\ttarget_volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\tif (dmcfreq->rate == target_rate)\n+\t\treturn 0;\n+\n+\tmutex_lock(&dmcfreq->lock);\n+\n+\t/*\n+\t * If frequency scaling from low to high, adjust voltage first.\n+\t * If frequency scaling from high to low, adjust frequency first.\n+\t */\n+\tif (old_clk_rate < target_rate) {\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\t\tif (err) {\n+\t\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\",\n+\t\t\t\ttarget_volt);\n+\t\t\tgoto out;\n+\t\t}\n+\t}\n+\n+\terr = clk_set_rate(dmcfreq->dmc_clk, target_rate);\n+\tif (err) {\n+\t\tdev_err(dev, \"Cannot set frequency %lu (%d)\\n\", target_rate,\n+\t\t\terr);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t}\n+\n+\t/*\n+\t * Check the dpll rate,\n+\t * There only two result we will get,\n+\t * 1. Ddr frequency scaling fail, we still get the old rate.\n+\t * 2. Ddr frequency scaling sucessful, we get the rate we set.\n+\t */\n+\tdmcfreq->rate = clk_get_rate(dmcfreq->dmc_clk);\n+\n+\t/* If get the incorrect rate, set voltage to old value. */\n+\tif (dmcfreq->rate != target_rate) {\n+\t\tdev_err(dev, \"Got wrong frequency, Request %lu, Current %lu\\n\",\n+\t\t\ttarget_rate, dmcfreq->rate);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t} else if (old_clk_rate > target_rate)\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\tif (err)\n+\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\", target_volt);\n+\n+\tdmcfreq->rate = target_rate;\n+\tdmcfreq->volt = target_volt;\n+\n+out:\n+\tmutex_unlock(&dmcfreq->lock);\n+\treturn err;\n+}\n+\n+static int rk3328_dmcfreq_get_dev_status(struct device *dev,\n+\t\t\t\t\t struct devfreq_dev_status *stat)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct devfreq_event_data edata;\n+\tint ret = 0;\n+\n+\tret = devfreq_event_get_event(dmcfreq->edev, &edata);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tstat->current_frequency = dmcfreq->rate;\n+\tstat->busy_time = edata.load_count;\n+\tstat->total_time = edata.total_count;\n+\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_get_cur_freq(struct device *dev, unsigned long *freq)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\n+\t*freq = dmcfreq->rate;\n+\n+\treturn 0;\n+}\n+\n+static struct devfreq_dev_profile rk3328_devfreq_dmc_profile = {\n+\t.polling_ms\t= 200,\n+\t.target\t\t= rk3328_dmcfreq_target,\n+\t.get_dev_status\t= rk3328_dmcfreq_get_dev_status,\n+\t.get_cur_freq\t= rk3328_dmcfreq_get_cur_freq,\n+};\n+\n+static __maybe_unused int rk3328_dmcfreq_suspend(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_disable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to disable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_suspend_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to suspend the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static __maybe_unused int rk3328_dmcfreq_resume(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_enable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_resume_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to resume the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\treturn ret;\n+}\n+\n+static SIMPLE_DEV_PM_OPS(rk3328_dmcfreq_pm, rk3328_dmcfreq_suspend,\n+\t\t\t rk3328_dmcfreq_resume);\n+\n+static int rk3328_dmcfreq_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct device_node *np = pdev->dev.of_node;\n+\tstruct rk3328_dmcfreq *data;\n+\tstruct dev_pm_opp *opp;\n+\tint ret;\n+\n+\tdata = devm_kzalloc(dev, sizeof(struct rk3328_dmcfreq), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tmutex_init(&data->lock);\n+\n+\tdata->vdd_center = devm_regulator_get(dev, \"center\");\n+\tif (IS_ERR(data->vdd_center)) {\n+\t\tif (PTR_ERR(data->vdd_center) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the regulator \\\"center\\\"\\n\");\n+\t\treturn PTR_ERR(data->vdd_center);\n+\t}\n+\n+\tdata->dmc_clk = devm_clk_get(dev, \"dmc_clk\");\n+\tif (IS_ERR(data->dmc_clk)) {\n+\t\tif (PTR_ERR(data->dmc_clk) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the clk dmc_clk\\n\");\n+\t\treturn PTR_ERR(data->dmc_clk);\n+\t}\n+\n+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, 0);\n+#else\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, \"devfreq-events\", 0);\n+#endif\n+\tif (IS_ERR(data->edev))\n+\t\treturn -EPROBE_DEFER;\n+\n+\tret = devfreq_event_enable_edev(data->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = rk3328_dmc_init(pdev, data);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/*\n+\t * We add a devfreq driver to our parent since it has a device tree node\n+\t * with operating points.\n+\t */\n+\tif (dev_pm_opp_of_add_table(dev)) {\n+\t\tdev_err(dev, \"Invalid operating-points in device tree.\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tof_property_read_u32(np, \"upthreshold\",\n+\t\t\t     &data->ondemand_data.upthreshold);\n+\tof_property_read_u32(np, \"downdifferential\",\n+\t\t\t     &data->ondemand_data.downdifferential);\n+\n+\tdata->rate = clk_get_rate(data->dmc_clk);\n+\n+\topp = devfreq_recommended_opp(dev, &data->rate, 0);\n+\tif (IS_ERR(opp)) {\n+\t\tret = PTR_ERR(opp);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdata->rate = dev_pm_opp_get_freq(opp);\n+\tdata->volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\trk3328_devfreq_dmc_profile.initial_freq = data->rate;\n+\n+\tdata->devfreq = devm_devfreq_add_device(dev,\n+\t\t\t\t\t   &rk3328_devfreq_dmc_profile,\n+\t\t\t\t\t   DEVFREQ_GOV_SIMPLE_ONDEMAND,\n+\t\t\t\t\t   &data->ondemand_data);\n+\tif (IS_ERR(data->devfreq)) {\n+\t\tret = PTR_ERR(data->devfreq);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdevm_devfreq_register_opp_notifier(dev, data->devfreq);\n+\n+\tdata->dev = dev;\n+\tplatform_set_drvdata(pdev, data);\n+\n+\treturn 0;\n+\n+err_free_opp:\n+\tdev_pm_opp_of_remove_table(&pdev->dev);\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_remove(struct platform_device *pdev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev);\n+\n+\t/*\n+\t * Before remove the opp table we need to unregister the opp notifier.\n+\t */\n+\tdevm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq);\n+\tdev_pm_opp_of_remove_table(dmcfreq->dev);\n+\n+\treturn 0;\n+}\n+\n+static const struct of_device_id rk3328dmc_devfreq_of_match[] = {\n+\t{ .compatible = \"rockchip,rk3328-dmc\" },\n+\t{ },\n+};\n+MODULE_DEVICE_TABLE(of, rk3328dmc_devfreq_of_match);\n+\n+static struct platform_driver rk3328_dmcfreq_driver = {\n+\t.probe\t= rk3328_dmcfreq_probe,\n+\t.remove = rk3328_dmcfreq_remove,\n+\t.driver = {\n+\t\t.name\t= \"rk3328-dmc-freq\",\n+\t\t.pm\t= &rk3328_dmcfreq_pm,\n+\t\t.of_match_table = rk3328dmc_devfreq_of_match,\n+\t},\n+};\n+module_platform_driver(rk3328_dmcfreq_driver);\n+\n+MODULE_LICENSE(\"GPL v2\");\n+MODULE_AUTHOR(\"Lin Huang <hl@rock-chips.com>\");\n+MODULE_DESCRIPTION(\"RK3328 dmcfreq driver with devfreq framework\");\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\nnew file mode 100644\nindex 0000000000..b065432e77\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n@@ -0,0 +1,63 @@\n+/*\n+ *\n+ * Copyright (C) 2017 ROCKCHIP, Inc.\n+ *\n+ * This software is licensed under the terms of the GNU General Public\n+ * License version 2, as published by the Free Software Foundation, and\n+ * may be copied, distributed, and modified under those terms.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ */\n+\n+#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+#define _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+\n+#define DDR2_DEFAULT\t(0)\n+\n+#define DDR3_800D\t(0)\t/* 5-5-5 */\n+#define DDR3_800E\t(1)\t/* 6-6-6 */\n+#define DDR3_1066E\t(2)\t/* 6-6-6 */\n+#define DDR3_1066F\t(3)\t/* 7-7-7 */\n+#define DDR3_1066G\t(4)\t/* 8-8-8 */\n+#define DDR3_1333F\t(5)\t/* 7-7-7 */\n+#define DDR3_1333G\t(6)\t/* 8-8-8 */\n+#define DDR3_1333H\t(7)\t/* 9-9-9 */\n+#define DDR3_1333J\t(8)\t/* 10-10-10 */\n+#define DDR3_1600G\t(9)\t/* 8-8-8 */\n+#define DDR3_1600H\t(10)\t/* 9-9-9 */\n+#define DDR3_1600J\t(11)\t/* 10-10-10 */\n+#define DDR3_1600K\t(12)\t/* 11-11-11 */\n+#define DDR3_1866J\t(13)\t/* 10-10-10 */\n+#define DDR3_1866K\t(14)\t/* 11-11-11 */\n+#define DDR3_1866L\t(15)\t/* 12-12-12 */\n+#define DDR3_1866M\t(16)\t/* 13-13-13 */\n+#define DDR3_2133K\t(17)\t/* 11-11-11 */\n+#define DDR3_2133L\t(18)\t/* 12-12-12 */\n+#define DDR3_2133M\t(19)\t/* 13-13-13 */\n+#define DDR3_2133N\t(20)\t/* 14-14-14 */\n+#define DDR3_DEFAULT\t(21)\n+#define DDR_DDR2\t(22)\n+#define DDR_LPDDR\t(23)\n+#define DDR_LPDDR2\t(24)\n+\n+#define DDR4_1600J\t(0)\t/* 10-10-10 */\n+#define DDR4_1600K\t(1)\t/* 11-11-11 */\n+#define DDR4_1600L\t(2)\t/* 12-12-12 */\n+#define DDR4_1866L\t(3)\t/* 12-12-12 */\n+#define DDR4_1866M\t(4)\t/* 13-13-13 */\n+#define DDR4_1866N\t(5)\t/* 14-14-14 */\n+#define DDR4_2133N\t(6)\t/* 14-14-14 */\n+#define DDR4_2133P\t(7)\t/* 15-15-15 */\n+#define DDR4_2133R\t(8)\t/* 16-16-16 */\n+#define DDR4_2400P\t(9)\t/* 15-15-15 */\n+#define DDR4_2400R\t(10)\t/* 16-16-16 */\n+#define DDR4_2400U\t(11)\t/* 18-18-18 */\n+#define DDR4_DEFAULT\t(12)\n+\n+#define PAUSE_CPU_STACK_SIZE\t16\n+\n+#endif\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\nnew file mode 100644\nindex 0000000000..171f41c256\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n@@ -0,0 +1,159 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#ifndef _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+#define _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+\n+#define DDR3_DS_34ohm\t\t\t(34)\n+#define DDR3_DS_40ohm\t\t\t(40)\n+\n+#define DDR3_ODT_DIS\t\t\t(0)\n+#define DDR3_ODT_40ohm\t\t\t(40)\n+#define DDR3_ODT_60ohm\t\t\t(60)\n+#define DDR3_ODT_120ohm\t\t\t(120)\n+\n+#define LP2_DS_34ohm\t\t\t(34)\n+#define LP2_DS_40ohm\t\t\t(40)\n+#define LP2_DS_48ohm\t\t\t(48)\n+#define LP2_DS_60ohm\t\t\t(60)\n+#define LP2_DS_68_6ohm\t\t\t(68)\t/* optional */\n+#define LP2_DS_80ohm\t\t\t(80)\n+#define LP2_DS_120ohm\t\t\t(120)\t/* optional */\n+\n+#define LP3_DS_34ohm\t\t\t(34)\n+#define LP3_DS_40ohm\t\t\t(40)\n+#define LP3_DS_48ohm\t\t\t(48)\n+#define LP3_DS_60ohm\t\t\t(60)\n+#define LP3_DS_80ohm\t\t\t(80)\n+#define LP3_DS_34D_40U\t\t\t(3440)\n+#define LP3_DS_40D_48U\t\t\t(4048)\n+#define LP3_DS_34D_48U\t\t\t(3448)\n+\n+#define LP3_ODT_DIS\t\t\t(0)\n+#define LP3_ODT_60ohm\t\t\t(60)\n+#define LP3_ODT_120ohm\t\t\t(120)\n+#define LP3_ODT_240ohm\t\t\t(240)\n+\n+#define LP4_PDDS_40ohm\t\t\t(40)\n+#define LP4_PDDS_48ohm\t\t\t(48)\n+#define LP4_PDDS_60ohm\t\t\t(60)\n+#define LP4_PDDS_80ohm\t\t\t(80)\n+#define LP4_PDDS_120ohm\t\t\t(120)\n+#define LP4_PDDS_240ohm\t\t\t(240)\n+\n+#define LP4_DQ_ODT_40ohm\t\t(40)\n+#define LP4_DQ_ODT_48ohm\t\t(48)\n+#define LP4_DQ_ODT_60ohm\t\t(60)\n+#define LP4_DQ_ODT_80ohm\t\t(80)\n+#define LP4_DQ_ODT_120ohm\t\t(120)\n+#define LP4_DQ_ODT_240ohm\t\t(240)\n+#define LP4_DQ_ODT_DIS\t\t\t(0)\n+\n+#define LP4_CA_ODT_40ohm\t\t(40)\n+#define LP4_CA_ODT_48ohm\t\t(48)\n+#define LP4_CA_ODT_60ohm\t\t(60)\n+#define LP4_CA_ODT_80ohm\t\t(80)\n+#define LP4_CA_ODT_120ohm\t\t(120)\n+#define LP4_CA_ODT_240ohm\t\t(240)\n+#define LP4_CA_ODT_DIS\t\t\t(0)\n+\n+#define DDR4_DS_34ohm\t\t\t(34)\n+#define DDR4_DS_48ohm\t\t\t(48)\n+#define DDR4_RTT_NOM_DIS\t\t(0)\n+#define DDR4_RTT_NOM_60ohm\t\t(60)\n+#define DDR4_RTT_NOM_120ohm\t\t(120)\n+#define DDR4_RTT_NOM_40ohm\t\t(40)\n+#define DDR4_RTT_NOM_240ohm\t\t(240)\n+#define DDR4_RTT_NOM_48ohm\t\t(48)\n+#define DDR4_RTT_NOM_80ohm\t\t(80)\n+#define DDR4_RTT_NOM_34ohm\t\t(34)\n+\n+#define PHY_DDR3_RON_RTT_DISABLE\t(0)\n+#define PHY_DDR3_RON_RTT_451ohm\t\t(1)\n+#define PHY_DDR3_RON_RTT_225ohm\t\t(2)\n+#define PHY_DDR3_RON_RTT_150ohm\t\t(3)\n+#define PHY_DDR3_RON_RTT_112ohm\t\t(4)\n+#define PHY_DDR3_RON_RTT_90ohm\t\t(5)\n+#define PHY_DDR3_RON_RTT_75ohm\t\t(6)\n+#define PHY_DDR3_RON_RTT_64ohm\t\t(7)\n+#define PHY_DDR3_RON_RTT_56ohm\t\t(16)\n+#define PHY_DDR3_RON_RTT_50ohm\t\t(17)\n+#define PHY_DDR3_RON_RTT_45ohm\t\t(18)\n+#define PHY_DDR3_RON_RTT_41ohm\t\t(19)\n+#define PHY_DDR3_RON_RTT_37ohm\t\t(20)\n+#define PHY_DDR3_RON_RTT_34ohm\t\t(21)\n+#define PHY_DDR3_RON_RTT_33ohm\t\t(22)\n+#define PHY_DDR3_RON_RTT_30ohm\t\t(23)\n+#define PHY_DDR3_RON_RTT_28ohm\t\t(24)\n+#define PHY_DDR3_RON_RTT_26ohm\t\t(25)\n+#define PHY_DDR3_RON_RTT_25ohm\t\t(26)\n+#define PHY_DDR3_RON_RTT_23ohm\t\t(27)\n+#define PHY_DDR3_RON_RTT_22ohm\t\t(28)\n+#define PHY_DDR3_RON_RTT_21ohm\t\t(29)\n+#define PHY_DDR3_RON_RTT_20ohm\t\t(30)\n+#define PHY_DDR3_RON_RTT_19ohm\t\t(31)\n+\n+#define PHY_DDR4_LPDDR3_RON_RTT_DISABLE (0)\n+#define PHY_DDR4_LPDDR3_RON_RTT_480ohm\t(1)\n+#define PHY_DDR4_LPDDR3_RON_RTT_240ohm\t(2)\n+#define PHY_DDR4_LPDDR3_RON_RTT_160ohm\t(3)\n+#define PHY_DDR4_LPDDR3_RON_RTT_120ohm\t(4)\n+#define PHY_DDR4_LPDDR3_RON_RTT_96ohm\t(5)\n+#define PHY_DDR4_LPDDR3_RON_RTT_80ohm\t(6)\n+#define PHY_DDR4_LPDDR3_RON_RTT_68ohm\t(7)\n+#define PHY_DDR4_LPDDR3_RON_RTT_60ohm\t(16)\n+#define PHY_DDR4_LPDDR3_RON_RTT_53ohm\t(17)\n+#define PHY_DDR4_LPDDR3_RON_RTT_48ohm\t(18)\n+#define PHY_DDR4_LPDDR3_RON_RTT_43ohm\t(19)\n+#define PHY_DDR4_LPDDR3_RON_RTT_40ohm\t(20)\n+#define PHY_DDR4_LPDDR3_RON_RTT_37ohm\t(21)\n+#define PHY_DDR4_LPDDR3_RON_RTT_34ohm\t(22)\n+#define PHY_DDR4_LPDDR3_RON_RTT_32ohm\t(23)\n+#define PHY_DDR4_LPDDR3_RON_RTT_30ohm\t(24)\n+#define PHY_DDR4_LPDDR3_RON_RTT_28ohm\t(25)\n+#define PHY_DDR4_LPDDR3_RON_RTT_26ohm\t(26)\n+#define PHY_DDR4_LPDDR3_RON_RTT_25ohm\t(27)\n+#define PHY_DDR4_LPDDR3_RON_RTT_24ohm\t(28)\n+#define PHY_DDR4_LPDDR3_RON_RTT_22ohm\t(29)\n+#define PHY_DDR4_LPDDR3_RON_RTT_21ohm\t(30)\n+#define PHY_DDR4_LPDDR3_RON_RTT_20ohm\t(31)\n+\n+#endif /*_DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H*/\ndiff --git a/target/linux/rockchip/image/Makefile b/target/linux/rockchip/image/Makefile\nindex f5fdff637f..5791f5c064 100644\n--- a/target/linux/rockchip/image/Makefile\n+++ b/target/linux/rockchip/image/Makefile\n@@ -45,6 +45,26 @@ define Build/pine64-img\n \tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-u-boot.itb of=\"$@\" seek=16384 conv=notrunc\n endef\n \n+define Build/pine64-bin\n+\t# Typical Rockchip boot flow with Rockchip miniloader\n+\t# Rockchp idbLoader which is combinded by Rockchip ddr init bin\n+\t# and miniloader bin from Rockchip rkbin project\n+\n+\t# Generate a new partition table in $@ with 32 MiB of alignment\n+\t# padding for the idbloader, uboot and trust image to fit:\n+\t# http://opensource.rock-chips.com/wiki_Boot_option#Boot_flow\n+\t$(SCRIPT_DIR)/gen_image_generic.sh \\\n+\t\t$@ \\\n+\t\t$(CONFIG_TARGET_KERNEL_PARTSIZE) $@.boot \\\n+\t\t$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(IMAGE_ROOTFS) \\\n+\t\t32768\n+\n+\t# Copy the idbloader, uboot and trust image to the image at sector 0x40, 0x4000 and 0x6000\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-idbloader.bin of=\"$@\" seek=64 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-uboot.img of=\"$@\" seek=16384 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-trust.bin of=\"$@\" seek=24576 conv=notrunc\n+endef\n+\n ### Devices ###\n define Device/Default\n   PROFILES := Default\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex 24b1c38137..b3ef5a28d4 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -7,11 +7,21 @@ define Device/friendlyarm_nanopi-r2s\n   DEVICE_MODEL := NanoPi R2S\n   SOC := rk3328\n   UBOOT_DEVICE_NAME := nanopi-r2s-rk3328\n-  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-img | gzip | append-metadata\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-bin | gzip | append-metadata\n   DEVICE_PACKAGES := kmod-usb-net-rtl8152\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\n \n+define Device/friendlyarm_nanopi-r4s\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi R4S\n+  SOC := rk3399\n+  UBOOT_DEVICE_NAME := nanopi-r4s-rk3399\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-r8169 -urngd\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-r4s\n+\n define Device/pine64_rockpro64\n   DEVICE_VENDOR := Pine64\n   DEVICE_MODEL := RockPro64\ndiff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript\nnew file mode 100644\nindex 0000000000..abe9c24ee3\n--- /dev/null\n+++ b/target/linux/rockchip/image/nanopi-r4s.bootscript\n@@ -0,0 +1,8 @@\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\ndiff --git a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nnew file mode 100644\nindex 0000000000..897a42fea2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -134,6 +134,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..69c880db9f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,218 @@\n+From 11c2b38cf0a04b0edb3eabae24fb1484489725e2 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 07:12:30 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 178 ++++++++++++++++++\n+ 2 files changed, 179 insertions(+)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-le\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..28798047fd\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -165,6 +165,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..16ca6279e7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -398,6 +398,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..1de560e33f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -297,6 +297,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1906,6 +1906,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff --git a/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\nnew file mode 100644\nindex 0000000000..a4b8340be4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n@@ -0,0 +1,44 @@\n+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 13:53:25 +0800\n+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/Kconfig      |  18 +-\n+ drivers/devfreq/Makefile     |   1 +\n+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++\n+ 3 files changed, 862 insertions(+), 3 deletions(-)\n+ create mode 100644 drivers/devfreq/rk3328_dmc.c\n+\n+--- a/drivers/devfreq/Kconfig\n++++ b/drivers/devfreq/Kconfig\n+@@ -131,6 +131,18 @@ config ARM_TEGRA20_DEVFREQ\n+ \t  It reads Memory Controller counters and adjusts the operating\n+ \t  frequencies and voltages with OPP support.\n+ \n++config ARM_RK3328_DMC_DEVFREQ\n++\ttristate \"ARM RK3328 DMC DEVFREQ Driver\"\n++\tdepends on ARCH_ROCKCHIP\n++\tselect DEVFREQ_EVENT_ROCKCHIP_DFI\n++\tselect DEVFREQ_GOV_SIMPLE_ONDEMAND\n++\tselect PM_DEVFREQ_EVENT\n++\tselect PM_OPP\n++\thelp\n++\t  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).\n++\t  It sets the frequency for the memory controller and reads the usage counts\n++\t  from hardware.\n++\n+ config ARM_RK3399_DMC_DEVFREQ\n+ \ttristate \"ARM RK3399 DMC DEVFREQ Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \\\n+--- a/drivers/devfreq/Makefile\n++++ b/drivers/devfreq/Makefile\n+@@ -12,6 +12,7 @@ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)\t+=\n+ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ)\t+= imx-bus.o\n+ obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ)\t+= imx8m-ddrc.o\n+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)\t+= rk3399_dmc.o\n++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)\t+= rk3328_dmc.o\n+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)\t\t+= tegra30-devfreq.o\n+ obj-$(CONFIG_ARM_TEGRA20_DEVFREQ)\t+= tegra20-devfreq.o\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\nnew file mode 100644\nindex 0000000000..4e688f8eb4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n@@ -0,0 +1,218 @@\n+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001\n+From: Tang Yun ping <typ@rock-chips.com>\n+Date: Thu, 4 May 2017 20:49:58 +0800\n+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2\n+ APIs\n+\n+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.\n+\n+Signed-off-by: Tang Yun ping <typ@rock-chips.com>\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++\n+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-\n+ drivers/clk/rockchip/clk.h          |   3 +-\n+ include/soc/rockchip/rockchip_sip.h |  11 +++\n+ 4 files changed, 147 insertions(+), 4 deletions(-)\n+\n+diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c\n+index 9273bce4d7b6..555aaf4e758d 100644\n+--- a/drivers/clk/rockchip/clk-ddr.c\n++++ b/drivers/clk/rockchip/clk-ddr.c\n+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddrclk_sip_ops = {\n+ \t.get_parent = rockchip_ddrclk_get_parent,\n+ };\n+ \n++/* See v4.4/include/dt-bindings/display/rk_fb.h */\n++#define SCREEN_NULL\t\t\t0\n++#define SCREEN_HDMI\t\t\t6\n++\n++static inline int rk_drm_get_lcdc_type(void)\n++{\n++\treturn SCREEN_NULL;\n++}\n++\n++struct share_params {\n++\tu32 hz;\n++\tu32 lcdc_type;\n++\tu32 vop;\n++\tu32 vop_dclk_mode;\n++\tu32 sr_idle_en;\n++\tu32 addr_mcu_el3;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag1;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag0;\n++\tu32 complt_hwirq;\n++\t /* if need, add parameter after */\n++};\n++\n++struct rockchip_ddrclk_data {\n++\tu32 inited_flag;\n++\tvoid __iomem *share_memory;\n++};\n++\n++static struct rockchip_ddrclk_data ddr_data;\n++\n++static void rockchip_ddrclk_data_init(void)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n++\t\t      1, SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif (!res.a0) {\n++\t\tddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);\n++\t\tddr_data.inited_flag = 1;\n++\t}\n++}\n++\n++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t   unsigned long drate,\n++\t\t\t\t\t   unsigned long prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = drate;\n++\tp->lcdc_type = rk_drm_get_lcdc_type();\n++\tp->wait_flag1 = 1;\n++\tp->wait_flag0 = 1;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif ((int)res.a1 == -6) {\n++\t\tpr_err(\"%s: timeout, drate = %lumhz\\n\", __func__, drate/1000000);\n++\t\t/* TODO: rockchip_dmcfreq_wait_complete(); */\n++\t}\n++\n++\treturn res.a0;\n++}\n++\n++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2\n++\t\t\t(struct clk_hw *hw, unsigned long parent_rate)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t      unsigned long rate,\n++\t\t\t\t\t      unsigned long *prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = rate;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {\n++\t.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,\n++\t.set_rate = rockchip_ddrclk_sip_set_rate_v2,\n++\t.round_rate = rockchip_ddrclk_sip_round_rate_v2,\n++\t.get_parent = rockchip_ddrclk_get_parent,\n++};\n++\n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+ \t\t\t\t\t u8 num_parents, int mux_offset,\n+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \tcase ROCKCHIP_DDRCLK_SIP:\n+ \t\tinit.ops = &rockchip_ddrclk_sip_ops;\n+ \t\tbreak;\n++\tcase ROCKCHIP_DDRCLK_SIP_V2:\n++\t\tinit.ops = &rockchip_ddrclk_sip_ops_v2;\n++\t\tbreak;\n+ \tdefault:\n+ \t\tpr_err(\"%s: unsupported ddrclk type %d\\n\", __func__, ddr_flag);\n+ \t\tkfree(ddrclk);\n+diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c\n+index c186a1985bf4..ac6e6163a232 100644\n+--- a/drivers/clk/rockchip/clk-rk3328.c\n++++ b/drivers/clk/rockchip/clk-rk3328.c\n+@@ -314,9 +314,10 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {\n+ \t\t\tRK3328_CLKGATE_CON(14), 1, GFLAGS),\n+ \n+ \t/* PD_DDR */\n+-\tCOMPOSITE(0, \"clk_ddr\", mux_ddrphy_p, CLK_IGNORE_UNUSED,\n+-\t\t\tRK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,\n+-\t\t\tRK3328_CLKGATE_CON(0), 4, GFLAGS),\n++\tCOMPOSITE_DDRCLK(SCLK_DDRCLK, \"sclk_ddrc\", mux_ddrphy_p, 0,\n++\t\t\tRK3328_CLKSEL_CON(3), 8, 2, 0, 3,\n++\t\t\tROCKCHIP_DDRCLK_SIP_V2),\n++\n+ \tGATE(0, \"clk_ddrmsch\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+ \t\t\tRK3328_CLKGATE_CON(18), 6, GFLAGS),\n+ \tGATE(0, \"clk_ddrupctl\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h\n+index 2271a84124b0..7405aaf965ec 100644\n+--- a/drivers/clk/rockchip/clk.h\n++++ b/drivers/clk/rockchip/clk.h\n+@@ -362,7 +362,8 @@ struct clk *rockchip_clk_register_mmc(const char *name,\n+  * DDRCLK flags, including method of setting the rate\n+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.\n+  */\n+-#define ROCKCHIP_DDRCLK_SIP\t\tBIT(0)\n++#define ROCKCHIP_DDRCLK_SIP\t\t0x01\n++#define ROCKCHIP_DDRCLK_SIP_V2\t\t0x03\n+ \n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h\n+index c46a9ae2a2ab..fa7e0a2d72cc 100644\n+--- a/include/soc/rockchip/rockchip_sip.h\n++++ b/include/soc/rockchip/rockchip_sip.h\n+@@ -16,5 +16,16 @@\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ\t0x06\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM\t0x07\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD\t0x08\n++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION\t0x08\n++\n++#define ROCKCHIP_SIP_SHARE_MEM\t\t\t0x82000009\n++\n++/* Share mem page types */\n++typedef enum {\n++    SHARE_PAGE_TYPE_INVALID = 0,\n++    SHARE_PAGE_TYPE_UARTDBG,\n++    SHARE_PAGE_TYPE_DDR,\n++    SHARE_PAGE_TYPE_MAX,\n++} share_page_type_t;\n+ \n+ #endif\ndiff --git a/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\nnew file mode 100644\nindex 0000000000..283e4abd2f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n@@ -0,0 +1,662 @@\n+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 12:49:48 +0800\n+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---\n+ 1 file changed, 505 insertions(+), 49 deletions(-)\n+\n+--- a/drivers/devfreq/event/rockchip-dfi.c\n++++ b/drivers/devfreq/event/rockchip-dfi.c\n+@@ -18,25 +18,66 @@\n+ #include <linux/list.h>\n+ #include <linux/of.h>\n+ \n+-#include <soc/rockchip/rk3399_grf.h>\n+-\n+-#define RK3399_DMC_NUM_CH\t2\n++#define PX30_PMUGRF_OS_REG2\t\t0x208\n+ \n++#define RK3128_GRF_SOC_CON0\t\t0x140\n++#define RK3128_GRF_OS_REG1\t\t0x1cc\n++#define RK3128_GRF_DFI_WRNUM\t\t0x220\n++#define RK3128_GRF_DFI_RDNUM\t\t0x224\n++#define RK3128_GRF_DFI_TIMERVAL\t\t0x22c\n++#define RK3128_DDR_MONITOR_EN\t\t((1 << (16 + 6)) + (1 << 6))\n++#define RK3128_DDR_MONITOR_DISB\t\t((1 << (16 + 6)) + (0 << 6))\n++\n++#define RK3288_PMU_SYS_REG2\t\t0x9c\n++#define RK3288_GRF_SOC_CON4\t\t0x254\n++#define RK3288_GRF_SOC_STATUS(n)\t(0x280 + (n) * 4)\n++#define RK3288_DFI_EN\t\t\t(0x30003 << 14)\n++#define RK3288_DFI_DIS\t\t\t(0x30000 << 14)\n++#define RK3288_LPDDR_SEL\t\t(0x10001 << 13)\n++#define RK3288_DDR3_SEL\t\t\t(0x10000 << 13)\n++\n++#define RK3328_GRF_OS_REG2\t\t0x5d0\n++\n++#define RK3368_GRF_DDRC0_CON0\t\t0x600\n++#define RK3368_GRF_SOC_STATUS5\t\t0x494\n++#define RK3368_GRF_SOC_STATUS6\t\t0x498\n++#define RK3368_GRF_SOC_STATUS8\t\t0x4a0\n++#define RK3368_GRF_SOC_STATUS9\t\t0x4a4\n++#define RK3368_GRF_SOC_STATUS10\t\t0x4a8\n++#define RK3368_DFI_EN\t\t\t(0x30003 << 5)\n++#define RK3368_DFI_DIS\t\t\t(0x30000 << 5)\n++\n++#define MAX_DMC_NUM_CH\t\t\t2\n++#define READ_DRAMTYPE_INFO(n)\t\t(((n) >> 13) & 0x7)\n++#define READ_CH_INFO(n)\t\t\t(((n) >> 28) & 0x3)\n+ /* DDRMON_CTRL */\n+-#define DDRMON_CTRL\t0x04\n+-#define CLR_DDRMON_CTRL\t(0x1f0000 << 0)\n+-#define LPDDR4_EN\t(0x10001 << 4)\n+-#define HARDWARE_EN\t(0x10001 << 3)\n+-#define LPDDR3_EN\t(0x10001 << 2)\n+-#define SOFTWARE_EN\t(0x10001 << 1)\n+-#define SOFTWARE_DIS\t(0x10000 << 1)\n+-#define TIME_CNT_EN\t(0x10001 << 0)\n++#define DDRMON_CTRL\t\t\t0x04\n++#define CLR_DDRMON_CTRL\t\t\t(0x3f0000 << 0)\n++#define DDR4_EN\t\t\t\t(0x10001 << 5)\n++#define LPDDR4_EN\t\t\t(0x10001 << 4)\n++#define HARDWARE_EN\t\t\t(0x10001 << 3)\n++#define LPDDR2_3_EN\t\t\t(0x10001 << 2)\n++#define SOFTWARE_EN\t\t\t(0x10001 << 1)\n++#define SOFTWARE_DIS\t\t\t(0x10000 << 1)\n++#define TIME_CNT_EN\t\t\t(0x10001 << 0)\n+ \n+ #define DDRMON_CH0_COUNT_NUM\t\t0x28\n+ #define DDRMON_CH0_DFI_ACCESS_NUM\t0x2c\n+ #define DDRMON_CH1_COUNT_NUM\t\t0x3c\n+ #define DDRMON_CH1_DFI_ACCESS_NUM\t0x40\n+ \n++/* pmu grf */\n++#define PMUGRF_OS_REG2\t\t\t0x308\n++\n++enum {\n++\tDDR4 = 0,\n++\tDDR3 = 3,\n++\tLPDDR2 = 5,\n++\tLPDDR3 = 6,\n++\tLPDDR4 = 7,\n++\tUNUSED = 0xFF\n++};\n++\n+ struct dmc_usage {\n+ \tu32 access;\n+ \tu32 total;\n+@@ -50,33 +91,261 @@ struct dmc_usage {\n+ struct rockchip_dfi {\n+ \tstruct devfreq_event_dev *edev;\n+ \tstruct devfreq_event_desc *desc;\n+-\tstruct dmc_usage ch_usage[RK3399_DMC_NUM_CH];\n++\tstruct dmc_usage ch_usage[MAX_DMC_NUM_CH];\n+ \tstruct device *dev;\n+ \tvoid __iomem *regs;\n+ \tstruct regmap *regmap_pmu;\n++\tstruct regmap *regmap_grf;\n++\tstruct regmap *regmap_pmugrf;\n+ \tstruct clk *clk;\n++\tu32 dram_type;\n++\t/*\n++\t * available mask, 1: available, 0: not available\n++\t * each bit represent a channel\n++\t */\n++\tu32 ch_msk;\n++};\n++\n++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_EN);\n++}\n++\n++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_DISB);\n++}\n++\n++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi_wr, dfi_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);\n++\n++\tedata->load_count = (dfi_wr + dfi_rd) * 4;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3128_dfi_ops = {\n++\t.disable = rk3128_dfi_disable,\n++\t.enable = rk3128_dfi_enable,\n++\t.get_event = rk3128_dfi_get_event,\n++\t.set_event = rk3128_dfi_set_event,\n++};\n++\n++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);\n++}\n++\n++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);\n++}\n++\n++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tu32 tmp, max = 0;\n++\tu32 i, busier_ch = 0;\n++\tu32 rd_count, wr_count, total_count;\n++\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\t/* Find out which channel is busier */\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);\n++\t\tinfo->ch_usage[i].access = (wr_count + rd_count) * 4;\n++\t\tinfo->ch_usage[i].total = total_count;\n++\t\ttmp = info->ch_usage[i].access;\n++\t\tif (tmp > max) {\n++\t\t\tbusier_ch = i;\n++\t\t\tmax = tmp;\n++\t\t}\n++\t}\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn busier_ch;\n++}\n++\n++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tint busier_ch;\n++\tunsigned long flags;\n++\n++\tlocal_irq_save(flags);\n++\tbusier_ch = rk3288_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n++\n++\tedata->load_count = info->ch_usage[busier_ch].access;\n++\tedata->total_count = info->ch_usage[busier_ch].total;\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3288_dfi_ops = {\n++\t.disable = rk3288_dfi_disable,\n++\t.enable = rk3288_dfi_enable,\n++\t.get_event = rk3288_dfi_get_event,\n++\t.set_event = rk3288_dfi_set_event,\n++};\n++\n++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);\n++}\n++\n++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);\n++}\n++\n++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);\n++\n++\tedata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3368_dfi_ops = {\n++\t.disable = rk3368_dfi_disable,\n++\t.enable = rk3368_dfi_enable,\n++\t.get_event = rk3368_dfi_get_event,\n++\t.set_event = rk3368_dfi_set_event,\n+ };\n+ \n+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tvoid __iomem *dfi_regs = info->regs;\n+-\tu32 val;\n+-\tu32 ddr_type;\n+-\n+-\t/* get ddr type */\n+-\tregmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);\n+-\tddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &\n+-\t\t    RK3399_PMUGRF_DDRTYPE_MASK;\n+ \n+ \t/* clear DDRMON_CTRL setting */\n+ \twritel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* set ddr type to dfi */\n+-\tif (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)\n+-\t\twritel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);\n+-\telse if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)\n++\tif (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)\n++\t\twritel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == LPDDR4)\n+ \t\twritel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == DDR4)\n++\t\twritel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* enable count, use software mode */\n+ \twritel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);\n+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st\n+ \trockchip_dfi_stop_hardware_counter(edev);\n+ \n+ \t/* Find out which channel is busier */\n+-\tfor (i = 0; i < RK3399_DMC_NUM_CH; i++) {\n+-\t\tinfo->ch_usage[i].access = readl_relaxed(dfi_regs +\n+-\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\n+ \t\tinfo->ch_usage[i].total = readl_relaxed(dfi_regs +\n+ \t\t\t\tDDRMON_CH0_COUNT_NUM + i * 20);\n+-\t\ttmp = info->ch_usage[i].access;\n++\n++\t\t/* LPDDR4 BL = 16,other DDR type BL = 8 */\n++\t\ttmp = readl_relaxed(dfi_regs +\n++\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20);\n++\t\tif (info->dram_type == LPDDR4)\n++\t\t\ttmp *= 8;\n++\t\telse\n++\t\t\ttmp *= 4;\n++\t\tinfo->ch_usage[i].access = tmp;\n++\n+ \t\tif (tmp > max) {\n+ \t\t\tbusier_ch = i;\n+ \t\t\tmax = tmp;\n+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \n+ \trockchip_dfi_stop_hardware_counter(edev);\n+-\tclk_disable_unprepare(info->clk);\n++\tif (info->clk)\n++\t\tclk_disable_unprepare(info->clk);\n+ \n+ \treturn 0;\n+ }\n+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint ret;\n+ \n+-\tret = clk_prepare_enable(info->clk);\n+-\tif (ret) {\n+-\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\", ret);\n+-\t\treturn ret;\n++\tif (info->clk) {\n++\t\tret = clk_prepare_enable(info->clk);\n++\t\tif (ret) {\n++\t\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\",\n++\t\t\t\tret);\n++\t\t\treturn ret;\n++\t\t}\n+ \t}\n+ \n+ \trockchip_dfi_start_hardware_counter(edev);\n+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint busier_ch;\n++\tunsigned long flags;\n+ \n++\tlocal_irq_save(flags);\n+ \tbusier_ch = rockchip_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n+ \n+ \tedata->load_count = info->ch_usage[busier_ch].access;\n+ \tedata->total_count = info->ch_usage[busier_ch].total;\n+@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro\n+ \t.set_event = rockchip_dfi_set_event,\n+ };\n+ \n+-static const struct of_device_id rockchip_dfi_id_match[] = {\n+-\t{ .compatible = \"rockchip,rk3399-dfi\" },\n+-\t{ },\n+-};\n+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++static __init int px30_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n+ \n+-static int rockchip_dfi_probe(struct platform_device *pdev)\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmugrf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmugrf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmugrf))\n++\t\t\treturn PTR_ERR(data->regmap_pmugrf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3128_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n+ {\n+-\tstruct device *dev = &pdev->dev;\n+-\tstruct rockchip_dfi *data;\n+-\tstruct devfreq_event_desc *desc;\n+ \tstruct device_node *np = pdev->dev.of_node, *node;\n+ \n+-\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n+-\tif (!data)\n+-\t\treturn -ENOMEM;\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tdesc->ops = &rk3128_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3288_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmu\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmu = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmu))\n++\t\t\treturn PTR_ERR(data->regmap_pmu);\n++\t}\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tif (data->dram_type == DDR3)\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_DDR3_SEL);\n++\telse\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_LPDDR_SEL);\n++\n++\tdesc->ops = &rk3288_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3368_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\n++\tif (!dev->parent || !dev->parent->of_node)\n++\t\treturn -EINVAL;\n++\n++\tdata->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);\n++\tif (IS_ERR(data->regmap_grf))\n++\t\treturn PTR_ERR(data->regmap_grf);\n++\n++\tdesc->ops = &rk3368_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rockchip_dfi_init(struct platform_device *pdev,\n++\t\t\t\t    struct rockchip_dfi *data,\n++\t\t\t\t    struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n+ \n+ \tdata->regs = devm_platform_ioremap_resource(pdev, 0);\n+ \tif (IS_ERR(data->regs))\n+@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla\n+ \t\tif (IS_ERR(data->regmap_pmu))\n+ \t\t\treturn PTR_ERR(data->regmap_pmu);\n+ \t}\n+-\tdata->dev = dev;\n++\n++\tregmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3328_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n++\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static const struct of_device_id rockchip_dfi_id_match[] = {\n++\t{ .compatible = \"rockchip,px30-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk1808-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk3128-dfi\", .data = rk3128_dfi_init },\n++\t{ .compatible = \"rockchip,rk3288-dfi\", .data = rk3288_dfi_init },\n++\t{ .compatible = \"rockchip,rk3328-dfi\", .data = rk3328_dfi_init },\n++\t{ .compatible = \"rockchip,rk3368-dfi\", .data = rk3368_dfi_init },\n++\t{ .compatible = \"rockchip,rk3399-dfi\", .data = rockchip_dfi_init },\n++\t{ },\n++};\n++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++\n++static int rockchip_dfi_probe(struct platform_device *pdev)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct rockchip_dfi *data;\n++\tstruct devfreq_event_desc *desc;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\tint (*init)(struct platform_device *pdev, struct rockchip_dfi *data,\n++\t\t    struct devfreq_event_desc *desc);\n++\n++\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n++\tif (!data)\n++\t\treturn -ENOMEM;\n+ \n+ \tdesc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);\n+ \tif (!desc)\n+ \t\treturn -ENOMEM;\n+ \n+-\tdesc->ops = &rockchip_dfi_ops;\n++\tmatch = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);\n++\tif (match) {\n++\t\tinit = match->data;\n++\t\tif (init) {\n++\t\t\tif (init(pdev, data, desc))\n++\t\t\t\treturn -EINVAL;\n++\t\t} else {\n++\t\t\treturn 0;\n++\t\t}\n++\t} else {\n++\t\treturn 0;\n++\t}\n++\n+ \tdesc->driver_data = data;\n+ \tdesc->name = np->name;\n+ \tdata->desc = desc;\n++\tdata->dev = dev;\n+ \n+-\tdata->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);\n++\tdata->edev = devm_devfreq_event_add_edev(dev, desc);\n+ \tif (IS_ERR(data->edev)) {\n+-\t\tdev_err(&pdev->dev,\n+-\t\t\t\"failed to add devfreq-event device\\n\");\n++\t\tdev_err(dev, \"failed to add devfreq-event device\\n\");\n+ \t\treturn PTR_ERR(data->edev);\n+ \t}\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nnew file mode 100644\nindex 0000000000..ebdce52004\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -0,0 +1,27 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[adjusted commit title]\n+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -1021,6 +1021,13 @@\n+ \t\t};\n+ \t};\n+ \n++\tdfi: dfi@ff790000 {\n++\t\treg = <0x00 0xff790000 0x00 0x400>;\n++\t\tcompatible = \"rockchip,rk3328-dfi\";\n++\t\trockchip,grf = <&grf>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nnew file mode 100644\nindex 0000000000..d93b9a77b2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -0,0 +1,126 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++\n+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-\n+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++\n+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++\n+ 4 files changed, 617 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi\n+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h\n+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -7,6 +7,7 @@\n+ \n+ #include <dt-bindings/input/input.h>\n+ #include <dt-bindings/gpio/gpio.h>\n++#include \"rk3328-dram-nanopi2-timing.dtsi\"\n+ #include \"rk3328.dtsi\"\n+ \n+ / {\n+@@ -115,6 +116,72 @@\n+ \t\tregulator-min-microvolt = <5000000>;\n+ \t\tregulator-max-microvolt = <5000000>;\n+ \t};\n++\n++\tdmc: dmc {\n++\t\tcompatible = \"rockchip,rk3328-dmc\";\n++\t\tdevfreq-events = <&dfi>;\n++\t\tcenter-supply = <&vdd_log>;\n++\t\tclocks = <&cru SCLK_DDRCLK>;\n++\t\tclock-names = \"dmc_clk\";\n++\t\toperating-points-v2 = <&dmc_opp_table>;\n++\t\tddr_timing = <&ddr_timing>;\n++\t\tupthreshold = <40>;\n++\t\tdowndifferential = <20>;\n++\t\tauto-min-freq = <786000>;\n++\t\tauto-freq-en = <0>;\n++\t\t#cooling-cells = <2>;\n++\t\tstatus = \"okay\";\n++\n++\t\tddr_power_model: ddr_power_model {\n++\t\t\tcompatible = \"ddr_power_model\";\n++\t\t\tdynamic-power-coefficient = <120>;\n++\t\t\tstatic-power-coefficient = <200>;\n++\t\t\tts = <32000 4700 (-80) 2>;\n++\t\t\tthermal-zone = \"soc-thermal\";\n++\t\t};\n++\t};\n++\n++\tdmc_opp_table: dmc-opp-table {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\trockchip,leakage-voltage-sel = <\n++\t\t\t1   10    0\n++\t\t\t11  254   1\n++\t\t>;\n++\t\tnvmem-cells = <&logic_leakage>;\n++\t\tnvmem-cell-names = \"ddr_leakage\";\n++\n++\t\topp-786000000 {\n++\t\t\topp-hz = /bits/ 64 <786000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-798000000 {\n++\t\t\topp-hz = /bits/ 64 <798000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-840000000 {\n++\t\t\topp-hz = /bits/ 64 <840000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-924000000 {\n++\t\t\topp-hz = /bits/ 64 <924000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t\topp-microvolt-L0 = <1100000>;\n++\t\t\topp-microvolt-L1 = <1075000>;\n++\t\t};\n++\t\topp-1056000000 {\n++\t\t\topp-hz = /bits/ 64 <1056000000>;\n++\t\t\topp-microvolt = <1175000>;\n++\t\t\topp-microvolt-L0 = <1175000>;\n++\t\t\topp-microvolt-L1 = <1150000>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -137,6 +204,10 @@\n+ \tstatus = \"disabled\";\n+ };\n+ \n++&dfi {\n++\tstatus = \"okay\";\n++};\n++\n+ &gmac2io {\n+ \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n+ \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n+@@ -202,6 +273,7 @@\n+ \t\t\t\tregulator-name = \"vdd_log\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1075000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n+@@ -216,6 +288,7 @@\n+ \t\t\t\tregulator-name = \"vdd_arm\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1225000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\ndiff --git a/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..f589ce2a7b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -192,13 +192,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..c85da5fb07\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tamba: bus {\ndiff --git a/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..0ea189b886\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,182 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,152 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1125000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1225000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1275000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1325000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \tchosen {\n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0003-new_rockchip_support_k510.patch",
    "content": "From 1f116553b6f685b0ab0303174e1d6ff73c85459f Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 5 Mar 2021 21:21:53 +0800\nSubject: [PATCH] new_rockchip_support_k510\n\n This introduces rockchip ddrloader firmware, which allows users to control the memory frequency\n runtime. This introduces rockchip ddrloader firmware, which allows users to control the memory frequency runtime. \n Signed-off-by: AmadeusGhost <amadeus@immortalwrt.org> \n Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org> \n\n R4S support:\n Signed-off-by: Tianling Shen <cnsztl@gmail.com> Co-authored-by: Jensen Huang\n <jensenhuang@friendlyarm.com> Signed-off-by: Jensen Huang\n <jensenhuang@friendlyarm.com> Co-authored-by: Marty Jones\n <mj8263788@gmail.com> Signed-off-by: Marty Jones <mj8263788@gmail.com> \n----\n new file:   package/boot/arm-trusted-firmware-rk3328/Makefile\n new file:   package/boot/arm-trusted-firmware-rk3328/src/trust.ini \n modified:   package/boot/uboot-rockchip/Makefile \n new file:   package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n new file:   package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n new file:   package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n new file:   target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n new file:   target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n modified:   target/linux/rockchip/Makefile \n modified:   target/linux/rockchip/armv8/base-files/etc/board.d/01_leds \n modified:   target/linux/rockchip/armv8/base-files/etc/board.d/02_network \n modified:   target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n modified:   target/linux/rockchip/armv8/config-5.10 \n modified:   target/linux/rockchip/armv8/config-5.4 \n new file:   target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n new file:   target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c \n new file:   target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n new file:   target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n modified:   target/linux/rockchip/image/Makefile\n modified:   target/linux/rockchip/image/armv8.mk \n new file:   target/linux/rockchip/image/nanopi-r4s.bootscript \n new file:   target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n new file:   target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n new file:   target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n new file:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n new file:   target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n new file:   target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n new file:   target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n new file:   target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n new file:   target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n new file:   target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n new file:   target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n new file:   target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n new file:   target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n new file:   target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n new file:   target/linux/rockchip/patches-5.4/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n new file:   target/linux/rockchip/patches-5.4/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n new file:   target/linux/rockchip/patches-5.4/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n new file:   target/linux/rockchip/patches-5.4/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n new file:   target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n---\n .../boot/arm-trusted-firmware-rk3328/Makefile |  55 ++\n .../arm-trusted-firmware-rk3328/src/trust.ini |  15 +\n package/boot/uboot-rockchip/Makefile          |  25 +-\n ...split-nanopi-r4-rk3399-out-of-evb_rk.patch | 509 +++++++++++\n ...9-Add-support-for-multiple-DDR-types.patch | 256 ++++++\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 313 +++++++\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |  38 +\n ...k-events-support-multiple-registrant.patch | 291 ++++++\n target/linux/rockchip/Makefile                |   2 +-\n .../armv8/base-files/etc/board.d/01_leds      |   3 +-\n .../armv8/base-files/etc/board.d/02_network   |   7 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   4 +\n target/linux/rockchip/armv8/config-5.10       |   5 +\n target/linux/rockchip/armv8/config-5.4        |   1 +\n .../rockchip/rk3328-dram-nanopi2-timing.dtsi  | 311 +++++++\n .../files/drivers/devfreq/rk3328_dmc.c        | 852 ++++++++++++++++++\n .../include/dt-bindings/clock/rockchip-ddr.h  |  63 ++\n .../include/dt-bindings/memory/rk3328-dram.h  | 159 ++++\n target/linux/rockchip/image/Makefile          |  14 +\n target/linux/rockchip/image/armv8.mk          |  12 +-\n .../rockchip/image/nanopi-r4s.bootscript      |   8 +\n ...add-compatible-to-NanoPi-R2S-etherne.patch |  25 +\n ...-initial-signal-voltage-on-power-off.patch |  35 +\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 218 +++++\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 +\n ...-for-rockchip-hardware-random-number.patch |  45 +\n ...ip-add-hardware-random-number-genera.patch |  50 +\n ...ip-add-devfreq-driver-for-rk3328-dmc.patch |  44 +\n ...setting-ddr-clock-via-SIP-Version-2-.patch | 218 +++++\n ...eq-rockchip-dfi-add-more-soc-support.patch | 662 ++++++++++++++\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |  27 +\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 +++\n ...adjust-default-coherent_pool-to-2MiB.patch |  28 +\n ...ip-add-more-cpu-operating-points-for.patch |  44 +\n ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 186 ++++\n ...ip-add-devfreq-driver-for-rk3328-dmc.patch |  48 +\n ...setting-ddr-clock-via-SIP-Version-2-.patch | 218 +++++\n ...eq-rockchip-dfi-add-more-soc-support.patch | 665 ++++++++++++++\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |  27 +\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 +++\n 40 files changed, 5750 insertions(+), 7 deletions(-)\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/Makefile\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n create mode 100644 package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n create mode 100644 package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n create mode 100644 package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n create mode 100644 target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n create mode 100644 target/linux/rockchip/image/nanopi-r4s.bootscript\n create mode 100644 target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n create mode 100644 target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n create mode 100644 target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n create mode 100644 target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n create mode 100644 target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n create mode 100644 target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n create mode 100644 target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n create mode 100644 target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n create mode 100644 target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n create mode 100644 target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n create mode 100644 target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n create mode 100644 target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n create mode 100644 target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n create mode 100644 target/linux/rockchip/patches-5.4/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n create mode 100644 target/linux/rockchip/patches-5.4/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n create mode 100644 target/linux/rockchip/patches-5.4/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n create mode 100644 target/linux/rockchip/patches-5.4/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n create mode 100644 target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/Makefile b/package/boot/arm-trusted-firmware-rk3328/Makefile\nnew file mode 100644\nindex 0000000000..32fab196b5\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/Makefile\n@@ -0,0 +1,55 @@\n+#\n+# Copyright (C) 2021 ImmortalWrt\n+# (https://immortalwrt.org)\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+\n+include $(TOPDIR)/rules.mk\n+\n+PKG_NAME:=arm-trusted-firmware-rk3328\n+PKG_RELEASE:=1\n+\n+PKG_SOURCE_PROTO:=git\n+PKG_SOURCE_URL=https://github.com/rockchip-linux/rkbin.git\n+PKG_SOURCE_DATE:=2020-10-30\n+PKG_SOURCE_VERSION:=0bb1c512492386a72a3a0b5a0e18e49c636577b9\n+PKG_MIRROR_HASH:=6dffe95b83f37a280f98c105fce529f45e39ce333b24709a9645aac1352457ce\n+\n+PKG_MAINTAINER:=\n+\n+MAKE_PATH:=$(PKG_NAME)\n+\n+include $(INCLUDE_DIR)/package.mk\n+\n+define Package/arm-trusted-firmware-rk3328\n+    SECTION:=boot\n+    CATEGORY:=Boot Loaders\n+    TITLE:=ARM Trusted Firmware for Rockchip\n+    DEPENDS:=@TARGET_rockchip_armv8\n+endef\n+\n+define Build/Configure\n+\t$(SED) 's,$$$$(PKG_BUILD_DIR),$(PKG_BUILD_DIR),g' $(PKG_BUILD_DIR)/trust.ini\n+\t$(call Build/Configure/Default)\n+endef\n+\n+define Build/Compile\n+\tmkimage -n rk3328 -T rksd -d $(PKG_BUILD_DIR)/bin/rk33/rk3328_ddr_333MHz_v1.16.bin $(PKG_BUILD_DIR)/idbloader.bin\n+\tcat $(PKG_BUILD_DIR)/bin/rk33/rk322xh_miniloader_v2.50.bin >> $(PKG_BUILD_DIR)/idbloader.bin\n+\t$(PKG_BUILD_DIR)/tools/trust_merger --replace bl31.elf $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.44.elf $(PKG_BUILD_DIR)/trust.ini\n+endef\n+\n+define Build/InstallDev\n+\t$(INSTALL_DIR) -p $(STAGING_DIR_IMAGE)\n+\t$(CP) $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.44.elf $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/tools/loaderimage $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/idbloader.bin $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/trust.bin $(STAGING_DIR_IMAGE)/\n+endef\n+\n+define Package/arm-trusted-firmware-rk3328/install\n+endef\n+\n+$(eval $(call BuildPackage,arm-trusted-firmware-rk3328))\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/src/trust.ini b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\nnew file mode 100644\nindex 0000000000..b95797427e\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n@@ -0,0 +1,15 @@\n+[VERSION]\n+MAJOR=1\n+MINOR=0\n+[BL30_OPTION]\n+SEC=0\n+[BL31_OPTION]\n+SEC=1\n+PATH=bl31.elf\n+ADDR=0x10000\n+[BL32_OPTION]\n+SEC=0\n+[BL33_OPTION]\n+SEC=0\n+[OUTPUT]\n+PATH=$(PKG_BUILD_DIR)/trust.bin\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 393e8c3a9f..a0e6d06383 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -29,15 +29,26 @@ define U-Boot/nanopi-r2s-rk3328\n   NAME:=NanoPi R2S\n   BUILD_DEVICES:= \\\n     friendlyarm_nanopi-r2s\n-  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rockchip\n-  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n-  ATF:=rk3328_bl31.elf\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rk3328\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rk3328\n+  ATF:=rk322xh_bl31_v1.44.elf\n+  USE_RKBIN:=1\n   OF_PLATDATA:=$(1)\n endef\n \n \n # RK3399 boards\n \n+define U-Boot/nanopi-r4s-rk3399\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=NanoPi R4S\n+  BUILD_DEVICES:= \\\n+    friendlyarm_nanopi-r4s\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n+  ATF:=rk3399_bl31.elf\n+endef\n+\n define U-Boot/rock-pi-4-rk3399\n   BUILD_SUBTARGET:=armv8\n   NAME:=Rock Pi 4\n@@ -59,6 +70,7 @@ define U-Boot/rockpro64-rk3399\n endef\n \n UBOOT_TARGETS := \\\n+  nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n   nanopi-r2s-rk3328\n@@ -85,8 +97,15 @@ endef\n \n define Build/InstallDev\n \t$(INSTALL_DIR) $(STAGING_DIR_IMAGE)\n+ifneq ($(USE_RKBIN),)\n+\t$(STAGING_DIR_IMAGE)/loaderimage --pack --uboot $(PKG_BUILD_DIR)/u-boot-dtb.bin $(PKG_BUILD_DIR)/uboot.img 0x200000\n+\t$(CP) $(PKG_BUILD_DIR)/uboot.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-uboot.img\n+\t$(CP) $(STAGING_DIR_IMAGE)/idbloader.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.bin\n+\t$(CP) $(STAGING_DIR_IMAGE)/trust.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-trust.bin\n+else\n \t$(CP) $(PKG_BUILD_DIR)/idbloader.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.img\n \t$(CP) $(PKG_BUILD_DIR)/u-boot.itb $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-u-boot.itb\n+endif\n endef\n \n define Package/u-boot/install/default\ndiff --git a/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\nnew file mode 100644\nindex 0000000000..d8a118dd2e\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n@@ -0,0 +1,509 @@\n+From a765bb2678b6d1666caafef0fcf88fba88b5b26f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Fri, 18 Dec 2020 17:10:35 +0800\n+Subject: [PATCH] rockchip: rk3399: split nanopi-r4-rk3399 out of evb_rk3399\n+\n+nanopi-r4-rk3399 board has multiple DDR types. Currently we don't have any code\n+are compatible with these devices. Since multiple DDR types is specific to\n+nanopi-r4-rk3399 board, split it into its own board file and add code\n+support here.\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[Improved commit message and Kconfig description]\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm/mach-rockchip/rk3399/Kconfig |  15 +++\n+ board/friendlyarm/nanopi4/Kconfig     |  15 +++\n+ board/friendlyarm/nanopi4/MAINTAINERS |   5 +\n+ board/friendlyarm/nanopi4/Makefile    |   8 ++\n+ board/friendlyarm/nanopi4/hwrev.c     | 185 ++++++++++++++++++++++++++\n+ board/friendlyarm/nanopi4/hwrev.h     |  27 ++++\n+ board/friendlyarm/nanopi4/nanopi4.c   | 148 +++++++++++++++++++++\n+ drivers/clk/rockchip/clk_rk3399.c     |   2 +\n+ include/configs/nanopi4.h             |  24 ++++\n+ 9 files changed, 429 insertions(+)\n+ create mode 100644 board/friendlyarm/nanopi4/Kconfig\n+ create mode 100644 board/friendlyarm/nanopi4/MAINTAINERS\n+ create mode 100644 board/friendlyarm/nanopi4/Makefile\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.c\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.h\n+ create mode 100644 board/friendlyarm/nanopi4/nanopi4.c\n+ create mode 100644 include/configs/nanopi4.h\n+\n+--- a/arch/arm/mach-rockchip/rk3399/Kconfig\n++++ b/arch/arm/mach-rockchip/rk3399/Kconfig\n+@@ -109,6 +109,20 @@ config TARGET_ROC_PC_RK3399\n+ \t   * wide voltage input(5V-15V), dual cell battery\n+ \t   * Wifi/BT accessible via expansion board M.2\n+ \n++config TARGET_NANOPI4_RK3399\n++\tbool \"FriendlyElec NanoPi4 board\"\n++\thelp\n++\t  NanoPi4 is SBC produced by FriendlyElec. Key features:\n++\n++\t   * Rockchip RK3399\n++\t   * 1/2/4GB Dual-Channel DDR3/LPDDR4\n++\t   * SD card slot\n++\t   * Gigabit ethernet\n++\t   * PCIe\n++\t   * USB 3.0, 2.0\n++\t   * USB Type C power\n++\t   * GPIO expansion ports\n++\n+ endchoice\n+ \n+ config ROCKCHIP_BOOT_MODE_REG\n+@@ -152,6 +166,7 @@ config SYS_BOOTCOUNT_ADDR\n+ endif # BOOTCOUNT_LIMIT\n+ \n+ source \"board/firefly/roc-pc-rk3399/Kconfig\"\n++source \"board/friendlyarm/nanopi4/Kconfig\"\n+ source \"board/google/gru/Kconfig\"\n+ source \"board/pine64/pinebook-pro-rk3399/Kconfig\"\n+ source \"board/pine64/rockpro64_rk3399/Kconfig\"\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Kconfig\n+@@ -0,0 +1,15 @@\n++if TARGET_NANOPI4_RK3399\n++\n++config SYS_BOARD\n++\tdefault \"nanopi4\"\n++\n++config SYS_VENDOR\n++\tdefault \"friendlyarm\"\n++\n++config SYS_CONFIG_NAME\n++\tdefault \"nanopi4\"\n++\n++config BOARD_SPECIFIC_OPTIONS\n++\tdef_bool y\n++\n++endif\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -0,0 +1,5 @@\n++NanoPi 4 Series\n++M:      FriendlyElec <support@friendlyarm.com>\n++S:      Maintained\n++F:      board/friendlyarm/nanopi4/\n++F:      include/configs/nanopi4.h\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Makefile\n+@@ -0,0 +1,8 @@\n++#\n++# Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++# (http://www.friendlyarm.com)\n++#\n++# SPDX-License-Identifier:     GPL-2.0+\n++#\n++\n++obj-y\t+= nanopi4.o hwrev.o\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.c\n+@@ -0,0 +1,185 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <linux/delay.h>\n++#include <log.h>\n++#include <asm/io.h>\n++#include <asm/gpio.h>\n++#include <asm/arch-rockchip/gpio.h>\n++\n++/*\n++ * ID info:\n++ *  ID : Volts : ADC value :   Bucket\n++ *  ==   =====   =========   ===========\n++ *   0 : 0.102V:        58 :    0 -   81\n++ *   1 : 0.211V:       120 :   82 -  150\n++ *   2 : 0.319V:       181 :  151 -  211\n++ *   3 : 0.427V:       242 :  212 -  274\n++ *   4 : 0.542V:       307 :  275 -  342\n++ *   5 : 0.666V:       378 :  343 -  411\n++ *   6 : 0.781V:       444 :  412 -  477\n++ *   7 : 0.900V:       511 :  478 -  545\n++ *   8 : 1.023V:       581 :  546 -  613\n++ *   9 : 1.137V:       646 :  614 -  675\n++ *  10 : 1.240V:       704 :  676 -  733\n++ *  11 : 1.343V:       763 :  734 -  795\n++ *  12 : 1.457V:       828 :  796 -  861\n++ *  13 : 1.576V:       895 :  862 -  925\n++ *  14 : 1.684V:       956 :  926 -  989\n++ *  15 : 1.800V:      1023 :  990 - 1023\n++ */\n++static const int id_readings[] = {\n++\t 81, 150, 211, 274, 342, 411, 477, 545,\n++\t613, 675, 733, 795, 861, 925, 989, 1023\n++};\n++\n++static int cached_board_id = -1;\n++\n++#define SARADC_BASE\t\t0xFF100000\n++#define SARADC_DATA\t\t(SARADC_BASE + 0)\n++#define SARADC_CTRL\t\t(SARADC_BASE + 8)\n++\n++static u32 get_saradc_value(int chn)\n++{\n++\tint timeout = 0;\n++\tu32 adc_value = 0;\n++\n++\twritel(0, SARADC_CTRL);\n++\tudelay(2);\n++\n++\twritel(0x28 | chn, SARADC_CTRL);\n++\tudelay(50);\n++\n++\ttimeout = 0;\n++\tdo {\n++\t\tif (readl(SARADC_CTRL) & 0x40) {\n++\t\t\tadc_value = readl(SARADC_DATA) & 0x3FF;\n++\t\t\tgoto stop_adc;\n++\t\t}\n++\n++\t\tudelay(10);\n++\t} while (timeout++ < 100);\n++\n++stop_adc:\n++\twritel(0, SARADC_CTRL);\n++\n++\treturn adc_value;\n++}\n++\n++static uint32_t get_adc_index(int chn)\n++{\n++\tint i;\n++\tint adc_reading;\n++\n++\tif (cached_board_id != -1)\n++\t\treturn cached_board_id;\n++\n++\tadc_reading = get_saradc_value(chn);\n++\tfor (i = 0; i < ARRAY_SIZE(id_readings); i++) {\n++\t\tif (adc_reading <= id_readings[i]) {\n++\t\t\tdebug(\"ADC reading %d, ID %d\\n\", adc_reading, i);\n++\t\t\tcached_board_id = i;\n++\t\t\treturn i;\n++\t\t}\n++\t}\n++\n++\t/* should die for impossible value */\n++\treturn 0;\n++}\n++\n++/*\n++ * Board revision list: <GPIO4_D1 | GPIO4_D0>\n++ *  0b00 - NanoPC-T4\n++ *  0b01 - NanoPi M4\n++ *\n++ * Extended by ADC_IN4\n++ * Group A:\n++ *  0x04 - NanoPi NEO4\n++ *  0x06 - SOC-RK3399\n++ *  0x07 - SOC-RK3399 V2\n++ *  0x09 - NanoPi R4S 1GB\n++ *  0x0A - NanoPi R4S 4GB\n++ *\n++ * Group B:\n++ *  0x21 - NanoPi M4 Ver2.0\n++ *  0x22 - NanoPi M4B\n++ */\n++static int pcb_rev = -1;\n++\n++void bd_hwrev_init(void)\n++{\n++#define GPIO4_BASE\t0xff790000\n++\tstruct rockchip_gpio_regs *regs = (void *)GPIO4_BASE;\n++\n++#ifdef CONFIG_SPL_BUILD\n++\tstruct udevice *dev;\n++\n++\tif (uclass_get_device_by_driver(UCLASS_CLK,\n++\t\t\t\tDM_GET_DRIVER(clk_rk3399), &dev))\n++\t\treturn;\n++#endif\n++\n++\tif (pcb_rev >= 0)\n++\t\treturn;\n++\n++\t/* D1, D0: input mode */\n++\tclrbits_le32(&regs->swport_ddr, (0x3 << 24));\n++\tpcb_rev = (readl(&regs->ext_port) >> 24) & 0x3;\n++\n++\tif (pcb_rev == 0x3) {\n++\t\t/* Revision group A: 0x04 ~ 0x13 */\n++\t\tpcb_rev = 0x4 + get_adc_index(4);\n++\n++\t} else if (pcb_rev == 0x1) {\n++\t\tint idx = get_adc_index(4);\n++\n++\t\t/* Revision group B: 0x21 ~ 0x2f */\n++\t\tif (idx > 0) {\n++\t\t\tpcb_rev = 0x20 + idx;\n++\t\t}\n++\t}\n++}\n++\n++#ifdef CONFIG_SPL_BUILD\n++static struct board_ddrtype {\n++\tint rev;\n++\tconst char *type;\n++} ddrtypes[] = {\n++\t{ 0x00, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x01, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x04,   \"ddr3-1866\" },\n++\t{ 0x06,   \"ddr3-1866\" },\n++\t{ 0x07, \"lpddr4-100\"  },\n++\t{ 0x09,   \"ddr3-1866\" },\n++\t{ 0x0a, \"lpddr4-100\"  },\n++\t{ 0x21, \"lpddr4-100\"  },\n++\t{ 0x22,   \"ddr3-1866\" },\n++};\n++\n++const char *rk3399_get_ddrtype(void) {\n++\tint i;\n++\n++\tbd_hwrev_init();\n++\tprintf(\"Board: rev%02x\\n\", pcb_rev);\n++\n++\tfor (i = 0; i < ARRAY_SIZE(ddrtypes); i++) {\n++\t\tif (ddrtypes[i].rev == pcb_rev)\n++\t\t\treturn ddrtypes[i].type;\n++\t}\n++\n++\t/* fallback to first subnode (ie, first included dtsi) */\n++\treturn NULL;\n++}\n++#endif\n++\n++/* To override __weak symbols */\n++u32 get_board_rev(void)\n++{\n++\treturn pcb_rev;\n++}\n++\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.h\n+@@ -0,0 +1,27 @@\n++/*\n++ * Copyright (C) Guangzhou FriendlyARM Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * This program is free software; you can redistribute it and/or\n++ * modify it under the terms of the GNU General Public License\n++ * as published by the Free Software Foundation; either version 2\n++ * of the License, or (at your option) any later version.\n++ *\n++ * This program is distributed in the hope that it will be useful,\n++ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n++ * GNU General Public License for more details.\n++ *\n++ * You should have received a copy of the GNU General Public License\n++ * along with this program; if not, you can access it online at\n++ * http://www.gnu.org/licenses/gpl-2.0.html.\n++ */\n++\n++#ifndef __BD_HW_REV_H__\n++#define __BD_HW_REV_H__\n++\n++extern void bd_hwrev_config_gpio(void);\n++extern void bd_hwrev_init(void);\n++extern u32 get_board_rev(void);\n++\n++#endif /* __BD_HW_REV_H__ */\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/nanopi4.c\n+@@ -0,0 +1,148 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <env.h>\n++#include <hash.h>\n++#include <linux/bitops.h>\n++#include <i2c.h>\n++#include <init.h>\n++#include <net.h>\n++#include <netdev.h>\n++#include <syscon.h>\n++#include <asm/arch-rockchip/bootrom.h>\n++#include <asm/arch-rockchip/clock.h>\n++#include <asm/arch-rockchip/grf_rk3399.h>\n++#include <asm/arch-rockchip/hardware.h>\n++#include <asm/arch-rockchip/misc.h>\n++#include <asm/io.h>\n++#include <asm/setup.h>\n++#include <u-boot/sha256.h>\n++\n++#ifdef CONFIG_MISC_INIT_R\n++static void setup_iodomain(void)\n++{\n++\tstruct rk3399_grf_regs *grf =\n++\t    syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n++\n++\t/* BT565 and AUDIO is in 1.8v domain */\n++\trk_setreg(&grf->io_vsel, BIT(0) | BIT(1));\n++}\n++\n++static int __maybe_unused mac_read_from_generic_eeprom(u8 *addr)\n++{\n++\tstruct udevice *i2c_dev;\n++\tint ret;\n++\n++\t/* Microchip 24AA02xxx EEPROMs with EUI-48 Node Identity */\n++\tret = i2c_get_chip_for_busnum(2, 0x51, 1, &i2c_dev);\n++\tif (!ret)\n++\t\tret = dm_i2c_read(i2c_dev, 0xfa, addr, 6);\n++\n++\treturn ret;\n++}\n++\n++static void setup_macaddr(void)\n++{\n++#if CONFIG_IS_ENABLED(CMD_NET)\n++\tint ret;\n++\tconst char *cpuid = env_get(\"cpuid#\");\n++\tu8 hash[SHA256_SUM_LEN];\n++\tint size = sizeof(hash);\n++\tu8 mac_addr[6];\n++\tint from_eeprom = 0;\n++\tint lockdown = 0;\n++\n++#ifndef CONFIG_ENV_IS_NOWHERE\n++\tlockdown = env_get_yesno(\"lockdown\") == 1;\n++#endif\n++\tif (lockdown && env_get(\"ethaddr\"))\n++\t\treturn;\n++\n++\tret = mac_read_from_generic_eeprom(mac_addr);\n++\tif (!ret && is_valid_ethaddr(mac_addr)) {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\t\tfrom_eeprom = 1;\n++\t}\n++\n++\tif (!cpuid) {\n++\t\tdebug(\"%s: could not retrieve 'cpuid#'\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\tret = hash_block(\"sha256\", (void *)cpuid, strlen(cpuid), hash, &size);\n++\tif (ret) {\n++\t\tdebug(\"%s: failed to calculate SHA256\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\t/* Copy 6 bytes of the hash to base the MAC address on */\n++\tmemcpy(mac_addr, hash, 6);\n++\n++\t/* Make this a valid MAC address and set it */\n++\tmac_addr[0] &= 0xfe;  /* clear multicast bit */\n++\tmac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */\n++\n++\tif (from_eeprom) {\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t} else {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\n++\t\tif (lockdown && env_get(\"eth1addr\"))\n++\t\t\treturn;\n++\n++\t\t/* Ugly, copy another 4 bytes to generate a similar address */\n++\t\tmemcpy(mac_addr + 2, hash + 8, 4);\n++\t\tif (!memcmp(hash + 2, hash + 8, 4))\n++\t\t\tmac_addr[5] ^= 0xff;\n++\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t}\n++#endif\n++\n++\treturn;\n++}\n++\n++int misc_init_r(void)\n++{\n++\tconst u32 cpuid_offset = 0x7;\n++\tconst u32 cpuid_length = 0x10;\n++\tu8 cpuid[cpuid_length];\n++\tint ret;\n++\n++\tsetup_iodomain();\n++\n++\tret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = rockchip_cpuid_set(cpuid, cpuid_length);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tsetup_macaddr();\n++\tbd_hwrev_init();\n++\n++\treturn 0;\n++}\n++#endif\n++\n++#ifdef CONFIG_SERIAL_TAG\n++void get_board_serial(struct tag_serialnr *serialnr)\n++{\n++\tchar *serial_string;\n++\tu64 serial = 0;\n++\n++\tserial_string = env_get(\"serial#\");\n++\n++\tif (serial_string)\n++\t\tserial = simple_strtoull(serial_string, NULL, 16);\n++\n++\tserialnr->high = (u32)(serial >> 32);\n++\tserialnr->low = (u32)(serial & 0xffffffff);\n++}\n++#endif\n+diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c\n+index 22c373a623..38975c0c65 100644\n+--- a/drivers/clk/rockchip/clk_rk3399.c\n++++ b/drivers/clk/rockchip/clk_rk3399.c\n+@@ -1351,6 +1351,8 @@ static void rkclk_init(struct rockchip_cru *cru)\n+ \t\t     pclk_div << PCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     hclk_div << HCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     HCLK_PERILP1_PLL_SEL_GPLL << HCLK_PERILP1_PLL_SEL_SHIFT);\n++\n++\trk3399_saradc_set_clk(cru, 1000000);\n+ }\n+ #endif\n+ \n+--- /dev/null\n++++ b/include/configs/nanopi4.h\n+@@ -0,0 +1,24 @@\n++/* SPDX-License-Identifier: GPL-2.0+ */\n++/*\n++ * Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * (C) Copyright 2016 Rockchip Electronics Co., Ltd\n++ */\n++\n++#ifndef __CONFIG_NANOPI4_H__\n++#define __CONFIG_NANOPI4_H__\n++\n++#define ROCKCHIP_DEVICE_SETTINGS \\\n++\t\t\"stdin=serial,usbkbd\\0\" \\\n++\t\t\"stdout=serial,vidconsole\\0\" \\\n++\t\t\"stderr=serial,vidconsole\\0\"\n++\n++#include <configs/rk3399_common.h>\n++\n++#define SDRAM_BANK_SIZE\t\t\t(2UL << 30)\n++\n++#define CONFIG_SERIAL_TAG\n++#define CONFIG_REVISION_TAG\n++\n++#endif\ndiff --git a/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\nnew file mode 100644\nindex 0000000000..b624bcc763\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n@@ -0,0 +1,256 @@\n+From a9447b7b60a3c5195d0fabbe5aa9c32d047ec997 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Sat, 19 Dec 2020 19:39:14 +0800\n+Subject: [PATCH] ram: rk3399: Add support for multiple DDR types\n+\n+Move rockchip,sdram-params to named subnode to include\n+multiple sdram parameters, and then read the parameters\n+(by subnode name, first subnode or current node) before\n+rk3399_dmc_init().\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi      |  6 ++-\n+ arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi      |  5 +-\n+ arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi      |  6 ++-\n+ .../arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi |  3 ++\n+ .../arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi |  3 ++\n+ .../rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi |  3 ++\n+ arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi     |  3 ++\n+ drivers/ram/rockchip/sdram_rk3399.c           | 49 +++++++++++++++----\n+ 8 files changed, 64 insertions(+), 14 deletions(-)\n+\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1333 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1600 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1866 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n+@@ -5,6 +5,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-2GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+@@ -1537,4 +1539,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-4GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-samsung-4GB-1866 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1543,4 +1545,5 @@\n+ \t\t0x01010000\t/* DENALI_PHY_957_DATA */\n+ \t\t0x00000000\t/* DENALI_PHY_958_DATA */\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n+@@ -6,6 +6,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr4-100 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1538,4 +1540,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/drivers/ram/rockchip/sdram_rk3399.c\n++++ b/drivers/ram/rockchip/sdram_rk3399.c\n+@@ -1625,7 +1625,6 @@ static void set_ddr_stride(struct rk3399_pmusgrf_regs *pmusgrf, u32 stride)\n+ \trk_clrsetreg(&pmusgrf->soc_con4, 0x1f << 10, stride << 10);\n+ }\n+ \n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank,\n+ \t\t\t       struct rk3399_sdram_params *params)\n+ {\n+@@ -1715,8 +1714,8 @@ void modify_param(const struct chan_info *chan,\n+ \tclrsetbits_le32(&denali_pi_params[76], 0x1 << 24, 0x1 << 24);\n+ \tclrsetbits_le32(&denali_pi_params[77], 0x1, 0x1);\n+ }\n+-#else\n+ \n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n+ struct rk3399_sdram_params dfs_cfgs_lpddr4[] = {\n+ #include \"sdram-rk3399-lpddr4-400.inc\"\n+ #include \"sdram-rk3399-lpddr4-800.inc\"\n+@@ -3011,20 +3010,40 @@ static int sdram_init(struct dram_info *dram,\n+ \treturn 0;\n+ }\n+ \n++__weak const char *rk3399_get_ddrtype(void)\n++{\n++\treturn NULL;\n++}\n++\n+ static int rk3399_dmc_ofdata_to_platdata(struct udevice *dev)\n+ {\n+ #if !CONFIG_IS_ENABLED(OF_PLATDATA)\n+ \tstruct rockchip_dmc_plat *plat = dev_get_platdata(dev);\n++\tofnode node = { .np = NULL };\n++\tconst char *name;\n+ \tint ret;\n+ \n+-\tret = dev_read_u32_array(dev, \"rockchip,sdram-params\",\n+-\t\t\t\t (u32 *)&plat->sdram_params,\n+-\t\t\t\t sizeof(plat->sdram_params) / sizeof(u32));\n++\tname = rk3399_get_ddrtype();\n++\tif (name)\n++\t\tnode = dev_read_subnode(dev, name);\n++\tif (!ofnode_valid(node)) {\n++\t\tdebug(\"Failed to read subnode %s\\n\", name);\n++\t\tnode = dev_read_first_subnode(dev);\n++\t}\n++\n++\t/* fallback to current node */\n++\tif (!ofnode_valid(node))\n++\t\tnode = dev_ofnode(dev);\n++\n++\tret = ofnode_read_u32_array(node, \"rockchip,sdram-params\",\n++\t\t\t\t    (u32 *)&plat->sdram_params,\n++\t\t\t\t    sizeof(plat->sdram_params) / sizeof(u32));\n+ \tif (ret) {\n+ \t\tprintf(\"%s: Cannot read rockchip,sdram-params %d\\n\",\n+ \t\t       __func__, ret);\n+ \t\treturn ret;\n+ \t}\n++\n+ \tret = regmap_init_mem(dev_ofnode(dev), &plat->map);\n+ \tif (ret)\n+ \t\tprintf(\"%s: regmap failed %d\\n\", __func__, ret);\n+@@ -3051,18 +3070,20 @@ static int conv_of_platdata(struct udevice *dev)\n+ #endif\n+ \n+ static const struct sdram_rk3399_ops rk3399_ops = {\n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ \t.data_training_first = data_training_first,\n+ \t.set_rate_index = switch_to_phy_index1,\n+ \t.modify_param = modify_param,\n+ \t.get_phy_index_params = get_phy_index_params,\n+-#else\n++};\n++\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++static const struct sdram_rk3399_ops lpddr4_ops = {\n+ \t.data_training_first = lpddr4_mr_detect,\n+ \t.set_rate_index = lpddr4_set_rate,\n+ \t.modify_param = lpddr4_modify_param,\n+ \t.get_phy_index_params = lpddr4_get_phy_index_params,\n+-#endif\n+ };\n++#endif\n+ \n+ static int rk3399_dmc_init(struct udevice *dev)\n+ {\n+@@ -3081,7 +3102,17 @@ static int rk3399_dmc_init(struct udevice *dev)\n+ \t\treturn ret;\n+ #endif\n+ \n+-\tpriv->ops = &rk3399_ops;\n++\tif (params->base.dramtype == LPDDR4) {\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++\t\tpriv->ops = &lpddr4_ops;\n++#else\n++\t\tprintf(\"LPDDR4 support is disable\\n\");\n++\t\treturn -EINVAL;\n++#endif\n++\t} else {\n++\t\tpriv->ops = &rk3399_ops;\n++\t}\n++\n+ \tpriv->cic = syscon_get_first_range(ROCKCHIP_SYSCON_CIC);\n+ \tpriv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n+ \tpriv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);\ndiff --git a/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..74c7c3f4a5\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,313 @@\n+From 8dc76bbce30c3f63f290f008f8410c00fee13c9a Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 05:55:50 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm/dts/Makefile                      |   1 +\n+ arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi |   9 ++\n+ arch/arm/dts/rk3399-nanopi-r4s.dts         | 178 +++++++++++++++++++++\n+ board/friendlyarm/nanopi4/MAINTAINERS      |   6 +\n+ configs/nanopi-r4s-rk3399_defconfig        |  63 ++++++++\n+ 5 files changed, 257 insertions(+)\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s.dts\n+ create mode 100644 configs/nanopi-r4s-rk3399_defconfig\n+\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -132,6 +132,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \\\n+ \trk3399-nanopi-m4.dtb \\\n+ \trk3399-nanopi-m4-2gb.dtb \\\n+ \trk3399-nanopi-neo4.dtb \\\n++\trk3399-nanopi-r4s.dtb \\\n+ \trk3399-orangepi.dtb \\\n+ \trk3399-pinebook-pro.dtb \\\n+ \trk3399-puma-haikou.dtb \\\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+@@ -0,0 +1,9 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * (C) Copyright 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ */\n++\n++#include \"rk3399-nanopi4-u-boot.dtsi\"\n++#include \"rk3399-sdram-lpddr4-100.dtsi\"\n++#include \"rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\"\n++#include \"rk3399-sdram-ddr3-1866.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\n+--- a/board/friendlyarm/nanopi4/MAINTAINERS\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -3,3 +3,9 @@ M:      FriendlyElec <support@friendlyarm.com>\n+ S:      Maintained\n+ F:      board/friendlyarm/nanopi4/\n+ F:      include/configs/nanopi4.h\n++\n++NANOPI-R4S\n++M:      Tianling Shen <cnsztl@gmail.com>\n++S:      Maintained\n++F:      configs/nanopi-r4s-rk3399_defconfig\n++F:      arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+--- /dev/null\n++++ b/configs/nanopi-r4s-rk3399_defconfig\n+@@ -0,0 +1,63 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3399=y\n++CONFIG_TARGET_NANOPI4_RK3399=y\n++CONFIG_DEBUG_UART_BASE=0xFF1A0000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3399-nanopi-r4s\"\n++CONFIG_DEBUG_UART=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3399-nanopi-r4s.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000\n++CONFIG_TPL=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_OF_SPL_REMOVE_PROPS=\"pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_SYS_MMC_ENV_DEV=1\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_MMC_SDHCI=y\n++CONFIG_MMC_SDHCI_ROCKCHIP=y\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM_RK3399_LPDDR4=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_KEYBOARD=y\n++CONFIG_USB_HOST_ETHER=y\n++CONFIG_USB_ETHER_ASIX=y\n++CONFIG_USB_ETHER_ASIX88179=y\n++CONFIG_USB_ETHER_MCS7830=y\n++CONFIG_USB_ETHER_RTL8152=y\n++CONFIG_USB_ETHER_SMSC95XX=y\n++CONFIG_DM_VIDEO=y\n++CONFIG_DISPLAY=y\n++CONFIG_VIDEO_ROCKCHIP=y\n++CONFIG_DISPLAY_ROCKCHIP_HDMI=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\ndiff --git a/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..70cfadca9c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -148,9 +148,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..2981c3d906\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2748,6 +2748,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3783,9 +3790,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex 7aeb0a3d55..f7b6995911 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk\n \n BOARD:=rockchip\n BOARDNAME:=Rockchip\n-FEATURES:=ext4 audio usb usbgadget display gpio fpu rootfs-part boot-part squashfs\n+FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n KERNEL_PATCHVER=5.4\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex e97ea3312d..bfecd0874c 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -8,7 +8,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+friendlyarm,nanopi-r4s)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 99f55513aa..0c22601c95 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -7,7 +7,8 @@ rockchip_setup_interfaces()\n \tlocal board=\"$1\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -35,6 +36,10 @@ rockchip_setup_macs()\n \t\twan_mac=$(nanopi_r2s_generate_mac)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n \t\t;;\n+\tfriendlyarm,nanopi-r4s)\n+\t\twan_mac=$(cat /sys/class/net/eth0/address)\n+\t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n+\t\t;;\n \tesac\n \n \t[ -n \"$lan_mac\" ] && ucidef_set_interface_macaddr \"lan\" $lan_mac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 44716258bf..9e4a4cf4fc 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -26,5 +26,9 @@ friendlyarm,nanopi-r2s)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tset_interface_core 10 \"eth0\"\n+\tset_interface_core 20 \"eth1\"\n+\t;;\n esac\n \ndiff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex eaef238c92..b5062cbd32 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -61,6 +61,7 @@ CONFIG_ARM_MHU=y\n CONFIG_ARM_PSCI_CPUIDLE=y\n CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y\n CONFIG_ARM_PSCI_FW=y\n+CONFIG_ARM_RK3328_DMC_DEVFREQ=y\n # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set\n # CONFIG_ARM_SCMI_PROTOCOL is not set\n CONFIG_ARM_SCPI_CPUFREQ=y\n@@ -162,6 +163,10 @@ CONFIG_CRYPTO_AEAD2=y\n CONFIG_CRYPTO_CRC32=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+# CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n CONFIG_CRYPTO_HASH=y\n CONFIG_CRYPTO_HASH2=y\n CONFIG_CRYPTO_MANAGER=y\ndiff --git a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4\nindex f6ec79b121..96291fab91 100644\n--- a/target/linux/rockchip/armv8/config-5.4\n+++ b/target/linux/rockchip/armv8/config-5.4\n@@ -63,6 +63,7 @@ CONFIG_ARM_GIC_V3_ITS_PCI=y\n CONFIG_ARM_MHU=y\n CONFIG_ARM_PSCI_CPUIDLE=y\n CONFIG_ARM_PSCI_FW=y\n+CONFIG_ARM_RK3328_DMC_DEVFREQ=y\n # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set\n # CONFIG_ARM_SCMI_PROTOCOL is not set\n CONFIG_ARM_SCPI_CPUFREQ=y\ndiff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\nnew file mode 100644\nindex 0000000000..a3f5ff4bdc\n--- /dev/null\n+++ b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n@@ -0,0 +1,311 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#include <dt-bindings/clock/rockchip-ddr.h>\n+#include <dt-bindings/memory/rk3328-dram.h>\n+\n+/ {\n+\tddr_timing: ddr_timing {\n+\t\tcompatible = \"rockchip,ddr-timing\";\n+\t\tddr3_speed_bin = <DDR3_DEFAULT>;\n+\t\tddr4_speed_bin = <DDR4_DEFAULT>;\n+\t\tpd_idle = <0>;\n+\t\tsr_idle = <0>;\n+\t\tsr_mc_gate_idle = <0>;\n+\t\tsrpd_lite_idle\t= <0>;\n+\t\tstandby_idle = <0>;\n+\n+\t\tauto_pd_dis_freq = <1066>;\n+\t\tauto_sr_dis_freq = <800>;\n+\t\tddr3_dll_dis_freq = <300>;\n+\t\tddr4_dll_dis_freq = <625>;\n+\t\tphy_dll_dis_freq = <400>;\n+\n+\t\tddr3_odt_dis_freq = <100>;\n+\t\tphy_ddr3_odt_dis_freq = <100>;\n+\t\tddr3_drv = <DDR3_DS_40ohm>;\n+\t\tddr3_odt = <DDR3_ODT_120ohm>;\n+\t\tphy_ddr3_ca_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_ck_drv = <PHY_DDR3_RON_RTT_45ohm>;\n+\t\tphy_ddr3_dq_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_odt = <PHY_DDR3_RON_RTT_225ohm>;\n+\n+\t\tlpddr3_odt_dis_freq = <666>;\n+\t\tphy_lpddr3_odt_dis_freq = <666>;\n+\t\tlpddr3_drv = <LP3_DS_40ohm>;\n+\t\tlpddr3_odt = <LP3_ODT_240ohm>;\n+\t\tphy_lpddr3_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_lpddr3_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\tlpddr4_odt_dis_freq = <800>;\n+\t\tphy_lpddr4_odt_dis_freq = <800>;\n+\t\tlpddr4_drv = <LP4_PDDS_60ohm>;\n+\t\tlpddr4_dq_odt = <LP4_DQ_ODT_40ohm>;\n+\t\tlpddr4_ca_odt = <LP4_CA_ODT_40ohm>;\n+\t\tphy_lpddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_40ohm>;\n+\t\tphy_lpddr4_ck_cs_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_60ohm>;\n+\n+\t\tddr4_odt_dis_freq = <666>;\n+\t\tphy_ddr4_odt_dis_freq = <666>;\n+\t\tddr4_drv = <DDR4_DS_34ohm>;\n+\t\tddr4_odt = <DDR4_RTT_NOM_240ohm>;\n+\t\tphy_ddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_ddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\t/* CA de-skew, one step is 47.8ps, range 0-15 */\n+\t\tddr3a1_ddr4a9_de-skew = <7>;\n+\t\tddr3a0_ddr4a10_de-skew = <7>;\n+\t\tddr3a3_ddr4a6_de-skew = <8>;\n+\t\tddr3a2_ddr4a4_de-skew = <8>;\n+\t\tddr3a5_ddr4a8_de-skew = <7>;\n+\t\tddr3a4_ddr4a5_de-skew = <9>;\n+\t\tddr3a7_ddr4a11_de-skew = <7>;\n+\t\tddr3a6_ddr4a7_de-skew = <9>;\n+\t\tddr3a9_ddr4a0_de-skew = <8>;\n+\t\tddr3a8_ddr4a13_de-skew = <7>;\n+\t\tddr3a11_ddr4a3_de-skew = <9>;\n+\t\tddr3a10_ddr4cs0_de-skew = <7>;\n+\t\tddr3a13_ddr4a2_de-skew = <8>;\n+\t\tddr3a12_ddr4ba1_de-skew = <7>;\n+\t\tddr3a15_ddr4odt0_de-skew = <7>;\n+\t\tddr3a14_ddr4a1_de-skew = <8>;\n+\t\tddr3ba1_ddr4a15_de-skew = <7>;\n+\t\tddr3ba0_ddr4bg0_de-skew = <7>;\n+\t\tddr3ras_ddr4cke_de-skew = <7>;\n+\t\tddr3ba2_ddr4ba0_de-skew = <8>;\n+\t\tddr3we_ddr4bg1_de-skew = <8>;\n+\t\tddr3cas_ddr4a12_de-skew = <7>;\n+\t\tddr3ckn_ddr4ckn_de-skew = <8>;\n+\t\tddr3ckp_ddr4ckp_de-skew = <8>;\n+\t\tddr3cke_ddr4a16_de-skew = <8>;\n+\t\tddr3odt0_ddr4a14_de-skew = <7>;\n+\t\tddr3cs0_ddr4act_de-skew = <8>;\n+\t\tddr3reset_ddr4reset_de-skew = <7>;\n+\t\tddr3cs1_ddr4cs1_de-skew = <7>;\n+\t\tddr3odt1_ddr4odt1_de-skew = <7>;\n+\n+\t\t/* DATA de-skew\n+\t\t * RX one step is 25.1ps, range 0-15\n+\t\t * TX one step is 47.8ps, range 0-15\n+\t\t */\n+\t\tcs0_dm0_rx_de-skew = <7>;\n+\t\tcs0_dm0_tx_de-skew = <8>;\n+\t\tcs0_dq0_rx_de-skew = <7>;\n+\t\tcs0_dq0_tx_de-skew = <8>;\n+\t\tcs0_dq1_rx_de-skew = <7>;\n+\t\tcs0_dq1_tx_de-skew = <8>;\n+\t\tcs0_dq2_rx_de-skew = <7>;\n+\t\tcs0_dq2_tx_de-skew = <8>;\n+\t\tcs0_dq3_rx_de-skew = <7>;\n+\t\tcs0_dq3_tx_de-skew = <8>;\n+\t\tcs0_dq4_rx_de-skew = <7>;\n+\t\tcs0_dq4_tx_de-skew = <8>;\n+\t\tcs0_dq5_rx_de-skew = <7>;\n+\t\tcs0_dq5_tx_de-skew = <8>;\n+\t\tcs0_dq6_rx_de-skew = <7>;\n+\t\tcs0_dq6_tx_de-skew = <8>;\n+\t\tcs0_dq7_rx_de-skew = <7>;\n+\t\tcs0_dq7_tx_de-skew = <8>;\n+\t\tcs0_dqs0_rx_de-skew = <6>;\n+\t\tcs0_dqs0p_tx_de-skew = <9>;\n+\t\tcs0_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm1_rx_de-skew = <7>;\n+\t\tcs0_dm1_tx_de-skew = <7>;\n+\t\tcs0_dq8_rx_de-skew = <7>;\n+\t\tcs0_dq8_tx_de-skew = <8>;\n+\t\tcs0_dq9_rx_de-skew = <7>;\n+\t\tcs0_dq9_tx_de-skew = <7>;\n+\t\tcs0_dq10_rx_de-skew = <7>;\n+\t\tcs0_dq10_tx_de-skew = <8>;\n+\t\tcs0_dq11_rx_de-skew = <7>;\n+\t\tcs0_dq11_tx_de-skew = <7>;\n+\t\tcs0_dq12_rx_de-skew = <7>;\n+\t\tcs0_dq12_tx_de-skew = <8>;\n+\t\tcs0_dq13_rx_de-skew = <7>;\n+\t\tcs0_dq13_tx_de-skew = <7>;\n+\t\tcs0_dq14_rx_de-skew = <7>;\n+\t\tcs0_dq14_tx_de-skew = <8>;\n+\t\tcs0_dq15_rx_de-skew = <7>;\n+\t\tcs0_dq15_tx_de-skew = <7>;\n+\t\tcs0_dqs1_rx_de-skew = <7>;\n+\t\tcs0_dqs1p_tx_de-skew = <9>;\n+\t\tcs0_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm2_rx_de-skew = <7>;\n+\t\tcs0_dm2_tx_de-skew = <8>;\n+\t\tcs0_dq16_rx_de-skew = <7>;\n+\t\tcs0_dq16_tx_de-skew = <8>;\n+\t\tcs0_dq17_rx_de-skew = <7>;\n+\t\tcs0_dq17_tx_de-skew = <8>;\n+\t\tcs0_dq18_rx_de-skew = <7>;\n+\t\tcs0_dq18_tx_de-skew = <8>;\n+\t\tcs0_dq19_rx_de-skew = <7>;\n+\t\tcs0_dq19_tx_de-skew = <8>;\n+\t\tcs0_dq20_rx_de-skew = <7>;\n+\t\tcs0_dq20_tx_de-skew = <8>;\n+\t\tcs0_dq21_rx_de-skew = <7>;\n+\t\tcs0_dq21_tx_de-skew = <8>;\n+\t\tcs0_dq22_rx_de-skew = <7>;\n+\t\tcs0_dq22_tx_de-skew = <8>;\n+\t\tcs0_dq23_rx_de-skew = <7>;\n+\t\tcs0_dq23_tx_de-skew = <8>;\n+\t\tcs0_dqs2_rx_de-skew = <6>;\n+\t\tcs0_dqs2p_tx_de-skew = <9>;\n+\t\tcs0_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm3_rx_de-skew = <7>;\n+\t\tcs0_dm3_tx_de-skew = <7>;\n+\t\tcs0_dq24_rx_de-skew = <7>;\n+\t\tcs0_dq24_tx_de-skew = <8>;\n+\t\tcs0_dq25_rx_de-skew = <7>;\n+\t\tcs0_dq25_tx_de-skew = <7>;\n+\t\tcs0_dq26_rx_de-skew = <7>;\n+\t\tcs0_dq26_tx_de-skew = <7>;\n+\t\tcs0_dq27_rx_de-skew = <7>;\n+\t\tcs0_dq27_tx_de-skew = <7>;\n+\t\tcs0_dq28_rx_de-skew = <7>;\n+\t\tcs0_dq28_tx_de-skew = <7>;\n+\t\tcs0_dq29_rx_de-skew = <7>;\n+\t\tcs0_dq29_tx_de-skew = <7>;\n+\t\tcs0_dq30_rx_de-skew = <7>;\n+\t\tcs0_dq30_tx_de-skew = <7>;\n+\t\tcs0_dq31_rx_de-skew = <7>;\n+\t\tcs0_dq31_tx_de-skew = <7>;\n+\t\tcs0_dqs3_rx_de-skew = <7>;\n+\t\tcs0_dqs3p_tx_de-skew = <9>;\n+\t\tcs0_dqs3n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm0_rx_de-skew = <7>;\n+\t\tcs1_dm0_tx_de-skew = <8>;\n+\t\tcs1_dq0_rx_de-skew = <7>;\n+\t\tcs1_dq0_tx_de-skew = <8>;\n+\t\tcs1_dq1_rx_de-skew = <7>;\n+\t\tcs1_dq1_tx_de-skew = <8>;\n+\t\tcs1_dq2_rx_de-skew = <7>;\n+\t\tcs1_dq2_tx_de-skew = <8>;\n+\t\tcs1_dq3_rx_de-skew = <7>;\n+\t\tcs1_dq3_tx_de-skew = <8>;\n+\t\tcs1_dq4_rx_de-skew = <7>;\n+\t\tcs1_dq4_tx_de-skew = <8>;\n+\t\tcs1_dq5_rx_de-skew = <7>;\n+\t\tcs1_dq5_tx_de-skew = <8>;\n+\t\tcs1_dq6_rx_de-skew = <7>;\n+\t\tcs1_dq6_tx_de-skew = <8>;\n+\t\tcs1_dq7_rx_de-skew = <7>;\n+\t\tcs1_dq7_tx_de-skew = <8>;\n+\t\tcs1_dqs0_rx_de-skew = <6>;\n+\t\tcs1_dqs0p_tx_de-skew = <9>;\n+\t\tcs1_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm1_rx_de-skew = <7>;\n+\t\tcs1_dm1_tx_de-skew = <7>;\n+\t\tcs1_dq8_rx_de-skew = <7>;\n+\t\tcs1_dq8_tx_de-skew = <8>;\n+\t\tcs1_dq9_rx_de-skew = <7>;\n+\t\tcs1_dq9_tx_de-skew = <7>;\n+\t\tcs1_dq10_rx_de-skew = <7>;\n+\t\tcs1_dq10_tx_de-skew = <8>;\n+\t\tcs1_dq11_rx_de-skew = <7>;\n+\t\tcs1_dq11_tx_de-skew = <7>;\n+\t\tcs1_dq12_rx_de-skew = <7>;\n+\t\tcs1_dq12_tx_de-skew = <8>;\n+\t\tcs1_dq13_rx_de-skew = <7>;\n+\t\tcs1_dq13_tx_de-skew = <7>;\n+\t\tcs1_dq14_rx_de-skew = <7>;\n+\t\tcs1_dq14_tx_de-skew = <8>;\n+\t\tcs1_dq15_rx_de-skew = <7>;\n+\t\tcs1_dq15_tx_de-skew = <7>;\n+\t\tcs1_dqs1_rx_de-skew = <7>;\n+\t\tcs1_dqs1p_tx_de-skew = <9>;\n+\t\tcs1_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm2_rx_de-skew = <7>;\n+\t\tcs1_dm2_tx_de-skew = <8>;\n+\t\tcs1_dq16_rx_de-skew = <7>;\n+\t\tcs1_dq16_tx_de-skew = <8>;\n+\t\tcs1_dq17_rx_de-skew = <7>;\n+\t\tcs1_dq17_tx_de-skew = <8>;\n+\t\tcs1_dq18_rx_de-skew = <7>;\n+\t\tcs1_dq18_tx_de-skew = <8>;\n+\t\tcs1_dq19_rx_de-skew = <7>;\n+\t\tcs1_dq19_tx_de-skew = <8>;\n+\t\tcs1_dq20_rx_de-skew = <7>;\n+\t\tcs1_dq20_tx_de-skew = <8>;\n+\t\tcs1_dq21_rx_de-skew = <7>;\n+\t\tcs1_dq21_tx_de-skew = <8>;\n+\t\tcs1_dq22_rx_de-skew = <7>;\n+\t\tcs1_dq22_tx_de-skew = <8>;\n+\t\tcs1_dq23_rx_de-skew = <7>;\n+\t\tcs1_dq23_tx_de-skew = <8>;\n+\t\tcs1_dqs2_rx_de-skew = <6>;\n+\t\tcs1_dqs2p_tx_de-skew = <9>;\n+\t\tcs1_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm3_rx_de-skew = <7>;\n+\t\tcs1_dm3_tx_de-skew = <7>;\n+\t\tcs1_dq24_rx_de-skew = <7>;\n+\t\tcs1_dq24_tx_de-skew = <8>;\n+\t\tcs1_dq25_rx_de-skew = <7>;\n+\t\tcs1_dq25_tx_de-skew = <7>;\n+\t\tcs1_dq26_rx_de-skew = <7>;\n+\t\tcs1_dq26_tx_de-skew = <7>;\n+\t\tcs1_dq27_rx_de-skew = <7>;\n+\t\tcs1_dq27_tx_de-skew = <7>;\n+\t\tcs1_dq28_rx_de-skew = <7>;\n+\t\tcs1_dq28_tx_de-skew = <7>;\n+\t\tcs1_dq29_rx_de-skew = <7>;\n+\t\tcs1_dq29_tx_de-skew = <7>;\n+\t\tcs1_dq30_rx_de-skew = <7>;\n+\t\tcs1_dq30_tx_de-skew = <7>;\n+\t\tcs1_dq31_rx_de-skew = <7>;\n+\t\tcs1_dq31_tx_de-skew = <7>;\n+\t\tcs1_dqs3_rx_de-skew = <7>;\n+\t\tcs1_dqs3p_tx_de-skew = <9>;\n+\t\tcs1_dqs3n_tx_de-skew = <9>;\n+\t};\n+};\ndiff --git a/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\nnew file mode 100644\nindex 0000000000..72601a0904\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n@@ -0,0 +1,852 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd.\n+ * Author: Lin Huang <hl@rock-chips.com>\n+ */\n+\n+#include <linux/arm-smccc.h>\n+#include <linux/clk.h>\n+#include <linux/delay.h>\n+#include <linux/devfreq.h>\n+#include <linux/devfreq-event.h>\n+#include <linux/interrupt.h>\n+#include <linux/iversion.h>\n+#include <linux/mfd/syscon.h>\n+#include <linux/module.h>\n+#include <linux/of.h>\n+#include <linux/platform_device.h>\n+#include <linux/pm_opp.h>\n+#include <linux/regmap.h>\n+#include <linux/regulator/consumer.h>\n+#include <linux/rwsem.h>\n+#include <linux/suspend.h>\n+#include <linux/version.h>\n+\n+#include <soc/rockchip/rockchip_sip.h>\n+\n+#define DTS_PAR_OFFSET\t\t(4096)\n+\n+struct share_params {\n+\tu32 hz;\n+\tu32 lcdc_type;\n+\tu32 vop;\n+\tu32 vop_dclk_mode;\n+\tu32 sr_idle_en;\n+\tu32 addr_mcu_el3;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag1;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag0;\n+\tu32 complt_hwirq;\n+\t/* if need, add parameter after */\n+};\n+\n+static struct share_params *ddr_psci_param;\n+\n+/* hope this define can adapt all future platform */\n+static const char * const rk3328_dts_timing[] = {\n+\t\"ddr3_speed_bin\",\n+\t\"ddr4_speed_bin\",\n+\t\"pd_idle\",\n+\t\"sr_idle\",\n+\t\"sr_mc_gate_idle\",\n+\t\"srpd_lite_idle\",\n+\t\"standby_idle\",\n+\n+\t\"auto_pd_dis_freq\",\n+\t\"auto_sr_dis_freq\",\n+\t\"ddr3_dll_dis_freq\",\n+\t\"ddr4_dll_dis_freq\",\n+\t\"phy_dll_dis_freq\",\n+\n+\t\"ddr3_odt_dis_freq\",\n+\t\"phy_ddr3_odt_dis_freq\",\n+\t\"ddr3_drv\",\n+\t\"ddr3_odt\",\n+\t\"phy_ddr3_ca_drv\",\n+\t\"phy_ddr3_ck_drv\",\n+\t\"phy_ddr3_dq_drv\",\n+\t\"phy_ddr3_odt\",\n+\n+\t\"lpddr3_odt_dis_freq\",\n+\t\"phy_lpddr3_odt_dis_freq\",\n+\t\"lpddr3_drv\",\n+\t\"lpddr3_odt\",\n+\t\"phy_lpddr3_ca_drv\",\n+\t\"phy_lpddr3_ck_drv\",\n+\t\"phy_lpddr3_dq_drv\",\n+\t\"phy_lpddr3_odt\",\n+\n+\t\"lpddr4_odt_dis_freq\",\n+\t\"phy_lpddr4_odt_dis_freq\",\n+\t\"lpddr4_drv\",\n+\t\"lpddr4_dq_odt\",\n+\t\"lpddr4_ca_odt\",\n+\t\"phy_lpddr4_ca_drv\",\n+\t\"phy_lpddr4_ck_cs_drv\",\n+\t\"phy_lpddr4_dq_drv\",\n+\t\"phy_lpddr4_odt\",\n+\n+\t\"ddr4_odt_dis_freq\",\n+\t\"phy_ddr4_odt_dis_freq\",\n+\t\"ddr4_drv\",\n+\t\"ddr4_odt\",\n+\t\"phy_ddr4_ca_drv\",\n+\t\"phy_ddr4_ck_drv\",\n+\t\"phy_ddr4_dq_drv\",\n+\t\"phy_ddr4_odt\",\n+};\n+\n+static const char * const rk3328_dts_ca_timing[] = {\n+\t\"ddr3a1_ddr4a9_de-skew\",\n+\t\"ddr3a0_ddr4a10_de-skew\",\n+\t\"ddr3a3_ddr4a6_de-skew\",\n+\t\"ddr3a2_ddr4a4_de-skew\",\n+\t\"ddr3a5_ddr4a8_de-skew\",\n+\t\"ddr3a4_ddr4a5_de-skew\",\n+\t\"ddr3a7_ddr4a11_de-skew\",\n+\t\"ddr3a6_ddr4a7_de-skew\",\n+\t\"ddr3a9_ddr4a0_de-skew\",\n+\t\"ddr3a8_ddr4a13_de-skew\",\n+\t\"ddr3a11_ddr4a3_de-skew\",\n+\t\"ddr3a10_ddr4cs0_de-skew\",\n+\t\"ddr3a13_ddr4a2_de-skew\",\n+\t\"ddr3a12_ddr4ba1_de-skew\",\n+\t\"ddr3a15_ddr4odt0_de-skew\",\n+\t\"ddr3a14_ddr4a1_de-skew\",\n+\t\"ddr3ba1_ddr4a15_de-skew\",\n+\t\"ddr3ba0_ddr4bg0_de-skew\",\n+\t\"ddr3ras_ddr4cke_de-skew\",\n+\t\"ddr3ba2_ddr4ba0_de-skew\",\n+\t\"ddr3we_ddr4bg1_de-skew\",\n+\t\"ddr3cas_ddr4a12_de-skew\",\n+\t\"ddr3ckn_ddr4ckn_de-skew\",\n+\t\"ddr3ckp_ddr4ckp_de-skew\",\n+\t\"ddr3cke_ddr4a16_de-skew\",\n+\t\"ddr3odt0_ddr4a14_de-skew\",\n+\t\"ddr3cs0_ddr4act_de-skew\",\n+\t\"ddr3reset_ddr4reset_de-skew\",\n+\t\"ddr3cs1_ddr4cs1_de-skew\",\n+\t\"ddr3odt1_ddr4odt1_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs0_timing[] = {\n+\t\"cs0_dm0_rx_de-skew\",\n+\t\"cs0_dm0_tx_de-skew\",\n+\t\"cs0_dq0_rx_de-skew\",\n+\t\"cs0_dq0_tx_de-skew\",\n+\t\"cs0_dq1_rx_de-skew\",\n+\t\"cs0_dq1_tx_de-skew\",\n+\t\"cs0_dq2_rx_de-skew\",\n+\t\"cs0_dq2_tx_de-skew\",\n+\t\"cs0_dq3_rx_de-skew\",\n+\t\"cs0_dq3_tx_de-skew\",\n+\t\"cs0_dq4_rx_de-skew\",\n+\t\"cs0_dq4_tx_de-skew\",\n+\t\"cs0_dq5_rx_de-skew\",\n+\t\"cs0_dq5_tx_de-skew\",\n+\t\"cs0_dq6_rx_de-skew\",\n+\t\"cs0_dq6_tx_de-skew\",\n+\t\"cs0_dq7_rx_de-skew\",\n+\t\"cs0_dq7_tx_de-skew\",\n+\t\"cs0_dqs0_rx_de-skew\",\n+\t\"cs0_dqs0p_tx_de-skew\",\n+\t\"cs0_dqs0n_tx_de-skew\",\n+\n+\t\"cs0_dm1_rx_de-skew\",\n+\t\"cs0_dm1_tx_de-skew\",\n+\t\"cs0_dq8_rx_de-skew\",\n+\t\"cs0_dq8_tx_de-skew\",\n+\t\"cs0_dq9_rx_de-skew\",\n+\t\"cs0_dq9_tx_de-skew\",\n+\t\"cs0_dq10_rx_de-skew\",\n+\t\"cs0_dq10_tx_de-skew\",\n+\t\"cs0_dq11_rx_de-skew\",\n+\t\"cs0_dq11_tx_de-skew\",\n+\t\"cs0_dq12_rx_de-skew\",\n+\t\"cs0_dq12_tx_de-skew\",\n+\t\"cs0_dq13_rx_de-skew\",\n+\t\"cs0_dq13_tx_de-skew\",\n+\t\"cs0_dq14_rx_de-skew\",\n+\t\"cs0_dq14_tx_de-skew\",\n+\t\"cs0_dq15_rx_de-skew\",\n+\t\"cs0_dq15_tx_de-skew\",\n+\t\"cs0_dqs1_rx_de-skew\",\n+\t\"cs0_dqs1p_tx_de-skew\",\n+\t\"cs0_dqs1n_tx_de-skew\",\n+\n+\t\"cs0_dm2_rx_de-skew\",\n+\t\"cs0_dm2_tx_de-skew\",\n+\t\"cs0_dq16_rx_de-skew\",\n+\t\"cs0_dq16_tx_de-skew\",\n+\t\"cs0_dq17_rx_de-skew\",\n+\t\"cs0_dq17_tx_de-skew\",\n+\t\"cs0_dq18_rx_de-skew\",\n+\t\"cs0_dq18_tx_de-skew\",\n+\t\"cs0_dq19_rx_de-skew\",\n+\t\"cs0_dq19_tx_de-skew\",\n+\t\"cs0_dq20_rx_de-skew\",\n+\t\"cs0_dq20_tx_de-skew\",\n+\t\"cs0_dq21_rx_de-skew\",\n+\t\"cs0_dq21_tx_de-skew\",\n+\t\"cs0_dq22_rx_de-skew\",\n+\t\"cs0_dq22_tx_de-skew\",\n+\t\"cs0_dq23_rx_de-skew\",\n+\t\"cs0_dq23_tx_de-skew\",\n+\t\"cs0_dqs2_rx_de-skew\",\n+\t\"cs0_dqs2p_tx_de-skew\",\n+\t\"cs0_dqs2n_tx_de-skew\",\n+\n+\t\"cs0_dm3_rx_de-skew\",\n+\t\"cs0_dm3_tx_de-skew\",\n+\t\"cs0_dq24_rx_de-skew\",\n+\t\"cs0_dq24_tx_de-skew\",\n+\t\"cs0_dq25_rx_de-skew\",\n+\t\"cs0_dq25_tx_de-skew\",\n+\t\"cs0_dq26_rx_de-skew\",\n+\t\"cs0_dq26_tx_de-skew\",\n+\t\"cs0_dq27_rx_de-skew\",\n+\t\"cs0_dq27_tx_de-skew\",\n+\t\"cs0_dq28_rx_de-skew\",\n+\t\"cs0_dq28_tx_de-skew\",\n+\t\"cs0_dq29_rx_de-skew\",\n+\t\"cs0_dq29_tx_de-skew\",\n+\t\"cs0_dq30_rx_de-skew\",\n+\t\"cs0_dq30_tx_de-skew\",\n+\t\"cs0_dq31_rx_de-skew\",\n+\t\"cs0_dq31_tx_de-skew\",\n+\t\"cs0_dqs3_rx_de-skew\",\n+\t\"cs0_dqs3p_tx_de-skew\",\n+\t\"cs0_dqs3n_tx_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs1_timing[] = {\n+\t\"cs1_dm0_rx_de-skew\",\n+\t\"cs1_dm0_tx_de-skew\",\n+\t\"cs1_dq0_rx_de-skew\",\n+\t\"cs1_dq0_tx_de-skew\",\n+\t\"cs1_dq1_rx_de-skew\",\n+\t\"cs1_dq1_tx_de-skew\",\n+\t\"cs1_dq2_rx_de-skew\",\n+\t\"cs1_dq2_tx_de-skew\",\n+\t\"cs1_dq3_rx_de-skew\",\n+\t\"cs1_dq3_tx_de-skew\",\n+\t\"cs1_dq4_rx_de-skew\",\n+\t\"cs1_dq4_tx_de-skew\",\n+\t\"cs1_dq5_rx_de-skew\",\n+\t\"cs1_dq5_tx_de-skew\",\n+\t\"cs1_dq6_rx_de-skew\",\n+\t\"cs1_dq6_tx_de-skew\",\n+\t\"cs1_dq7_rx_de-skew\",\n+\t\"cs1_dq7_tx_de-skew\",\n+\t\"cs1_dqs0_rx_de-skew\",\n+\t\"cs1_dqs0p_tx_de-skew\",\n+\t\"cs1_dqs0n_tx_de-skew\",\n+\n+\t\"cs1_dm1_rx_de-skew\",\n+\t\"cs1_dm1_tx_de-skew\",\n+\t\"cs1_dq8_rx_de-skew\",\n+\t\"cs1_dq8_tx_de-skew\",\n+\t\"cs1_dq9_rx_de-skew\",\n+\t\"cs1_dq9_tx_de-skew\",\n+\t\"cs1_dq10_rx_de-skew\",\n+\t\"cs1_dq10_tx_de-skew\",\n+\t\"cs1_dq11_rx_de-skew\",\n+\t\"cs1_dq11_tx_de-skew\",\n+\t\"cs1_dq12_rx_de-skew\",\n+\t\"cs1_dq12_tx_de-skew\",\n+\t\"cs1_dq13_rx_de-skew\",\n+\t\"cs1_dq13_tx_de-skew\",\n+\t\"cs1_dq14_rx_de-skew\",\n+\t\"cs1_dq14_tx_de-skew\",\n+\t\"cs1_dq15_rx_de-skew\",\n+\t\"cs1_dq15_tx_de-skew\",\n+\t\"cs1_dqs1_rx_de-skew\",\n+\t\"cs1_dqs1p_tx_de-skew\",\n+\t\"cs1_dqs1n_tx_de-skew\",\n+\n+\t\"cs1_dm2_rx_de-skew\",\n+\t\"cs1_dm2_tx_de-skew\",\n+\t\"cs1_dq16_rx_de-skew\",\n+\t\"cs1_dq16_tx_de-skew\",\n+\t\"cs1_dq17_rx_de-skew\",\n+\t\"cs1_dq17_tx_de-skew\",\n+\t\"cs1_dq18_rx_de-skew\",\n+\t\"cs1_dq18_tx_de-skew\",\n+\t\"cs1_dq19_rx_de-skew\",\n+\t\"cs1_dq19_tx_de-skew\",\n+\t\"cs1_dq20_rx_de-skew\",\n+\t\"cs1_dq20_tx_de-skew\",\n+\t\"cs1_dq21_rx_de-skew\",\n+\t\"cs1_dq21_tx_de-skew\",\n+\t\"cs1_dq22_rx_de-skew\",\n+\t\"cs1_dq22_tx_de-skew\",\n+\t\"cs1_dq23_rx_de-skew\",\n+\t\"cs1_dq23_tx_de-skew\",\n+\t\"cs1_dqs2_rx_de-skew\",\n+\t\"cs1_dqs2p_tx_de-skew\",\n+\t\"cs1_dqs2n_tx_de-skew\",\n+\n+\t\"cs1_dm3_rx_de-skew\",\n+\t\"cs1_dm3_tx_de-skew\",\n+\t\"cs1_dq24_rx_de-skew\",\n+\t\"cs1_dq24_tx_de-skew\",\n+\t\"cs1_dq25_rx_de-skew\",\n+\t\"cs1_dq25_tx_de-skew\",\n+\t\"cs1_dq26_rx_de-skew\",\n+\t\"cs1_dq26_tx_de-skew\",\n+\t\"cs1_dq27_rx_de-skew\",\n+\t\"cs1_dq27_tx_de-skew\",\n+\t\"cs1_dq28_rx_de-skew\",\n+\t\"cs1_dq28_tx_de-skew\",\n+\t\"cs1_dq29_rx_de-skew\",\n+\t\"cs1_dq29_tx_de-skew\",\n+\t\"cs1_dq30_rx_de-skew\",\n+\t\"cs1_dq30_tx_de-skew\",\n+\t\"cs1_dq31_rx_de-skew\",\n+\t\"cs1_dq31_tx_de-skew\",\n+\t\"cs1_dqs3_rx_de-skew\",\n+\t\"cs1_dqs3p_tx_de-skew\",\n+\t\"cs1_dqs3n_tx_de-skew\",\n+};\n+\n+struct rk3328_ddr_dts_config_timing {\n+\tunsigned int ddr3_speed_bin;\n+\tunsigned int ddr4_speed_bin;\n+\tunsigned int pd_idle;\n+\tunsigned int sr_idle;\n+\tunsigned int sr_mc_gate_idle;\n+\tunsigned int srpd_lite_idle;\n+\tunsigned int standby_idle;\n+\n+\tunsigned int auto_pd_dis_freq;\n+\tunsigned int auto_sr_dis_freq;\n+\t/* for ddr3 only */\n+\tunsigned int ddr3_dll_dis_freq;\n+\t/* for ddr4 only */\n+\tunsigned int ddr4_dll_dis_freq;\n+\tunsigned int phy_dll_dis_freq;\n+\n+\tunsigned int ddr3_odt_dis_freq;\n+\tunsigned int phy_ddr3_odt_dis_freq;\n+\tunsigned int ddr3_drv;\n+\tunsigned int ddr3_odt;\n+\tunsigned int phy_ddr3_ca_drv;\n+\tunsigned int phy_ddr3_ck_drv;\n+\tunsigned int phy_ddr3_dq_drv;\n+\tunsigned int phy_ddr3_odt;\n+\n+\tunsigned int lpddr3_odt_dis_freq;\n+\tunsigned int phy_lpddr3_odt_dis_freq;\n+\tunsigned int lpddr3_drv;\n+\tunsigned int lpddr3_odt;\n+\tunsigned int phy_lpddr3_ca_drv;\n+\tunsigned int phy_lpddr3_ck_drv;\n+\tunsigned int phy_lpddr3_dq_drv;\n+\tunsigned int phy_lpddr3_odt;\n+\n+\tunsigned int lpddr4_odt_dis_freq;\n+\tunsigned int phy_lpddr4_odt_dis_freq;\n+\tunsigned int lpddr4_drv;\n+\tunsigned int lpddr4_dq_odt;\n+\tunsigned int lpddr4_ca_odt;\n+\tunsigned int phy_lpddr4_ca_drv;\n+\tunsigned int phy_lpddr4_ck_cs_drv;\n+\tunsigned int phy_lpddr4_dq_drv;\n+\tunsigned int phy_lpddr4_odt;\n+\n+\tunsigned int ddr4_odt_dis_freq;\n+\tunsigned int phy_ddr4_odt_dis_freq;\n+\tunsigned int ddr4_drv;\n+\tunsigned int ddr4_odt;\n+\tunsigned int phy_ddr4_ca_drv;\n+\tunsigned int phy_ddr4_ck_drv;\n+\tunsigned int phy_ddr4_dq_drv;\n+\tunsigned int phy_ddr4_odt;\n+\n+\tunsigned int ca_skew[15];\n+\tunsigned int cs0_skew[44];\n+\tunsigned int cs1_skew[44];\n+\n+\tunsigned int available;\n+};\n+\n+struct rk3328_ddr_de_skew_setting {\n+\tunsigned int ca_de_skew[30];\n+\tunsigned int cs0_de_skew[84];\n+\tunsigned int cs1_de_skew[84];\n+};\n+\n+struct rk3328_dmcfreq {\n+\tstruct device *dev;\n+\tstruct devfreq *devfreq;\n+\tstruct devfreq_simple_ondemand_data ondemand_data;\n+\tstruct clk *dmc_clk;\n+\tstruct devfreq_event_dev *edev;\n+\tstruct mutex lock;\n+\tstruct regulator *vdd_center;\n+\tunsigned long rate, target_rate;\n+\tunsigned long volt, target_volt;\n+\n+\tint (*set_auto_self_refresh)(u32 en);\n+};\n+\n+static void\n+rk3328_de_skew_setting_2_register(struct rk3328_ddr_de_skew_setting *de_skew,\n+\t\t\t\t  struct rk3328_ddr_dts_config_timing *tim)\n+{\n+\tu32 n;\n+\tu32 offset;\n+\tu32 shift;\n+\n+\tmemset_io(tim->ca_skew, 0, sizeof(tim->ca_skew));\n+\tmemset_io(tim->cs0_skew, 0, sizeof(tim->cs0_skew));\n+\tmemset_io(tim->cs1_skew, 0, sizeof(tim->cs1_skew));\n+\n+\t/* CA de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->ca_de_skew); n++) {\n+\t\toffset = n / 2;\n+\t\tshift = n % 2;\n+\t\t/* 0 => 4; 1 => 0 */\n+\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->ca_skew[offset] &= ~(0xf << shift);\n+\t\ttim->ca_skew[offset] |= (de_skew->ca_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS0 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs0_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs0_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs0_skew[offset] |= (de_skew->cs0_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS1 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs1_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs1_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs1_skew[offset] |= (de_skew->cs1_de_skew[n] << shift);\n+\t}\n+}\n+\n+static void of_get_rk3328_timings(struct device *dev,\n+\t\t\t\t  struct device_node *np, uint32_t *timing)\n+{\n+\tstruct device_node *np_tim;\n+\tu32 *p;\n+\tstruct rk3328_ddr_dts_config_timing *dts_timing;\n+\tstruct rk3328_ddr_de_skew_setting *de_skew;\n+\tint ret = 0;\n+\tu32 i;\n+\n+\tdts_timing =\n+\t\t(struct rk3328_ddr_dts_config_timing *)(timing +\n+\t\t\t\t\t\t\tDTS_PAR_OFFSET / 4);\n+\n+\tnp_tim = of_parse_phandle(np, \"ddr_timing\", 0);\n+\tif (!np_tim) {\n+\t\tret = -EINVAL;\n+\t\tgoto end;\n+\t}\n+\tde_skew = kmalloc(sizeof(*de_skew), GFP_KERNEL);\n+\tif (!de_skew) {\n+\t\tret = -ENOMEM;\n+\t\tgoto end;\n+\t}\n+\n+\tp = (u32 *)dts_timing;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->ca_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_ca_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_ca_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs0_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs0_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs0_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs1_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs1_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs1_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tif (!ret)\n+\t\trk3328_de_skew_setting_2_register(de_skew, dts_timing);\n+\n+\tkfree(de_skew);\n+end:\n+\tif (!ret) {\n+\t\tdts_timing->available = 1;\n+\t} else {\n+\t\tdts_timing->available = 0;\n+\t\tdev_err(dev, \"of_get_ddr_timings: fail\\n\");\n+\t}\n+\n+\tof_node_put(np_tim);\n+}\n+\n+static int rockchip_ddr_set_auto_self_refresh(uint32_t en)\n+{\n+\tstruct arm_smccc_res res;\n+\n+\tddr_psci_param->sr_idle_en = en;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR,\n+\t\t      0, 0, 0, 0, &res);\n+\n+\treturn res.a0;\n+}\n+\n+static int rk3328_dmc_init(struct platform_device *pdev,\n+\t\t\t   struct rk3328_dmcfreq *dmcfreq)\n+{\n+\tstruct arm_smccc_res res;\n+\tu32 size, page_num;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      0, 0, ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 || (res.a1 < 0x101)) {\n+\t\tdev_err(&pdev->dev,\n+\t\t\t\"trusted firmware need to update or is invalid\\n\");\n+\t\treturn -ENXIO;\n+\t}\n+\n+\tdev_notice(&pdev->dev, \"current ATF version 0x%lx\\n\", res.a1);\n+\n+\t/*\n+\t * first 4KB is used for interface parameters\n+\t * after 4KB * N is dts parameters\n+\t */\n+\tsize = sizeof(struct rk3328_ddr_dts_config_timing);\n+\tpage_num = DIV_ROUND_UP(size, 4096) + 1;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n+\t\t      page_num, SHARE_PAGE_TYPE_DDR, 0,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 != 0) {\n+\t\tdev_err(&pdev->dev, \"no ATF memory for init\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tddr_psci_param = ioremap(res.a1, page_num << 12);\n+\tof_get_rk3328_timings(&pdev->dev, pdev->dev.of_node,\n+\t\t\t      (uint32_t *)ddr_psci_param);\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_INIT,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0) {\n+\t\tdev_err(&pdev->dev, \"Rockchip dram init error %lx\\n\", res.a0);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tdmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh;\n+\n+\treturn 0;\n+}\n+\n+static int rk3328_dmcfreq_target(struct device *dev, unsigned long *freq,\n+\t\t\t\t u32 flags)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct dev_pm_opp *opp;\n+\tunsigned long old_clk_rate = dmcfreq->rate;\n+\tunsigned long target_volt, target_rate;\n+\tint err;\n+\n+\topp = devfreq_recommended_opp(dev, freq, flags);\n+\tif (IS_ERR(opp))\n+\t\treturn PTR_ERR(opp);\n+\n+\ttarget_rate = dev_pm_opp_get_freq(opp);\n+\ttarget_volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\tif (dmcfreq->rate == target_rate)\n+\t\treturn 0;\n+\n+\tmutex_lock(&dmcfreq->lock);\n+\n+\t/*\n+\t * If frequency scaling from low to high, adjust voltage first.\n+\t * If frequency scaling from high to low, adjust frequency first.\n+\t */\n+\tif (old_clk_rate < target_rate) {\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\t\tif (err) {\n+\t\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\",\n+\t\t\t\ttarget_volt);\n+\t\t\tgoto out;\n+\t\t}\n+\t}\n+\n+\terr = clk_set_rate(dmcfreq->dmc_clk, target_rate);\n+\tif (err) {\n+\t\tdev_err(dev, \"Cannot set frequency %lu (%d)\\n\", target_rate,\n+\t\t\terr);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t}\n+\n+\t/*\n+\t * Check the dpll rate,\n+\t * There only two result we will get,\n+\t * 1. Ddr frequency scaling fail, we still get the old rate.\n+\t * 2. Ddr frequency scaling sucessful, we get the rate we set.\n+\t */\n+\tdmcfreq->rate = clk_get_rate(dmcfreq->dmc_clk);\n+\n+\t/* If get the incorrect rate, set voltage to old value. */\n+\tif (dmcfreq->rate != target_rate) {\n+\t\tdev_err(dev, \"Got wrong frequency, Request %lu, Current %lu\\n\",\n+\t\t\ttarget_rate, dmcfreq->rate);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t} else if (old_clk_rate > target_rate)\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\tif (err)\n+\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\", target_volt);\n+\n+\tdmcfreq->rate = target_rate;\n+\tdmcfreq->volt = target_volt;\n+\n+out:\n+\tmutex_unlock(&dmcfreq->lock);\n+\treturn err;\n+}\n+\n+static int rk3328_dmcfreq_get_dev_status(struct device *dev,\n+\t\t\t\t\t struct devfreq_dev_status *stat)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct devfreq_event_data edata;\n+\tint ret = 0;\n+\n+\tret = devfreq_event_get_event(dmcfreq->edev, &edata);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tstat->current_frequency = dmcfreq->rate;\n+\tstat->busy_time = edata.load_count;\n+\tstat->total_time = edata.total_count;\n+\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_get_cur_freq(struct device *dev, unsigned long *freq)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\n+\t*freq = dmcfreq->rate;\n+\n+\treturn 0;\n+}\n+\n+static struct devfreq_dev_profile rk3328_devfreq_dmc_profile = {\n+\t.polling_ms\t= 200,\n+\t.target\t\t= rk3328_dmcfreq_target,\n+\t.get_dev_status\t= rk3328_dmcfreq_get_dev_status,\n+\t.get_cur_freq\t= rk3328_dmcfreq_get_cur_freq,\n+};\n+\n+static __maybe_unused int rk3328_dmcfreq_suspend(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_disable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to disable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_suspend_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to suspend the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static __maybe_unused int rk3328_dmcfreq_resume(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_enable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_resume_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to resume the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\treturn ret;\n+}\n+\n+static SIMPLE_DEV_PM_OPS(rk3328_dmcfreq_pm, rk3328_dmcfreq_suspend,\n+\t\t\t rk3328_dmcfreq_resume);\n+\n+static int rk3328_dmcfreq_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct device_node *np = pdev->dev.of_node;\n+\tstruct rk3328_dmcfreq *data;\n+\tstruct dev_pm_opp *opp;\n+\tint ret;\n+\n+\tdata = devm_kzalloc(dev, sizeof(struct rk3328_dmcfreq), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tmutex_init(&data->lock);\n+\n+\tdata->vdd_center = devm_regulator_get(dev, \"center\");\n+\tif (IS_ERR(data->vdd_center)) {\n+\t\tif (PTR_ERR(data->vdd_center) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the regulator \\\"center\\\"\\n\");\n+\t\treturn PTR_ERR(data->vdd_center);\n+\t}\n+\n+\tdata->dmc_clk = devm_clk_get(dev, \"dmc_clk\");\n+\tif (IS_ERR(data->dmc_clk)) {\n+\t\tif (PTR_ERR(data->dmc_clk) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the clk dmc_clk\\n\");\n+\t\treturn PTR_ERR(data->dmc_clk);\n+\t}\n+\n+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, 0);\n+#else\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, \"devfreq-events\", 0);\n+#endif\n+\tif (IS_ERR(data->edev))\n+\t\treturn -EPROBE_DEFER;\n+\n+\tret = devfreq_event_enable_edev(data->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = rk3328_dmc_init(pdev, data);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/*\n+\t * We add a devfreq driver to our parent since it has a device tree node\n+\t * with operating points.\n+\t */\n+\tif (dev_pm_opp_of_add_table(dev)) {\n+\t\tdev_err(dev, \"Invalid operating-points in device tree.\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tof_property_read_u32(np, \"upthreshold\",\n+\t\t\t     &data->ondemand_data.upthreshold);\n+\tof_property_read_u32(np, \"downdifferential\",\n+\t\t\t     &data->ondemand_data.downdifferential);\n+\n+\tdata->rate = clk_get_rate(data->dmc_clk);\n+\n+\topp = devfreq_recommended_opp(dev, &data->rate, 0);\n+\tif (IS_ERR(opp)) {\n+\t\tret = PTR_ERR(opp);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdata->rate = dev_pm_opp_get_freq(opp);\n+\tdata->volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\trk3328_devfreq_dmc_profile.initial_freq = data->rate;\n+\n+\tdata->devfreq = devm_devfreq_add_device(dev,\n+\t\t\t\t\t   &rk3328_devfreq_dmc_profile,\n+\t\t\t\t\t   DEVFREQ_GOV_SIMPLE_ONDEMAND,\n+\t\t\t\t\t   &data->ondemand_data);\n+\tif (IS_ERR(data->devfreq)) {\n+\t\tret = PTR_ERR(data->devfreq);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdevm_devfreq_register_opp_notifier(dev, data->devfreq);\n+\n+\tdata->dev = dev;\n+\tplatform_set_drvdata(pdev, data);\n+\n+\treturn 0;\n+\n+err_free_opp:\n+\tdev_pm_opp_of_remove_table(&pdev->dev);\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_remove(struct platform_device *pdev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev);\n+\n+\t/*\n+\t * Before remove the opp table we need to unregister the opp notifier.\n+\t */\n+\tdevm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq);\n+\tdev_pm_opp_of_remove_table(dmcfreq->dev);\n+\n+\treturn 0;\n+}\n+\n+static const struct of_device_id rk3328dmc_devfreq_of_match[] = {\n+\t{ .compatible = \"rockchip,rk3328-dmc\" },\n+\t{ },\n+};\n+MODULE_DEVICE_TABLE(of, rk3328dmc_devfreq_of_match);\n+\n+static struct platform_driver rk3328_dmcfreq_driver = {\n+\t.probe\t= rk3328_dmcfreq_probe,\n+\t.remove = rk3328_dmcfreq_remove,\n+\t.driver = {\n+\t\t.name\t= \"rk3328-dmc-freq\",\n+\t\t.pm\t= &rk3328_dmcfreq_pm,\n+\t\t.of_match_table = rk3328dmc_devfreq_of_match,\n+\t},\n+};\n+module_platform_driver(rk3328_dmcfreq_driver);\n+\n+MODULE_LICENSE(\"GPL v2\");\n+MODULE_AUTHOR(\"Lin Huang <hl@rock-chips.com>\");\n+MODULE_DESCRIPTION(\"RK3328 dmcfreq driver with devfreq framework\");\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\nnew file mode 100644\nindex 0000000000..b065432e77\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n@@ -0,0 +1,63 @@\n+/*\n+ *\n+ * Copyright (C) 2017 ROCKCHIP, Inc.\n+ *\n+ * This software is licensed under the terms of the GNU General Public\n+ * License version 2, as published by the Free Software Foundation, and\n+ * may be copied, distributed, and modified under those terms.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ */\n+\n+#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+#define _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+\n+#define DDR2_DEFAULT\t(0)\n+\n+#define DDR3_800D\t(0)\t/* 5-5-5 */\n+#define DDR3_800E\t(1)\t/* 6-6-6 */\n+#define DDR3_1066E\t(2)\t/* 6-6-6 */\n+#define DDR3_1066F\t(3)\t/* 7-7-7 */\n+#define DDR3_1066G\t(4)\t/* 8-8-8 */\n+#define DDR3_1333F\t(5)\t/* 7-7-7 */\n+#define DDR3_1333G\t(6)\t/* 8-8-8 */\n+#define DDR3_1333H\t(7)\t/* 9-9-9 */\n+#define DDR3_1333J\t(8)\t/* 10-10-10 */\n+#define DDR3_1600G\t(9)\t/* 8-8-8 */\n+#define DDR3_1600H\t(10)\t/* 9-9-9 */\n+#define DDR3_1600J\t(11)\t/* 10-10-10 */\n+#define DDR3_1600K\t(12)\t/* 11-11-11 */\n+#define DDR3_1866J\t(13)\t/* 10-10-10 */\n+#define DDR3_1866K\t(14)\t/* 11-11-11 */\n+#define DDR3_1866L\t(15)\t/* 12-12-12 */\n+#define DDR3_1866M\t(16)\t/* 13-13-13 */\n+#define DDR3_2133K\t(17)\t/* 11-11-11 */\n+#define DDR3_2133L\t(18)\t/* 12-12-12 */\n+#define DDR3_2133M\t(19)\t/* 13-13-13 */\n+#define DDR3_2133N\t(20)\t/* 14-14-14 */\n+#define DDR3_DEFAULT\t(21)\n+#define DDR_DDR2\t(22)\n+#define DDR_LPDDR\t(23)\n+#define DDR_LPDDR2\t(24)\n+\n+#define DDR4_1600J\t(0)\t/* 10-10-10 */\n+#define DDR4_1600K\t(1)\t/* 11-11-11 */\n+#define DDR4_1600L\t(2)\t/* 12-12-12 */\n+#define DDR4_1866L\t(3)\t/* 12-12-12 */\n+#define DDR4_1866M\t(4)\t/* 13-13-13 */\n+#define DDR4_1866N\t(5)\t/* 14-14-14 */\n+#define DDR4_2133N\t(6)\t/* 14-14-14 */\n+#define DDR4_2133P\t(7)\t/* 15-15-15 */\n+#define DDR4_2133R\t(8)\t/* 16-16-16 */\n+#define DDR4_2400P\t(9)\t/* 15-15-15 */\n+#define DDR4_2400R\t(10)\t/* 16-16-16 */\n+#define DDR4_2400U\t(11)\t/* 18-18-18 */\n+#define DDR4_DEFAULT\t(12)\n+\n+#define PAUSE_CPU_STACK_SIZE\t16\n+\n+#endif\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\nnew file mode 100644\nindex 0000000000..171f41c256\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n@@ -0,0 +1,159 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#ifndef _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+#define _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+\n+#define DDR3_DS_34ohm\t\t\t(34)\n+#define DDR3_DS_40ohm\t\t\t(40)\n+\n+#define DDR3_ODT_DIS\t\t\t(0)\n+#define DDR3_ODT_40ohm\t\t\t(40)\n+#define DDR3_ODT_60ohm\t\t\t(60)\n+#define DDR3_ODT_120ohm\t\t\t(120)\n+\n+#define LP2_DS_34ohm\t\t\t(34)\n+#define LP2_DS_40ohm\t\t\t(40)\n+#define LP2_DS_48ohm\t\t\t(48)\n+#define LP2_DS_60ohm\t\t\t(60)\n+#define LP2_DS_68_6ohm\t\t\t(68)\t/* optional */\n+#define LP2_DS_80ohm\t\t\t(80)\n+#define LP2_DS_120ohm\t\t\t(120)\t/* optional */\n+\n+#define LP3_DS_34ohm\t\t\t(34)\n+#define LP3_DS_40ohm\t\t\t(40)\n+#define LP3_DS_48ohm\t\t\t(48)\n+#define LP3_DS_60ohm\t\t\t(60)\n+#define LP3_DS_80ohm\t\t\t(80)\n+#define LP3_DS_34D_40U\t\t\t(3440)\n+#define LP3_DS_40D_48U\t\t\t(4048)\n+#define LP3_DS_34D_48U\t\t\t(3448)\n+\n+#define LP3_ODT_DIS\t\t\t(0)\n+#define LP3_ODT_60ohm\t\t\t(60)\n+#define LP3_ODT_120ohm\t\t\t(120)\n+#define LP3_ODT_240ohm\t\t\t(240)\n+\n+#define LP4_PDDS_40ohm\t\t\t(40)\n+#define LP4_PDDS_48ohm\t\t\t(48)\n+#define LP4_PDDS_60ohm\t\t\t(60)\n+#define LP4_PDDS_80ohm\t\t\t(80)\n+#define LP4_PDDS_120ohm\t\t\t(120)\n+#define LP4_PDDS_240ohm\t\t\t(240)\n+\n+#define LP4_DQ_ODT_40ohm\t\t(40)\n+#define LP4_DQ_ODT_48ohm\t\t(48)\n+#define LP4_DQ_ODT_60ohm\t\t(60)\n+#define LP4_DQ_ODT_80ohm\t\t(80)\n+#define LP4_DQ_ODT_120ohm\t\t(120)\n+#define LP4_DQ_ODT_240ohm\t\t(240)\n+#define LP4_DQ_ODT_DIS\t\t\t(0)\n+\n+#define LP4_CA_ODT_40ohm\t\t(40)\n+#define LP4_CA_ODT_48ohm\t\t(48)\n+#define LP4_CA_ODT_60ohm\t\t(60)\n+#define LP4_CA_ODT_80ohm\t\t(80)\n+#define LP4_CA_ODT_120ohm\t\t(120)\n+#define LP4_CA_ODT_240ohm\t\t(240)\n+#define LP4_CA_ODT_DIS\t\t\t(0)\n+\n+#define DDR4_DS_34ohm\t\t\t(34)\n+#define DDR4_DS_48ohm\t\t\t(48)\n+#define DDR4_RTT_NOM_DIS\t\t(0)\n+#define DDR4_RTT_NOM_60ohm\t\t(60)\n+#define DDR4_RTT_NOM_120ohm\t\t(120)\n+#define DDR4_RTT_NOM_40ohm\t\t(40)\n+#define DDR4_RTT_NOM_240ohm\t\t(240)\n+#define DDR4_RTT_NOM_48ohm\t\t(48)\n+#define DDR4_RTT_NOM_80ohm\t\t(80)\n+#define DDR4_RTT_NOM_34ohm\t\t(34)\n+\n+#define PHY_DDR3_RON_RTT_DISABLE\t(0)\n+#define PHY_DDR3_RON_RTT_451ohm\t\t(1)\n+#define PHY_DDR3_RON_RTT_225ohm\t\t(2)\n+#define PHY_DDR3_RON_RTT_150ohm\t\t(3)\n+#define PHY_DDR3_RON_RTT_112ohm\t\t(4)\n+#define PHY_DDR3_RON_RTT_90ohm\t\t(5)\n+#define PHY_DDR3_RON_RTT_75ohm\t\t(6)\n+#define PHY_DDR3_RON_RTT_64ohm\t\t(7)\n+#define PHY_DDR3_RON_RTT_56ohm\t\t(16)\n+#define PHY_DDR3_RON_RTT_50ohm\t\t(17)\n+#define PHY_DDR3_RON_RTT_45ohm\t\t(18)\n+#define PHY_DDR3_RON_RTT_41ohm\t\t(19)\n+#define PHY_DDR3_RON_RTT_37ohm\t\t(20)\n+#define PHY_DDR3_RON_RTT_34ohm\t\t(21)\n+#define PHY_DDR3_RON_RTT_33ohm\t\t(22)\n+#define PHY_DDR3_RON_RTT_30ohm\t\t(23)\n+#define PHY_DDR3_RON_RTT_28ohm\t\t(24)\n+#define PHY_DDR3_RON_RTT_26ohm\t\t(25)\n+#define PHY_DDR3_RON_RTT_25ohm\t\t(26)\n+#define PHY_DDR3_RON_RTT_23ohm\t\t(27)\n+#define PHY_DDR3_RON_RTT_22ohm\t\t(28)\n+#define PHY_DDR3_RON_RTT_21ohm\t\t(29)\n+#define PHY_DDR3_RON_RTT_20ohm\t\t(30)\n+#define PHY_DDR3_RON_RTT_19ohm\t\t(31)\n+\n+#define PHY_DDR4_LPDDR3_RON_RTT_DISABLE (0)\n+#define PHY_DDR4_LPDDR3_RON_RTT_480ohm\t(1)\n+#define PHY_DDR4_LPDDR3_RON_RTT_240ohm\t(2)\n+#define PHY_DDR4_LPDDR3_RON_RTT_160ohm\t(3)\n+#define PHY_DDR4_LPDDR3_RON_RTT_120ohm\t(4)\n+#define PHY_DDR4_LPDDR3_RON_RTT_96ohm\t(5)\n+#define PHY_DDR4_LPDDR3_RON_RTT_80ohm\t(6)\n+#define PHY_DDR4_LPDDR3_RON_RTT_68ohm\t(7)\n+#define PHY_DDR4_LPDDR3_RON_RTT_60ohm\t(16)\n+#define PHY_DDR4_LPDDR3_RON_RTT_53ohm\t(17)\n+#define PHY_DDR4_LPDDR3_RON_RTT_48ohm\t(18)\n+#define PHY_DDR4_LPDDR3_RON_RTT_43ohm\t(19)\n+#define PHY_DDR4_LPDDR3_RON_RTT_40ohm\t(20)\n+#define PHY_DDR4_LPDDR3_RON_RTT_37ohm\t(21)\n+#define PHY_DDR4_LPDDR3_RON_RTT_34ohm\t(22)\n+#define PHY_DDR4_LPDDR3_RON_RTT_32ohm\t(23)\n+#define PHY_DDR4_LPDDR3_RON_RTT_30ohm\t(24)\n+#define PHY_DDR4_LPDDR3_RON_RTT_28ohm\t(25)\n+#define PHY_DDR4_LPDDR3_RON_RTT_26ohm\t(26)\n+#define PHY_DDR4_LPDDR3_RON_RTT_25ohm\t(27)\n+#define PHY_DDR4_LPDDR3_RON_RTT_24ohm\t(28)\n+#define PHY_DDR4_LPDDR3_RON_RTT_22ohm\t(29)\n+#define PHY_DDR4_LPDDR3_RON_RTT_21ohm\t(30)\n+#define PHY_DDR4_LPDDR3_RON_RTT_20ohm\t(31)\n+\n+#endif /*_DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H*/\ndiff --git a/target/linux/rockchip/image/Makefile b/target/linux/rockchip/image/Makefile\nindex f5fdff637f..3741bee8cc 100644\n--- a/target/linux/rockchip/image/Makefile\n+++ b/target/linux/rockchip/image/Makefile\n@@ -45,6 +45,20 @@ define Build/pine64-img\n \tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-u-boot.itb of=\"$@\" seek=16384 conv=notrunc\n endef\n \n+define Build/pine64-bin\n+\t# This is a copy of pine64-img, but uses rockchip ddrloader\n+\n+\t$(SCRIPT_DIR)/gen_image_generic.sh \\\n+\t\t$@ \\\n+\t\t$(CONFIG_TARGET_KERNEL_PARTSIZE) $@.boot \\\n+\t\t$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(IMAGE_ROOTFS) \\\n+\t\t32768\n+\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-idbloader.bin of=\"$@\" seek=64 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-uboot.img of=\"$@\" seek=16384 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-trust.bin of=\"$@\" seek=24576 conv=notrunc\n+endef\n+\n ### Devices ###\n define Device/Default\n   PROFILES := Default\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex 24b1c38137..b3ef5a28d4 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -7,11 +7,21 @@ define Device/friendlyarm_nanopi-r2s\n   DEVICE_MODEL := NanoPi R2S\n   SOC := rk3328\n   UBOOT_DEVICE_NAME := nanopi-r2s-rk3328\n-  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-img | gzip | append-metadata\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-bin | gzip | append-metadata\n   DEVICE_PACKAGES := kmod-usb-net-rtl8152\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\n \n+define Device/friendlyarm_nanopi-r4s\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi R4S\n+  SOC := rk3399\n+  UBOOT_DEVICE_NAME := nanopi-r4s-rk3399\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-r8169 -urngd\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-r4s\n+\n define Device/pine64_rockpro64\n   DEVICE_VENDOR := Pine64\n   DEVICE_MODEL := RockPro64\ndiff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript\nnew file mode 100644\nindex 0000000000..abe9c24ee3\n--- /dev/null\n+++ b/target/linux/rockchip/image/nanopi-r4s.bootscript\n@@ -0,0 +1,8 @@\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\ndiff --git a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nnew file mode 100644\nindex 0000000000..897a42fea2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -134,6 +134,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..69c880db9f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,218 @@\n+From 11c2b38cf0a04b0edb3eabae24fb1484489725e2 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 07:12:30 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 178 ++++++++++++++++++\n+ 2 files changed, 179 insertions(+)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-le\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..28798047fd\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -165,6 +165,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..16ca6279e7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -398,6 +398,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..1de560e33f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -297,6 +297,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1906,6 +1906,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff --git a/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\nnew file mode 100644\nindex 0000000000..a4b8340be4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n@@ -0,0 +1,44 @@\n+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 13:53:25 +0800\n+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/Kconfig      |  18 +-\n+ drivers/devfreq/Makefile     |   1 +\n+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++\n+ 3 files changed, 862 insertions(+), 3 deletions(-)\n+ create mode 100644 drivers/devfreq/rk3328_dmc.c\n+\n+--- a/drivers/devfreq/Kconfig\n++++ b/drivers/devfreq/Kconfig\n+@@ -131,6 +131,18 @@ config ARM_TEGRA20_DEVFREQ\n+ \t  It reads Memory Controller counters and adjusts the operating\n+ \t  frequencies and voltages with OPP support.\n+ \n++config ARM_RK3328_DMC_DEVFREQ\n++\ttristate \"ARM RK3328 DMC DEVFREQ Driver\"\n++\tdepends on ARCH_ROCKCHIP\n++\tselect DEVFREQ_EVENT_ROCKCHIP_DFI\n++\tselect DEVFREQ_GOV_SIMPLE_ONDEMAND\n++\tselect PM_DEVFREQ_EVENT\n++\tselect PM_OPP\n++\thelp\n++\t  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).\n++\t  It sets the frequency for the memory controller and reads the usage counts\n++\t  from hardware.\n++\n+ config ARM_RK3399_DMC_DEVFREQ\n+ \ttristate \"ARM RK3399 DMC DEVFREQ Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \\\n+--- a/drivers/devfreq/Makefile\n++++ b/drivers/devfreq/Makefile\n+@@ -12,6 +12,7 @@ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)\t+=\n+ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ)\t+= imx-bus.o\n+ obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ)\t+= imx8m-ddrc.o\n+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)\t+= rk3399_dmc.o\n++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)\t+= rk3328_dmc.o\n+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)\t\t+= tegra30-devfreq.o\n+ obj-$(CONFIG_ARM_TEGRA20_DEVFREQ)\t+= tegra20-devfreq.o\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\nnew file mode 100644\nindex 0000000000..4e688f8eb4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n@@ -0,0 +1,218 @@\n+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001\n+From: Tang Yun ping <typ@rock-chips.com>\n+Date: Thu, 4 May 2017 20:49:58 +0800\n+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2\n+ APIs\n+\n+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.\n+\n+Signed-off-by: Tang Yun ping <typ@rock-chips.com>\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++\n+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-\n+ drivers/clk/rockchip/clk.h          |   3 +-\n+ include/soc/rockchip/rockchip_sip.h |  11 +++\n+ 4 files changed, 147 insertions(+), 4 deletions(-)\n+\n+diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c\n+index 9273bce4d7b6..555aaf4e758d 100644\n+--- a/drivers/clk/rockchip/clk-ddr.c\n++++ b/drivers/clk/rockchip/clk-ddr.c\n+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddrclk_sip_ops = {\n+ \t.get_parent = rockchip_ddrclk_get_parent,\n+ };\n+ \n++/* See v4.4/include/dt-bindings/display/rk_fb.h */\n++#define SCREEN_NULL\t\t\t0\n++#define SCREEN_HDMI\t\t\t6\n++\n++static inline int rk_drm_get_lcdc_type(void)\n++{\n++\treturn SCREEN_NULL;\n++}\n++\n++struct share_params {\n++\tu32 hz;\n++\tu32 lcdc_type;\n++\tu32 vop;\n++\tu32 vop_dclk_mode;\n++\tu32 sr_idle_en;\n++\tu32 addr_mcu_el3;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag1;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag0;\n++\tu32 complt_hwirq;\n++\t /* if need, add parameter after */\n++};\n++\n++struct rockchip_ddrclk_data {\n++\tu32 inited_flag;\n++\tvoid __iomem *share_memory;\n++};\n++\n++static struct rockchip_ddrclk_data ddr_data;\n++\n++static void rockchip_ddrclk_data_init(void)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n++\t\t      1, SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif (!res.a0) {\n++\t\tddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);\n++\t\tddr_data.inited_flag = 1;\n++\t}\n++}\n++\n++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t   unsigned long drate,\n++\t\t\t\t\t   unsigned long prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = drate;\n++\tp->lcdc_type = rk_drm_get_lcdc_type();\n++\tp->wait_flag1 = 1;\n++\tp->wait_flag0 = 1;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif ((int)res.a1 == -6) {\n++\t\tpr_err(\"%s: timeout, drate = %lumhz\\n\", __func__, drate/1000000);\n++\t\t/* TODO: rockchip_dmcfreq_wait_complete(); */\n++\t}\n++\n++\treturn res.a0;\n++}\n++\n++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2\n++\t\t\t(struct clk_hw *hw, unsigned long parent_rate)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t      unsigned long rate,\n++\t\t\t\t\t      unsigned long *prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = rate;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {\n++\t.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,\n++\t.set_rate = rockchip_ddrclk_sip_set_rate_v2,\n++\t.round_rate = rockchip_ddrclk_sip_round_rate_v2,\n++\t.get_parent = rockchip_ddrclk_get_parent,\n++};\n++\n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+ \t\t\t\t\t u8 num_parents, int mux_offset,\n+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \tcase ROCKCHIP_DDRCLK_SIP:\n+ \t\tinit.ops = &rockchip_ddrclk_sip_ops;\n+ \t\tbreak;\n++\tcase ROCKCHIP_DDRCLK_SIP_V2:\n++\t\tinit.ops = &rockchip_ddrclk_sip_ops_v2;\n++\t\tbreak;\n+ \tdefault:\n+ \t\tpr_err(\"%s: unsupported ddrclk type %d\\n\", __func__, ddr_flag);\n+ \t\tkfree(ddrclk);\n+diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c\n+index c186a1985bf4..ac6e6163a232 100644\n+--- a/drivers/clk/rockchip/clk-rk3328.c\n++++ b/drivers/clk/rockchip/clk-rk3328.c\n+@@ -314,9 +314,10 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {\n+ \t\t\tRK3328_CLKGATE_CON(14), 1, GFLAGS),\n+ \n+ \t/* PD_DDR */\n+-\tCOMPOSITE(0, \"clk_ddr\", mux_ddrphy_p, CLK_IGNORE_UNUSED,\n+-\t\t\tRK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,\n+-\t\t\tRK3328_CLKGATE_CON(0), 4, GFLAGS),\n++\tCOMPOSITE_DDRCLK(SCLK_DDRCLK, \"sclk_ddrc\", mux_ddrphy_p, 0,\n++\t\t\tRK3328_CLKSEL_CON(3), 8, 2, 0, 3,\n++\t\t\tROCKCHIP_DDRCLK_SIP_V2),\n++\n+ \tGATE(0, \"clk_ddrmsch\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+ \t\t\tRK3328_CLKGATE_CON(18), 6, GFLAGS),\n+ \tGATE(0, \"clk_ddrupctl\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h\n+index 2271a84124b0..7405aaf965ec 100644\n+--- a/drivers/clk/rockchip/clk.h\n++++ b/drivers/clk/rockchip/clk.h\n+@@ -362,7 +362,8 @@ struct clk *rockchip_clk_register_mmc(const char *name,\n+  * DDRCLK flags, including method of setting the rate\n+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.\n+  */\n+-#define ROCKCHIP_DDRCLK_SIP\t\tBIT(0)\n++#define ROCKCHIP_DDRCLK_SIP\t\t0x01\n++#define ROCKCHIP_DDRCLK_SIP_V2\t\t0x03\n+ \n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h\n+index c46a9ae2a2ab..fa7e0a2d72cc 100644\n+--- a/include/soc/rockchip/rockchip_sip.h\n++++ b/include/soc/rockchip/rockchip_sip.h\n+@@ -16,5 +16,16 @@\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ\t0x06\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM\t0x07\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD\t0x08\n++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION\t0x08\n++\n++#define ROCKCHIP_SIP_SHARE_MEM\t\t\t0x82000009\n++\n++/* Share mem page types */\n++typedef enum {\n++    SHARE_PAGE_TYPE_INVALID = 0,\n++    SHARE_PAGE_TYPE_UARTDBG,\n++    SHARE_PAGE_TYPE_DDR,\n++    SHARE_PAGE_TYPE_MAX,\n++} share_page_type_t;\n+ \n+ #endif\ndiff --git a/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\nnew file mode 100644\nindex 0000000000..283e4abd2f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n@@ -0,0 +1,662 @@\n+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 12:49:48 +0800\n+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---\n+ 1 file changed, 505 insertions(+), 49 deletions(-)\n+\n+--- a/drivers/devfreq/event/rockchip-dfi.c\n++++ b/drivers/devfreq/event/rockchip-dfi.c\n+@@ -18,25 +18,66 @@\n+ #include <linux/list.h>\n+ #include <linux/of.h>\n+ \n+-#include <soc/rockchip/rk3399_grf.h>\n+-\n+-#define RK3399_DMC_NUM_CH\t2\n++#define PX30_PMUGRF_OS_REG2\t\t0x208\n+ \n++#define RK3128_GRF_SOC_CON0\t\t0x140\n++#define RK3128_GRF_OS_REG1\t\t0x1cc\n++#define RK3128_GRF_DFI_WRNUM\t\t0x220\n++#define RK3128_GRF_DFI_RDNUM\t\t0x224\n++#define RK3128_GRF_DFI_TIMERVAL\t\t0x22c\n++#define RK3128_DDR_MONITOR_EN\t\t((1 << (16 + 6)) + (1 << 6))\n++#define RK3128_DDR_MONITOR_DISB\t\t((1 << (16 + 6)) + (0 << 6))\n++\n++#define RK3288_PMU_SYS_REG2\t\t0x9c\n++#define RK3288_GRF_SOC_CON4\t\t0x254\n++#define RK3288_GRF_SOC_STATUS(n)\t(0x280 + (n) * 4)\n++#define RK3288_DFI_EN\t\t\t(0x30003 << 14)\n++#define RK3288_DFI_DIS\t\t\t(0x30000 << 14)\n++#define RK3288_LPDDR_SEL\t\t(0x10001 << 13)\n++#define RK3288_DDR3_SEL\t\t\t(0x10000 << 13)\n++\n++#define RK3328_GRF_OS_REG2\t\t0x5d0\n++\n++#define RK3368_GRF_DDRC0_CON0\t\t0x600\n++#define RK3368_GRF_SOC_STATUS5\t\t0x494\n++#define RK3368_GRF_SOC_STATUS6\t\t0x498\n++#define RK3368_GRF_SOC_STATUS8\t\t0x4a0\n++#define RK3368_GRF_SOC_STATUS9\t\t0x4a4\n++#define RK3368_GRF_SOC_STATUS10\t\t0x4a8\n++#define RK3368_DFI_EN\t\t\t(0x30003 << 5)\n++#define RK3368_DFI_DIS\t\t\t(0x30000 << 5)\n++\n++#define MAX_DMC_NUM_CH\t\t\t2\n++#define READ_DRAMTYPE_INFO(n)\t\t(((n) >> 13) & 0x7)\n++#define READ_CH_INFO(n)\t\t\t(((n) >> 28) & 0x3)\n+ /* DDRMON_CTRL */\n+-#define DDRMON_CTRL\t0x04\n+-#define CLR_DDRMON_CTRL\t(0x1f0000 << 0)\n+-#define LPDDR4_EN\t(0x10001 << 4)\n+-#define HARDWARE_EN\t(0x10001 << 3)\n+-#define LPDDR3_EN\t(0x10001 << 2)\n+-#define SOFTWARE_EN\t(0x10001 << 1)\n+-#define SOFTWARE_DIS\t(0x10000 << 1)\n+-#define TIME_CNT_EN\t(0x10001 << 0)\n++#define DDRMON_CTRL\t\t\t0x04\n++#define CLR_DDRMON_CTRL\t\t\t(0x3f0000 << 0)\n++#define DDR4_EN\t\t\t\t(0x10001 << 5)\n++#define LPDDR4_EN\t\t\t(0x10001 << 4)\n++#define HARDWARE_EN\t\t\t(0x10001 << 3)\n++#define LPDDR2_3_EN\t\t\t(0x10001 << 2)\n++#define SOFTWARE_EN\t\t\t(0x10001 << 1)\n++#define SOFTWARE_DIS\t\t\t(0x10000 << 1)\n++#define TIME_CNT_EN\t\t\t(0x10001 << 0)\n+ \n+ #define DDRMON_CH0_COUNT_NUM\t\t0x28\n+ #define DDRMON_CH0_DFI_ACCESS_NUM\t0x2c\n+ #define DDRMON_CH1_COUNT_NUM\t\t0x3c\n+ #define DDRMON_CH1_DFI_ACCESS_NUM\t0x40\n+ \n++/* pmu grf */\n++#define PMUGRF_OS_REG2\t\t\t0x308\n++\n++enum {\n++\tDDR4 = 0,\n++\tDDR3 = 3,\n++\tLPDDR2 = 5,\n++\tLPDDR3 = 6,\n++\tLPDDR4 = 7,\n++\tUNUSED = 0xFF\n++};\n++\n+ struct dmc_usage {\n+ \tu32 access;\n+ \tu32 total;\n+@@ -50,33 +91,261 @@ struct dmc_usage {\n+ struct rockchip_dfi {\n+ \tstruct devfreq_event_dev *edev;\n+ \tstruct devfreq_event_desc *desc;\n+-\tstruct dmc_usage ch_usage[RK3399_DMC_NUM_CH];\n++\tstruct dmc_usage ch_usage[MAX_DMC_NUM_CH];\n+ \tstruct device *dev;\n+ \tvoid __iomem *regs;\n+ \tstruct regmap *regmap_pmu;\n++\tstruct regmap *regmap_grf;\n++\tstruct regmap *regmap_pmugrf;\n+ \tstruct clk *clk;\n++\tu32 dram_type;\n++\t/*\n++\t * available mask, 1: available, 0: not available\n++\t * each bit represent a channel\n++\t */\n++\tu32 ch_msk;\n++};\n++\n++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_EN);\n++}\n++\n++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_DISB);\n++}\n++\n++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi_wr, dfi_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);\n++\n++\tedata->load_count = (dfi_wr + dfi_rd) * 4;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3128_dfi_ops = {\n++\t.disable = rk3128_dfi_disable,\n++\t.enable = rk3128_dfi_enable,\n++\t.get_event = rk3128_dfi_get_event,\n++\t.set_event = rk3128_dfi_set_event,\n++};\n++\n++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);\n++}\n++\n++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);\n++}\n++\n++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tu32 tmp, max = 0;\n++\tu32 i, busier_ch = 0;\n++\tu32 rd_count, wr_count, total_count;\n++\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\t/* Find out which channel is busier */\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);\n++\t\tinfo->ch_usage[i].access = (wr_count + rd_count) * 4;\n++\t\tinfo->ch_usage[i].total = total_count;\n++\t\ttmp = info->ch_usage[i].access;\n++\t\tif (tmp > max) {\n++\t\t\tbusier_ch = i;\n++\t\t\tmax = tmp;\n++\t\t}\n++\t}\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn busier_ch;\n++}\n++\n++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tint busier_ch;\n++\tunsigned long flags;\n++\n++\tlocal_irq_save(flags);\n++\tbusier_ch = rk3288_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n++\n++\tedata->load_count = info->ch_usage[busier_ch].access;\n++\tedata->total_count = info->ch_usage[busier_ch].total;\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3288_dfi_ops = {\n++\t.disable = rk3288_dfi_disable,\n++\t.enable = rk3288_dfi_enable,\n++\t.get_event = rk3288_dfi_get_event,\n++\t.set_event = rk3288_dfi_set_event,\n++};\n++\n++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);\n++}\n++\n++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);\n++}\n++\n++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);\n++\n++\tedata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3368_dfi_ops = {\n++\t.disable = rk3368_dfi_disable,\n++\t.enable = rk3368_dfi_enable,\n++\t.get_event = rk3368_dfi_get_event,\n++\t.set_event = rk3368_dfi_set_event,\n+ };\n+ \n+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tvoid __iomem *dfi_regs = info->regs;\n+-\tu32 val;\n+-\tu32 ddr_type;\n+-\n+-\t/* get ddr type */\n+-\tregmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);\n+-\tddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &\n+-\t\t    RK3399_PMUGRF_DDRTYPE_MASK;\n+ \n+ \t/* clear DDRMON_CTRL setting */\n+ \twritel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* set ddr type to dfi */\n+-\tif (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)\n+-\t\twritel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);\n+-\telse if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)\n++\tif (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)\n++\t\twritel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == LPDDR4)\n+ \t\twritel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == DDR4)\n++\t\twritel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* enable count, use software mode */\n+ \twritel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);\n+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st\n+ \trockchip_dfi_stop_hardware_counter(edev);\n+ \n+ \t/* Find out which channel is busier */\n+-\tfor (i = 0; i < RK3399_DMC_NUM_CH; i++) {\n+-\t\tinfo->ch_usage[i].access = readl_relaxed(dfi_regs +\n+-\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\n+ \t\tinfo->ch_usage[i].total = readl_relaxed(dfi_regs +\n+ \t\t\t\tDDRMON_CH0_COUNT_NUM + i * 20);\n+-\t\ttmp = info->ch_usage[i].access;\n++\n++\t\t/* LPDDR4 BL = 16,other DDR type BL = 8 */\n++\t\ttmp = readl_relaxed(dfi_regs +\n++\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20);\n++\t\tif (info->dram_type == LPDDR4)\n++\t\t\ttmp *= 8;\n++\t\telse\n++\t\t\ttmp *= 4;\n++\t\tinfo->ch_usage[i].access = tmp;\n++\n+ \t\tif (tmp > max) {\n+ \t\t\tbusier_ch = i;\n+ \t\t\tmax = tmp;\n+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \n+ \trockchip_dfi_stop_hardware_counter(edev);\n+-\tclk_disable_unprepare(info->clk);\n++\tif (info->clk)\n++\t\tclk_disable_unprepare(info->clk);\n+ \n+ \treturn 0;\n+ }\n+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint ret;\n+ \n+-\tret = clk_prepare_enable(info->clk);\n+-\tif (ret) {\n+-\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\", ret);\n+-\t\treturn ret;\n++\tif (info->clk) {\n++\t\tret = clk_prepare_enable(info->clk);\n++\t\tif (ret) {\n++\t\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\",\n++\t\t\t\tret);\n++\t\t\treturn ret;\n++\t\t}\n+ \t}\n+ \n+ \trockchip_dfi_start_hardware_counter(edev);\n+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint busier_ch;\n++\tunsigned long flags;\n+ \n++\tlocal_irq_save(flags);\n+ \tbusier_ch = rockchip_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n+ \n+ \tedata->load_count = info->ch_usage[busier_ch].access;\n+ \tedata->total_count = info->ch_usage[busier_ch].total;\n+@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro\n+ \t.set_event = rockchip_dfi_set_event,\n+ };\n+ \n+-static const struct of_device_id rockchip_dfi_id_match[] = {\n+-\t{ .compatible = \"rockchip,rk3399-dfi\" },\n+-\t{ },\n+-};\n+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++static __init int px30_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n+ \n+-static int rockchip_dfi_probe(struct platform_device *pdev)\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmugrf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmugrf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmugrf))\n++\t\t\treturn PTR_ERR(data->regmap_pmugrf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3128_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n+ {\n+-\tstruct device *dev = &pdev->dev;\n+-\tstruct rockchip_dfi *data;\n+-\tstruct devfreq_event_desc *desc;\n+ \tstruct device_node *np = pdev->dev.of_node, *node;\n+ \n+-\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n+-\tif (!data)\n+-\t\treturn -ENOMEM;\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tdesc->ops = &rk3128_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3288_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmu\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmu = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmu))\n++\t\t\treturn PTR_ERR(data->regmap_pmu);\n++\t}\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tif (data->dram_type == DDR3)\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_DDR3_SEL);\n++\telse\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_LPDDR_SEL);\n++\n++\tdesc->ops = &rk3288_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3368_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\n++\tif (!dev->parent || !dev->parent->of_node)\n++\t\treturn -EINVAL;\n++\n++\tdata->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);\n++\tif (IS_ERR(data->regmap_grf))\n++\t\treturn PTR_ERR(data->regmap_grf);\n++\n++\tdesc->ops = &rk3368_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rockchip_dfi_init(struct platform_device *pdev,\n++\t\t\t\t    struct rockchip_dfi *data,\n++\t\t\t\t    struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n+ \n+ \tdata->regs = devm_platform_ioremap_resource(pdev, 0);\n+ \tif (IS_ERR(data->regs))\n+@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla\n+ \t\tif (IS_ERR(data->regmap_pmu))\n+ \t\t\treturn PTR_ERR(data->regmap_pmu);\n+ \t}\n+-\tdata->dev = dev;\n++\n++\tregmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3328_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n++\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static const struct of_device_id rockchip_dfi_id_match[] = {\n++\t{ .compatible = \"rockchip,px30-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk1808-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk3128-dfi\", .data = rk3128_dfi_init },\n++\t{ .compatible = \"rockchip,rk3288-dfi\", .data = rk3288_dfi_init },\n++\t{ .compatible = \"rockchip,rk3328-dfi\", .data = rk3328_dfi_init },\n++\t{ .compatible = \"rockchip,rk3368-dfi\", .data = rk3368_dfi_init },\n++\t{ .compatible = \"rockchip,rk3399-dfi\", .data = rockchip_dfi_init },\n++\t{ },\n++};\n++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++\n++static int rockchip_dfi_probe(struct platform_device *pdev)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct rockchip_dfi *data;\n++\tstruct devfreq_event_desc *desc;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\tint (*init)(struct platform_device *pdev, struct rockchip_dfi *data,\n++\t\t    struct devfreq_event_desc *desc);\n++\n++\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n++\tif (!data)\n++\t\treturn -ENOMEM;\n+ \n+ \tdesc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);\n+ \tif (!desc)\n+ \t\treturn -ENOMEM;\n+ \n+-\tdesc->ops = &rockchip_dfi_ops;\n++\tmatch = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);\n++\tif (match) {\n++\t\tinit = match->data;\n++\t\tif (init) {\n++\t\t\tif (init(pdev, data, desc))\n++\t\t\t\treturn -EINVAL;\n++\t\t} else {\n++\t\t\treturn 0;\n++\t\t}\n++\t} else {\n++\t\treturn 0;\n++\t}\n++\n+ \tdesc->driver_data = data;\n+ \tdesc->name = np->name;\n+ \tdata->desc = desc;\n++\tdata->dev = dev;\n+ \n+-\tdata->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);\n++\tdata->edev = devm_devfreq_event_add_edev(dev, desc);\n+ \tif (IS_ERR(data->edev)) {\n+-\t\tdev_err(&pdev->dev,\n+-\t\t\t\"failed to add devfreq-event device\\n\");\n++\t\tdev_err(dev, \"failed to add devfreq-event device\\n\");\n+ \t\treturn PTR_ERR(data->edev);\n+ \t}\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nnew file mode 100644\nindex 0000000000..ebdce52004\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -0,0 +1,27 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[adjusted commit title]\n+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -1021,6 +1021,13 @@\n+ \t\t};\n+ \t};\n+ \n++\tdfi: dfi@ff790000 {\n++\t\treg = <0x00 0xff790000 0x00 0x400>;\n++\t\tcompatible = \"rockchip,rk3328-dfi\";\n++\t\trockchip,grf = <&grf>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nnew file mode 100644\nindex 0000000000..d93b9a77b2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -0,0 +1,126 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++\n+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-\n+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++\n+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++\n+ 4 files changed, 617 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi\n+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h\n+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -7,6 +7,7 @@\n+ \n+ #include <dt-bindings/input/input.h>\n+ #include <dt-bindings/gpio/gpio.h>\n++#include \"rk3328-dram-nanopi2-timing.dtsi\"\n+ #include \"rk3328.dtsi\"\n+ \n+ / {\n+@@ -115,6 +116,72 @@\n+ \t\tregulator-min-microvolt = <5000000>;\n+ \t\tregulator-max-microvolt = <5000000>;\n+ \t};\n++\n++\tdmc: dmc {\n++\t\tcompatible = \"rockchip,rk3328-dmc\";\n++\t\tdevfreq-events = <&dfi>;\n++\t\tcenter-supply = <&vdd_log>;\n++\t\tclocks = <&cru SCLK_DDRCLK>;\n++\t\tclock-names = \"dmc_clk\";\n++\t\toperating-points-v2 = <&dmc_opp_table>;\n++\t\tddr_timing = <&ddr_timing>;\n++\t\tupthreshold = <40>;\n++\t\tdowndifferential = <20>;\n++\t\tauto-min-freq = <786000>;\n++\t\tauto-freq-en = <0>;\n++\t\t#cooling-cells = <2>;\n++\t\tstatus = \"okay\";\n++\n++\t\tddr_power_model: ddr_power_model {\n++\t\t\tcompatible = \"ddr_power_model\";\n++\t\t\tdynamic-power-coefficient = <120>;\n++\t\t\tstatic-power-coefficient = <200>;\n++\t\t\tts = <32000 4700 (-80) 2>;\n++\t\t\tthermal-zone = \"soc-thermal\";\n++\t\t};\n++\t};\n++\n++\tdmc_opp_table: dmc-opp-table {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\trockchip,leakage-voltage-sel = <\n++\t\t\t1   10    0\n++\t\t\t11  254   1\n++\t\t>;\n++\t\tnvmem-cells = <&logic_leakage>;\n++\t\tnvmem-cell-names = \"ddr_leakage\";\n++\n++\t\topp-786000000 {\n++\t\t\topp-hz = /bits/ 64 <786000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-798000000 {\n++\t\t\topp-hz = /bits/ 64 <798000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-840000000 {\n++\t\t\topp-hz = /bits/ 64 <840000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-924000000 {\n++\t\t\topp-hz = /bits/ 64 <924000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t\topp-microvolt-L0 = <1100000>;\n++\t\t\topp-microvolt-L1 = <1075000>;\n++\t\t};\n++\t\topp-1056000000 {\n++\t\t\topp-hz = /bits/ 64 <1056000000>;\n++\t\t\topp-microvolt = <1175000>;\n++\t\t\topp-microvolt-L0 = <1175000>;\n++\t\t\topp-microvolt-L1 = <1150000>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -137,6 +204,10 @@\n+ \tstatus = \"disabled\";\n+ };\n+ \n++&dfi {\n++\tstatus = \"okay\";\n++};\n++\n+ &gmac2io {\n+ \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n+ \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n+@@ -202,6 +273,7 @@\n+ \t\t\t\tregulator-name = \"vdd_log\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1075000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n+@@ -216,6 +288,7 @@\n+ \t\t\t\tregulator-name = \"vdd_arm\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1225000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\ndiff --git a/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..f589ce2a7b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -192,13 +192,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..c85da5fb07\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tamba: bus {\ndiff --git a/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..9d393c5771\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,186 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,156 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1150000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++ \t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1300000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \tchosen {\ndiff --git a/target/linux/rockchip/patches-5.4/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.4/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\nnew file mode 100644\nindex 0000000000..8d67a11f90\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n@@ -0,0 +1,48 @@\n+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 13:53:25 +0800\n+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/Kconfig      |  18 +-\n+ drivers/devfreq/Makefile     |   1 +\n+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++\n+ 3 files changed, 862 insertions(+), 3 deletions(-)\n+ create mode 100644 drivers/devfreq/rk3328_dmc.c\n+\n+diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig\n+index defe1d438710..5ae0832f046b 100644\n+--- a/drivers/devfreq/Kconfig\n++++ b/drivers/devfreq/Kconfig\n+@@ -116,6 +116,18 @@ config ARM_TEGRA20_DEVFREQ\n+ \t  It reads Memory Controller counters and adjusts the operating\n+ \t  frequencies and voltages with OPP support.\n+ \n++config ARM_RK3328_DMC_DEVFREQ\n++\ttristate \"ARM RK3328 DMC DEVFREQ Driver\"\n++\tdepends on ARCH_ROCKCHIP\n++\tselect DEVFREQ_EVENT_ROCKCHIP_DFI\n++\tselect DEVFREQ_GOV_SIMPLE_ONDEMAND\n++\tselect PM_DEVFREQ_EVENT\n++\tselect PM_OPP\n++\thelp\n++\t  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).\n++\t  It sets the frequency for the memory controller and reads the usage counts\n++\t  from hardware.\n++\n+ config ARM_RK3399_DMC_DEVFREQ\n+ \ttristate \"ARM RK3399 DMC DEVFREQ Driver\"\n+ \tdepends on ARCH_ROCKCHIP\n+diff --git a/drivers/devfreq/Makefile b/drivers/devfreq/Makefile\n+index 338ae8440db6..ec568406ef50 100644\n+--- a/drivers/devfreq/Makefile\n++++ b/drivers/devfreq/Makefile\n+@@ -9,6 +9,7 @@ obj-$(CONFIG_DEVFREQ_GOV_PASSIVE)\t+= governor_passive.o\n+ \n+ # DEVFREQ Drivers\n+ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)\t+= exynos-bus.o\n++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)\t+= rk3328_dmc.o\n+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)\t+= rk3399_dmc.o\n+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)\t\t+= tegra30-devfreq.o\n+ obj-$(CONFIG_ARM_TEGRA20_DEVFREQ)\t+= tegra20-devfreq.o\ndiff --git a/target/linux/rockchip/patches-5.4/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.4/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\nnew file mode 100644\nindex 0000000000..4e688f8eb4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n@@ -0,0 +1,218 @@\n+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001\n+From: Tang Yun ping <typ@rock-chips.com>\n+Date: Thu, 4 May 2017 20:49:58 +0800\n+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2\n+ APIs\n+\n+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.\n+\n+Signed-off-by: Tang Yun ping <typ@rock-chips.com>\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++\n+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-\n+ drivers/clk/rockchip/clk.h          |   3 +-\n+ include/soc/rockchip/rockchip_sip.h |  11 +++\n+ 4 files changed, 147 insertions(+), 4 deletions(-)\n+\n+diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c\n+index 9273bce4d7b6..555aaf4e758d 100644\n+--- a/drivers/clk/rockchip/clk-ddr.c\n++++ b/drivers/clk/rockchip/clk-ddr.c\n+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddrclk_sip_ops = {\n+ \t.get_parent = rockchip_ddrclk_get_parent,\n+ };\n+ \n++/* See v4.4/include/dt-bindings/display/rk_fb.h */\n++#define SCREEN_NULL\t\t\t0\n++#define SCREEN_HDMI\t\t\t6\n++\n++static inline int rk_drm_get_lcdc_type(void)\n++{\n++\treturn SCREEN_NULL;\n++}\n++\n++struct share_params {\n++\tu32 hz;\n++\tu32 lcdc_type;\n++\tu32 vop;\n++\tu32 vop_dclk_mode;\n++\tu32 sr_idle_en;\n++\tu32 addr_mcu_el3;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag1;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag0;\n++\tu32 complt_hwirq;\n++\t /* if need, add parameter after */\n++};\n++\n++struct rockchip_ddrclk_data {\n++\tu32 inited_flag;\n++\tvoid __iomem *share_memory;\n++};\n++\n++static struct rockchip_ddrclk_data ddr_data;\n++\n++static void rockchip_ddrclk_data_init(void)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n++\t\t      1, SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif (!res.a0) {\n++\t\tddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);\n++\t\tddr_data.inited_flag = 1;\n++\t}\n++}\n++\n++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t   unsigned long drate,\n++\t\t\t\t\t   unsigned long prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = drate;\n++\tp->lcdc_type = rk_drm_get_lcdc_type();\n++\tp->wait_flag1 = 1;\n++\tp->wait_flag0 = 1;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif ((int)res.a1 == -6) {\n++\t\tpr_err(\"%s: timeout, drate = %lumhz\\n\", __func__, drate/1000000);\n++\t\t/* TODO: rockchip_dmcfreq_wait_complete(); */\n++\t}\n++\n++\treturn res.a0;\n++}\n++\n++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2\n++\t\t\t(struct clk_hw *hw, unsigned long parent_rate)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t      unsigned long rate,\n++\t\t\t\t\t      unsigned long *prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = rate;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {\n++\t.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,\n++\t.set_rate = rockchip_ddrclk_sip_set_rate_v2,\n++\t.round_rate = rockchip_ddrclk_sip_round_rate_v2,\n++\t.get_parent = rockchip_ddrclk_get_parent,\n++};\n++\n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+ \t\t\t\t\t u8 num_parents, int mux_offset,\n+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \tcase ROCKCHIP_DDRCLK_SIP:\n+ \t\tinit.ops = &rockchip_ddrclk_sip_ops;\n+ \t\tbreak;\n++\tcase ROCKCHIP_DDRCLK_SIP_V2:\n++\t\tinit.ops = &rockchip_ddrclk_sip_ops_v2;\n++\t\tbreak;\n+ \tdefault:\n+ \t\tpr_err(\"%s: unsupported ddrclk type %d\\n\", __func__, ddr_flag);\n+ \t\tkfree(ddrclk);\n+diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c\n+index c186a1985bf4..ac6e6163a232 100644\n+--- a/drivers/clk/rockchip/clk-rk3328.c\n++++ b/drivers/clk/rockchip/clk-rk3328.c\n+@@ -314,9 +314,10 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {\n+ \t\t\tRK3328_CLKGATE_CON(14), 1, GFLAGS),\n+ \n+ \t/* PD_DDR */\n+-\tCOMPOSITE(0, \"clk_ddr\", mux_ddrphy_p, CLK_IGNORE_UNUSED,\n+-\t\t\tRK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,\n+-\t\t\tRK3328_CLKGATE_CON(0), 4, GFLAGS),\n++\tCOMPOSITE_DDRCLK(SCLK_DDRCLK, \"sclk_ddrc\", mux_ddrphy_p, 0,\n++\t\t\tRK3328_CLKSEL_CON(3), 8, 2, 0, 3,\n++\t\t\tROCKCHIP_DDRCLK_SIP_V2),\n++\n+ \tGATE(0, \"clk_ddrmsch\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+ \t\t\tRK3328_CLKGATE_CON(18), 6, GFLAGS),\n+ \tGATE(0, \"clk_ddrupctl\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h\n+index 2271a84124b0..7405aaf965ec 100644\n+--- a/drivers/clk/rockchip/clk.h\n++++ b/drivers/clk/rockchip/clk.h\n+@@ -362,7 +362,8 @@ struct clk *rockchip_clk_register_mmc(const char *name,\n+  * DDRCLK flags, including method of setting the rate\n+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.\n+  */\n+-#define ROCKCHIP_DDRCLK_SIP\t\tBIT(0)\n++#define ROCKCHIP_DDRCLK_SIP\t\t0x01\n++#define ROCKCHIP_DDRCLK_SIP_V2\t\t0x03\n+ \n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h\n+index c46a9ae2a2ab..fa7e0a2d72cc 100644\n+--- a/include/soc/rockchip/rockchip_sip.h\n++++ b/include/soc/rockchip/rockchip_sip.h\n+@@ -16,5 +16,16 @@\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ\t0x06\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM\t0x07\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD\t0x08\n++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION\t0x08\n++\n++#define ROCKCHIP_SIP_SHARE_MEM\t\t\t0x82000009\n++\n++/* Share mem page types */\n++typedef enum {\n++    SHARE_PAGE_TYPE_INVALID = 0,\n++    SHARE_PAGE_TYPE_UARTDBG,\n++    SHARE_PAGE_TYPE_DDR,\n++    SHARE_PAGE_TYPE_MAX,\n++} share_page_type_t;\n+ \n+ #endif\ndiff --git a/target/linux/rockchip/patches-5.4/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.4/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\nnew file mode 100644\nindex 0000000000..dbf491a287\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n@@ -0,0 +1,665 @@\n+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 12:49:48 +0800\n+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---\n+ 1 file changed, 505 insertions(+), 49 deletions(-)\n+\n+diff --git a/drivers/devfreq/event/rockchip-dfi.c b/drivers/devfreq/event/rockchip-dfi.c\n+index 5d1042188727..80be0efdfb9b 100644\n+--- a/drivers/devfreq/event/rockchip-dfi.c\n++++ b/drivers/devfreq/event/rockchip-dfi.c\n+@@ -18,25 +18,66 @@\n+ #include <linux/list.h>\n+ #include <linux/of.h>\n+ \n+-#include <soc/rockchip/rk3399_grf.h>\n+-\n+-#define RK3399_DMC_NUM_CH\t2\n+-\n++#define PX30_PMUGRF_OS_REG2\t\t0x208\n++\n++#define RK3128_GRF_SOC_CON0\t\t0x140\n++#define RK3128_GRF_OS_REG1\t\t0x1cc\n++#define RK3128_GRF_DFI_WRNUM\t\t0x220\n++#define RK3128_GRF_DFI_RDNUM\t\t0x224\n++#define RK3128_GRF_DFI_TIMERVAL\t\t0x22c\n++#define RK3128_DDR_MONITOR_EN\t\t((1 << (16 + 6)) + (1 << 6))\n++#define RK3128_DDR_MONITOR_DISB\t\t((1 << (16 + 6)) + (0 << 6))\n++\n++#define RK3288_PMU_SYS_REG2\t\t0x9c\n++#define RK3288_GRF_SOC_CON4\t\t0x254\n++#define RK3288_GRF_SOC_STATUS(n)\t(0x280 + (n) * 4)\n++#define RK3288_DFI_EN\t\t\t(0x30003 << 14)\n++#define RK3288_DFI_DIS\t\t\t(0x30000 << 14)\n++#define RK3288_LPDDR_SEL\t\t(0x10001 << 13)\n++#define RK3288_DDR3_SEL\t\t\t(0x10000 << 13)\n++\n++#define RK3328_GRF_OS_REG2\t\t0x5d0\n++\n++#define RK3368_GRF_DDRC0_CON0\t\t0x600\n++#define RK3368_GRF_SOC_STATUS5\t\t0x494\n++#define RK3368_GRF_SOC_STATUS6\t\t0x498\n++#define RK3368_GRF_SOC_STATUS8\t\t0x4a0\n++#define RK3368_GRF_SOC_STATUS9\t\t0x4a4\n++#define RK3368_GRF_SOC_STATUS10\t\t0x4a8\n++#define RK3368_DFI_EN\t\t\t(0x30003 << 5)\n++#define RK3368_DFI_DIS\t\t\t(0x30000 << 5)\n++\n++#define MAX_DMC_NUM_CH\t\t\t2\n++#define READ_DRAMTYPE_INFO(n)\t\t(((n) >> 13) & 0x7)\n++#define READ_CH_INFO(n)\t\t\t(((n) >> 28) & 0x3)\n+ /* DDRMON_CTRL */\n+-#define DDRMON_CTRL\t0x04\n+-#define CLR_DDRMON_CTRL\t(0x1f0000 << 0)\n+-#define LPDDR4_EN\t(0x10001 << 4)\n+-#define HARDWARE_EN\t(0x10001 << 3)\n+-#define LPDDR3_EN\t(0x10001 << 2)\n+-#define SOFTWARE_EN\t(0x10001 << 1)\n+-#define SOFTWARE_DIS\t(0x10000 << 1)\n+-#define TIME_CNT_EN\t(0x10001 << 0)\n++#define DDRMON_CTRL\t\t\t0x04\n++#define CLR_DDRMON_CTRL\t\t\t(0x3f0000 << 0)\n++#define DDR4_EN\t\t\t\t(0x10001 << 5)\n++#define LPDDR4_EN\t\t\t(0x10001 << 4)\n++#define HARDWARE_EN\t\t\t(0x10001 << 3)\n++#define LPDDR2_3_EN\t\t\t(0x10001 << 2)\n++#define SOFTWARE_EN\t\t\t(0x10001 << 1)\n++#define SOFTWARE_DIS\t\t\t(0x10000 << 1)\n++#define TIME_CNT_EN\t\t\t(0x10001 << 0)\n+ \n+ #define DDRMON_CH0_COUNT_NUM\t\t0x28\n+ #define DDRMON_CH0_DFI_ACCESS_NUM\t0x2c\n+ #define DDRMON_CH1_COUNT_NUM\t\t0x3c\n+ #define DDRMON_CH1_DFI_ACCESS_NUM\t0x40\n+ \n++/* pmu grf */\n++#define PMUGRF_OS_REG2\t\t\t0x308\n++\n++enum {\n++\tDDR4 = 0,\n++\tDDR3 = 3,\n++\tLPDDR2 = 5,\n++\tLPDDR3 = 6,\n++\tLPDDR4 = 7,\n++\tUNUSED = 0xFF\n++};\n++\n+ struct dmc_usage {\n+ \tu32 access;\n+ \tu32 total;\n+@@ -50,33 +91,261 @@ struct dmc_usage {\n+ struct rockchip_dfi {\n+ \tstruct devfreq_event_dev *edev;\n+ \tstruct devfreq_event_desc *desc;\n+-\tstruct dmc_usage ch_usage[RK3399_DMC_NUM_CH];\n++\tstruct dmc_usage ch_usage[MAX_DMC_NUM_CH];\n+ \tstruct device *dev;\n+ \tvoid __iomem *regs;\n+ \tstruct regmap *regmap_pmu;\n++\tstruct regmap *regmap_grf;\n++\tstruct regmap *regmap_pmugrf;\n+ \tstruct clk *clk;\n++\tu32 dram_type;\n++\t/*\n++\t * available mask, 1: available, 0: not available\n++\t * each bit represent a channel\n++\t */\n++\tu32 ch_msk;\n++};\n++\n++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_EN);\n++}\n++\n++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_DISB);\n++}\n++\n++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi_wr, dfi_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);\n++\n++\tedata->load_count = (dfi_wr + dfi_rd) * 4;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3128_dfi_ops = {\n++\t.disable = rk3128_dfi_disable,\n++\t.enable = rk3128_dfi_enable,\n++\t.get_event = rk3128_dfi_get_event,\n++\t.set_event = rk3128_dfi_set_event,\n++};\n++\n++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);\n++}\n++\n++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);\n++}\n++\n++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tu32 tmp, max = 0;\n++\tu32 i, busier_ch = 0;\n++\tu32 rd_count, wr_count, total_count;\n++\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\t/* Find out which channel is busier */\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);\n++\t\tinfo->ch_usage[i].access = (wr_count + rd_count) * 4;\n++\t\tinfo->ch_usage[i].total = total_count;\n++\t\ttmp = info->ch_usage[i].access;\n++\t\tif (tmp > max) {\n++\t\t\tbusier_ch = i;\n++\t\t\tmax = tmp;\n++\t\t}\n++\t}\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn busier_ch;\n++}\n++\n++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tint busier_ch;\n++\tunsigned long flags;\n++\n++\tlocal_irq_save(flags);\n++\tbusier_ch = rk3288_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n++\n++\tedata->load_count = info->ch_usage[busier_ch].access;\n++\tedata->total_count = info->ch_usage[busier_ch].total;\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3288_dfi_ops = {\n++\t.disable = rk3288_dfi_disable,\n++\t.enable = rk3288_dfi_enable,\n++\t.get_event = rk3288_dfi_get_event,\n++\t.set_event = rk3288_dfi_set_event,\n++};\n++\n++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);\n++}\n++\n++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);\n++}\n++\n++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);\n++\n++\tedata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3368_dfi_ops = {\n++\t.disable = rk3368_dfi_disable,\n++\t.enable = rk3368_dfi_enable,\n++\t.get_event = rk3368_dfi_get_event,\n++\t.set_event = rk3368_dfi_set_event,\n+ };\n+ \n+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tvoid __iomem *dfi_regs = info->regs;\n+-\tu32 val;\n+-\tu32 ddr_type;\n+-\n+-\t/* get ddr type */\n+-\tregmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);\n+-\tddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &\n+-\t\t    RK3399_PMUGRF_DDRTYPE_MASK;\n+ \n+ \t/* clear DDRMON_CTRL setting */\n+ \twritel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* set ddr type to dfi */\n+-\tif (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)\n+-\t\twritel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);\n+-\telse if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)\n++\tif (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)\n++\t\twritel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == LPDDR4)\n+ \t\twritel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == DDR4)\n++\t\twritel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* enable count, use software mode */\n+ \twritel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);\n+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n+ \trockchip_dfi_stop_hardware_counter(edev);\n+ \n+ \t/* Find out which channel is busier */\n+-\tfor (i = 0; i < RK3399_DMC_NUM_CH; i++) {\n+-\t\tinfo->ch_usage[i].access = readl_relaxed(dfi_regs +\n+-\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\n+ \t\tinfo->ch_usage[i].total = readl_relaxed(dfi_regs +\n+ \t\t\t\tDDRMON_CH0_COUNT_NUM + i * 20);\n+-\t\ttmp = info->ch_usage[i].access;\n++\n++\t\t/* LPDDR4 BL = 16,other DDR type BL = 8 */\n++\t\ttmp = readl_relaxed(dfi_regs +\n++\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20);\n++\t\tif (info->dram_type == LPDDR4)\n++\t\t\ttmp *= 8;\n++\t\telse\n++\t\t\ttmp *= 4;\n++\t\tinfo->ch_usage[i].access = tmp;\n++\n+ \t\tif (tmp > max) {\n+ \t\t\tbusier_ch = i;\n+ \t\t\tmax = tmp;\n+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct devfreq_event_dev *edev)\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \n+ \trockchip_dfi_stop_hardware_counter(edev);\n+-\tclk_disable_unprepare(info->clk);\n++\tif (info->clk)\n++\t\tclk_disable_unprepare(info->clk);\n+ \n+ \treturn 0;\n+ }\n+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct devfreq_event_dev *edev)\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint ret;\n+ \n+-\tret = clk_prepare_enable(info->clk);\n+-\tif (ret) {\n+-\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\", ret);\n+-\t\treturn ret;\n++\tif (info->clk) {\n++\t\tret = clk_prepare_enable(info->clk);\n++\t\tif (ret) {\n++\t\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\",\n++\t\t\t\tret);\n++\t\t\treturn ret;\n++\t\t}\n+ \t}\n+ \n+ \trockchip_dfi_start_hardware_counter(edev);\n+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct devfreq_event_dev *edev,\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint busier_ch;\n++\tunsigned long flags;\n+ \n++\tlocal_irq_save(flags);\n+ \tbusier_ch = rockchip_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n+ \n+ \tedata->load_count = info->ch_usage[busier_ch].access;\n+ \tedata->total_count = info->ch_usage[busier_ch].total;\n+@@ -167,23 +453,117 @@ static const struct devfreq_event_ops rockchip_dfi_ops = {\n+ \t.set_event = rockchip_dfi_set_event,\n+ };\n+ \n+-static const struct of_device_id rockchip_dfi_id_match[] = {\n+-\t{ .compatible = \"rockchip,rk3399-dfi\" },\n+-\t{ },\n+-};\n+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++static __init int px30_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n+ \n+-static int rockchip_dfi_probe(struct platform_device *pdev)\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmugrf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmugrf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmugrf))\n++\t\t\treturn PTR_ERR(data->regmap_pmugrf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3128_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tdesc->ops = &rk3128_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3288_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmu\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmu = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmu))\n++\t\t\treturn PTR_ERR(data->regmap_pmu);\n++\t}\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tif (data->dram_type == DDR3)\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_DDR3_SEL);\n++\telse\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_LPDDR_SEL);\n++\n++\tdesc->ops = &rk3288_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3368_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\n++\tif (!dev->parent || !dev->parent->of_node)\n++\t\treturn -EINVAL;\n++\n++\tdata->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);\n++\tif (IS_ERR(data->regmap_grf))\n++\t\treturn PTR_ERR(data->regmap_grf);\n++\n++\tdesc->ops = &rk3368_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rockchip_dfi_init(struct platform_device *pdev,\n++\t\t\t\t    struct rockchip_dfi *data,\n++\t\t\t\t    struct devfreq_event_desc *desc)\n+ {\n+ \tstruct device *dev = &pdev->dev;\n+-\tstruct rockchip_dfi *data;\n+ \tstruct resource *res;\n+-\tstruct devfreq_event_desc *desc;\n+ \tstruct device_node *np = pdev->dev.of_node, *node;\n+-\n+-\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n+-\tif (!data)\n+-\t\treturn -ENOMEM;\n++\tu32 val;\n+ \n+ \tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n+ \tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n+@@ -203,21 +583,97 @@ static int rockchip_dfi_probe(struct platform_device *pdev)\n+ \t\tif (IS_ERR(data->regmap_pmu))\n+ \t\t\treturn PTR_ERR(data->regmap_pmu);\n+ \t}\n+-\tdata->dev = dev;\n++\n++\tregmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3328_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n++\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static const struct of_device_id rockchip_dfi_id_match[] = {\n++\t{ .compatible = \"rockchip,px30-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk1808-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk3128-dfi\", .data = rk3128_dfi_init },\n++\t{ .compatible = \"rockchip,rk3288-dfi\", .data = rk3288_dfi_init },\n++\t{ .compatible = \"rockchip,rk3328-dfi\", .data = rk3328_dfi_init },\n++\t{ .compatible = \"rockchip,rk3368-dfi\", .data = rk3368_dfi_init },\n++\t{ .compatible = \"rockchip,rk3399-dfi\", .data = rockchip_dfi_init },\n++\t{ },\n++};\n++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++\n++static int rockchip_dfi_probe(struct platform_device *pdev)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct rockchip_dfi *data;\n++\tstruct devfreq_event_desc *desc;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\tint (*init)(struct platform_device *pdev, struct rockchip_dfi *data,\n++\t\t    struct devfreq_event_desc *desc);\n++\n++\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n++\tif (!data)\n++\t\treturn -ENOMEM;\n+ \n+ \tdesc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);\n+ \tif (!desc)\n+ \t\treturn -ENOMEM;\n+ \n+-\tdesc->ops = &rockchip_dfi_ops;\n++\tmatch = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);\n++\tif (match) {\n++\t\tinit = match->data;\n++\t\tif (init) {\n++\t\t\tif (init(pdev, data, desc))\n++\t\t\t\treturn -EINVAL;\n++\t\t} else {\n++\t\t\treturn 0;\n++\t\t}\n++\t} else {\n++\t\treturn 0;\n++\t}\n++\n+ \tdesc->driver_data = data;\n+ \tdesc->name = np->name;\n+ \tdata->desc = desc;\n++\tdata->dev = dev;\n+ \n+-\tdata->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);\n++\tdata->edev = devm_devfreq_event_add_edev(dev, desc);\n+ \tif (IS_ERR(data->edev)) {\n+-\t\tdev_err(&pdev->dev,\n+-\t\t\t\"failed to add devfreq-event device\\n\");\n++\t\tdev_err(dev, \"failed to add devfreq-event device\\n\");\n+ \t\treturn PTR_ERR(data->edev);\n+ \t}\ndiff --git a/target/linux/rockchip/patches-5.4/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.4/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nnew file mode 100644\nindex 0000000000..e9b79b6fa9\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -0,0 +1,27 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[adjusted commit title]\n+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -993,6 +993,13 @@\n+ \t\t};\n+ \t};\n+ \n++\tdfi: dfi@ff790000 {\n++\t\treg = <0x00 0xff790000 0x00 0x400>;\n++\t\tcompatible = \"rockchip,rk3328-dfi\";\n++\t\trockchip,grf = <&grf>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nnew file mode 100644\nindex 0000000000..0298ccfab1\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -0,0 +1,126 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++\n+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-\n+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++\n+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++\n+ 4 files changed, 617 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi\n+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h\n+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -7,6 +7,7 @@\n+ \n+ #include <dt-bindings/input/input.h>\n+ #include <dt-bindings/gpio/gpio.h>\n++#include \"rk3328-dram-nanopi2-timing.dtsi\"\n+ #include \"rk3328.dtsi\"\n+ \n+ / {\n+@@ -115,6 +116,72 @@\n+ \t\tregulator-max-microvolt = <5000000>;\n+ \t\tenable-active-high;\n+ \t};\n++\n++\tdmc: dmc {\n++\t\tcompatible = \"rockchip,rk3328-dmc\";\n++\t\tdevfreq-events = <&dfi>;\n++\t\tcenter-supply = <&vdd_log>;\n++\t\tclocks = <&cru SCLK_DDRCLK>;\n++\t\tclock-names = \"dmc_clk\";\n++\t\toperating-points-v2 = <&dmc_opp_table>;\n++\t\tddr_timing = <&ddr_timing>;\n++\t\tupthreshold = <40>;\n++\t\tdowndifferential = <20>;\n++\t\tauto-min-freq = <786000>;\n++\t\tauto-freq-en = <0>;\n++\t\t#cooling-cells = <2>;\n++\t\tstatus = \"okay\";\n++\n++\t\tddr_power_model: ddr_power_model {\n++\t\t\tcompatible = \"ddr_power_model\";\n++\t\t\tdynamic-power-coefficient = <120>;\n++\t\t\tstatic-power-coefficient = <200>;\n++\t\t\tts = <32000 4700 (-80) 2>;\n++\t\t\tthermal-zone = \"soc-thermal\";\n++\t\t};\n++\t};\n++\n++\tdmc_opp_table: dmc-opp-table {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\trockchip,leakage-voltage-sel = <\n++\t\t\t1   10    0\n++\t\t\t11  254   1\n++\t\t>;\n++\t\tnvmem-cells = <&logic_leakage>;\n++\t\tnvmem-cell-names = \"ddr_leakage\";\n++\n++\t\topp-786000000 {\n++\t\t\topp-hz = /bits/ 64 <786000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-798000000 {\n++\t\t\topp-hz = /bits/ 64 <798000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-840000000 {\n++\t\t\topp-hz = /bits/ 64 <840000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-924000000 {\n++\t\t\topp-hz = /bits/ 64 <924000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t\topp-microvolt-L0 = <1100000>;\n++\t\t\topp-microvolt-L1 = <1075000>;\n++\t\t};\n++\t\topp-1056000000 {\n++\t\t\topp-hz = /bits/ 64 <1056000000>;\n++\t\t\topp-microvolt = <1175000>;\n++\t\t\topp-microvolt-L0 = <1175000>;\n++\t\t\topp-microvolt-L1 = <1150000>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -133,6 +200,10 @@\n+ \tcpu-supply = <&vdd_arm>;\n+ };\n+ \n++&dfi {\n++\tstatus = \"okay\";\n++};\n++\n+ &gmac2io {\n+ \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n+ \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n+@@ -198,6 +269,7 @@\n+ \t\t\t\tregulator-name = \"vdd_log\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1075000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n+@@ -212,6 +284,7 @@\n+ \t\t\t\tregulator-name = \"vdd_arm\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1225000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0003-rockchip-fixes-re-boot-with-UHS-cards.patch",
    "content": "From 390f2248dfa3a38dc33ee2219b4dcc581dadcf8d Mon Sep 17 00:00:00 2001\nFrom: Tianling Shen <cnsztl@gmail.com>\nDate: Fri, 25 Dec 2020 21:59:41 +0800\nSubject: [PATCH 3/5] rockchip: fixes re-boot with UHS cards\n\nSome boards have SD card connectors where the power rail cannot be switched\noff by the driver. If the card has not been power cycled, it may still be\nusing 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\nwill fail to boot from a UHS card that continue to use 1.8V signaling.\n\nSet initial signal voltage in mmc_power_off() to allow re-boot to function.\n\nThis fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\nsame issue have been seen on some Rockchip RK3399 boards.\n\nBackport from https://lore.kernel.org/linux-rockchip/AM3PR03MB09664161A7FA2BD68B2800A7AC620@AM3PR03MB0966.eurprd03.prod.outlook.com/\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\n---\n ...-initial-signal-voltage-on-power-off.patch | 41 +++++++++++++++++++\n 1 file changed, 41 insertions(+)\n create mode 100644 target/linux/rockchip/patches-5.4/108-rfc-mmc-core-set-initial-signal-voltage-on-power-off.patch\n\ndiff --git a/target/linux/rockchip/patches-5.4/108-rfc-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.4/108-rfc-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..4370734dd7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/108-rfc-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,41 @@\n+Subject: [RFC] mmc: core: set initial signal voltage on power off\n+Date: Sun, 17 Feb 2019 22:14:38 +0000\n+Message-ID: <AM3PR03MB09664161A7FA2BD68B2800A7AC620@AM3PR03MB0966.eurprd03.prod.outlook.com>\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas-uIzNG4q0ceqzQB+pC5nmwQ@public.gmane.org>\n+---\n+ drivers/mmc/core/core.c | 8 ++++++++\n+ 1 file changed, 8 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1684,6 +1684,14 @@ void mmc_power_off(struct mmc_host *host)\n+ \tif (host->ios.power_mode == MMC_POWER_OFF)\n+ \t\treturn;\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n++\t/*\n++\t * This delay should be sufficient to allow the power supply\n++\t * to reach the minimum voltage.\n++\t */\n++\tmmc_delay(host->ios.power_delay_ms);\n++\n+ \tmmc_pwrseq_power_off(host);\n+ \n+ \thost->ios.clock = 0;\n+\n-- \n2.20.1\n\n"
  },
  {
    "path": "not_use_file/0004-add-new-rk33xx-support.patch",
    "content": "From f9a68930750e4b87888d6e20747a5438f3d3b1a3 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 10 Jun 2021 16:25:08 +0800\nSubject: [PATCH] add new rk33xx support\n\n\tnew file:   target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n\tnew file:   target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n\tnew file:   target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n\tnew file:   target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n\tnew file:   target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n\tnew file:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n---\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |  38 +++\n ...k-events-support-multiple-registrant.patch | 291 ++++++++++++++++++\n ...dd-compatible-to-NanoPi-R2S-ethernet.patch |  25 ++\n ...d-OF-node-for-pcie-eth-on-NanoPi-R4S.patch |  22 ++\n ...-initial-signal-voltage-on-power-off.patch |  35 +++\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 ++\n 6 files changed, 433 insertions(+)\n create mode 100644 target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n create mode 100644 target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n create mode 100644 target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n\ndiff --git a/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..2664758304\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -139,9 +139,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..b9743c9681\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2744,6 +2744,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3784,9 +3791,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch b/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\nnew file mode 100644\nindex 0000000000..085dd392c9\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -138,6 +138,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\nnew file mode 100644\nindex 0000000000..028deca248\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n@@ -0,0 +1,22 @@\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -83,6 +83,19 @@\n+ \tmax-link-speed = <1>;\n+ \tnum-lanes = <1>;\n+ \tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\n++\t\tpcie-eth@0,0 {\n++\t\t\tcompatible = \"realtek,r8168\";\n++\t\t\treg = <0x000000 0 0 0 0>;\n++\n++\t\t\trealtek,led-data = <0x870>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &pinctrl {\ndiff --git a/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..edf007eefa\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -169,6 +169,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0004-uboot-add-r4s-support.patch",
    "content": "From 2f05db8da23df42444ea353a012ae23ab4ddd4f2 Mon Sep 17 00:00:00 2001\nFrom: Tianling Shen <cnsztl@gmail.com>\nDate: Sat, 19 Dec 2020 19:25:16 +0800\nSubject: [PATCH] uboot-rockchip: add NanoPi R4S support\n\nAdd support for the FriendlyARM NanoPi R4S.\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\nCo-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\nSigned-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\nCo-authored-by: Marty Jones <mj8263788@gmail.com>\nSigned-off-by: Marty Jones <mj8263788@gmail.com>\n---\n package/boot/uboot-rockchip/Makefile          |  11 +\n ...split-nanopi-r4-rk3399-out-of-evb_rk.patch | 509 ++++++++++++++++++\n ...9-Add-support-for-multiple-DDR-types.patch | 256 +++++++++\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 313 +++++++++++\n 4 files changed, 1089 insertions(+)\n create mode 100644 package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n create mode 100644 package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n create mode 100644 package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 393e8c3a9f09..62536798345b 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -38,6 +38,16 @@ endef\n \n # RK3399 boards\n \n+define U-Boot/nanopi-r4s-rk3399\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=NanoPi R4S\n+  BUILD_DEVICES:= \\\n+    friendlyarm_nanopi-r4s\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r4s-rk3399:arm-trusted-firmware-rockchip\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n+  ATF:=rk3399_bl31.elf\n+endef\n+\n define U-Boot/rock-pi-4-rk3399\n   BUILD_SUBTARGET:=armv8\n   NAME:=Rock Pi 4\n@@ -59,6 +69,7 @@ define U-Boot/rockpro64-rk3399\n endef\n \n UBOOT_TARGETS := \\\n+  nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n   nanopi-r2s-rk3328\ndiff --git a/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\nnew file mode 100644\nindex 000000000000..d8a118dd2e95\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/200-rockchip-rk3399-split-nanopi-r4-rk3399-out-of-evb_rk.patch\n@@ -0,0 +1,509 @@\n+From a765bb2678b6d1666caafef0fcf88fba88b5b26f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Fri, 18 Dec 2020 17:10:35 +0800\n+Subject: [PATCH] rockchip: rk3399: split nanopi-r4-rk3399 out of evb_rk3399\n+\n+nanopi-r4-rk3399 board has multiple DDR types. Currently we don't have any code\n+are compatible with these devices. Since multiple DDR types is specific to\n+nanopi-r4-rk3399 board, split it into its own board file and add code\n+support here.\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[Improved commit message and Kconfig description]\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm/mach-rockchip/rk3399/Kconfig |  15 +++\n+ board/friendlyarm/nanopi4/Kconfig     |  15 +++\n+ board/friendlyarm/nanopi4/MAINTAINERS |   5 +\n+ board/friendlyarm/nanopi4/Makefile    |   8 ++\n+ board/friendlyarm/nanopi4/hwrev.c     | 185 ++++++++++++++++++++++++++\n+ board/friendlyarm/nanopi4/hwrev.h     |  27 ++++\n+ board/friendlyarm/nanopi4/nanopi4.c   | 148 +++++++++++++++++++++\n+ drivers/clk/rockchip/clk_rk3399.c     |   2 +\n+ include/configs/nanopi4.h             |  24 ++++\n+ 9 files changed, 429 insertions(+)\n+ create mode 100644 board/friendlyarm/nanopi4/Kconfig\n+ create mode 100644 board/friendlyarm/nanopi4/MAINTAINERS\n+ create mode 100644 board/friendlyarm/nanopi4/Makefile\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.c\n+ create mode 100644 board/friendlyarm/nanopi4/hwrev.h\n+ create mode 100644 board/friendlyarm/nanopi4/nanopi4.c\n+ create mode 100644 include/configs/nanopi4.h\n+\n+--- a/arch/arm/mach-rockchip/rk3399/Kconfig\n++++ b/arch/arm/mach-rockchip/rk3399/Kconfig\n+@@ -109,6 +109,20 @@ config TARGET_ROC_PC_RK3399\n+ \t   * wide voltage input(5V-15V), dual cell battery\n+ \t   * Wifi/BT accessible via expansion board M.2\n+ \n++config TARGET_NANOPI4_RK3399\n++\tbool \"FriendlyElec NanoPi4 board\"\n++\thelp\n++\t  NanoPi4 is SBC produced by FriendlyElec. Key features:\n++\n++\t   * Rockchip RK3399\n++\t   * 1/2/4GB Dual-Channel DDR3/LPDDR4\n++\t   * SD card slot\n++\t   * Gigabit ethernet\n++\t   * PCIe\n++\t   * USB 3.0, 2.0\n++\t   * USB Type C power\n++\t   * GPIO expansion ports\n++\n+ endchoice\n+ \n+ config ROCKCHIP_BOOT_MODE_REG\n+@@ -152,6 +166,7 @@ config SYS_BOOTCOUNT_ADDR\n+ endif # BOOTCOUNT_LIMIT\n+ \n+ source \"board/firefly/roc-pc-rk3399/Kconfig\"\n++source \"board/friendlyarm/nanopi4/Kconfig\"\n+ source \"board/google/gru/Kconfig\"\n+ source \"board/pine64/pinebook-pro-rk3399/Kconfig\"\n+ source \"board/pine64/rockpro64_rk3399/Kconfig\"\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Kconfig\n+@@ -0,0 +1,15 @@\n++if TARGET_NANOPI4_RK3399\n++\n++config SYS_BOARD\n++\tdefault \"nanopi4\"\n++\n++config SYS_VENDOR\n++\tdefault \"friendlyarm\"\n++\n++config SYS_CONFIG_NAME\n++\tdefault \"nanopi4\"\n++\n++config BOARD_SPECIFIC_OPTIONS\n++\tdef_bool y\n++\n++endif\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -0,0 +1,5 @@\n++NanoPi 4 Series\n++M:      FriendlyElec <support@friendlyarm.com>\n++S:      Maintained\n++F:      board/friendlyarm/nanopi4/\n++F:      include/configs/nanopi4.h\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/Makefile\n+@@ -0,0 +1,8 @@\n++#\n++# Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++# (http://www.friendlyarm.com)\n++#\n++# SPDX-License-Identifier:     GPL-2.0+\n++#\n++\n++obj-y\t+= nanopi4.o hwrev.o\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.c\n+@@ -0,0 +1,185 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <linux/delay.h>\n++#include <log.h>\n++#include <asm/io.h>\n++#include <asm/gpio.h>\n++#include <asm/arch-rockchip/gpio.h>\n++\n++/*\n++ * ID info:\n++ *  ID : Volts : ADC value :   Bucket\n++ *  ==   =====   =========   ===========\n++ *   0 : 0.102V:        58 :    0 -   81\n++ *   1 : 0.211V:       120 :   82 -  150\n++ *   2 : 0.319V:       181 :  151 -  211\n++ *   3 : 0.427V:       242 :  212 -  274\n++ *   4 : 0.542V:       307 :  275 -  342\n++ *   5 : 0.666V:       378 :  343 -  411\n++ *   6 : 0.781V:       444 :  412 -  477\n++ *   7 : 0.900V:       511 :  478 -  545\n++ *   8 : 1.023V:       581 :  546 -  613\n++ *   9 : 1.137V:       646 :  614 -  675\n++ *  10 : 1.240V:       704 :  676 -  733\n++ *  11 : 1.343V:       763 :  734 -  795\n++ *  12 : 1.457V:       828 :  796 -  861\n++ *  13 : 1.576V:       895 :  862 -  925\n++ *  14 : 1.684V:       956 :  926 -  989\n++ *  15 : 1.800V:      1023 :  990 - 1023\n++ */\n++static const int id_readings[] = {\n++\t 81, 150, 211, 274, 342, 411, 477, 545,\n++\t613, 675, 733, 795, 861, 925, 989, 1023\n++};\n++\n++static int cached_board_id = -1;\n++\n++#define SARADC_BASE\t\t0xFF100000\n++#define SARADC_DATA\t\t(SARADC_BASE + 0)\n++#define SARADC_CTRL\t\t(SARADC_BASE + 8)\n++\n++static u32 get_saradc_value(int chn)\n++{\n++\tint timeout = 0;\n++\tu32 adc_value = 0;\n++\n++\twritel(0, SARADC_CTRL);\n++\tudelay(2);\n++\n++\twritel(0x28 | chn, SARADC_CTRL);\n++\tudelay(50);\n++\n++\ttimeout = 0;\n++\tdo {\n++\t\tif (readl(SARADC_CTRL) & 0x40) {\n++\t\t\tadc_value = readl(SARADC_DATA) & 0x3FF;\n++\t\t\tgoto stop_adc;\n++\t\t}\n++\n++\t\tudelay(10);\n++\t} while (timeout++ < 100);\n++\n++stop_adc:\n++\twritel(0, SARADC_CTRL);\n++\n++\treturn adc_value;\n++}\n++\n++static uint32_t get_adc_index(int chn)\n++{\n++\tint i;\n++\tint adc_reading;\n++\n++\tif (cached_board_id != -1)\n++\t\treturn cached_board_id;\n++\n++\tadc_reading = get_saradc_value(chn);\n++\tfor (i = 0; i < ARRAY_SIZE(id_readings); i++) {\n++\t\tif (adc_reading <= id_readings[i]) {\n++\t\t\tdebug(\"ADC reading %d, ID %d\\n\", adc_reading, i);\n++\t\t\tcached_board_id = i;\n++\t\t\treturn i;\n++\t\t}\n++\t}\n++\n++\t/* should die for impossible value */\n++\treturn 0;\n++}\n++\n++/*\n++ * Board revision list: <GPIO4_D1 | GPIO4_D0>\n++ *  0b00 - NanoPC-T4\n++ *  0b01 - NanoPi M4\n++ *\n++ * Extended by ADC_IN4\n++ * Group A:\n++ *  0x04 - NanoPi NEO4\n++ *  0x06 - SOC-RK3399\n++ *  0x07 - SOC-RK3399 V2\n++ *  0x09 - NanoPi R4S 1GB\n++ *  0x0A - NanoPi R4S 4GB\n++ *\n++ * Group B:\n++ *  0x21 - NanoPi M4 Ver2.0\n++ *  0x22 - NanoPi M4B\n++ */\n++static int pcb_rev = -1;\n++\n++void bd_hwrev_init(void)\n++{\n++#define GPIO4_BASE\t0xff790000\n++\tstruct rockchip_gpio_regs *regs = (void *)GPIO4_BASE;\n++\n++#ifdef CONFIG_SPL_BUILD\n++\tstruct udevice *dev;\n++\n++\tif (uclass_get_device_by_driver(UCLASS_CLK,\n++\t\t\t\tDM_GET_DRIVER(clk_rk3399), &dev))\n++\t\treturn;\n++#endif\n++\n++\tif (pcb_rev >= 0)\n++\t\treturn;\n++\n++\t/* D1, D0: input mode */\n++\tclrbits_le32(&regs->swport_ddr, (0x3 << 24));\n++\tpcb_rev = (readl(&regs->ext_port) >> 24) & 0x3;\n++\n++\tif (pcb_rev == 0x3) {\n++\t\t/* Revision group A: 0x04 ~ 0x13 */\n++\t\tpcb_rev = 0x4 + get_adc_index(4);\n++\n++\t} else if (pcb_rev == 0x1) {\n++\t\tint idx = get_adc_index(4);\n++\n++\t\t/* Revision group B: 0x21 ~ 0x2f */\n++\t\tif (idx > 0) {\n++\t\t\tpcb_rev = 0x20 + idx;\n++\t\t}\n++\t}\n++}\n++\n++#ifdef CONFIG_SPL_BUILD\n++static struct board_ddrtype {\n++\tint rev;\n++\tconst char *type;\n++} ddrtypes[] = {\n++\t{ 0x00, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x01, \"lpddr3-samsung-4GB-1866\" },\n++\t{ 0x04,   \"ddr3-1866\" },\n++\t{ 0x06,   \"ddr3-1866\" },\n++\t{ 0x07, \"lpddr4-100\"  },\n++\t{ 0x09,   \"ddr3-1866\" },\n++\t{ 0x0a, \"lpddr4-100\"  },\n++\t{ 0x21, \"lpddr4-100\"  },\n++\t{ 0x22,   \"ddr3-1866\" },\n++};\n++\n++const char *rk3399_get_ddrtype(void) {\n++\tint i;\n++\n++\tbd_hwrev_init();\n++\tprintf(\"Board: rev%02x\\n\", pcb_rev);\n++\n++\tfor (i = 0; i < ARRAY_SIZE(ddrtypes); i++) {\n++\t\tif (ddrtypes[i].rev == pcb_rev)\n++\t\t\treturn ddrtypes[i].type;\n++\t}\n++\n++\t/* fallback to first subnode (ie, first included dtsi) */\n++\treturn NULL;\n++}\n++#endif\n++\n++/* To override __weak symbols */\n++u32 get_board_rev(void)\n++{\n++\treturn pcb_rev;\n++}\n++\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/hwrev.h\n+@@ -0,0 +1,27 @@\n++/*\n++ * Copyright (C) Guangzhou FriendlyARM Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * This program is free software; you can redistribute it and/or\n++ * modify it under the terms of the GNU General Public License\n++ * as published by the Free Software Foundation; either version 2\n++ * of the License, or (at your option) any later version.\n++ *\n++ * This program is distributed in the hope that it will be useful,\n++ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n++ * GNU General Public License for more details.\n++ *\n++ * You should have received a copy of the GNU General Public License\n++ * along with this program; if not, you can access it online at\n++ * http://www.gnu.org/licenses/gpl-2.0.html.\n++ */\n++\n++#ifndef __BD_HW_REV_H__\n++#define __BD_HW_REV_H__\n++\n++extern void bd_hwrev_config_gpio(void);\n++extern void bd_hwrev_init(void);\n++extern u32 get_board_rev(void);\n++\n++#endif /* __BD_HW_REV_H__ */\n+--- /dev/null\n++++ b/board/friendlyarm/nanopi4/nanopi4.c\n+@@ -0,0 +1,148 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Copyright (c) 2020 FriendlyElec Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ */\n++\n++#include <common.h>\n++#include <dm.h>\n++#include <env.h>\n++#include <hash.h>\n++#include <linux/bitops.h>\n++#include <i2c.h>\n++#include <init.h>\n++#include <net.h>\n++#include <netdev.h>\n++#include <syscon.h>\n++#include <asm/arch-rockchip/bootrom.h>\n++#include <asm/arch-rockchip/clock.h>\n++#include <asm/arch-rockchip/grf_rk3399.h>\n++#include <asm/arch-rockchip/hardware.h>\n++#include <asm/arch-rockchip/misc.h>\n++#include <asm/io.h>\n++#include <asm/setup.h>\n++#include <u-boot/sha256.h>\n++\n++#ifdef CONFIG_MISC_INIT_R\n++static void setup_iodomain(void)\n++{\n++\tstruct rk3399_grf_regs *grf =\n++\t    syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n++\n++\t/* BT565 and AUDIO is in 1.8v domain */\n++\trk_setreg(&grf->io_vsel, BIT(0) | BIT(1));\n++}\n++\n++static int __maybe_unused mac_read_from_generic_eeprom(u8 *addr)\n++{\n++\tstruct udevice *i2c_dev;\n++\tint ret;\n++\n++\t/* Microchip 24AA02xxx EEPROMs with EUI-48 Node Identity */\n++\tret = i2c_get_chip_for_busnum(2, 0x51, 1, &i2c_dev);\n++\tif (!ret)\n++\t\tret = dm_i2c_read(i2c_dev, 0xfa, addr, 6);\n++\n++\treturn ret;\n++}\n++\n++static void setup_macaddr(void)\n++{\n++#if CONFIG_IS_ENABLED(CMD_NET)\n++\tint ret;\n++\tconst char *cpuid = env_get(\"cpuid#\");\n++\tu8 hash[SHA256_SUM_LEN];\n++\tint size = sizeof(hash);\n++\tu8 mac_addr[6];\n++\tint from_eeprom = 0;\n++\tint lockdown = 0;\n++\n++#ifndef CONFIG_ENV_IS_NOWHERE\n++\tlockdown = env_get_yesno(\"lockdown\") == 1;\n++#endif\n++\tif (lockdown && env_get(\"ethaddr\"))\n++\t\treturn;\n++\n++\tret = mac_read_from_generic_eeprom(mac_addr);\n++\tif (!ret && is_valid_ethaddr(mac_addr)) {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\t\tfrom_eeprom = 1;\n++\t}\n++\n++\tif (!cpuid) {\n++\t\tdebug(\"%s: could not retrieve 'cpuid#'\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\tret = hash_block(\"sha256\", (void *)cpuid, strlen(cpuid), hash, &size);\n++\tif (ret) {\n++\t\tdebug(\"%s: failed to calculate SHA256\\n\", __func__);\n++\t\treturn;\n++\t}\n++\n++\t/* Copy 6 bytes of the hash to base the MAC address on */\n++\tmemcpy(mac_addr, hash, 6);\n++\n++\t/* Make this a valid MAC address and set it */\n++\tmac_addr[0] &= 0xfe;  /* clear multicast bit */\n++\tmac_addr[0] |= 0x02;  /* set local assignment bit (IEEE802) */\n++\n++\tif (from_eeprom) {\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t} else {\n++\t\teth_env_set_enetaddr(\"ethaddr\", mac_addr);\n++\n++\t\tif (lockdown && env_get(\"eth1addr\"))\n++\t\t\treturn;\n++\n++\t\t/* Ugly, copy another 4 bytes to generate a similar address */\n++\t\tmemcpy(mac_addr + 2, hash + 8, 4);\n++\t\tif (!memcmp(hash + 2, hash + 8, 4))\n++\t\t\tmac_addr[5] ^= 0xff;\n++\n++\t\teth_env_set_enetaddr(\"eth1addr\", mac_addr);\n++\t}\n++#endif\n++\n++\treturn;\n++}\n++\n++int misc_init_r(void)\n++{\n++\tconst u32 cpuid_offset = 0x7;\n++\tconst u32 cpuid_length = 0x10;\n++\tu8 cpuid[cpuid_length];\n++\tint ret;\n++\n++\tsetup_iodomain();\n++\n++\tret = rockchip_cpuid_from_efuse(cpuid_offset, cpuid_length, cpuid);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = rockchip_cpuid_set(cpuid, cpuid_length);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tsetup_macaddr();\n++\tbd_hwrev_init();\n++\n++\treturn 0;\n++}\n++#endif\n++\n++#ifdef CONFIG_SERIAL_TAG\n++void get_board_serial(struct tag_serialnr *serialnr)\n++{\n++\tchar *serial_string;\n++\tu64 serial = 0;\n++\n++\tserial_string = env_get(\"serial#\");\n++\n++\tif (serial_string)\n++\t\tserial = simple_strtoull(serial_string, NULL, 16);\n++\n++\tserialnr->high = (u32)(serial >> 32);\n++\tserialnr->low = (u32)(serial & 0xffffffff);\n++}\n++#endif\n+diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c\n+index 22c373a623..38975c0c65 100644\n+--- a/drivers/clk/rockchip/clk_rk3399.c\n++++ b/drivers/clk/rockchip/clk_rk3399.c\n+@@ -1351,6 +1351,8 @@ static void rkclk_init(struct rockchip_cru *cru)\n+ \t\t     pclk_div << PCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     hclk_div << HCLK_PERILP1_DIV_CON_SHIFT |\n+ \t\t     HCLK_PERILP1_PLL_SEL_GPLL << HCLK_PERILP1_PLL_SEL_SHIFT);\n++\n++\trk3399_saradc_set_clk(cru, 1000000);\n+ }\n+ #endif\n+ \n+--- /dev/null\n++++ b/include/configs/nanopi4.h\n+@@ -0,0 +1,24 @@\n++/* SPDX-License-Identifier: GPL-2.0+ */\n++/*\n++ * Copyright (C) Guangzhou FriendlyELEC Computer Tech. Co., Ltd.\n++ * (http://www.friendlyarm.com)\n++ *\n++ * (C) Copyright 2016 Rockchip Electronics Co., Ltd\n++ */\n++\n++#ifndef __CONFIG_NANOPI4_H__\n++#define __CONFIG_NANOPI4_H__\n++\n++#define ROCKCHIP_DEVICE_SETTINGS \\\n++\t\t\"stdin=serial,usbkbd\\0\" \\\n++\t\t\"stdout=serial,vidconsole\\0\" \\\n++\t\t\"stderr=serial,vidconsole\\0\"\n++\n++#include <configs/rk3399_common.h>\n++\n++#define SDRAM_BANK_SIZE\t\t\t(2UL << 30)\n++\n++#define CONFIG_SERIAL_TAG\n++#define CONFIG_REVISION_TAG\n++\n++#endif\ndiff --git a/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\nnew file mode 100644\nindex 000000000000..b624bcc76311\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/201-ram-rk3399-Add-support-for-multiple-DDR-types.patch\n@@ -0,0 +1,256 @@\n+From a9447b7b60a3c5195d0fabbe5aa9c32d047ec997 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Sat, 19 Dec 2020 19:39:14 +0800\n+Subject: [PATCH] ram: rk3399: Add support for multiple DDR types\n+\n+Move rockchip,sdram-params to named subnode to include\n+multiple sdram parameters, and then read the parameters\n+(by subnode name, first subnode or current node) before\n+rk3399_dmc_init().\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi      |  6 ++-\n+ arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi      |  5 +-\n+ arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi      |  6 ++-\n+ .../arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi |  3 ++\n+ .../arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi |  3 ++\n+ .../rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi |  3 ++\n+ arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi     |  3 ++\n+ drivers/ram/rockchip/sdram_rk3399.c           | 49 +++++++++++++++----\n+ 8 files changed, 64 insertions(+), 14 deletions(-)\n+\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1333.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1333 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1600.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1600 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-ddr3-1866.dtsi\n+@@ -4,7 +4,9 @@\n+  */\n+ \n+ &dmc {\n+-        rockchip,sdram-params = <\n++\tddr3-1866 {\n++\tu-boot,dm-pre-reloc;\n++\trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+ \t\t0x3\n+@@ -1536,5 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+-\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-2GB-1600.dtsi\n+@@ -5,6 +5,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-2GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x1\n+ \t\t0xa\n+@@ -1537,4 +1539,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-4GB-1600.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-4GB-1600 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1536,4 +1538,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\n+@@ -4,6 +4,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr3-samsung-4GB-1866 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1543,4 +1545,5 @@\n+ \t\t0x01010000\t/* DENALI_PHY_957_DATA */\n+ \t\t0x00000000\t/* DENALI_PHY_958_DATA */\n+ \t>;\n++\t};\n+ };\n+--- a/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n++++ b/arch/arm/dts/rk3399-sdram-lpddr4-100.dtsi\n+@@ -6,6 +6,8 @@\n+  */\n+ \n+ &dmc {\n++\tlpddr4-100 {\n++\tu-boot,dm-pre-reloc;\n+ \trockchip,sdram-params = <\n+ \t\t0x2\n+ \t\t0xa\n+@@ -1538,4 +1540,5 @@\n+ \t\t0x01010000\n+ \t\t0x00000000\n+ \t>;\n++\t};\n+ };\n+--- a/drivers/ram/rockchip/sdram_rk3399.c\n++++ b/drivers/ram/rockchip/sdram_rk3399.c\n+@@ -1625,7 +1625,6 @@ static void set_ddr_stride(struct rk3399_pmusgrf_regs *pmusgrf, u32 stride)\n+ \trk_clrsetreg(&pmusgrf->soc_con4, 0x1f << 10, stride << 10);\n+ }\n+ \n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank,\n+ \t\t\t       struct rk3399_sdram_params *params)\n+ {\n+@@ -1715,8 +1714,8 @@ void modify_param(const struct chan_info *chan,\n+ \tclrsetbits_le32(&denali_pi_params[76], 0x1 << 24, 0x1 << 24);\n+ \tclrsetbits_le32(&denali_pi_params[77], 0x1, 0x1);\n+ }\n+-#else\n+ \n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n+ struct rk3399_sdram_params dfs_cfgs_lpddr4[] = {\n+ #include \"sdram-rk3399-lpddr4-400.inc\"\n+ #include \"sdram-rk3399-lpddr4-800.inc\"\n+@@ -3011,20 +3010,40 @@ static int sdram_init(struct dram_info *dram,\n+ \treturn 0;\n+ }\n+ \n++__weak const char *rk3399_get_ddrtype(void)\n++{\n++\treturn NULL;\n++}\n++\n+ static int rk3399_dmc_ofdata_to_platdata(struct udevice *dev)\n+ {\n+ #if !CONFIG_IS_ENABLED(OF_PLATDATA)\n+ \tstruct rockchip_dmc_plat *plat = dev_get_platdata(dev);\n++\tofnode node = { .np = NULL };\n++\tconst char *name;\n+ \tint ret;\n+ \n+-\tret = dev_read_u32_array(dev, \"rockchip,sdram-params\",\n+-\t\t\t\t (u32 *)&plat->sdram_params,\n+-\t\t\t\t sizeof(plat->sdram_params) / sizeof(u32));\n++\tname = rk3399_get_ddrtype();\n++\tif (name)\n++\t\tnode = dev_read_subnode(dev, name);\n++\tif (!ofnode_valid(node)) {\n++\t\tdebug(\"Failed to read subnode %s\\n\", name);\n++\t\tnode = dev_read_first_subnode(dev);\n++\t}\n++\n++\t/* fallback to current node */\n++\tif (!ofnode_valid(node))\n++\t\tnode = dev_ofnode(dev);\n++\n++\tret = ofnode_read_u32_array(node, \"rockchip,sdram-params\",\n++\t\t\t\t    (u32 *)&plat->sdram_params,\n++\t\t\t\t    sizeof(plat->sdram_params) / sizeof(u32));\n+ \tif (ret) {\n+ \t\tprintf(\"%s: Cannot read rockchip,sdram-params %d\\n\",\n+ \t\t       __func__, ret);\n+ \t\treturn ret;\n+ \t}\n++\n+ \tret = regmap_init_mem(dev_ofnode(dev), &plat->map);\n+ \tif (ret)\n+ \t\tprintf(\"%s: regmap failed %d\\n\", __func__, ret);\n+@@ -3051,18 +3070,20 @@ static int conv_of_platdata(struct udevice *dev)\n+ #endif\n+ \n+ static const struct sdram_rk3399_ops rk3399_ops = {\n+-#if !defined(CONFIG_RAM_RK3399_LPDDR4)\n+ \t.data_training_first = data_training_first,\n+ \t.set_rate_index = switch_to_phy_index1,\n+ \t.modify_param = modify_param,\n+ \t.get_phy_index_params = get_phy_index_params,\n+-#else\n++};\n++\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++static const struct sdram_rk3399_ops lpddr4_ops = {\n+ \t.data_training_first = lpddr4_mr_detect,\n+ \t.set_rate_index = lpddr4_set_rate,\n+ \t.modify_param = lpddr4_modify_param,\n+ \t.get_phy_index_params = lpddr4_get_phy_index_params,\n+-#endif\n+ };\n++#endif\n+ \n+ static int rk3399_dmc_init(struct udevice *dev)\n+ {\n+@@ -3081,7 +3102,17 @@ static int rk3399_dmc_init(struct udevice *dev)\n+ \t\treturn ret;\n+ #endif\n+ \n+-\tpriv->ops = &rk3399_ops;\n++\tif (params->base.dramtype == LPDDR4) {\n++#if defined(CONFIG_RAM_RK3399_LPDDR4)\n++\t\tpriv->ops = &lpddr4_ops;\n++#else\n++\t\tprintf(\"LPDDR4 support is disable\\n\");\n++\t\treturn -EINVAL;\n++#endif\n++\t} else {\n++\t\tpriv->ops = &rk3399_ops;\n++\t}\n++\n+ \tpriv->cic = syscon_get_first_range(ROCKCHIP_SYSCON_CIC);\n+ \tpriv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);\n+ \tpriv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);\ndiff --git a/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 000000000000..74c7c3f4a5bd\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/202-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,313 @@\n+From 8dc76bbce30c3f63f290f008f8410c00fee13c9a Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 05:55:50 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm/dts/Makefile                      |   1 +\n+ arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi |   9 ++\n+ arch/arm/dts/rk3399-nanopi-r4s.dts         | 178 +++++++++++++++++++++\n+ board/friendlyarm/nanopi4/MAINTAINERS      |   6 +\n+ configs/nanopi-r4s-rk3399_defconfig        |  63 ++++++++\n+ 5 files changed, 257 insertions(+)\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+ create mode 100644 arch/arm/dts/rk3399-nanopi-r4s.dts\n+ create mode 100644 configs/nanopi-r4s-rk3399_defconfig\n+\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -132,6 +132,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \\\n+ \trk3399-nanopi-m4.dtb \\\n+ \trk3399-nanopi-m4-2gb.dtb \\\n+ \trk3399-nanopi-neo4.dtb \\\n++\trk3399-nanopi-r4s.dtb \\\n+ \trk3399-orangepi.dtb \\\n+ \trk3399-pinebook-pro.dtb \\\n+ \trk3399-puma-haikou.dtb \\\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+@@ -0,0 +1,9 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * (C) Copyright 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ */\n++\n++#include \"rk3399-nanopi4-u-boot.dtsi\"\n++#include \"rk3399-sdram-lpddr4-100.dtsi\"\n++#include \"rk3399-sdram-lpddr3-samsung-4GB-1866.dtsi\"\n++#include \"rk3399-sdram-ddr3-1866.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\n+--- a/board/friendlyarm/nanopi4/MAINTAINERS\n++++ b/board/friendlyarm/nanopi4/MAINTAINERS\n+@@ -3,3 +3,9 @@ M:      FriendlyElec <support@friendlyarm.com>\n+ S:      Maintained\n+ F:      board/friendlyarm/nanopi4/\n+ F:      include/configs/nanopi4.h\n++\n++NANOPI-R4S\n++M:      Tianling Shen <cnsztl@gmail.com>\n++S:      Maintained\n++F:      configs/nanopi-r4s-rk3399_defconfig\n++F:      arch/arm/dts/rk3399-nanopi-r4s-u-boot.dtsi\n+--- /dev/null\n++++ b/configs/nanopi-r4s-rk3399_defconfig\n+@@ -0,0 +1,63 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3399=y\n++CONFIG_TARGET_NANOPI4_RK3399=y\n++CONFIG_DEBUG_UART_BASE=0xFF1A0000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3399-nanopi-r4s\"\n++CONFIG_DEBUG_UART=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3399-nanopi-r4s.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000\n++CONFIG_TPL=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_OF_SPL_REMOVE_PROPS=\"pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_SYS_MMC_ENV_DEV=1\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_MMC_SDHCI=y\n++CONFIG_MMC_SDHCI_ROCKCHIP=y\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM_RK3399_LPDDR4=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_KEYBOARD=y\n++CONFIG_USB_HOST_ETHER=y\n++CONFIG_USB_ETHER_ASIX=y\n++CONFIG_USB_ETHER_ASIX88179=y\n++CONFIG_USB_ETHER_MCS7830=y\n++CONFIG_USB_ETHER_RTL8152=y\n++CONFIG_USB_ETHER_SMSC95XX=y\n++CONFIG_DM_VIDEO=y\n++CONFIG_DISPLAY=y\n++CONFIG_VIDEO_ROCKCHIP=y\n++CONFIG_DISPLAY_ROCKCHIP_HDMI=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\n"
  },
  {
    "path": "not_use_file/0005-target-5.10-r4s-support.patch",
    "content": "diff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex bcc0cc3f8f..4996b434f0 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk\n \n BOARD:=rockchip\n BOARDNAME:=Rockchip\n-FEATURES:=ext4 audio usb usbgadget display gpio fpu rootfs-part boot-part squashfs\n+FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n KERNEL_PATCHVER=5.4\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex bba3e2aa56..77655d426a 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -9,7 +9,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+friendlyarm,nanopi-r4s)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 48133c81a1..d8acaabe27 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -8,7 +8,8 @@ rockchip_setup_interfaces()\n \tlocal board=\"$1\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -17,9 +18,9 @@ rockchip_setup_interfaces()\n \tesac\n }\n \n-nanopi_r2s_generate_mac()\n+nanopi_generate_mac()\n {\n-\tlocal sd_hash=$(sha256sum /sys/devices/platform/ff500000.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n+\tlocal sd_hash=$(sha256sum /sys/devices/platform/*.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n \tlocal mac_base=$(macaddr_canonicalize \"$(echo \"${sd_hash}\" | dd bs=1 count=12 2>/dev/null)\")\n \techo \"$(macaddr_unsetbit_mc \"$(macaddr_setbit_la \"${mac_base}\")\")\"\n }\n@@ -32,8 +33,9 @@ rockchip_setup_macs()\n \tlocal label_mac=\"\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n-\t\twan_mac=$(nanopi_r2s_generate_mac)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n+\t\twan_mac=$(nanopi_generate_mac)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n \t\t;;\n \tesac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 44716258bf..9e4a4cf4fc 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -26,5 +26,9 @@ friendlyarm,nanopi-r2s)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tset_interface_core 10 \"eth0\"\n+\tset_interface_core 20 \"eth1\"\n+\t;;\n esac\n \ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex 24b1c38137..b1ff32dadb 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -12,6 +12,16 @@ define Device/friendlyarm_nanopi-r2s\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\n \n+define Device/friendlyarm_nanopi-r4s\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi R4S\n+  SOC := rk3399\n+  UBOOT_DEVICE_NAME := nanopi-r4s-rk3399\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-r8169 -urngd\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-r4s\n+\n define Device/pine64_rockpro64\n   DEVICE_VENDOR := Pine64\n   DEVICE_MODEL := RockPro64\ndiff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript\nnew file mode 100644\nindex 0000000000..abe9c24ee3\n--- /dev/null\n+++ b/target/linux/rockchip/image/nanopi-r4s.bootscript\n@@ -0,0 +1,8 @@\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\n"
  },
  {
    "path": "not_use_file/0005-target-add-r4s-support.patch",
    "content": "From 8c841a734925e412a343d6ddf21bc22b2c850c5a Mon Sep 17 00:00:00 2001\nFrom: Tianling Shen <cnsztl@gmail.com>\nDate: Fri, 25 Dec 2020 20:03:14 +0800\nSubject: [PATCH] rockchip: add NanoPi R4S support\n \tmodified:   target/linux/rockchip/Makefile\n  \tmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n   \tmodified:   target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n   \tmodified:   target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity \n   \tmodified:   target/linux/rockchip/image/armv8.mk \t\n   \tnew file:   target/linux/rockchip/image/nanopi-r4s.bootscript \t\n   \tnew file:   target/linux/rockchip/patches-5.4/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n\nHardware\n--------\nRockChip RK3399 ARM64 (6 cores)\n1GB DDR3 or 4GB LPDDR4 RAM\n2x 1000 Base-T\n3 LEDs (LAN / WAN / SYS)\n1 Button (Reset)\nMicro-SD slot\n2x USB 3.0 Port\n\nInstallation\n------------\nUncompress the OpenWrt sysupgrade and write it to a micro SD card using\ndd.\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\nCo-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\nSigned-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\nCo-authored-by: Marty Jones <mj8263788@gmail.com>\nSigned-off-by: Marty Jones <mj8263788@gmail.com>\n\n---\n target/linux/rockchip/Makefile                |   2 +-\n .../armv8/base-files/etc/board.d/01_leds      |   3 +-\n .../armv8/base-files/etc/board.d/02_network   |  12 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   4 +\n target/linux/rockchip/image/armv8.mk          |  10 +\n .../rockchip/image/nanopi-r4s.bootscript      |   8 +\n ...Add-support-for-FriendlyARM-NanoPi-R.patch | 225 ++++++++++++++++++\n 7 files changed, 257 insertions(+), 7 deletions(-)\n create mode 100644 target/linux/rockchip/image/nanopi-r4s.bootscript\n create mode 100644 target/linux/rockchip/patches-5.4/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n\ndiff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex bcc0cc3f8f..4996b434f0 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk\n \n BOARD:=rockchip\n BOARDNAME:=Rockchip\n-FEATURES:=ext4 audio usb usbgadget display gpio fpu rootfs-part boot-part squashfs\n+FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n KERNEL_PATCHVER=5.4\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex bba3e2aa56..77655d426a 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -9,7 +9,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+friendlyarm,nanopi-r4s)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 48133c81a1..d8acaabe27 100755\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -8,7 +8,8 @@ rockchip_setup_interfaces()\n \tlocal board=\"$1\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -17,9 +18,9 @@ rockchip_setup_interfaces()\n \tesac\n }\n \n-nanopi_r2s_generate_mac()\n+nanopi_generate_mac()\n {\n-\tlocal sd_hash=$(sha256sum /sys/devices/platform/ff500000.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n+\tlocal sd_hash=$(sha256sum /sys/devices/platform/*.dwmmc/mmc_host/mmc0/mmc0:*/cid)\n \tlocal mac_base=$(macaddr_canonicalize \"$(echo \"${sd_hash}\" | dd bs=1 count=12 2>/dev/null)\")\n \techo \"$(macaddr_unsetbit_mc \"$(macaddr_setbit_la \"${mac_base}\")\")\"\n }\n@@ -32,8 +33,9 @@ rockchip_setup_macs()\n \tlocal label_mac=\"\"\n \n \tcase \"$board\" in\n-\tfriendlyarm,nanopi-r2s)\n-\t\twan_mac=$(nanopi_r2s_generate_mac)\n+\tfriendlyarm,nanopi-r2s|\\\n+\tfriendlyarm,nanopi-r4s)\n+\t\twan_mac=$(nanopi_generate_mac)\n \t\tlan_mac=$(macaddr_add \"$wan_mac\" +1)\n \t\t;;\n \tesac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 44716258bf..9e4a4cf4fc 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -26,5 +26,9 @@ friendlyarm,nanopi-r2s)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\n+friendlyarm,nanopi-r4s)\n+\tset_interface_core 10 \"eth0\"\n+\tset_interface_core 20 \"eth1\"\n+\t;;\n esac\n \ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex 24b1c38137..b1ff32dadb 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -12,6 +12,16 @@ define Device/friendlyarm_nanopi-r2s\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\n \n+define Device/friendlyarm_nanopi-r4s\n+  DEVICE_VENDOR := FriendlyARM\n+  DEVICE_MODEL := NanoPi R4S\n+  SOC := rk3399\n+  UBOOT_DEVICE_NAME := nanopi-r4s-rk3399\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r4s | pine64-img | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-r8168\n+endef\n+TARGET_DEVICES += friendlyarm_nanopi-r4s\n+\n define Device/pine64_rockpro64\n   DEVICE_VENDOR := Pine64\n   DEVICE_MODEL := RockPro64\ndiff --git a/target/linux/rockchip/image/nanopi-r4s.bootscript b/target/linux/rockchip/image/nanopi-r4s.bootscript\nnew file mode 100644\nindex 0000000000..abe9c24ee3\n--- /dev/null\n+++ b/target/linux/rockchip/image/nanopi-r4s.bootscript\n@@ -0,0 +1,8 @@\n+part uuid mmc ${devnum}:2 uuid\n+\n+setenv bootargs \"console=ttyS2,1500000 earlycon=uart8250,mmio32,0xff1a0000 root=PARTUUID=${uuid} rw rootwait\"\n+\n+load mmc ${devnum}:1 ${fdt_addr_r} rockchip.dtb\n+load mmc ${devnum}:1 ${kernel_addr_r} kernel.img\n+\n+booti ${kernel_addr_r} - ${fdt_addr_r}\ndiff --git a/target/linux/rockchip/patches-5.4/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.4/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..8bc8024c8d\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,225 @@\n+From 11c2b38cf0a04b0edb3eabae24fb1484489725e2 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 07:12:30 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 178 ++++++++++++++++++\n+ 2 files changed, 179 insertions(+)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -25,6 +25,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-leez-p710.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,185 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0,0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\n++\t\tpcie-eth@1,0 {\n++\t\t\tcompatible = \"realtek,rtl8168\";\n++\t\t\treg = <0x00010000 0 0 0 0>;\n++\n++\t\t\trealtek,led-data = <0x870>;\n++\t\t};\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\n-- \n2.28.0\n\n"
  },
  {
    "path": "not_use_file/0006-config54.patch",
    "content": "diff --git a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4\nindex bea1dbc741..479cc53d0e 100644\n--- a/target/linux/rockchip/armv8/config-5.4\n+++ b/target/linux/rockchip/armv8/config-5.4\n@@ -9,6 +9,7 @@ CONFIG_ARCH_ROCKCHIP=y\n CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y\n CONFIG_ARC_EMAC_CORE=y\n CONFIG_ARM64_CNP=y\n+CONFIG_ARM64_CRYPTO=y\n # CONFIG_ARM64_ERRATUM_1165522 is not set\n # CONFIG_ARM64_ERRATUM_1286807 is not set\n # CONFIG_ARM64_ERRATUM_1418040 is not set\n@@ -115,9 +116,138 @@ CONFIG_CRC16=y\n CONFIG_CRC32_SLICEBY8=y\n CONFIG_CRC_T10DIF=y\n CONFIG_CROSS_MEMORY_ATTACH=y\n+CONFIG_CRYPTO_842=y\n+CONFIG_CRYPTO_ACOMP2=y\n+CONFIG_CRYPTO_ADIANTUM=y\n+CONFIG_CRYPTO_AEGIS128=y\n+CONFIG_CRYPTO_AEGIS128_SIMD=y\n+CONFIG_CRYPTO_AES_ARM64=y\n+CONFIG_CRYPTO_AES_ARM64_BS=y\n+CONFIG_CRYPTO_AES_ARM64_CE=y\n+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y\n+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y\n+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\n+CONFIG_CRYPTO_AES_TI=y\n+CONFIG_CRYPTO_AKCIPHER=y\n+CONFIG_CRYPTO_AKCIPHER2=y\n+CONFIG_CRYPTO_ANSI_CPRNG=y\n+CONFIG_CRYPTO_ANUBIS=y\n+CONFIG_CRYPTO_ARC4=y\n+CONFIG_CRYPTO_AUTHENC=y\n+CONFIG_CRYPTO_BLOWFISH=y\n+CONFIG_CRYPTO_BLOWFISH_COMMON=y\n+CONFIG_CRYPTO_CAMELLIA=y\n+CONFIG_CRYPTO_CAST5=y\n+CONFIG_CRYPTO_CAST6=y\n+CONFIG_CRYPTO_CAST_COMMON=y\n+CONFIG_CRYPTO_CBC=y\n+CONFIG_CRYPTO_CCM=y\n+CONFIG_CRYPTO_CFB=y\n+CONFIG_CRYPTO_CHACHA20=y\n+CONFIG_CRYPTO_CHACHA20POLY1305=y\n+CONFIG_CRYPTO_CHACHA20_NEON=y\n+CONFIG_CRYPTO_CMAC=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n-# CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y\n+CONFIG_CRYPTO_CRYPTD=y\n+CONFIG_CRYPTO_CTR=y\n+CONFIG_CRYPTO_CTS=y\n+CONFIG_CRYPTO_DEFLATE=y\n+CONFIG_CRYPTO_DES=y\n+CONFIG_CRYPTO_DEV_CCP=y\n+CONFIG_CRYPTO_DEV_CCP_DD=y\n+CONFIG_CRYPTO_DEV_CCREE=y\n+CONFIG_CRYPTO_DEV_HISI_SEC=y\n+CONFIG_CRYPTO_DEV_ROCKCHIP=y\n+CONFIG_CRYPTO_DEV_SAFEXCEL=y\n+CONFIG_CRYPTO_DEV_SP_CCP=y\n+CONFIG_CRYPTO_DH=y\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_CTR=y\n+CONFIG_CRYPTO_DRBG_HASH=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_ECB=y\n+CONFIG_CRYPTO_ECC=y\n+CONFIG_CRYPTO_ECDH=y\n+CONFIG_CRYPTO_ECHAINIV=y\n+CONFIG_CRYPTO_ECRDSA=y\n+CONFIG_CRYPTO_ESSIV=y\n+CONFIG_CRYPTO_FCRYPT=y\n+CONFIG_CRYPTO_GCM=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_GHASH=y\n+CONFIG_CRYPTO_GHASH_ARM64_CE=y\n+CONFIG_CRYPTO_HASH_INFO=y\n+CONFIG_CRYPTO_HMAC=y\n+CONFIG_CRYPTO_HW=y\n+CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_KEYWRAP=y\n+CONFIG_CRYPTO_KHAZAD=y\n+CONFIG_CRYPTO_KPP=y\n+CONFIG_CRYPTO_KPP2=y\n+CONFIG_CRYPTO_LIB_DES=y\n+CONFIG_CRYPTO_LIB_SHA256=y\n+CONFIG_CRYPTO_LRW=y\n+CONFIG_CRYPTO_LZ4=y\n+CONFIG_CRYPTO_LZ4HC=y\n+CONFIG_CRYPTO_LZO=y\n+CONFIG_CRYPTO_MD4=y\n+CONFIG_CRYPTO_MD5=y\n+CONFIG_CRYPTO_MICHAEL_MIC=y\n+CONFIG_CRYPTO_NHPOLY1305=y\n+CONFIG_CRYPTO_NHPOLY1305_NEON=y\n+CONFIG_CRYPTO_NULL=y\n+CONFIG_CRYPTO_OFB=y\n+CONFIG_CRYPTO_PCBC=y\n+CONFIG_CRYPTO_POLY1305=y\n+CONFIG_CRYPTO_RMD128=y\n+CONFIG_CRYPTO_RMD160=y\n+CONFIG_CRYPTO_RMD256=y\n+CONFIG_CRYPTO_RMD320=y\n+CONFIG_CRYPTO_RNG=y\n+CONFIG_CRYPTO_RNG2=y\n+CONFIG_CRYPTO_RNG_DEFAULT=y\n+CONFIG_CRYPTO_RSA=y\n+CONFIG_CRYPTO_SALSA20=y\n+CONFIG_CRYPTO_SEED=y\n+CONFIG_CRYPTO_SEQIV=y\n+CONFIG_CRYPTO_SERPENT=y\n+CONFIG_CRYPTO_SHA1=y\n+CONFIG_CRYPTO_SHA1_ARM64_CE=y\n+CONFIG_CRYPTO_SHA256=y\n+CONFIG_CRYPTO_SHA256_ARM64=y\n+CONFIG_CRYPTO_SHA2_ARM64_CE=y\n+CONFIG_CRYPTO_SHA3=y\n+CONFIG_CRYPTO_SHA3_ARM64=y\n+CONFIG_CRYPTO_SHA512=y\n+CONFIG_CRYPTO_SHA512_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64_CE=y\n+CONFIG_CRYPTO_SIMD=y\n+CONFIG_CRYPTO_SM3=y\n+CONFIG_CRYPTO_SM3_ARM64_CE=y\n+CONFIG_CRYPTO_SM4=y\n+CONFIG_CRYPTO_SM4_ARM64_CE=y\n+CONFIG_CRYPTO_STATS=y\n+CONFIG_CRYPTO_STREEBOG=y\n+CONFIG_CRYPTO_TEA=y\n+CONFIG_CRYPTO_TEST=m\n+CONFIG_CRYPTO_TGR192=y\n+CONFIG_CRYPTO_TWOFISH=y\n+CONFIG_CRYPTO_TWOFISH_COMMON=y\n+CONFIG_CRYPTO_USER=y\n+CONFIG_CRYPTO_USER_API=y\n+CONFIG_CRYPTO_USER_API_AEAD=y\n+CONFIG_CRYPTO_USER_API_HASH=y\n+CONFIG_CRYPTO_USER_API_RNG=y\n+CONFIG_CRYPTO_USER_API_SKCIPHER=y\n+CONFIG_CRYPTO_VMAC=y\n+CONFIG_CRYPTO_WP512=y\n+CONFIG_CRYPTO_XCBC=y\n+CONFIG_CRYPTO_XTS=y\n+CONFIG_CRYPTO_XXHASH=y\n+CONFIG_CRYPTO_ZSTD=y\n CONFIG_DEBUG_BUGVERBOSE=y\n # CONFIG_DEVFREQ_GOV_PASSIVE is not set\n CONFIG_DEVFREQ_GOV_PERFORMANCE=y\n@@ -184,6 +314,7 @@ CONFIG_HUGETLB_PAGE=y\n CONFIG_HWMON=y\n CONFIG_HWSPINLOCK=y\n CONFIG_HW_CONSOLE=y\n+CONFIG_HW_RANDOM_ROCKCHIP=y\n # CONFIG_HZ_PERIODIC is not set\n CONFIG_I2C=y\n CONFIG_I2C_ALGOBIT=y\n"
  },
  {
    "path": "not_use_file/0006-target-5.10-rockchip-support.patch",
    "content": "diff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex d7755ba3f5..ebb5ed3a3a 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -165,6 +165,10 @@ CONFIG_CRYPTO_AEAD2=y\n CONFIG_CRYPTO_CRC32=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+# CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n CONFIG_CRYPTO_HASH=y\n CONFIG_CRYPTO_HASH2=y\n CONFIG_CRYPTO_JITTERENTROPY=y\ndiff --git a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nnew file mode 100644\nindex 0000000000..897a42fea2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -134,6 +134,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/105-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\nnew file mode 100644\nindex 0000000000..69c880db9f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/200-rockchip-rk3399-Add-support-for-FriendlyARM-NanoPi-R.patch\n@@ -0,0 +1,218 @@\n+From 11c2b38cf0a04b0edb3eabae24fb1484489725e2 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Fri, 8 Jan 2021 07:12:30 +0000\n+Subject: [PATCH] rockchip: rk3399: Add support for FriendlyARM NanoPi R4S\n+\n+This adds support for the NanoPi R4S from FriendlyArm.\n+\n+Rockchip RK3399 SoC\n+1GB DDR3 or 4GB LPDDR4 RAM\n+Gigabit Ethernet (WAN)\n+Gigabit Ethernet (PCIe) (LAN)\n+USB 3.0 Host Port x 2\n+MicroSD slot\n+Reset button\n+WAN - LAN - SYS LED\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Signed-off-by: Jensen Huang <jensenhuang@friendlyarm.com>\n+Co-authored-by: Marty Jones <mj8263788@gmail.com>\n+Signed-off-by: Marty Jones <mj8263788@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +\n+ .../boot/dts/rockchip/rk3399-nanopi-r4s.dts   | 178 ++++++++++++++++++\n+ 2 files changed, 179 insertions(+)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -30,6 +30,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-le\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopc-t4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -0,0 +1,178 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2020 Jensen Huang <jensenhuang@friendlyarm.com>\n++ * Copyright (c) 2020 Marty Jones <mj8263788@gmail.com>\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ */\n++\n++/dts-v1/;\n++#include \"rk3399-nanopi4.dtsi\"\n++\n++/ {\n++\tmodel = \"FriendlyElec NanoPi R4S\";\n++\tcompatible = \"friendlyarm,nanopi-r4s\", \"rockchip,rk3399\";\n++\n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tcompatible = \"gpio-leds\";\n++\t\tpinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;\n++\t\tpinctrl-names = \"default\";\n++\n++\t\tlan_led: led-0 {\n++\t\t\tgpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:lan\";\n++\t\t};\n++\n++\t\tsys_led: led-1 {\n++\t\t\tgpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:red:sys\";\n++\t\t};\n++\n++\t\twan_led: led-2 {\n++\t\t\tgpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;\n++\t\t\tlabel = \"nanopi-r4s:green:wan\";\n++\t\t};\n++\t};\n++\n++\t/delete-node/ gpio-keys;\n++\tgpio-keys {\n++\t\tcompatible = \"gpio-keys\";\n++\t\tpinctrl-names = \"default\";\n++\t\tpinctrl-0 = <&reset_button_pin>;\n++\n++\t\treset {\n++\t\t\tdebounce-interval = <50>;\n++\t\t\tgpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;\n++\t\t\tlabel = \"reset\";\n++\t\t\tlinux,code = <KEY_RESTART>;\n++\t\t};\n++\t};\n++\n++\tvdd_5v: vdd-5v {\n++\t\tcompatible = \"regulator-fixed\";\n++\t\tregulator-name = \"vdd_5v\";\n++\t\tregulator-always-on;\n++\t\tregulator-boot-on;\n++\t};\n++\n++\tfan: pwm-fan {\n++\t\tcompatible = \"pwm-fan\";\n++\t\t/*\n++\t\t * With 20KHz PWM and an EVERCOOL EC4007H12SA fan, these levels\n++\t\t * work out to 0, ~1200, ~3000, and 5000RPM respectively.\n++\t\t */\n++\t\tcooling-levels = <0 12 18 255>;\n++\t\t#cooling-cells = <2>;\n++\t\tfan-supply = <&vdd_5v>;\n++\t\tpwms = <&pwm1 0 50000 0>;\n++\t};\n++};\n++\n++&cpu_thermal {\n++\ttrips {\n++\t\tcpu_warm: cpu_warm {\n++\t\t\ttemperature = <55000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\n++\t\tcpu_hot: cpu_hot {\n++\t\t\ttemperature = <65000>;\n++\t\t\thysteresis = <2000>;\n++\t\t\ttype = \"active\";\n++\t\t};\n++\t};\n++\n++\tcooling-maps {\n++\t\tmap2 {\n++\t\t\ttrip = <&cpu_warm>;\n++\t\t\tcooling-device = <&fan THERMAL_NO_LIMIT 1>;\n++\t\t};\n++\n++\t\tmap3 {\n++\t\t\ttrip = <&cpu_hot>;\n++\t\t\tcooling-device = <&fan 2 THERMAL_NO_LIMIT>;\n++\t\t};\n++\t};\n++};\n++\n++&emmc_phy {\n++\tstatus = \"disabled\";\n++};\n++\n++&fusb0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&pcie0 {\n++\tmax-link-speed = <1>;\n++\tnum-lanes = <1>;\n++\tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\t};\n++};\n++\n++&pinctrl {\n++\t/delete-node/ gpio-leds;\n++\tgpio-leds {\n++\t\tlan_led_pin: lan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\tsys_led_pin: sys-led-pin {\n++\t\t\trockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\n++\t\twan_led_pin: wan-led-pin {\n++\t\t\trockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;\n++\t\t};\n++\t};\n++\n++\t/delete-node/ rockchip-key;\n++\trockchip-key {\n++\t\treset_button_pin: reset-button-pin {\n++\t\t\trockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;\n++\t\t};\n++\t};\n++};\n++\n++&sdhci {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdio0 {\n++\tstatus = \"disabled\";\n++};\n++\n++&sdmmc {\n++\tsd-uhs-sdr12;\n++\tsd-uhs-sdr25;\n++\tsd-uhs-sdr50;\n++};\n++\n++&u2phy0_host {\n++\tphy-supply = <&vdd_5v>;\n++};\n++\n++&u2phy1_host {\n++\tstatus = \"disabled\";\n++};\n++\n++&usbdrd_dwc3_0 {\n++\tdr_mode = \"host\";\n++};\n++\n++&vcc3v3_sys {\n++\tvin-supply = <&vcc5v0_sys>;\n++};\ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..28798047fd\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -165,6 +165,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..16ca6279e7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -398,6 +398,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..1de560e33f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -297,6 +297,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1906,6 +1906,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff --git a/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..f589ce2a7b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -192,13 +192,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..c85da5fb07\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tamba: bus {\ndiff --git a/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..9d393c5771\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,186 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,156 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1150000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++ \t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1300000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \tchosen {\n"
  },
  {
    "path": "not_use_file/0009-rockchip-add-support-for-OrangePi-R1-Plus.patch-old",
    "content": "From dff6e56482e3e4af56f344e4ffe851ffe619852f Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 11 Jun 2021 05:20:38 +0800\nSubject: [PATCH] rockchip:add support for OrangePi R1 Plus\n\n---\n package/boot/uboot-rockchip/Makefile          |  15 +-\n ...328-Add-support-for-Orangepi-R1-Plus.patch | 172 ++++++++++++++++++\n .../orangepi-r1-plus-rk3328/dt-plat.c         | 127 +++++++++++++\n .../orangepi-r1-plus-rk3328/dt-structs-gen.h  |  51 ++++++\n .../armv8/base-files/etc/board.d/01_leds      |   3 +-\n .../armv8/base-files/etc/board.d/02_network   |   7 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   3 +-\n target/linux/rockchip/image/armv8.mk          |  10 +\n ...328-Add-support-for-OrangePi-R1-Plus.patch |  52 ++++++\n ...328-Add-support-for-OrangePi-R1-Plus.patch |  52 ++++++\n 10 files changed, 488 insertions(+), 4 deletions(-)\n create mode 100644 package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\n create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\n create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\n create mode 100644 target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n create mode 100644 target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex da9af4f3f0..db1161718d 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -36,6 +36,18 @@ define U-Boot/nanopi-r2s-rk3328\n   OF_PLATDATA:=$(1)\n endef\n \n+define U-Boot/orangepi-r1-plus-rk3328\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=Orange Pi R1 Plus\n+  BUILD_DEVICES:= \\\n+    xunlong_orangepi-r1-plus\n+  DEPENDS:=+PACKAGE_u-boot-orangepi-r1-plus-rk3328:arm-trusted-firmware-rk3328\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rk3328\n+  ATF:=rk322xh_bl31_v1.46.elf\n+  USE_RKBIN:=1\n+  OF_PLATDATA:=$(1)\n+endef\n+\n \n # RK3399 boards\n \n@@ -73,7 +85,8 @@ UBOOT_TARGETS := \\\n   nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n-  nanopi-r2s-rk3328\n+  nanopi-r2s-rk3328 \\\n+  orangepi-r1-plus-rk3328\n \n UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes\n \ndiff --git a/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..46a3b11594\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\n@@ -0,0 +1,172 @@\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -109,6 +109,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3308) += \\\n+ dtb-$(CONFIG_ROCKCHIP_RK3328) += \\\n+ \trk3328-evb.dtb \\\n+ \trk3328-nanopi-r2s.dtb \\\n++\trk3328-orangepi-r1-plus.dtb \\\n+ \trk3328-roc-cc.dtb \\\n+ \trk3328-rock64.dtb \\\n+ \trk3328-rock-pi-e.dtb\n+--- /dev/null\n++++ b/arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi\n+@@ -0,0 +1,1 @@\n++#include \"rk3328-nanopi-r2s-u-boot.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,38 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 Plus\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\n+--- a/board/rockchip/evb_rk3328/MAINTAINERS\n++++ b/board/rockchip/evb_rk3328/MAINTAINERS\n+@@ -12,6 +12,13 @@ F:      configs/nanopi-r2s-rk3328_defconfig\n+ F:      arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi\n+ F:      arch/arm/dts/rk3328-nanopi-r2s.dts\n+ \n++ORANGEPI-R1-PLUS-RK3328\n++M:      Shenzhen Xunlong Software CO.,Limited <zhao_steven@263.net>\n++S:      Maintained\n++F:      configs/orangepi-r1-plus-rk3328_defconfig\n++F:      arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi\n++F:      arch/arm/dts/rk3328-orangepi-r1-plus.dts\n++\n+ ROC-RK3328-CC\n+ M:      Loic Devulder <ldevulder@suse.com>\n+ M:      Chen-Yu Tsai <wens@csie.org>\n+--- /dev/null\n++++ b/configs/orangepi-r1-plus-rk3328_defconfig\n+@@ -0,0 +1,98 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_SPL_GPIO_SUPPORT=y\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3328=y\n++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y\n++CONFIG_TPL_LIBCOMMON_SUPPORT=y\n++CONFIG_TPL_LIBGENERIC_SUPPORT=y\n++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y\n++CONFIG_SPL_STACK_R_ADDR=0x600000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_DEBUG_UART_BASE=0xFF130000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_SYSINFO=y\n++CONFIG_DEBUG_UART=y\n++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800\n++# CONFIG_ANDROID_BOOT_IMAGE is not set\n++CONFIG_FIT=y\n++CONFIG_FIT_VERBOSE=y\n++CONFIG_SPL_LOAD_FIT=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3328-orangepi-r1-plus.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_DISPLAY_CPUINFO is not set\n++CONFIG_DISPLAY_BOARDINFO_LATE=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_TPL_SYS_MALLOC_SIMPLE=y\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_I2C_SUPPORT=y\n++CONFIG_SPL_POWER_SUPPORT=y\n++CONFIG_SPL_ATF=y\n++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_TPL_OF_CONTROL=y\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3328-orangepi-r1-plus\"\n++CONFIG_OF_SPL_REMOVE_PROPS=\"clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_TPL_OF_PLATDATA=y\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_NET_RANDOM_ETHADDR=y\n++CONFIG_TPL_DM=y\n++CONFIG_REGMAP=y\n++CONFIG_SPL_REGMAP=y\n++CONFIG_TPL_REGMAP=y\n++CONFIG_SYSCON=y\n++CONFIG_SPL_SYSCON=y\n++CONFIG_TPL_SYSCON=y\n++CONFIG_CLK=y\n++CONFIG_SPL_CLK=y\n++CONFIG_FASTBOOT_BUF_ADDR=0x800800\n++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_SF_DEFAULT_SPEED=20000000\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PINCTRL=y\n++CONFIG_SPL_PINCTRL=y\n++CONFIG_DM_PMIC=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_SPL_DM_REGULATOR=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_DM_REGULATOR_FIXED=y\n++CONFIG_SPL_DM_REGULATOR_FIXED=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM=y\n++CONFIG_SPL_RAM=y\n++CONFIG_TPL_RAM=y\n++CONFIG_DM_RESET=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++# CONFIG_TPL_SYSRESET is not set\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_OHCI_HCD=y\n++CONFIG_USB_OHCI_GENERIC=y\n++CONFIG_USB_DWC2=y\n++CONFIG_USB_DWC3=y\n++# CONFIG_USB_DWC3_GADGET is not set\n++CONFIG_USB_GADGET=y\n++CONFIG_USB_GADGET_DWC2_OTG=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_TPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\ndiff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\nnew file mode 100644\nindex 0000000000..e0f2041f72\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\n@@ -0,0 +1,127 @@\n+/*\n+ * DO NOT MODIFY\n+ *\n+ * Declares the U_BOOT_DRIVER() records and platform data.\n+ * This was generated by dtoc from a .dtb (device tree binary) file.\n+ */\n+\n+/* Allow use of U_BOOT_DRVINFO() in this file */\n+#define DT_PLAT_C\n+\n+#include <common.h>\n+#include <dm.h>\n+#include <dt-structs.h>\n+\n+/* Node /clock-controller@ff440000 index 0 */\n+static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = {\n+ .reg      = {0xff440000, 0x1000},\n+ .rockchip_grf   = 0x3a,\n+};\n+U_BOOT_DRVINFO(clock_controller_at_ff440000) = {\n+ .name   = \"rockchip_rk3328_cru\",\n+ .plat = &dtv_clock_controller_at_ff440000,\n+ .plat_size  = sizeof(dtv_clock_controller_at_ff440000),\n+ .parent_idx = -1,\n+};\n+\n+/* Node /dmc index 1 */\n+static struct dtd_rockchip_rk3328_dmc dtv_dmc = {\n+ .reg      = {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000,\n+   0xff720000, 0x1000, 0xff798000, 0x1000},\n+ .rockchip_sdram_params  = {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0,\n+   0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15,\n+   0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0,\n+   0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8,\n+   0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8,\n+   0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104,\n+   0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114,\n+   0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184,\n+   0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240,\n+   0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff,\n+   0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c,\n+   0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79,\n+   0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87,\n+   0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78,\n+   0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77,\n+   0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77,\n+   0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,\n+   0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77,\n+   0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9,\n+   0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,\n+   0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77,\n+   0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78,\n+   0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69,\n+   0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77,\n+   0x77, 0x77, 0x79, 0x9},\n+};\n+U_BOOT_DRVINFO(dmc) = {\n+ .name   = \"rockchip_rk3328_dmc\",\n+ .plat = &dtv_dmc,\n+ .plat_size  = sizeof(dtv_dmc),\n+ .parent_idx = -1,\n+};\n+\n+/* Node /mmc@ff500000 index 2 */\n+static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = {\n+ .bus_width    = 0x4,\n+ .cap_sd_highspeed = true,\n+ .clocks     = {\n+     {0, {317}},\n+     {0, {33}},\n+     {0, {74}},\n+     {0, {78}},},\n+ .disable_wp   = true,\n+ .fifo_depth   = 0x100,\n+ .interrupts   = {0x0, 0xc, 0x4},\n+ .max_frequency    = 0x8f0d180,\n+ .pinctrl_0    = {0x47, 0x48, 0x49, 0x4a},\n+ .pinctrl_names    = \"default\",\n+ .reg      = {0xff500000, 0x4000},\n+ .sd_uhs_sdr104    = true,\n+ .sd_uhs_sdr12   = true,\n+ .sd_uhs_sdr25   = true,\n+ .sd_uhs_sdr50   = true,\n+ .u_boot_spl_fifo_mode = true,\n+ .vmmc_supply    = 0x4b,\n+ .vqmmc_supply   = 0x1e,\n+};\n+U_BOOT_DRVINFO(mmc_at_ff500000) = {\n+ .name   = \"rockchip_rk3288_dw_mshc\",\n+ .plat = &dtv_mmc_at_ff500000,\n+ .plat_size  = sizeof(dtv_mmc_at_ff500000),\n+ .parent_idx = -1,\n+};\n+\n+/* Node /serial@ff130000 index 3 */\n+static struct dtd_ns16550_serial dtv_serial_at_ff130000 = {\n+ .clock_frequency  = 0x16e3600,\n+ .clocks     = {\n+     {0, {40}},\n+     {0, {212}},},\n+ .dma_names    = {\"tx\", \"rx\"},\n+ .dmas     = {0x10, 0x6, 0x10, 0x7},\n+ .interrupts   = {0x0, 0x39, 0x4},\n+ .pinctrl_0    = 0x26,\n+ .pinctrl_names    = \"default\",\n+ .reg      = {0xff130000, 0x100},\n+ .reg_io_width   = 0x4,\n+ .reg_shift    = 0x2,\n+};\n+U_BOOT_DRVINFO(serial_at_ff130000) = {\n+ .name   = \"ns16550_serial\",\n+ .plat = &dtv_serial_at_ff130000,\n+ .plat_size  = sizeof(dtv_serial_at_ff130000),\n+ .parent_idx = -1,\n+};\n+\n+/* Node /syscon@ff100000 index 4 */\n+static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = {\n+ .reg      = {0xff100000, 0x1000},\n+};\n+U_BOOT_DRVINFO(syscon_at_ff100000) = {\n+ .name   = \"rockchip_rk3328_grf\",\n+ .plat = &dtv_syscon_at_ff100000,\n+ .plat_size  = sizeof(dtv_syscon_at_ff100000),\n+ .parent_idx = -1,\n+};\n+\ndiff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\nnew file mode 100644\nindex 0000000000..b5590c2a5b\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\n@@ -0,0 +1,51 @@\n+/*\n+ * DO NOT MODIFY\n+ *\n+ * Defines the structs used to hold devicetree data.\n+ * This was generated by dtoc from a .dtb (device tree binary) file.\n+ */\n+\n+#include <stdbool.h>\n+#include <linux/libfdt.h>\n+struct dtd_ns16550_serial {\n+ fdt32_t   clock_frequency;\n+ struct phandle_1_arg clocks[2];\n+ const char *  dma_names[2];\n+ fdt32_t   dmas[4];\n+ fdt32_t   interrupts[3];\n+ fdt32_t   pinctrl_0;\n+ const char *  pinctrl_names;\n+ fdt64_t   reg[2];\n+ fdt32_t   reg_io_width;\n+ fdt32_t   reg_shift;\n+};\n+struct dtd_rockchip_rk3288_dw_mshc {\n+ fdt32_t   bus_width;\n+ bool    cap_sd_highspeed;\n+ struct phandle_1_arg clocks[4];\n+ bool    disable_wp;\n+ fdt32_t   fifo_depth;\n+ fdt32_t   interrupts[3];\n+ fdt32_t   max_frequency;\n+ fdt32_t   pinctrl_0[4];\n+ const char *  pinctrl_names;\n+ fdt64_t   reg[2];\n+ bool    sd_uhs_sdr104;\n+ bool    sd_uhs_sdr12;\n+ bool    sd_uhs_sdr25;\n+ bool    sd_uhs_sdr50;\n+ bool    u_boot_spl_fifo_mode;\n+ fdt32_t   vmmc_supply;\n+ fdt32_t   vqmmc_supply;\n+};\n+struct dtd_rockchip_rk3328_cru {\n+ fdt64_t   reg[2];\n+ fdt32_t   rockchip_grf;\n+};\n+struct dtd_rockchip_rk3328_dmc {\n+ fdt64_t   reg[12];\n+ fdt32_t   rockchip_sdram_params[196];\n+};\n+struct dtd_rockchip_rk3328_grf {\n+ fdt64_t   reg[2];\n+};\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex b10c43ba60..53ae6d023a 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -8,7 +8,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+xunlong,orangepi-r1-plus)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 91bdb760d5..543de54a67 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -8,7 +8,8 @@ rockchip_setup_interfaces()\n \n \tcase \"$board\" in\n \tfriendlyarm,nanopi-r2s|\\\n-\tfriendlyarm,nanopi-r4s)\n+\tfriendlyarm,nanopi-r4s|\\\n+\txunlong,orangepi-r1-plus)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -40,6 +41,10 @@ rockchip_setup_macs()\n \t\twan_mac=$(get_mac_binary \"/sys/bus/i2c/devices/2-0051/eeprom\" 0xfa)\n \t\tlan_mac=$(macaddr_setbit_la \"$wan_mac\")\n \t\t;;\n+\txunlong,orangepi-r1-plus)\n+\t\tlan_mac=$(cat /sys/class/net/eth1/address)\n+\t\twan_mac=$(macaddr_add \"$lan_mac\" -1)\n+\t\t;;\n \tesac\n \n \t[ -n \"$lan_mac\" ] && ucidef_set_interface_macaddr \"lan\" $lan_mac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 9e4a4cf4fc..d8e513f560 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -22,7 +22,8 @@ set_interface_core() {\n }\n \n case \"$(board_name)\" in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+xunlong,orangepi-r1-plus)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex e255970f28..1934b8d7d2 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -41,3 +41,13 @@ define Device/radxa_rock-pi-4\n   IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata\n endef\n TARGET_DEVICES += radxa_rock-pi-4\n+\n+define Device/xunlong_orangepi-r1-plus\n+  DEVICE_VENDOR := Xunlong\n+  DEVICE_MODEL := Orange Pi R1 Plus\n+  SOC := rk3328\n+  UBOOT_DEVICE_NAME := orangepi-r1-plus-rk3328\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-bin | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-usb-net-rtl8152\n+endef\n+TARGET_DEVICES += xunlong_orangepi-r1-plus\ndiff --git a/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..981c9692e8\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n@@ -0,0 +1,52 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -7,6 +7,7 @@\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,39 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 Plus\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  max-freq = <48000000>;\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\ndiff --git a/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..af8b555c5e\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n@@ -0,0 +1,52 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -2,6 +2,7 @@\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,39 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 PLUS\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  max-freq = <48000000>;\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0009-rockchip-introduce-vendor-USB3-inno-driver.patch",
    "content": "From dd3e76a173e3070b875b61186d363ba1097035df Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Mon, 8 Mar 2021 18:15:54 +0800\nSubject: [PATCH] rockchip: introduce vendor USB3 inno driver\n\nReference:\n- https://github.com/friendlyarm/kernel-rockchip/commit/e93adaa8e9acfa7de51762616d24c52522f46a13\n\nSigned-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n\n \tmodified:   target/linux/rockchip/armv8/config-5.10 \t\n \tnew file:   target/linux/rockchip/files/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml\n \tnew file:   target/linux/rockchip/files/drivers/phy/rockchip/phy-rockchip-inno-usb3.c\n \tnew file:   target/linux/rockchip/patches-5.10/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\n---\n target/linux/rockchip/armv8/config-5.10       |    1 +\n .../bindings/phy/phy-rockchip-inno-usb3.yaml  |  157 +++\n .../phy/rockchip/phy-rockchip-inno-usb3.c     | 1175 +++++++++++++++++\n ...-add-driver-for-Rockchip-USB-3.0-PHY.patch |   52 +\n 4 files changed, 1385 insertions(+)\n create mode 100644 target/linux/rockchip/files/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml\n create mode 100644 target/linux/rockchip/files/drivers/phy/rockchip/phy-rockchip-inno-usb3.c\n create mode 100644 target/linux/rockchip/patches-5.10/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\n\ndiff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex 54e5cb0145..ff24a4a7ab 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -486,6 +486,7 @@ CONFIG_PHY_ROCKCHIP_EMMC=y\n # CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set\n # CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set\n CONFIG_PHY_ROCKCHIP_INNO_USB2=y\n+CONFIG_PHY_ROCKCHIP_INNO_USB3=y\n CONFIG_PHY_ROCKCHIP_PCIE=y\n CONFIG_PHY_ROCKCHIP_TYPEC=y\n CONFIG_PHY_ROCKCHIP_USB=y\ndiff --git a/target/linux/rockchip/files/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml b/target/linux/rockchip/files/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml\nnew file mode 100644\nindex 0000000000..f4f2862517\n--- /dev/null\n+++ b/target/linux/rockchip/files/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb3.yaml\n@@ -0,0 +1,157 @@\n+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)\n+%YAML 1.2\n+---\n+$id: \"http://devicetree.org/schemas/phy/phy-rockchip-inno-usb3.yaml#\"\n+$schema: \"http://devicetree.org/meta-schemas/core.yaml#\"\n+\n+title: ROCKCHIP USB 3.0 PHY WITH INNO IP BLOCK\n+\n+maintainers:\n+\n+properties:\n+  compatible:\n+    enum:\n+      - rockchip,rk3328-u3phy\n+\n+  reg:\n+    - description: the base address of the USB 3.0 PHY\n+\n+  interrupts:\n+    maxItems: 1\n+\n+  interrupt-names:\n+    items:\n+      - const: linestate\n+        description: host/otg linestate interrupt\n+\n+  clocks:\n+    maxItems: 2\n+\n+  clock-names:\n+    items:\n+      - const: u3phy-otg\n+        description: USB 3.0 PHY UTMI\n+      - const: u3phy-pipe\n+        description: USB 3.0 PHY Pipe\n+\n+  resets:\n+    maxItems: 6\n+\n+  reset-names:\n+    items:\n+      - const: u3phy-u2-por\n+      description: USB 2.0 logic of USB 3.0 PHY\n+      - const: u3phy-u3-por\n+      description: USB 3.0 logic of USB 3.0 PHY\n+      - const: u3phy-pipe-mac\n+      description: USB 3.0 PHY pipe MAC\n+      - const: u3phy-utmi-mac\n+      description: USB 3.0 PHY utmi MAC\n+      - const: u3phy-utmi-apb\n+      description: USB 3.0 PHY utmi apb\n+      - const: u3phy-pipe-apb\n+      description: USB 3.0 PHY pipe apb\n+\n+  \"#phy-cells\":\n+    const: 1\n+\n+  rockchip,u3phygrf:\n+    $ref: /schemas/types.yaml#/definitions/phandle-array\n+    type: array\n+    - description: phandle to the syscon managing the\n+                   \"USB 3.0 PHY general register files\".\n+\n+  vbus-drv-gpios:\n+    $ref: /schemas/types.yaml#/definitions/phandle-array\n+    type: array\n+    - description: phandle for gpio vbus supply\n+\n+required:\n+  - compatible\n+  - reg\n+  - interrupts\n+  - interrupt-names\n+  - clocks\n+  - clock-names\n+  - resets\n+  - reset-names\n+  - \"#phy-cells\"\n+  - rockchip,u3phygrf\n+\n+patternProperties:\n+  \"^u3phy_utmi@[0-9a-f]+$\":\n+    type: object\n+\n+    properties:\n+      - description: USB 2.0 utmi phy.\n+\n+      rockchip,odt-val-tuning:\n+        type: boolean\n+        - description: specify 45ohm ODT tuning value.\n+\n+      \"phy-cells\":\n+        const: 0\n+\n+    required:\n+      - reg\n+      - \"#phy-cells\"\n+\n+patternProperties:\n+  \"^u3phy_pipe@[0-9a-f]+$\":\n+    type: object\n+\n+    properties:\n+      - description: USB 3.0 pipe phy.\n+\n+      rockchip,refclk-25m-quirk :\n+\n+        - description: phy reference clock changed to 25m quirk.\n+\n+      \"phy-cells\":\n+        const: 0\n+\n+    required:\n+      - reg\n+      - \"#phy-cells\"\n+\n+examples:\n+\n+usb3phy_grf: syscon@ff460000 {\n+\tcompatible = \"rockchip,usb3phy-grf\", \"syscon\";\n+\treg = <0x0 0xff460000 0x0 0x1000>;\n+};\n+\n+...\n+\n+u3phy: usb3-phy@ff470000 {\n+\tcompatible = \"rockchip,rk3328-u3phy\";\n+\treg = <0x0 0xff470000 0x0 0x0>;\n+\trockchip,u3phygrf = <&usb3phy_grf>;\n+\tinterrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;\n+\tinterrupt-names = \"linestate\";\n+\tclocks = <&cru PCLK_USB3PHY_OTG>, <&cru PCLK_USB3PHY_PIPE>;\n+\tclock-names = \"u3phy-otg\", \"u3phy-pipe\";\n+\tresets = <&cru SRST_USB3PHY_U2>,\n+\t\t <&cru SRST_USB3PHY_U3>,\n+\t\t <&cru SRST_USB3PHY_PIPE>,\n+\t\t <&cru SRST_USB3OTG_UTMI>,\n+\t\t <&cru SRST_USB3PHY_OTG_P>,\n+\t\t <&cru SRST_USB3PHY_PIPE_P>;\n+\treset-names = \"u3phy-u2-por\", \"u3phy-u3-por\",\n+\t\t      \"u3phy-pipe-mac\", \"u3phy-utmi-mac\",\n+\t\t      \"u3phy-utmi-apb\", \"u3phy-pipe-apb\";\n+\tvbus-drv-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;\n+\t#address-cells = <2>;\n+\t#size-cells = <2>;\n+\tranges;\n+\n+\tu3phy_utmi: utmi@ff470000 {\n+\t\treg = <0x0 0xff470000 0x0 0x8000>;\n+\t\t#phy-cells = <0>;\n+\t};\n+\n+\tu3phy_pipe: pipe@ff478000 {\n+\t\treg = <0x0 0xff478000 0x0 0x8000>;\n+\t\t#phy-cells = <0>;\n+\t};\n+};\ndiff --git a/target/linux/rockchip/files/drivers/phy/rockchip/phy-rockchip-inno-usb3.c b/target/linux/rockchip/files/drivers/phy/rockchip/phy-rockchip-inno-usb3.c\nnew file mode 100644\nindex 0000000000..a84a017e4b\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/phy/rockchip/phy-rockchip-inno-usb3.c\n@@ -0,0 +1,1175 @@\n+/*\n+ * Rockchip USB 3.0 PHY with Innosilicon IP block driver\n+ *\n+ * Copyright (C) 2016 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This program is free software; you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License as published by\n+ * the Free Software Foundation; either version 2 of the License, or\n+ * (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ */\n+\n+#include <linux/clk.h>\n+#include <linux/delay.h>\n+#include <linux/debugfs.h>\n+#include <linux/gpio/consumer.h>\n+#include <linux/interrupt.h>\n+#include <linux/io.h>\n+#include <linux/kernel.h>\n+#include <linux/mfd/syscon.h>\n+#include <linux/module.h>\n+#include <linux/of.h>\n+#include <linux/of_address.h>\n+#include <linux/of_irq.h>\n+#include <linux/of_platform.h>\n+#include <linux/phy/phy.h>\n+#include <linux/platform_device.h>\n+#include <linux/regmap.h>\n+#include <linux/reset.h>\n+#include <linux/usb/phy.h>\n+#include <linux/uaccess.h>\n+\n+#define U3PHY_PORT_NUM\t2\n+#define U3PHY_MAX_CLKS\t4\n+#define BIT_WRITEABLE_SHIFT\t16\n+#define SCHEDULE_DELAY\t(60 * HZ)\n+\n+#define U3PHY_APB_RST\tBIT(0)\n+#define U3PHY_POR_RST\tBIT(1)\n+#define U3PHY_MAC_RST\tBIT(2)\n+\n+struct rockchip_u3phy;\n+struct rockchip_u3phy_port;\n+\n+enum rockchip_u3phy_type {\n+\tU3PHY_TYPE_PIPE,\n+\tU3PHY_TYPE_UTMI,\n+};\n+\n+enum rockchip_u3phy_pipe_pwr {\n+\tPIPE_PWR_P0\t= 0,\n+\tPIPE_PWR_P1\t= 1,\n+\tPIPE_PWR_P2\t= 2,\n+\tPIPE_PWR_P3\t= 3,\n+\tPIPE_PWR_MAX\t= 4,\n+};\n+\n+enum rockchip_u3phy_rest_req {\n+\tU3_POR_RSTN\t= 0,\n+\tU2_POR_RSTN\t= 1,\n+\tPIPE_MAC_RSTN\t= 2,\n+\tUTMI_MAC_RSTN\t= 3,\n+\tPIPE_APB_RSTN\t= 4,\n+\tUTMI_APB_RSTN\t= 5,\n+\tU3PHY_RESET_MAX\t= 6,\n+};\n+\n+enum rockchip_u3phy_utmi_state {\n+\tPHY_UTMI_HS_ONLINE\t= 0,\n+\tPHY_UTMI_DISCONNECT\t= 1,\n+\tPHY_UTMI_CONNECT\t= 2,\n+\tPHY_UTMI_FS_LS_ONLINE\t= 4,\n+};\n+\n+/*\n+ * @rvalue: reset value\n+ * @dvalue: desired value\n+ */\n+struct u3phy_reg {\n+\tunsigned int\toffset;\n+\tunsigned int\tbitend;\n+\tunsigned int\tbitstart;\n+\tunsigned int\trvalue;\n+\tunsigned int\tdvalue;\n+};\n+\n+struct rockchip_u3phy_grfcfg {\n+\tstruct u3phy_reg\tum_suspend;\n+\tstruct u3phy_reg\tls_det_en;\n+\tstruct u3phy_reg\tls_det_st;\n+\tstruct u3phy_reg\tum_ls;\n+\tstruct u3phy_reg\tum_hstdct;\n+\tstruct u3phy_reg\tu2_only_ctrl;\n+\tstruct u3phy_reg\tu3_disable;\n+\tstruct u3phy_reg\tpp_pwr_st;\n+\tstruct u3phy_reg\tpp_pwr_en[PIPE_PWR_MAX];\n+};\n+\n+/**\n+ * struct rockchip_u3phy_apbcfg: usb3-phy apb configuration.\n+ * @u2_pre_emp: usb2-phy pre-emphasis tuning.\n+ * @u2_pre_emp_sth: usb2-phy pre-emphasis strength tuning.\n+ * @u2_odt_tuning: usb2-phy odt 45ohm tuning.\n+ */\n+struct rockchip_u3phy_apbcfg {\n+\tunsigned int\tu2_pre_emp;\n+\tunsigned int\tu2_pre_emp_sth;\n+\tunsigned int\tu2_odt_tuning;\n+};\n+\n+struct rockchip_u3phy_cfg {\n+\tunsigned int reg;\n+\tconst struct rockchip_u3phy_grfcfg grfcfg;\n+\n+\tint (*phy_pipe_power)(struct rockchip_u3phy *,\n+\t\t\t      struct rockchip_u3phy_port *,\n+\t\t\t      bool on);\n+\tint (*phy_tuning)(struct rockchip_u3phy *,\n+\t\t\t  struct rockchip_u3phy_port *,\n+\t\t\t  struct device_node *);\n+\tint (*phy_cp_test)(struct rockchip_u3phy *,\n+\t\t\t   struct rockchip_u3phy_port *);\n+};\n+\n+struct rockchip_u3phy_port {\n+\tstruct phy\t*phy;\n+\tvoid __iomem\t*base;\n+\tunsigned int\tindex;\n+\tunsigned char\ttype;\n+\tbool\t\tsuspended;\n+\tbool\t\trefclk_25m_quirk;\n+\tstruct mutex\tmutex; /* mutex for updating register */\n+\tstruct delayed_work\tum_sm_work;\n+};\n+\n+struct rockchip_u3phy {\n+\tstruct device *dev;\n+\tstruct regmap *u3phy_grf;\n+\tstruct regmap *grf;\n+\tint um_ls_irq;\n+\tstruct clk *clks[U3PHY_MAX_CLKS];\n+\tstruct dentry *root;\n+\tstruct regulator *vbus;\n+\tstruct reset_control *rsts[U3PHY_RESET_MAX];\n+\tstruct rockchip_u3phy_apbcfg apbcfg;\n+\tconst struct rockchip_u3phy_cfg *cfgs;\n+\tstruct rockchip_u3phy_port ports[U3PHY_PORT_NUM];\n+\tstruct usb_phy usb_phy;\n+\tbool vbus_enabled;\n+};\n+\n+static inline int param_write(void __iomem *base,\n+\t\t\t      const struct u3phy_reg *reg, bool desired)\n+{\n+\tunsigned int val, mask;\n+\tunsigned int tmp = desired ? reg->dvalue : reg->rvalue;\n+\tint ret = 0;\n+\n+\tmask = GENMASK(reg->bitend, reg->bitstart);\n+\tval = (tmp << reg->bitstart) | (mask << BIT_WRITEABLE_SHIFT);\n+\tret = regmap_write(base, reg->offset, val);\n+\n+\treturn ret;\n+}\n+\n+static inline bool param_exped(void __iomem *base,\n+\t\t\t       const struct u3phy_reg *reg,\n+\t\t\t       unsigned int value)\n+{\n+\tint ret;\n+\tunsigned int tmp, orig;\n+\tunsigned int mask = GENMASK(reg->bitend, reg->bitstart);\n+\n+\tret = regmap_read(base, reg->offset, &orig);\n+\tif (ret)\n+\t\treturn false;\n+\n+\ttmp = (orig & mask) >> reg->bitstart;\n+\treturn tmp == value;\n+}\n+\n+static int rockchip_set_vbus_power(struct rockchip_u3phy *u3phy, bool en)\n+{\n+\tint ret = 0;\n+\n+\tif (!u3phy->vbus)\n+\t\treturn 0;\n+\n+\tif (en && !u3phy->vbus_enabled) {\n+\t\tret = regulator_enable(u3phy->vbus);\n+\t\tif (ret)\n+\t\t\tdev_err(u3phy->dev,\n+\t\t\t\t\"Failed to enable VBUS supply\\n\");\n+\t} else if (!en && u3phy->vbus_enabled) {\n+\t\tret = regulator_disable(u3phy->vbus);\n+\t}\n+\n+\tif (ret == 0)\n+\t\tu3phy->vbus_enabled = en;\n+\n+\treturn ret;\n+}\n+\n+static int rockchip_u3phy_usb2_only_show(struct seq_file *s, void *unused)\n+{\n+\tstruct rockchip_u3phy\t*u3phy = s->private;\n+\n+\tif (param_exped(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.u2_only_ctrl, 1))\n+\t\tdev_info(u3phy->dev, \"u2\\n\");\n+\telse\n+\t\tdev_info(u3phy->dev, \"u3\\n\");\n+\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_usb2_only_open(struct inode *inode,\n+\t\t\t\t\t struct file *file)\n+{\n+\treturn single_open(file, rockchip_u3phy_usb2_only_show,\n+\t\t\t   inode->i_private);\n+}\n+\n+static ssize_t rockchip_u3phy_usb2_only_write(struct file *file,\n+\t\t\t\t\t      const char __user *ubuf,\n+\t\t\t\t\t      size_t count, loff_t *ppos)\n+{\n+\tstruct seq_file\t\t\t*s = file->private_data;\n+\tstruct rockchip_u3phy\t\t*u3phy = s->private;\n+\tstruct rockchip_u3phy_port\t*u3phy_port;\n+\tchar\t\t\t\tbuf[32];\n+\tu8\t\t\t\tindex;\n+\n+\tif (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))\n+\t\treturn -EFAULT;\n+\n+\tif (!strncmp(buf, \"u3\", 2) &&\n+\t    param_exped(u3phy->u3phy_grf,\n+\t\t\t&u3phy->cfgs->grfcfg.u2_only_ctrl, 1)) {\n+\t\tdev_info(u3phy->dev, \"Set usb3.0 and usb2.0 mode successfully\\n\");\n+\n+\t\trockchip_set_vbus_power(u3phy, false);\n+\n+\t\tparam_write(u3phy->grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.u3_disable, false);\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.u2_only_ctrl, false);\n+\n+\t\tfor (index = 0; index < U3PHY_PORT_NUM; index++) {\n+\t\t\tu3phy_port = &u3phy->ports[index];\n+\t\t\t/* enable u3 rx termimation */\n+\t\t\tif (u3phy_port->type == U3PHY_TYPE_PIPE)\n+\t\t\t\twritel(0x30, u3phy_port->base + 0xd8);\n+\t\t}\n+\n+\t\tatomic_notifier_call_chain(&u3phy->usb_phy.notifier, 0, NULL);\n+\n+\t\trockchip_set_vbus_power(u3phy, true);\n+\t} else if (!strncmp(buf, \"u2\", 2) &&\n+\t\t   param_exped(u3phy->u3phy_grf,\n+\t\t\t       &u3phy->cfgs->grfcfg.u2_only_ctrl, 0)) {\n+\t\tdev_info(u3phy->dev, \"Set usb2.0 only mode successfully\\n\");\n+\n+\t\trockchip_set_vbus_power(u3phy, false);\n+\n+\t\tparam_write(u3phy->grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.u3_disable, true);\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.u2_only_ctrl, true);\n+\n+\t\tfor (index = 0; index < U3PHY_PORT_NUM; index++) {\n+\t\t\tu3phy_port = &u3phy->ports[index];\n+\t\t\t/* disable u3 rx termimation */\n+\t\t\tif (u3phy_port->type == U3PHY_TYPE_PIPE)\n+\t\t\t\twritel(0x20, u3phy_port->base + 0xd8);\n+\t\t}\n+\n+\t\tatomic_notifier_call_chain(&u3phy->usb_phy.notifier, 0, NULL);\n+\n+\t\trockchip_set_vbus_power(u3phy, true);\n+\t} else {\n+\t\tdev_info(u3phy->dev, \"Same or illegal mode\\n\");\n+\t}\n+\n+\treturn count;\n+}\n+\n+static const struct file_operations rockchip_u3phy_usb2_only_fops = {\n+\t.open\t\t\t= rockchip_u3phy_usb2_only_open,\n+\t.write\t\t\t= rockchip_u3phy_usb2_only_write,\n+\t.read\t\t\t= seq_read,\n+\t.llseek\t\t\t= seq_lseek,\n+\t.release\t\t= single_release,\n+};\n+\n+int rockchip_u3phy_debugfs_init(struct rockchip_u3phy *u3phy)\n+{\n+\tstruct dentry\t\t*root;\n+\tstruct dentry\t\t*file;\n+\tint\t\t\tret;\n+\n+\troot = debugfs_create_dir(dev_name(u3phy->dev), NULL);\n+\tif (!root) {\n+\t\tret = -ENOMEM;\n+\t\tgoto err0;\n+\t}\n+\n+\tu3phy->root = root;\n+\n+\tfile = debugfs_create_file(\"u3phy_mode\", 0644, root,\n+\t\t\t\t   u3phy, &rockchip_u3phy_usb2_only_fops);\n+\tif (!file) {\n+\t\tret = -ENOMEM;\n+\t\tgoto err1;\n+\t}\n+\treturn 0;\n+\n+err1:\n+\tdebugfs_remove_recursive(root);\n+err0:\n+\treturn ret;\n+}\n+\n+static const char *get_rest_name(enum rockchip_u3phy_rest_req rst)\n+{\n+\tswitch (rst) {\n+\tcase U2_POR_RSTN:\n+\t\treturn \"u3phy-u2-por\";\n+\tcase U3_POR_RSTN:\n+\t\treturn \"u3phy-u3-por\";\n+\tcase PIPE_MAC_RSTN:\n+\t\treturn \"u3phy-pipe-mac\";\n+\tcase UTMI_MAC_RSTN:\n+\t\treturn \"u3phy-utmi-mac\";\n+\tcase UTMI_APB_RSTN:\n+\t\treturn \"u3phy-utmi-apb\";\n+\tcase PIPE_APB_RSTN:\n+\t\treturn \"u3phy-pipe-apb\";\n+\tdefault:\n+\t\treturn \"invalid\";\n+\t}\n+}\n+\n+static void rockchip_u3phy_rest_deassert(struct rockchip_u3phy *u3phy,\n+\t\t\t\t\t unsigned int flag)\n+{\n+\tint rst;\n+\n+\tif (flag & U3PHY_APB_RST) {\n+\t\tdev_dbg(u3phy->dev, \"deassert APB bus interface reset\\n\");\n+\t\tfor (rst = PIPE_APB_RSTN; rst <= UTMI_APB_RSTN; rst++) {\n+\t\t\tif (u3phy->rsts[rst])\n+\t\t\t\treset_control_deassert(u3phy->rsts[rst]);\n+\t\t}\n+\t}\n+\n+\tif (flag & U3PHY_POR_RST) {\n+\t\tusleep_range(12, 15);\n+\t\tdev_dbg(u3phy->dev, \"deassert u2 and u3 phy power on reset\\n\");\n+\t\tfor (rst = U3_POR_RSTN; rst <= U2_POR_RSTN; rst++) {\n+\t\t\tif (u3phy->rsts[rst])\n+\t\t\t\treset_control_deassert(u3phy->rsts[rst]);\n+\t\t}\n+\t}\n+\n+\tif (flag & U3PHY_MAC_RST) {\n+\t\tusleep_range(1200, 1500);\n+\t\tdev_dbg(u3phy->dev, \"deassert pipe and utmi MAC reset\\n\");\n+\t\tfor (rst = PIPE_MAC_RSTN; rst <= UTMI_MAC_RSTN; rst++)\n+\t\t\tif (u3phy->rsts[rst])\n+\t\t\t\treset_control_deassert(u3phy->rsts[rst]);\n+\t}\n+}\n+\n+static void rockchip_u3phy_rest_assert(struct rockchip_u3phy *u3phy)\n+{\n+\tint rst;\n+\n+\tdev_dbg(u3phy->dev, \"assert u3phy reset\\n\");\n+\tfor (rst = 0; rst < U3PHY_RESET_MAX; rst++)\n+\t\tif (u3phy->rsts[rst])\n+\t\t\treset_control_assert(u3phy->rsts[rst]);\n+}\n+\n+static int rockchip_u3phy_clk_enable(struct rockchip_u3phy *u3phy)\n+{\n+\tint ret, clk;\n+\n+\tfor (clk = 0; clk < U3PHY_MAX_CLKS && u3phy->clks[clk]; clk++) {\n+\t\tret = clk_prepare_enable(u3phy->clks[clk]);\n+\t\tif (ret)\n+\t\t\tgoto err_disable_clks;\n+\t}\n+\treturn 0;\n+\n+err_disable_clks:\n+\twhile (--clk >= 0)\n+\t\tclk_disable_unprepare(u3phy->clks[clk]);\n+\treturn ret;\n+}\n+\n+static void rockchip_u3phy_clk_disable(struct rockchip_u3phy *u3phy)\n+{\n+\tint clk;\n+\n+\tfor (clk = U3PHY_MAX_CLKS - 1; clk >= 0; clk--)\n+\t\tif (u3phy->clks[clk])\n+\t\t\tclk_disable_unprepare(u3phy->clks[clk]);\n+}\n+\n+static int rockchip_u3phy_init(struct phy *phy)\n+{\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_exit(struct phy *phy)\n+{\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_power_on(struct phy *phy)\n+{\n+\tstruct rockchip_u3phy_port *u3phy_port = phy_get_drvdata(phy);\n+\tstruct rockchip_u3phy *u3phy = dev_get_drvdata(phy->dev.parent);\n+\tint ret;\n+\n+\tdev_info(&u3phy_port->phy->dev, \"u3phy %s power on\\n\",\n+\t\t (u3phy_port->type == U3PHY_TYPE_UTMI) ? \"u2\" : \"u3\");\n+\n+\tif (!u3phy_port->suspended)\n+\t\treturn 0;\n+\n+\tret = rockchip_u3phy_clk_enable(u3phy);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (u3phy_port->type == U3PHY_TYPE_UTMI) {\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.um_suspend, false);\n+\t} else {\n+\t\t/* current in p2 ? */\n+\t\tif (param_exped(u3phy->u3phy_grf,\n+\t\t\t\t&u3phy->cfgs->grfcfg.pp_pwr_st, PIPE_PWR_P2))\n+\t\t\tgoto done;\n+\n+\t\tif (u3phy->cfgs->phy_pipe_power) {\n+\t\t\tdev_dbg(u3phy->dev, \"do pipe power up\\n\");\n+\t\t\tu3phy->cfgs->phy_pipe_power(u3phy, u3phy_port, true);\n+\t\t}\n+\n+\t\t/* exit to p0 */\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P0], true);\n+\t\tusleep_range(90, 100);\n+\n+\t\t/* enter to p2 from p0 */\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P2],\n+\t\t\t    false);\n+\t\tudelay(3);\n+\t}\n+\n+done:\n+\trockchip_set_vbus_power(u3phy, true);\n+\tu3phy_port->suspended = false;\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_power_off(struct phy *phy)\n+{\n+\tstruct rockchip_u3phy_port *u3phy_port = phy_get_drvdata(phy);\n+\tstruct rockchip_u3phy *u3phy = dev_get_drvdata(phy->dev.parent);\n+\n+\tdev_info(&u3phy_port->phy->dev, \"u3phy %s power off\\n\",\n+\t\t (u3phy_port->type == U3PHY_TYPE_UTMI) ? \"u2\" : \"u3\");\n+\n+\tif (u3phy_port->suspended)\n+\t\treturn 0;\n+\n+\tif (u3phy_port->type == U3PHY_TYPE_UTMI) {\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.um_suspend, true);\n+\t} else {\n+\t\t/* current in p3 ? */\n+\t\tif (param_exped(u3phy->u3phy_grf,\n+\t\t\t\t&u3phy->cfgs->grfcfg.pp_pwr_st, PIPE_PWR_P3))\n+\t\t\tgoto done;\n+\n+\t\t/* exit to p0 */\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P0], true);\n+\t\tudelay(2);\n+\n+\t\t/* enter to p3 from p0 */\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.pp_pwr_en[PIPE_PWR_P3], true);\n+\t\tudelay(6);\n+\n+\t\tif (u3phy->cfgs->phy_pipe_power) {\n+\t\t\tdev_dbg(u3phy->dev, \"do pipe power down\\n\");\n+\t\t\tu3phy->cfgs->phy_pipe_power(u3phy, u3phy_port, false);\n+\t\t}\n+\t}\n+\n+done:\n+\trockchip_u3phy_clk_disable(u3phy);\n+\tu3phy_port->suspended = true;\n+\treturn 0;\n+}\n+\n+static __maybe_unused int rockchip_u3phy_cp_test(struct phy *phy)\n+{\n+\tstruct rockchip_u3phy_port *u3phy_port = phy_get_drvdata(phy);\n+\tstruct rockchip_u3phy *u3phy = dev_get_drvdata(phy->dev.parent);\n+\tint ret;\n+\n+\tif (u3phy->cfgs->phy_cp_test) {\n+\t\t/*\n+\t\t * When do USB3 compliance test, we may connect the oscilloscope\n+\t\t * front panel Aux Out to the DUT SSRX+, the Aux Out of the\n+\t\t * oscilloscope outputs a negative pulse whose width is between\n+\t\t * 300- 400 ns which may trigger some DUTs to change the CP test\n+\t\t * pattern.\n+\t\t *\n+\t\t * The Inno USB3 PHY disable the function to detect the negative\n+\t\t * pulse in SSRX+ by default, so we need to enable the function\n+\t\t * to toggle the CP test pattern before do USB3 compliance test.\n+\t\t */\n+\t\tdev_dbg(u3phy->dev, \"prepare for u3phy compliance test\\n\");\n+\t\tret = u3phy->cfgs->phy_cp_test(u3phy, u3phy_port);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static __maybe_unused\n+struct phy *rockchip_u3phy_xlate(struct device *dev,\n+\t\t\t\t struct of_phandle_args *args)\n+{\n+\tstruct rockchip_u3phy *u3phy = dev_get_drvdata(dev);\n+\tstruct rockchip_u3phy_port *u3phy_port = NULL;\n+\tstruct device_node *phy_np = args->np;\n+\tint index;\n+\n+\tif (args->args_count != 1) {\n+\t\tdev_err(dev, \"invalid number of cells in 'phy' property\\n\");\n+\t\treturn ERR_PTR(-EINVAL);\n+\t}\n+\n+\tfor (index = 0; index < U3PHY_PORT_NUM; index++) {\n+\t\tif (phy_np == u3phy->ports[index].phy->dev.of_node) {\n+\t\t\tu3phy_port = &u3phy->ports[index];\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (!u3phy_port) {\n+\t\tdev_err(dev, \"failed to find appropriate phy\\n\");\n+\t\treturn ERR_PTR(-EINVAL);\n+\t}\n+\n+\treturn u3phy_port->phy;\n+}\n+\n+static struct phy_ops rockchip_u3phy_ops = {\n+\t.init\t\t= rockchip_u3phy_init,\n+\t.exit\t\t= rockchip_u3phy_exit,\n+\t.power_on\t= rockchip_u3phy_power_on,\n+\t.power_off\t= rockchip_u3phy_power_off,\n+\t.owner\t\t= THIS_MODULE,\n+};\n+\n+/*\n+ * The function manage host-phy port state and suspend/resume phy port\n+ * to save power automatically.\n+ *\n+ * we rely on utmi_linestate and utmi_hostdisconnect to identify whether\n+ * devices is disconnect or not. Besides, we do not need care it is FS/LS\n+ * disconnected or HS disconnected, actually, we just only need get the\n+ * device is disconnected at last through rearm the delayed work,\n+ * to suspend the phy port in _PHY_STATE_DISCONNECT_ case.\n+ */\n+static void rockchip_u3phy_um_sm_work(struct work_struct *work)\n+{\n+\tstruct rockchip_u3phy_port *u3phy_port =\n+\t\tcontainer_of(work, struct rockchip_u3phy_port, um_sm_work.work);\n+\tstruct rockchip_u3phy *u3phy =\n+\t\tdev_get_drvdata(u3phy_port->phy->dev.parent);\n+\tunsigned int sh = u3phy->cfgs->grfcfg.um_hstdct.bitend -\n+\t\t\tu3phy->cfgs->grfcfg.um_hstdct.bitstart + 1;\n+\tunsigned int ul, uhd, state;\n+\tunsigned int ul_mask, uhd_mask;\n+\tint ret;\n+\n+\tmutex_lock(&u3phy_port->mutex);\n+\n+\tret = regmap_read(u3phy->u3phy_grf,\n+\t\t\t  u3phy->cfgs->grfcfg.um_ls.offset, &ul);\n+\tif (ret < 0)\n+\t\tgoto next_schedule;\n+\n+\tret = regmap_read(u3phy->u3phy_grf,\n+\t\t\t  u3phy->cfgs->grfcfg.um_hstdct.offset, &uhd);\n+\tif (ret < 0)\n+\t\tgoto next_schedule;\n+\n+\tuhd_mask = GENMASK(u3phy->cfgs->grfcfg.um_hstdct.bitend,\n+\t\t\t   u3phy->cfgs->grfcfg.um_hstdct.bitstart);\n+\tul_mask = GENMASK(u3phy->cfgs->grfcfg.um_ls.bitend,\n+\t\t\t  u3phy->cfgs->grfcfg.um_ls.bitstart);\n+\n+\t/* stitch on um_ls and um_hstdct as phy state */\n+\tstate = ((uhd & uhd_mask) >> u3phy->cfgs->grfcfg.um_hstdct.bitstart) |\n+\t\t(((ul & ul_mask) >> u3phy->cfgs->grfcfg.um_ls.bitstart) << sh);\n+\n+\tswitch (state) {\n+\tcase PHY_UTMI_HS_ONLINE:\n+\t\tdev_dbg(&u3phy_port->phy->dev, \"HS online\\n\");\n+\t\tbreak;\n+\tcase PHY_UTMI_FS_LS_ONLINE:\n+\t\t/*\n+\t\t * For FS/LS device, the online state share with connect state\n+\t\t * from um_ls and um_hstdct register, so we distinguish\n+\t\t * them via suspended flag.\n+\t\t *\n+\t\t * Plus, there are two cases, one is D- Line pull-up, and D+\n+\t\t * line pull-down, the state is 4; another is D+ line pull-up,\n+\t\t * and D- line pull-down, the state is 2.\n+\t\t */\n+\t\tif (!u3phy_port->suspended) {\n+\t\t\t/* D- line pull-up, D+ line pull-down */\n+\t\t\tdev_dbg(&u3phy_port->phy->dev, \"FS/LS online\\n\");\n+\t\t\tbreak;\n+\t\t}\n+\t\t/* fall through */\n+\tcase PHY_UTMI_CONNECT:\n+\t\tif (u3phy_port->suspended) {\n+\t\t\tdev_dbg(&u3phy_port->phy->dev, \"Connected\\n\");\n+\t\t\trockchip_u3phy_power_on(u3phy_port->phy);\n+\t\t\tu3phy_port->suspended = false;\n+\t\t} else {\n+\t\t\t/* D+ line pull-up, D- line pull-down */\n+\t\t\tdev_dbg(&u3phy_port->phy->dev, \"FS/LS online\\n\");\n+\t\t}\n+\t\tbreak;\n+\tcase PHY_UTMI_DISCONNECT:\n+\t\tif (!u3phy_port->suspended) {\n+\t\t\tdev_dbg(&u3phy_port->phy->dev, \"Disconnected\\n\");\n+\t\t\trockchip_u3phy_power_off(u3phy_port->phy);\n+\t\t\tu3phy_port->suspended = true;\n+\t\t}\n+\n+\t\t/*\n+\t\t * activate the linestate detection to get the next device\n+\t\t * plug-in irq.\n+\t\t */\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.ls_det_st, true);\n+\t\tparam_write(u3phy->u3phy_grf,\n+\t\t\t    &u3phy->cfgs->grfcfg.ls_det_en, true);\n+\n+\t\t/*\n+\t\t * we don't need to rearm the delayed work when the phy port\n+\t\t * is suspended.\n+\t\t */\n+\t\tmutex_unlock(&u3phy_port->mutex);\n+\t\treturn;\n+\tdefault:\n+\t\tdev_dbg(&u3phy_port->phy->dev, \"unknown phy state\\n\");\n+\t\tbreak;\n+\t}\n+\n+next_schedule:\n+\tmutex_unlock(&u3phy_port->mutex);\n+\tschedule_delayed_work(&u3phy_port->um_sm_work, SCHEDULE_DELAY);\n+}\n+\n+static irqreturn_t rockchip_u3phy_um_ls_irq(int irq, void *data)\n+{\n+\tstruct rockchip_u3phy_port *u3phy_port = data;\n+\tstruct rockchip_u3phy *u3phy =\n+\t\tdev_get_drvdata(u3phy_port->phy->dev.parent);\n+\n+\tif (!param_exped(u3phy->u3phy_grf,\n+\t\t\t &u3phy->cfgs->grfcfg.ls_det_st,\n+\t\t\t u3phy->cfgs->grfcfg.ls_det_st.dvalue))\n+\t\treturn IRQ_NONE;\n+\n+\tdev_dbg(u3phy->dev, \"utmi linestate interrupt\\n\");\n+\tmutex_lock(&u3phy_port->mutex);\n+\n+\t/* disable linestate detect irq and clear its status */\n+\tparam_write(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.ls_det_en, false);\n+\tparam_write(u3phy->u3phy_grf, &u3phy->cfgs->grfcfg.ls_det_st, true);\n+\n+\tmutex_unlock(&u3phy_port->mutex);\n+\n+\t/*\n+\t * In this case for host phy, a new device is plugged in, meanwhile,\n+\t * if the phy port is suspended, we need rearm the work to resume it\n+\t * and mange its states; otherwise, we just return irq handled.\n+\t */\n+\tif (u3phy_port->suspended) {\n+\t\tdev_dbg(u3phy->dev, \"schedule utmi sm work\\n\");\n+\t\trockchip_u3phy_um_sm_work(&u3phy_port->um_sm_work.work);\n+\t}\n+\n+\treturn IRQ_HANDLED;\n+}\n+\n+static int rockchip_u3phy_parse_dt(struct rockchip_u3phy *u3phy,\n+\t\t\t\t   struct platform_device *pdev)\n+\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct device_node *np = dev->of_node;\n+\tint ret, i, clk;\n+\n+\tu3phy->um_ls_irq = platform_get_irq_byname(pdev, \"linestate\");\n+\tif (u3phy->um_ls_irq < 0) {\n+\t\tdev_err(dev, \"get utmi linestate irq failed\\n\");\n+\t\treturn -ENXIO;\n+\t}\n+\n+\t/* Get Vbus regulators */\n+\tu3phy->vbus = devm_regulator_get_optional(dev, \"vbus\");\n+\tif (IS_ERR(u3phy->vbus)) {\n+\t\tret = PTR_ERR(u3phy->vbus);\n+\t\tif (ret == -EPROBE_DEFER)\n+\t\t\treturn ret;\n+\n+\t\tdev_warn(dev, \"Failed to get VBUS supply regulator\\n\");\n+\t\tu3phy->vbus = NULL;\n+\t}\n+\n+\tfor (clk = 0; clk < U3PHY_MAX_CLKS; clk++) {\n+\t\tu3phy->clks[clk] = of_clk_get(np, clk);\n+\t\tif (IS_ERR(u3phy->clks[clk])) {\n+\t\t\tret = PTR_ERR(u3phy->clks[clk]);\n+\t\t\tif (ret == -EPROBE_DEFER)\n+\t\t\t\tgoto err_put_clks;\n+\t\t\tu3phy->clks[clk] = NULL;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < U3PHY_RESET_MAX; i++) {\n+\t\tu3phy->rsts[i] = devm_reset_control_get(dev, get_rest_name(i));\n+\t\tif (IS_ERR(u3phy->rsts[i])) {\n+\t\t\tdev_info(dev, \"no %s reset control specified\\n\",\n+\t\t\t\t get_rest_name(i));\n+\t\t\tu3phy->rsts[i] = NULL;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+\n+err_put_clks:\n+\twhile (--clk >= 0)\n+\t\tclk_put(u3phy->clks[clk]);\n+\treturn ret;\n+}\n+\n+static int rockchip_u3phy_port_init(struct rockchip_u3phy *u3phy,\n+\t\t\t\t    struct rockchip_u3phy_port *u3phy_port,\n+\t\t\t\t    struct device_node *child_np)\n+{\n+\tstruct resource res;\n+\tstruct phy *phy;\n+\tint ret;\n+\n+\tdev_dbg(u3phy->dev, \"u3phy port initialize\\n\");\n+\n+\tmutex_init(&u3phy_port->mutex);\n+\tu3phy_port->suspended = true; /* initial status */\n+\n+\tphy = devm_phy_create(u3phy->dev, child_np, &rockchip_u3phy_ops);\n+\tif (IS_ERR(phy)) {\n+\t\tdev_err(u3phy->dev, \"failed to create phy\\n\");\n+\t\treturn PTR_ERR(phy);\n+\t}\n+\n+\tu3phy_port->phy = phy;\n+\n+\tret = of_address_to_resource(child_np, 0, &res);\n+\tif (ret) {\n+\t\tdev_err(u3phy->dev, \"failed to get address resource(np-%s)\\n\",\n+\t\t\tchild_np->name);\n+\t\treturn ret;\n+\t}\n+\n+\tu3phy_port->base = devm_ioremap_resource(&u3phy_port->phy->dev, &res);\n+\tif (IS_ERR(u3phy_port->base)) {\n+\t\tdev_err(u3phy->dev, \"failed to remap phy regs\\n\");\n+\t\treturn PTR_ERR(u3phy_port->base);\n+\t}\n+\n+\tif (!of_node_cmp(child_np->name, \"pipe\")) {\n+\t\tu3phy_port->type = U3PHY_TYPE_PIPE;\n+\t\tu3phy_port->refclk_25m_quirk =\n+\t\t\tof_property_read_bool(child_np,\n+\t\t\t\t\t      \"rockchip,refclk-25m-quirk\");\n+\t} else {\n+\t\tu3phy_port->type = U3PHY_TYPE_UTMI;\n+\t\tINIT_DELAYED_WORK(&u3phy_port->um_sm_work,\n+\t\t\t\t  rockchip_u3phy_um_sm_work);\n+\n+\t\tret = devm_request_threaded_irq(u3phy->dev, u3phy->um_ls_irq,\n+\t\t\t\t\t\tNULL, rockchip_u3phy_um_ls_irq,\n+\t\t\t\t\t\tIRQF_ONESHOT, \"rockchip_u3phy\",\n+\t\t\t\t\t\tu3phy_port);\n+\t\tif (ret) {\n+\t\t\tdev_err(u3phy->dev, \"failed to request utmi linestate irq handle\\n\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\tif (u3phy->cfgs->phy_tuning) {\n+\t\tdev_dbg(u3phy->dev, \"do u3phy tuning\\n\");\n+\t\tret = u3phy->cfgs->phy_tuning(u3phy, u3phy_port, child_np);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\tphy_set_drvdata(u3phy_port->phy, u3phy_port);\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_on_init(struct usb_phy *usb_phy)\n+{\n+\tstruct rockchip_u3phy *u3phy =\n+\t\tcontainer_of(usb_phy, struct rockchip_u3phy, usb_phy);\n+\n+\trockchip_u3phy_rest_deassert(u3phy, U3PHY_POR_RST | U3PHY_MAC_RST);\n+\treturn 0;\n+}\n+\n+static void rockchip_u3phy_on_shutdown(struct usb_phy *usb_phy)\n+{\n+\tstruct rockchip_u3phy *u3phy =\n+\t\tcontainer_of(usb_phy, struct rockchip_u3phy, usb_phy);\n+\tint rst;\n+\n+\tfor (rst = 0; rst < U3PHY_RESET_MAX; rst++)\n+\t\tif (u3phy->rsts[rst] && rst != UTMI_APB_RSTN &&\n+\t\t    rst != PIPE_APB_RSTN)\n+\t\t\treset_control_assert(u3phy->rsts[rst]);\n+\tudelay(1);\n+}\n+\n+static int rockchip_u3phy_on_disconnect(struct usb_phy *usb_phy,\n+\t\t\t\t\tenum usb_device_speed speed)\n+{\n+\tstruct rockchip_u3phy *u3phy =\n+\t\tcontainer_of(usb_phy, struct rockchip_u3phy, usb_phy);\n+\n+\tdev_info(u3phy->dev, \"%s device has disconnected\\n\",\n+\t\t (speed == USB_SPEED_SUPER) ? \"U3\" : \"UW/U2/U1.1/U1\");\n+\n+\tif (speed == USB_SPEED_SUPER)\n+\t\tatomic_notifier_call_chain(&usb_phy->notifier, 0, NULL);\n+\n+\treturn 0;\n+}\n+\n+static int rockchip_u3phy_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct device_node *np = dev->of_node;\n+\tstruct device_node *child_np;\n+\tstruct phy_provider *provider;\n+\tstruct rockchip_u3phy *u3phy;\n+\tconst struct rockchip_u3phy_cfg *phy_cfgs;\n+\tconst struct of_device_id *match;\n+\tunsigned int reg[2];\n+\tint index, ret;\n+\n+\tmatch = of_match_device(dev->driver->of_match_table, dev);\n+\tif (!match || !match->data) {\n+\t\tdev_err(dev, \"phy-cfgs are not assigned!\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tu3phy = devm_kzalloc(dev, sizeof(*u3phy), GFP_KERNEL);\n+\tif (!u3phy)\n+\t\treturn -ENOMEM;\n+\n+\tu3phy->u3phy_grf =\n+\t\tsyscon_regmap_lookup_by_phandle(np, \"rockchip,u3phygrf\");\n+\tif (IS_ERR(u3phy->u3phy_grf))\n+\t\treturn PTR_ERR(u3phy->u3phy_grf);\n+\n+\tu3phy->grf =\n+\t\tsyscon_regmap_lookup_by_phandle(np, \"rockchip,grf\");\n+\tif (IS_ERR(u3phy->grf)) {\n+\t\tdev_err(dev, \"Missing rockchip,grf property\\n\");\n+\t\treturn PTR_ERR(u3phy->grf);\n+\t}\n+\n+\tif (of_property_read_u32_array(np, \"reg\", reg, 2)) {\n+\t\tdev_err(dev, \"the reg property is not assigned in %s node\\n\",\n+\t\t\tnp->name);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tu3phy->dev = dev;\n+\tu3phy->vbus_enabled = false;\n+\tphy_cfgs = match->data;\n+\tplatform_set_drvdata(pdev, u3phy);\n+\n+\t/* find out a proper config which can be matched with dt. */\n+\tindex = 0;\n+\twhile (phy_cfgs[index].reg) {\n+\t\tif (phy_cfgs[index].reg == reg[1]) {\n+\t\t\tu3phy->cfgs = &phy_cfgs[index];\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\t++index;\n+\t}\n+\n+\tif (!u3phy->cfgs) {\n+\t\tdev_err(dev, \"no phy-cfgs can be matched with %s node\\n\",\n+\t\t\tnp->name);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tret = rockchip_u3phy_parse_dt(u3phy, pdev);\n+\tif (ret) {\n+\t\tdev_err(dev, \"parse dt failed, ret(%d)\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tret = rockchip_u3phy_clk_enable(u3phy);\n+\tif (ret) {\n+\t\tdev_err(dev, \"clk enable failed, ret(%d)\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\trockchip_u3phy_rest_assert(u3phy);\n+\trockchip_u3phy_rest_deassert(u3phy, U3PHY_APB_RST | U3PHY_POR_RST);\n+\n+\tindex = 0;\n+\tfor_each_available_child_of_node(np, child_np) {\n+\t\tstruct rockchip_u3phy_port *u3phy_port = &u3phy->ports[index];\n+\n+\t\tu3phy_port->index = index;\n+\t\tret = rockchip_u3phy_port_init(u3phy, u3phy_port, child_np);\n+\t\tif (ret) {\n+\t\t\tdev_err(dev, \"u3phy port init failed,ret(%d)\\n\", ret);\n+\t\t\tgoto put_child;\n+\t\t}\n+\n+\t\t/* to prevent out of boundary */\n+\t\tif (++index >= U3PHY_PORT_NUM)\n+\t\t\tbreak;\n+\t}\n+\n+\tprovider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);\n+\tif (IS_ERR_OR_NULL(provider))\n+\t\tgoto put_child;\n+\n+\trockchip_u3phy_rest_deassert(u3phy, U3PHY_MAC_RST);\n+\trockchip_u3phy_clk_disable(u3phy);\n+\n+\tu3phy->usb_phy.dev = dev;\n+\tu3phy->usb_phy.init = rockchip_u3phy_on_init;\n+\tu3phy->usb_phy.shutdown = rockchip_u3phy_on_shutdown;\n+\tu3phy->usb_phy.notify_disconnect = rockchip_u3phy_on_disconnect;\n+\tusb_add_phy(&u3phy->usb_phy, USB_PHY_TYPE_USB3);\n+\tATOMIC_INIT_NOTIFIER_HEAD(&u3phy->usb_phy.notifier);\n+\n+\trockchip_u3phy_debugfs_init(u3phy);\n+\n+\tdev_info(dev, \"Rockchip u3phy initialized successfully\\n\");\n+\treturn 0;\n+\n+put_child:\n+\tof_node_put(child_np);\n+\treturn ret;\n+}\n+\n+static int rk3328_u3phy_pipe_power(struct rockchip_u3phy *u3phy,\n+\t\t\t\t   struct rockchip_u3phy_port *u3phy_port,\n+\t\t\t\t   bool on)\n+{\n+\tunsigned int reg;\n+\n+\tif (on) {\n+\t\treg = readl(u3phy_port->base + 0x1a8);\n+\t\treg &= ~BIT(4); /* ldo power up */\n+\t\twritel(reg, u3phy_port->base + 0x1a8);\n+\n+\t\treg = readl(u3phy_port->base + 0x044);\n+\t\treg &= ~BIT(4); /* bg power on */\n+\t\twritel(reg, u3phy_port->base + 0x044);\n+\n+\t\treg = readl(u3phy_port->base + 0x150);\n+\t\treg |= BIT(6); /* tx bias enable */\n+\t\twritel(reg, u3phy_port->base + 0x150);\n+\n+\t\treg = readl(u3phy_port->base + 0x080);\n+\t\treg &= ~BIT(2); /* tx cm power up */\n+\t\twritel(reg, u3phy_port->base + 0x080);\n+\n+\t\treg = readl(u3phy_port->base + 0x0c0);\n+\t\t/* tx obs enable and rx cm enable */\n+\t\treg |= (BIT(3) | BIT(4));\n+\t\twritel(reg, u3phy_port->base + 0x0c0);\n+\n+\t\tudelay(1);\n+\t} else {\n+\t\treg = readl(u3phy_port->base + 0x1a8);\n+\t\treg |= BIT(4); /* ldo power down */\n+\t\twritel(reg, u3phy_port->base + 0x1a8);\n+\n+\t\treg = readl(u3phy_port->base + 0x044);\n+\t\treg |= BIT(4); /* bg power down */\n+\t\twritel(reg, u3phy_port->base + 0x044);\n+\n+\t\treg = readl(u3phy_port->base + 0x150);\n+\t\treg &= ~BIT(6); /* tx bias disable */\n+\t\twritel(reg, u3phy_port->base + 0x150);\n+\n+\t\treg = readl(u3phy_port->base + 0x080);\n+\t\treg |= BIT(2); /* tx cm power down */\n+\t\twritel(reg, u3phy_port->base + 0x080);\n+\n+\t\treg = readl(u3phy_port->base + 0x0c0);\n+\t\t/* tx obs disable and rx cm disable */\n+\t\treg &= ~(BIT(3) | BIT(4));\n+\t\twritel(reg, u3phy_port->base + 0x0c0);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int rk3328_u3phy_tuning(struct rockchip_u3phy *u3phy,\n+\t\t\t       struct rockchip_u3phy_port *u3phy_port,\n+\t\t\t       struct device_node *child_np)\n+{\n+\tif (u3phy_port->type == U3PHY_TYPE_UTMI) {\n+\t\t/*\n+\t\t * For rk3328 SoC, pre-emphasis and pre-emphasis strength must\n+\t\t * be written as one fixed value as below.\n+\t\t *\n+\t\t * Dissimilarly, the odt 45ohm value should be flexibly tuninged\n+\t\t * for the different boards to adjust HS eye height, so its\n+\t\t * value can be assigned in DT in code design.\n+\t\t */\n+\n+\t\t/* {bits[2:0]=111}: always enable pre-emphasis */\n+\t\tu3phy->apbcfg.u2_pre_emp = 0x0f;\n+\n+\t\t/* {bits[5:3]=000}: pre-emphasis strength as the weakest */\n+\t\tu3phy->apbcfg.u2_pre_emp_sth = 0x41;\n+\n+\t\t/* {bits[4:0]=10101}: odt 45ohm tuning */\n+\t\tu3phy->apbcfg.u2_odt_tuning = 0xb5;\n+\t\t/* optional override of the odt 45ohm tuning */\n+\t\tof_property_read_u32(child_np, \"rockchip,odt-val-tuning\",\n+\t\t\t\t     &u3phy->apbcfg.u2_odt_tuning);\n+\n+\t\twritel(u3phy->apbcfg.u2_pre_emp, u3phy_port->base + 0x030);\n+\t\twritel(u3phy->apbcfg.u2_pre_emp_sth, u3phy_port->base + 0x040);\n+\t\twritel(u3phy->apbcfg.u2_odt_tuning, u3phy_port->base + 0x11c);\n+\t} else if (u3phy_port->type == U3PHY_TYPE_PIPE) {\n+\t\tif (u3phy_port->refclk_25m_quirk) {\n+\t\t\tdev_dbg(u3phy->dev, \"switch to 25m refclk\\n\");\n+\t\t\t/* ref clk switch to 25M */\n+\t\t\twritel(0x64, u3phy_port->base + 0x11c);\n+\t\t\twritel(0x64, u3phy_port->base + 0x028);\n+\t\t\twritel(0x01, u3phy_port->base + 0x020);\n+\t\t\twritel(0x21, u3phy_port->base + 0x030);\n+\t\t\twritel(0x06, u3phy_port->base + 0x108);\n+\t\t\twritel(0x00, u3phy_port->base + 0x118);\n+\t\t} else {\n+\t\t\t/* configure for 24M ref clk */\n+\t\t\twritel(0x80, u3phy_port->base + 0x10c);\n+\t\t\twritel(0x01, u3phy_port->base + 0x118);\n+\t\t\twritel(0x38, u3phy_port->base + 0x11c);\n+\t\t\twritel(0x83, u3phy_port->base + 0x020);\n+\t\t\twritel(0x02, u3phy_port->base + 0x108);\n+\t\t}\n+\n+\t\t/* Enable SSC */\n+\t\tudelay(3);\n+\t\twritel(0x08, u3phy_port->base + 0x000);\n+\t\twritel(0x0c, u3phy_port->base + 0x120);\n+\n+\t\t/* Tuning Rx for compliance RJTL test */\n+\t\twritel(0x70, u3phy_port->base + 0x150);\n+\t\twritel(0x12, u3phy_port->base + 0x0c8);\n+\t\twritel(0x05, u3phy_port->base + 0x148);\n+\t\twritel(0x08, u3phy_port->base + 0x068);\n+\t\twritel(0xf0, u3phy_port->base + 0x1c4);\n+\t\twritel(0xff, u3phy_port->base + 0x070);\n+\t\twritel(0x0f, u3phy_port->base + 0x06c);\n+\t\twritel(0xe0, u3phy_port->base + 0x060);\n+\n+\t\t/*\n+\t\t * Tuning Tx to increase the bias current\n+\t\t * used in TX driver and RX EQ, it can\n+\t\t * also increase the voltage of LFPS.\n+\t\t */\n+\t\twritel(0x08, u3phy_port->base + 0x180);\n+\t} else {\n+\t\tdev_err(u3phy->dev, \"invalid u3phy port type\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int rk322xh_u3phy_cp_test_enable(struct rockchip_u3phy *u3phy,\n+\t\t\t\t\tstruct rockchip_u3phy_port *u3phy_port)\n+{\n+\tif (u3phy_port->type == U3PHY_TYPE_PIPE) {\n+\t\twritel(0x0c, u3phy_port->base + 0x408);\n+\t} else {\n+\t\tdev_err(u3phy->dev, \"The u3phy type is not pipe\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static const struct rockchip_u3phy_cfg rk3328_u3phy_cfgs[] = {\n+\t{\n+\t\t.reg\t\t= 0xff470000,\n+\t\t.grfcfg\t\t= {\n+\t\t\t.um_suspend\t= { 0x0004, 15, 0, 0x1452, 0x15d1 },\n+\t\t\t.u2_only_ctrl\t= { 0x0020, 15, 15, 0, 1 },\n+\t\t\t.um_ls\t\t= { 0x0030, 5, 4, 0, 1 },\n+\t\t\t.um_hstdct\t= { 0x0030, 7, 7, 0, 1 },\n+\t\t\t.ls_det_en\t= { 0x0040, 0, 0, 0, 1 },\n+\t\t\t.ls_det_st\t= { 0x0044, 0, 0, 0, 1 },\n+\t\t\t.pp_pwr_st\t= { 0x0034, 14, 13, 0, 0},\n+\t\t\t.pp_pwr_en\t= { {0x0020, 14, 0, 0x0014, 0x0005},\n+\t\t\t\t\t    {0x0020, 14, 0, 0x0014, 0x000d},\n+\t\t\t\t\t    {0x0020, 14, 0, 0x0014, 0x0015},\n+\t\t\t\t\t    {0x0020, 14, 0, 0x0014, 0x001d} },\n+\t\t\t.u3_disable\t= { 0x04c4, 15, 0, 0x1100, 0x101},\n+\t\t},\n+\t\t.phy_pipe_power\t= rk3328_u3phy_pipe_power,\n+\t\t.phy_tuning\t= rk3328_u3phy_tuning,\n+\t\t.phy_cp_test\t= rk322xh_u3phy_cp_test_enable,\n+\t},\n+\t{ /* sentinel */ }\n+};\n+\n+static const struct of_device_id rockchip_u3phy_dt_match[] = {\n+\t{ .compatible = \"rockchip,rk3328-u3phy\", .data = &rk3328_u3phy_cfgs },\n+\t{}\n+};\n+MODULE_DEVICE_TABLE(of, rockchip_u3phy_dt_match);\n+\n+static struct platform_driver rockchip_u3phy_driver = {\n+\t.probe\t\t= rockchip_u3phy_probe,\n+\t.driver\t\t= {\n+\t\t.name\t= \"rockchip-u3phy\",\n+\t\t.of_match_table = rockchip_u3phy_dt_match,\n+\t},\n+};\n+module_platform_driver(rockchip_u3phy_driver);\n+\n+MODULE_AUTHOR(\"Frank Wang <frank.wang@rock-chips.com>\");\n+MODULE_AUTHOR(\"William Wu <william.wu@rock-chips.com>\");\n+MODULE_DESCRIPTION(\"Rockchip USB 3.0 PHY driver\");\n+MODULE_LICENSE(\"GPL v2\");\ndiff --git a/target/linux/rockchip/patches-5.10/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch b/target/linux/rockchip/patches-5.10/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\nnew file mode 100644\nindex 0000000000..f369f2bcd7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\n@@ -0,0 +1,52 @@\n+From faa767a9d0ced5642da0ae50b53d87de258f9525 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 17:24:30 +0800\n+Subject: [PATCH] phy: rockchip: add driver for Rockchip USB 3.0 PHY\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/phy/rockchip/Kconfig                  |    8 +\n+ drivers/phy/rockchip/Makefile                 |    1 +\n+ drivers/phy/rockchip/phy-rockchip-inno-usb3.c | 1175 +++++++++++++++++\n+ 3 files changed, 1184 insertions(+)\n+ create mode 100644 drivers/phy/rockchip/phy-rockchip-inno-usb3.c\n+\n+--- a/drivers/phy/rockchip/Kconfig\n++++ b/drivers/phy/rockchip/Kconfig\n+@@ -56,6 +56,15 @@ config PHY_ROCKCHIP_INNO_DSIDPHY\n+ \t  Enable this to support the Rockchip MIPI/LVDS/TTL PHY with\n+ \t  Innosilicon IP block.\n+ \n++config PHY_ROCKCHIP_INNO_USB3\n++\ttristate \"Rockchip INNO USB 3.0 PHY Driver\"\n++\tdepends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF\n++\tdepends on USB_SUPPORT\n++\tselect GENERIC_PHY\n++\tselect USB_PHY\n++\thelp\n++\t  Support for Rockchip USB 3.0 PHY with Innosilicon IP block.\n++\n+ config PHY_ROCKCHIP_PCIE\n+ \ttristate \"Rockchip PCIe PHY Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && OF) || COMPILE_TEST\n+--- a/drivers/phy/rockchip/Makefile\n++++ b/drivers/phy/rockchip/Makefile\n+@@ -5,6 +5,7 @@ obj-$(CONFIG_PHY_ROCKCHIP_EMMC)\t\t+= phy-\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY)\t+= phy-rockchip-inno-dsidphy.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI)\t+= phy-rockchip-inno-hdmi.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)\t+= phy-rockchip-inno-usb2.o\n++obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB3)\t+= phy-rockchip-inno-usb3.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_PCIE)\t\t+= phy-rockchip-pcie.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)\t+= phy-rockchip-typec.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_USB)\t\t+= phy-rockchip-usb.o\n+--- a/Documentation/devicetree/bindings/soc/rockchip/grf.txt\n++++ b/Documentation/devicetree/bindings/soc/rockchip/grf.txt\n+@@ -45,6 +45,8 @@ Required Properties:\n+    - \"rockchip,rk3328-usb2phy-grf\", \"syscon\": for rk3328\n+ - compatible: USBGRF should be one of the following:\n+    - \"rockchip,rv1108-usbgrf\", \"syscon\": for rv1108\n++- compatible: USB3PHYGRF should be one of the following:\n++   - \"rockchip,u3phy-grf\", \"syscon\"\n+ - reg: physical base address of the controller and length of memory mapped\n+   region.\n+ \n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/0010-rk3328_refresh_usb3_nodes_k5.10.patch",
    "content": "From fabf22f2188e53ab30d97ad90f6df6ba5e523cae Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Tue, 9 Mar 2021 15:43:18 +0800\nSubject: [PATCH] rk3328_refresh_usb3_nodes_k5.10\n\n\tmodified:   target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n\tdeleted:    target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n\tmodified:   target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\n\tmodified:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n\tmodified:   target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n\tmodified:   target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n\tnew file:   target/linux/rockchip/patches-5.10/809-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n\trenamed:    target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch -> target/linux/rockchip/patches-5.10/810-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\n---\n ...add-compatible-to-NanoPi-R2S-etherne.patch |   2 +-\n ...usb3-controller-node-for-RK3328-SoCs.patch |  62 -----------\n ...dd-OF-node-for-USB-eth-on-NanoPi-R2S.patch |   6 +-\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |   2 +-\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |   4 +-\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch |   8 +-\n ...usb3-controller-node-for-RK3328-SoCs.patch | 102 ++++++++++++++++++\n ...kchip-enable-LAN-port-on-NanoPi-R2S.patch} |  47 +++++---\n 8 files changed, 143 insertions(+), 90 deletions(-)\n delete mode 100644 target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n create mode 100644 target/linux/rockchip/patches-5.10/809-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n rename target/linux/rockchip/patches-5.10/{102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch => 810-rockchip-enable-LAN-port-on-NanoPi-R2S.patch} (62%)\n\ndiff --git a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\nindex 897a42fea2..085dd392c9 100644\n--- a/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n+++ b/target/linux/rockchip/patches-5.10/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch\n@@ -14,7 +14,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>\n \n --- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n +++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n-@@ -134,6 +134,8 @@\n+@@ -138,6 +138,8 @@\n  \t\t#size-cells = <0>;\n  \n  \t\trtl8211e: ethernet-phy@1 {\ndiff --git a/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch b/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\ndeleted file mode 100644\nindex e8123ee025..0000000000\n--- a/target/linux/rockchip/patches-5.10/101-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n+++ /dev/null\n@@ -1,62 +0,0 @@\n-From: William Wu <william.wu@rock-chips.com>\n-\n-RK3328 has one USB 3.0 OTG controller which uses DWC_USB3\n-core's general architecture. It can act as static xHCI host\n-controller, static device controller, USB 3.0/2.0 OTG basing\n-on ID of USB3.0 PHY.\n-\n-Signed-off-by: William Wu <william.wu@rock-chips.com>\n-Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n-\n----\n-\n-NOTE: This binding still has issues. From the original thread:\n-\n-the rk3328 usb3-phy has an issue with detecting any plugin events\n-after a previous device got removed - see the inno-usb3-phy driver\n-in the vendor kernel.\n-\n-The current state is good-enough for enabling the USB3 attached LAN\n-port of the NanoPi R2S. However, it might explode depending on your\n-use-case. You've been warned.\n-\n----\n- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 27 ++++++++++++++++++++++++\n- 1 file changed, 27 insertions(+)\n-\n---- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n-+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n-@@ -984,6 +984,33 @@\n- \t\tstatus = \"disabled\";\n- \t};\n- \n-+\tusbdrd3: usb@ff600000 {\n-+\t\tcompatible = \"rockchip,rk3328-dwc3\", \"rockchip,rk3399-dwc3\";\n-+\t\tclocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>,\n-+\t\t\t <&cru ACLK_USB3OTG>;\n-+\t\tclock-names = \"ref_clk\", \"suspend_clk\",\n-+\t\t\t      \"bus_clk\";\n-+\t\t#address-cells = <2>;\n-+\t\t#size-cells = <2>;\n-+\t\tranges;\n-+\t\tstatus = \"disabled\";\n-+\n-+\t\tusbdrd_dwc3: dwc3@ff600000 {\n-+\t\t\tcompatible = \"snps,dwc3\";\n-+\t\t\treg = <0x0 0xff600000 0x0 0x100000>;\n-+\t\t\tinterrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;\n-+\t\t\tdr_mode = \"otg\";\n-+\t\t\tphy_type = \"utmi_wide\";\n-+\t\t\tsnps,dis_enblslpm_quirk;\n-+\t\t\tsnps,dis-u2-freeclk-exists-quirk;\n-+\t\t\tsnps,dis_u2_susphy_quirk;\n-+\t\t\tsnps,dis_u3_susphy_quirk;\n-+\t\t\tsnps,dis-del-phy-power-chg-quirk;\n-+\t\t\tsnps,dis-tx-ipgap-linecheck-quirk;\n-+\t\t\tstatus = \"disabled\";\n-+\t\t};\n-+\t};\n-+\n- \tgic: interrupt-controller@ff811000 {\n- \t\tcompatible = \"arm,gic-400\";\n- \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\nindex dfc71a2701..e932567d1f 100644\n--- a/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\n+++ b/target/linux/rockchip/patches-5.10/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\n@@ -14,9 +14,9 @@ Signed-off-by: David Bauer <mail@david-bauer.net>\n \n --- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n +++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n-@@ -403,4 +403,11 @@\n- &usbdrd_dwc3 {\n- \tdr_mode = \"host\";\n+@@ -378,4 +378,11 @@\n+\n+ &usb_host0_ohci {\n  \tstatus = \"okay\";\n +\n +\tusb-eth@2 {\ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nindex 28798047fd..7aa6bbc27e 100644\n--- a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -9,7 +9,7 @@ Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n \n --- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n +++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n-@@ -165,6 +165,10 @@\n+@@ -157,6 +157,10 @@\n  \t};\n  };\n  \ndiff --git a/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nindex ebdce52004..413b31bdd1 100644\n--- a/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n+++ b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -11,8 +11,8 @@ Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n \n --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n-@@ -1021,6 +1021,13 @@\n- \t\t};\n+@@ -995,6 +995,13 @@\n+\t\tstatus = \"disabled\";\n  \t};\n  \n +\tdfi: dfi@ff790000 {\ndiff --git a/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nindex d93b9a77b2..1c4963f69a 100644\n--- a/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n+++ b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -24,7 +24,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>\n  #include \"rk3328.dtsi\"\n  \n  / {\n-@@ -115,6 +116,72 @@\n+@@ -103,6 +104,72 @@\n  \t\tregulator-min-microvolt = <5000000>;\n  \t\tregulator-max-microvolt = <5000000>;\n  \t};\n@@ -97,7 +97,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>\n  };\n  \n  &cpu0 {\n-@@ -137,6 +204,10 @@\n+@@ -125,6 +192,10 @@\n  \tstatus = \"disabled\";\n  };\n  \n@@ -108,7 +108,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>\n  &gmac2io {\n  \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n  \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n-@@ -202,6 +273,7 @@\n+@@ -190,6 +261,7 @@\n  \t\t\t\tregulator-name = \"vdd_log\";\n  \t\t\t\tregulator-always-on;\n  \t\t\t\tregulator-boot-on;\n@@ -116,7 +116,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>\n  \t\t\t\tregulator-min-microvolt = <712500>;\n  \t\t\t\tregulator-max-microvolt = <1450000>;\n  \t\t\t\tregulator-ramp-delay = <12500>;\n-@@ -216,6 +288,7 @@\n+@@ -204,6 +276,7 @@\n  \t\t\t\tregulator-name = \"vdd_arm\";\n  \t\t\t\tregulator-always-on;\n  \t\t\t\tregulator-boot-on;\ndiff --git a/target/linux/rockchip/patches-5.10/809-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch b/target/linux/rockchip/patches-5.10/809-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\nnew file mode 100644\nindex 0000000000..452500eda6\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/809-dts-rockchip-add-usb3-controller-node-for-RK3328-SoCs.patch\n@@ -0,0 +1,102 @@\n+From: William Wu <william.wu@rock-chips.com>\n+\n+RK3328 has one USB 3.0 OTG controller which uses DWC_USB3\n+core's general architecture. It can act as static xHCI host\n+controller, static device controller, USB 3.0/2.0 OTG basing\n+on ID of USB3.0 PHY.\n+\n+Signed-off-by: William Wu <william.wu@rock-chips.com>\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 72 ++++++++++++++++++++++++\n+ 1 file changed, 72 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -864,6 +864,47 @@\n+ \t\t};\n+ \t};\n+ \n++\tusb3phy_grf: syscon@ff460000 {\n++\t\tcompatible = \"rockchip,usb3phy-grf\", \"syscon\";\n++\t\treg = <0x0 0xff460000 0x0 0x1000>;\n++\t};\n++\n++\tu3phy: usb3-phy@ff470000 {\n++\t\tcompatible = \"rockchip,rk3328-u3phy\";\n++\t\treg = <0x0 0xff470000 0x0 0x0>;\n++\t\trockchip,u3phygrf = <&usb3phy_grf>;\n++\t\trockchip,grf = <&grf>;\n++\t\tinterrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;\n++\t\tinterrupt-names = \"linestate\";\n++\t\tclocks = <&cru PCLK_USB3PHY_OTG>, <&cru PCLK_USB3PHY_PIPE>;\n++\t\tclock-names = \"u3phy-otg\", \"u3phy-pipe\";\n++\t\tresets = <&cru SRST_USB3PHY_U2>,\n++\t\t\t <&cru SRST_USB3PHY_U3>,\n++\t\t\t <&cru SRST_USB3PHY_PIPE>,\n++\t\t\t <&cru SRST_USB3OTG_UTMI>,\n++\t\t\t <&cru SRST_USB3PHY_OTG_P>,\n++\t\t\t <&cru SRST_USB3PHY_PIPE_P>;\n++\t\treset-names = \"u3phy-u2-por\", \"u3phy-u3-por\",\n++\t\t\t      \"u3phy-pipe-mac\", \"u3phy-utmi-mac\",\n++\t\t\t      \"u3phy-utmi-apb\", \"u3phy-pipe-apb\";\n++\t\t#address-cells = <2>;\n++\t\t#size-cells = <2>;\n++\t\tranges;\n++\t\tstatus = \"disabled\";\n++\n++\t\tu3phy_utmi: utmi@ff470000 {\n++\t\t\treg = <0x0 0xff470000 0x0 0x8000>;\n++\t\t\t#phy-cells = <0>;\n++\t\t\tstatus = \"disabled\";\n++\t\t};\n++\n++\t\tu3phy_pipe: pipe@ff478000 {\n++\t\t\treg = <0x0 0xff478000 0x0 0x8000>;\n++\t\t\t#phy-cells = <0>;\n++\t\t\tstatus = \"disabled\";\n++\t\t};\n++\t};\n++\n+ \tsdmmc: mmc@ff500000 {\n+ \t\tcompatible = \"rockchip,rk3328-dw-mshc\", \"rockchip,rk3288-dw-mshc\";\n+ \t\treg = <0x0 0xff500000 0x0 0x4000>;\n+@@ -1002,6 +1043,37 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\tusbdrd3: usb@ff600000 {\n++\t\tcompatible = \"rockchip,rk3328-dwc3\", \"rockchip,rk3399-dwc3\";\n++\t\tclocks = <&cru SCLK_USB3OTG_REF>, <&cru ACLK_USB3OTG>,\n++\t\t\t <&cru SCLK_USB3OTG_SUSPEND>;\n++\t\tclock-names = \"ref\", \"bus_early\",\n++\t\t\t      \"suspend\";\n++\t\t#address-cells = <2>;\n++\t\t#size-cells = <2>;\n++\t\tranges;\n++\t\tclock-ranges;\n++\t\tstatus = \"disabled\";\n++\n++\t\tusbdrd_dwc3: dwc3@ff600000 {\n++\t\t\tcompatible = \"snps,dwc3\";\n++\t\t\treg = <0x0 0xff600000 0x0 0x100000>;\n++\t\t\tinterrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;\n++\t\t\tdr_mode = \"otg\";\n++\t\t\tphys = <&u3phy_utmi>, <&u3phy_pipe>;\n++\t\t\tphy-names = \"usb2-phy\", \"usb3-phy\";\n++\t\t\tphy_type = \"utmi_wide\";\n++\t\t\tsnps,dis_enblslpm_quirk;\n++\t\t\tsnps,dis-u2-freeclk-exists-quirk;\n++\t\t\tsnps,dis_u2_susphy_quirk;\n++\t\t\tsnps,dis_u3_susphy_quirk;\n++\t\t\tsnps,dis-del-phy-power-chg-quirk;\n++\t\t\tsnps,dis-tx-ipgap-linecheck-quirk;\n++\t\t\tsnps,xhci-trb-ent-quirk;\n++\t\t\tstatus = \"disabled\";\n++\t\t};\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.10/810-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\nsimilarity index 62%\nrename from target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\nrename to target/linux/rockchip/patches-5.10/810-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\nindex 48e8d472c8..ebbf56745c 100644\n--- a/target/linux/rockchip/patches-5.10/102-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\n+++ b/target/linux/rockchip/patches-5.10/810-rockchip-enable-LAN-port-on-NanoPi-R2S.patch\n@@ -1,4 +1,4 @@\n-From 0fc3b9b7619c4878f73a6a7989863f0d1a3fd392 Mon Sep 17 00:00:00 2001\n+From 7cde8541d04e0ade5d126bdada3cf0c0429eaa99 Mon Sep 17 00:00:00 2001\n From: David Bauer <mail@david-bauer.net>\n Date: Fri, 10 Jul 2020 21:12:16 +0200\n Subject: [PATCH] rockchip: enabled LAN port on NanoPi R2S\n@@ -8,15 +8,16 @@ This is required for the USB3 attached LAN port to work.\n \n Signed-off-by: David Bauer <mail@david-bauer.net>\n ---\n- .../boot/dts/rockchip/rk3328-nanopi-r2s.dts   | 27 +++++++++++++++++++\n- 1 file changed, 27 insertions(+)\n+ .../boot/dts/rockchip/rk3328-nanopi-r2s.dts   | 40 +++++++++++++++++++\n+ 1 file changed, 40 insertions(+)\n \n --- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n +++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n-@@ -44,6 +44,18 @@\n+@@ -170,6 +170,18 @@\n+ \t\t\topp-microvolt-L1 = <1150000>;\n  \t\t};\n  \t};\n- \n++\n +\tvcc_rtl8153: vcc-rtl8153-regulator {\n +\t\tcompatible = \"regulator-fixed\";\n +\t\tgpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>;\n@@ -28,12 +29,11 @@ Signed-off-by: David Bauer <mail@david-bauer.net>\n +\t\tregulator-max-microvolt = <5000000>;\n +\t\tenable-active-high;\n +\t};\n-+\n- \tleds {\n- \t\tcompatible = \"gpio-leds\";\n- \t\tpinctrl-0 = <&lan_led_pin>,  <&sys_led_pin>, <&wan_led_pin>;\n-@@ -271,6 +283,12 @@\n- \t\t\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -401,6 +413,12 @@\n+ \t\t\trockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>;\n  \t\t};\n  \t};\n +\n@@ -44,12 +44,25 @@ Signed-off-by: David Bauer <mail@david-bauer.net>\n +\t};\n  };\n  \n- &io_domains {\n-@@ -377,3 +395,12 @@\n- &usb_host0_ohci {\n- \tstatus = \"okay\";\n+ &pwm2 {\n+@@ -463,3 +481,29 @@\n+ \t\trealtek,led-data = <0x87>;\n+ \t};\n  };\n +\n++&u3phy {\n++\tvbus-supply = <&vcc_rtl8153>;\n++\tstatus = \"okay\";\n++};\n++\n++&u3phy_utmi {\n++\tstatus = \"okay\";\n++};\n++\n++&u3phy_pipe {\n++\tstatus = \"okay\";\n++};\n++\n +&usbdrd3 {\n +\tstatus = \"okay\";\n +};\n@@ -57,4 +70,8 @@ Signed-off-by: David Bauer <mail@david-bauer.net>\n +&usbdrd_dwc3 {\n +\tdr_mode = \"host\";\n +\tstatus = \"okay\";\n++\n++\tsnps,dis-tx-ipgap-linecheck-quirk;\n++\tsnps,xhci-slow-suspend-quirk;\n++\tsnps,xhci-trb-ent-quirk;\n +};\n-- \n2.25.1\n\n"
  },
  {
    "path": "not_use_file/005-rockchip-rk3328-add-compatible-to-NanoPi-R2S-etherne.patch",
    "content": "From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\nFrom: David Bauer <mail@david-bauer.net>\nDate: Mon, 28 Sep 2020 22:54:52 +0200\nSubject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n\nThis adds the compatible property to the NanoPi R2S ethernet PHY node.\nOtherwise, the PHY might not be probed, as the PHY ID reads all 0xff\nwhen it is still in reset.\n\nSigned-off-by: David Bauer <mail@david-bauer.net>\n---\n arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n 1 file changed, 2 insertions(+)\n\n--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n@@ -134,6 +134,8 @@\n \t\t#size-cells = <0>;\n \n \t\trtl8211e: ethernet-phy@1 {\n+\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n+\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n \t\t\treg = <1>;\n \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n \t\t\tpinctrl-names = \"default\";\n"
  },
  {
    "path": "not_use_file/007-arm64-dts-rockchip-Add-RK3328-idle-state.patch",
    "content": "From 4f279f9fbca54464173240f7e73b145a136dfa1e Mon Sep 17 00:00:00 2001\nFrom: Robin Murphy <robin.murphy@arm.com>\nDate: Sun, 29 Dec 2019 20:16:17 +0000\nSubject: arm64: dts: rockchip: Add RK3328 idle state\n\nDownstream RK3328 DTBs describe a CPU idle state matching that present\non other SoCs like RK3399. This works with upstream Trusted Firmware-A\ntoo, so let's add it here.\n\nSigned-off-by: Robin Murphy <robin.murphy@arm.com>\nLink: https://lore.kernel.org/r/a8c83e705d387446ea8121516d410e38b2d9c57b.1577640736.git.robin.murphy@arm.com\nSigned-off-by: Heiko Stuebner <heiko@sntech.de>\n---\n arch/arm64/boot/dts/rockchip/rk3328.dtsi | 17 +++++++++++++++++\n 1 file changed, 17 insertions(+)\n\ndiff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\nindex 91306ebed4da2..c9ff1188bd7b1 100644\n--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n@@ -41,6 +41,7 @@\n \t\t\treg = <0x0 0x0>;\n \t\t\tclocks = <&cru ARMCLK>;\n \t\t\t#cooling-cells = <2>;\n+\t\t\tcpu-idle-states = <&CPU_SLEEP>;\n \t\t\tdynamic-power-coefficient = <120>;\n \t\t\tenable-method = \"psci\";\n \t\t\tnext-level-cache = <&l2>;\n@@ -53,6 +54,7 @@\n \t\t\treg = <0x0 0x1>;\n \t\t\tclocks = <&cru ARMCLK>;\n \t\t\t#cooling-cells = <2>;\n+\t\t\tcpu-idle-states = <&CPU_SLEEP>;\n \t\t\tdynamic-power-coefficient = <120>;\n \t\t\tenable-method = \"psci\";\n \t\t\tnext-level-cache = <&l2>;\n@@ -65,6 +67,7 @@\n \t\t\treg = <0x0 0x2>;\n \t\t\tclocks = <&cru ARMCLK>;\n \t\t\t#cooling-cells = <2>;\n+\t\t\tcpu-idle-states = <&CPU_SLEEP>;\n \t\t\tdynamic-power-coefficient = <120>;\n \t\t\tenable-method = \"psci\";\n \t\t\tnext-level-cache = <&l2>;\n@@ -77,12 +80,26 @@\n \t\t\treg = <0x0 0x3>;\n \t\t\tclocks = <&cru ARMCLK>;\n \t\t\t#cooling-cells = <2>;\n+\t\t\tcpu-idle-states = <&CPU_SLEEP>;\n \t\t\tdynamic-power-coefficient = <120>;\n \t\t\tenable-method = \"psci\";\n \t\t\tnext-level-cache = <&l2>;\n \t\t\toperating-points-v2 = <&cpu0_opp_table>;\n \t\t};\n \n+\t\tidle-states {\n+\t\t\tentry-method = \"psci\";\n+\n+\t\t\tCPU_SLEEP: cpu-sleep {\n+\t\t\t\tcompatible = \"arm,idle-state\";\n+\t\t\t\tlocal-timer-stop;\n+\t\t\t\tarm,psci-suspend-param = <0x0010000>;\n+\t\t\t\tentry-latency-us = <120>;\n+\t\t\t\texit-latency-us = <250>;\n+\t\t\t\tmin-residency-us = <900>;\n+\t\t\t};\n+\t\t};\n+\n \t\tl2: l2-cache0 {\n \t\t\tcompatible = \"cache\";\n \t\t};\n-- \ncgit 1.2.3-1.el7\n\n"
  },
  {
    "path": "not_use_file/01-prepare_package.sh",
    "content": "#!/bin/bash\nclear\n\n#Use 19.07 feed source\nrm -f ./feeds.conf.default\nwget https://raw.githubusercontent.com/openwrt/openwrt/openwrt-19.07/feeds.conf.default\nwget -P include/ https://raw.githubusercontent.com/openwrt/openwrt/openwrt-19.07/include/scons.mk\npatch -p1 < ../patches/001-tools-add-upx-ucl-support.patch\n\n#remove annoying snapshot tag\nsed -i 's,SNAPSHOT,,g' include/version.mk\nsed -i 's,snapshots,,g' package/base-files/image-config.in\n\n#use 02 \nsed -i 's/Os/O2/g' include/target.mk\nsed -i 's/O2/O2/g' ./rules.mk\n\n#Update feed\n./scripts/feeds update -a && ./scripts/feeds install -a\n\n#3328 add idle\nwget -P target/linux/rockchip/patches-5.4 https://github.com/project-openwrt/openwrt/raw/master/target/linux/rockchip/patches-5.4/005-arm64-dts-rockchip-Add-RK3328-idle-state.patch\n\n#IRQ\n#sed -i '/;;/i\\set_interface_core 8 \"ff160000\" \"ff160000.i2c\"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n#sed -i '/;;/i\\set_interface_core 1 \"ff150000\" \"ff150000.i2c\"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n\n# Disabed rk3328 ethernet tcp/udp offloading tx/rx\nsed -i '/;;/i\\ethtool -K eth0 rx off tx off && logger -t disable-offloading \"disabed rk3328 ethernet tcp/udp offloading tx/rx\"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n#irqbalance\n#sed -i 's/0/1/g' feeds/packages/utils/irqbalance/files/irqbalance.config\n\n#Over Clock to 1.6G\ncp -f ../patches/999-unlock-1608mhz-rk3328.patch ./target/linux/rockchip/patches-5.4/999-unlock-1608mhz-rk3328.patch\n#patch i2c0\ncp -f ../patches/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch ./target/linux/rockchip/patches-5.4/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch\n\n#luci network\n#patch -p1 < ../patches/luci_network-add-packet-steering.patch\n#patch jsonc\npatch -p1 < ../patches/use_json_object_new_int64.patch\n\n#dnsmasq aaaa filter\npatch -p1 < ../patches/dnsmasq-add-filter-aaaa-option.patch\npatch -p1 < ../patches/luci-add-filter-aaaa-option.patch\ncp -f ../patches/900-add-filter-aaaa-option.patch ./package/network/services/dnsmasq/patches/900-add-filter-aaaa-option.patch\nrm -rf ./package/base-files/files/etc/init.d/boot\nwget -P package/base-files/files/etc/init.d https://raw.githubusercontent.com/project-openwrt/openwrt/openwrt-18.06-k5.4/package/base-files/files/etc/init.d/boot\n\n#Fullcone-rollback fw3\nrm -rf ./package/network/config/firewall\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/config/firewall package/network/config/firewall\n#Fullcone-Patch Kernel\npushd target/linux/generic/hack-5.4\nwget https://github.com/coolsnowwolf/lede/raw/master/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\npopd\n#Fullcone-Patch FireWall enable fullcone\nmkdir package/network/config/firewall/patches\nwget -P package/network/config/firewall/patches/ https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/fullconenat.patch\n#Fullcone-Patch LuCI add fullcone button\npushd feeds/luci\nwget -O- https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/luci.patch | git apply\npopd\n#Fullcone-fullconenat module\ncp -rf ../patches/fullconenat ./package/network/fullconenat\n#Fullcone-end\n\n#SFE-kernel patch\npushd target/linux/generic/hack-5.4\nwget https://github.com/coolsnowwolf/lede/raw/master/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\npopd\n#SFE-Patch FireWall for enable SFE\npatch -p1 < ../patches/luci-app-firewall_add_sfe_switch.patch\n#SFE-sfe module\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shortcut-fe package/new/shortcut-fe\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/fast-classifier package/new/fast-classifier\ncp -f ../patches/shortcut-fe ./package/base-files/files/etc/init.d\n#SFE-end\n\n#Change Cryptodev-linux\nrm -rf ./package/kernel/cryptodev-linux\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/kernel/cryptodev-linux package/kernel/cryptodev-linux\n\n#update curl\nrm -rf ./package/network/utils/curl\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/curl package/network/utils/curl\n\n#replace lzo\n#svn co https://github.com/openwrt/packages/trunk/libs/lzo feeds/packages/libs/lzo\n#ln -sf ../../../feeds/packages/libs/lzo ./package/feeds/packages/lzo\n#replace node\n#rm -rf ./feeds/packages/lang/node\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node feeds/packages/lang/node\n#rm -rf ./feeds/packages/lang/node-arduino-firmata\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-arduino-firmata feeds/packages/lang/node-arduino-firmata\n#rm -rf ./feeds/packages/lang/node-cylon\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-cylon feeds/packages/lang/node-cylon\n#rm -rf ./feeds/packages/lang/node-hid\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-hid feeds/packages/lang/node-hid\n#rm -rf ./feeds/packages/lang/node-homebridge\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-homebridge feeds/packages/lang/node-homebridge\n#rm -rf ./feeds/packages/lang/node-serialport\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-serialport feeds/packages/lang/node-serialport\n#rm -rf ./feeds/packages/lang/node-serialport-bindings\n#svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-serialport-bindings feeds/packages/lang/node-serialport-bindings\n# Change libcap\n#rm -rf ./feeds/packages/libs/libcap/\n#svn co https://github.com/openwrt/packages/trunk/libs/libcap feeds/packages/libs/libcap\n\n# Change GCC\n#rm -rf ./feeds/packages/devel/gcc\n#svn co https://github.com/openwrt/packages/trunk/devel/gcc feeds/packages/devel/gcc\n\n# Change Golang\n#rm -rf ./feeds/packages/lang/golang\n#svn co https://github.com/openwrt/packages/trunk/lang/golang feeds/packages/lang/golang\n\n#add libs\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/nghttp2 package/libs/nghttp2\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libconfig package/libs/libconfig\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/utils/fuse package/utils/fuse\n\n#Additional package\n#arpbind\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-arpbind package/lean/luci-app-arpbind\n#AutoCore\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/autocore package/lean/autocore\nsvn co https://github.com/project-openwrt/packages/trunk/utils/coremark feeds/packages/utils/coremark\nln -sf ../../../feeds/packages/utils/coremark ./package/feeds/packages/coremark\nsed -i 's,default n,default y,g' feeds/packages/utils/coremark/Makefile\n\n#DDNS\n#rm -rf ./feeds/packages/net/ddns-scripts\n#rm -rf ./feeds/luci/applications/luci-app-ddns\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_aliyun package/lean/ddns-scripts_aliyun\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_dnspod package/lean/ddns-scripts_dnspod\n#svn co https://github.com/openwrt/packages/branches/openwrt-18.06/net/ddns-scripts feeds/packages/net/ddns-scripts\n#svn co https://github.com/openwrt/luci/branches/openwrt-18.06/applications/luci-app-ddns feeds/luci/applications/luci-app-ddns\n\n#定时重启\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-autoreboot package/lean/luci-app-autoreboot\n#AdGuard\n#git clone -b master --single-branch https://github.com/rufengsuixing/luci-app-adguardhome package/new/luci-app-adguardhome\n#Adbyby\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-adbyby-plus package/lean/luci-app-adbyby-plus\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/adbyby package/lean/coremark/adbyby\n#gost\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/ctcgfw/gost package/ctcgfw/gost\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/luci-app-gost package/ctcgfw/luci-app-gost\n\n#SSRP\n#svn co https://github.com/fw876/helloworld/trunk/luci-app-ssr-plus package/lean/luci-app-ssr-plus\n#svn co https://github.com/fw876/helloworld/trunk/tcping package/lean/tcping\n#svn co https://github.com/fw876/helloworld/trunk/naiveproxy package/lean/naiveproxy\nsvn co https://github.com/Mattraks/helloworld/branches/Preview/luci-app-ssr-plus package/lean/luci-app-ssr-plus\nsvn co https://github.com/Mattraks/helloworld/branches/Preview/naiveproxy package/lean/naiveproxy\nsvn co https://github.com/Mattraks/helloworld/branches/Preview/tcping package/lean/tcping\n\n\n#SSRP依赖\n#rm -rf ./feeds/packages/net/kcptun\n#rm -rf ./feeds/packages/net/shadowsocks-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shadowsocksr-libev package/lean/shadowsocksr-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/pdnsd-alt package/lean/pdnsd\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/kcptun package/lean/kcptun\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/srelay package/lean/srelay\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/microsocks package/lean/microsocks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/dns2socks package/lean/dns2socks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/redsocks2 package/lean/redsocks2\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/proxychains-ng package/lean/proxychains-ng\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ipt2socks package/lean/ipt2socks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/simple-obfs package/lean/simple-obfs\n#svn co https://github.com/coolsnowwolf/packages/trunk/net/shadowsocks-libev package/lean/shadowsocks-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/trojan package/lean/trojan\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/lean/tcpping package/lean/tcpping\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/xray package/lean/xray\n#patch -p1 < ../patches/ssr-plus-tls.patch\n\n#OpenClash\n#svn co https://github.com/vernesong/OpenClash/trunk/luci-app-openclash package/new/luci-app-openclash\n#luci-app-clash\n#git clone https://github.com/frainzy1477/luci-app-clash.git package/luci-app-clash\n#edge主题\n#git clone -b master --single-branch https://github.com/garypang13/luci-theme-edge package/new/luci-theme-edge\n#订阅转换\n#svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/subconverter package/new/subconverter\n#svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/jpcre2 package/new/jpcre2\n#svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/rapidjson package/new/rapidjson\n\n#清理内存\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-ramfree package/lean/luci-app-ramfree\n\n#打印机\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-usb-printer package/lean/luci-app-usb-printer\n\n#流量监视\ngit clone -b master --single-branch https://github.com/brvphoenix/wrtbwmon package/new/wrtbwmon\ngit clone -b master --single-branch https://github.com/brvphoenix/luci-app-wrtbwmon package/new/luci-app-wrtbwmon\n#流量监管\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-netdata package/lean/luci-app-netdata\n\n#SeverChan\n#git clone -b master --single-branch https://github.com/tty228/luci-app-serverchan package/new/luci-app-serverchan\n\n#iputils\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/iputils package/network/utils/iputils\n#SmartDNS\n#svn co https://github.com/pymumu/smartdns/trunk/package/openwrt package/new/smartdns/smartdns\n#svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ntlf9t/luci-app-smartdns package/new/smartdns/luci-app-smartdns\n\n#jd-dailybonus\ngit clone --depth 1 https://github.com/jerrykuku/node-request.git package/new/node-request\ngit clone --depth 1 https://github.com/jerrykuku/luci-app-jd-dailybonus.git package/new/luci-app-jd-dailybonus\n\n#frp\nrm -f ./feeds/luci/applications/luci-app-frps\nrm -f ./feeds/luci/applications/luci-app-frpc\nrm -rf ./feeds/packages/net/frp\nrm -f ./package/feeds/packages/frp\ngit clone https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps\ngit clone https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/frp package/feeds/packages/frp\n\n#onliner\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/luci-app-onliner package/ctcgfw/luci-app-onliner\n#filetransfer\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/lean/luci-app-filetransfer package/lean/luci-app-filetransfer\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/lean/luci-lib-fs package/lean/luci-lib-fs\n#tmate\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/tmate package/ctcgfw/tmate\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/msgpack-c package/ctcgfw/msgpack-c\n#\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-cpufreq package/lean/luci-app-cpufreq\npatch -p1 < ../patches/luci-app-freq.patch\n#beardropper\ngit clone https://github.com/NateLol/luci-app-beardropper package/luci-app-beardropper\n\n#trojan server\n#svn co https://github.com/Lienol/openwrt-package/trunk/lienol/luci-app-trojan-server package/luci-app-trojan-server\n#transmission-web-control\n#rm -rf ./feeds/packages/net/transmission*\n#rm -rf ./feeds/luci/applications/luci-app-transmission/\n#svn co https://github.com/coolsnowwolf/packages/trunk/net/transmission feeds/packages/net/transmission\n#svn co https://github.com/coolsnowwolf/packages/trunk/net/transmission-web-control feeds/packages/net/transmission-web-control\n#svn co https://github.com/coolsnowwolf/luci/trunk/applications/luci-app-transmission feeds/luci/applications/luci-app-transmission\n#Dockerman\n#git clone https://github.com/lisaac/luci-app-dockerman.git package/lean/luci-app-dockerman\n#git clone https://github.com/lisaac/luci-lib-docker package/lean/luci-lib-docker\n#svn co https://github.com/openwrt/packages/trunk/utils/docker-ce package/lean/docker-ce\n#svn co https://github.com/openwrt/packages/trunk/utils/cgroupfs-mount package/lean/cgroupfs-mount\n#svn co https://github.com/openwrt/packages/trunk/utils/libnetwork package/lean/libnetwork\n#svn co https://github.com/openwrt/packages/trunk/utils/tini package/lean/tini\n#svn co https://github.com/openwrt/packages/trunk/utils/containerd package/lean/containerd\n#svn co https://github.com/openwrt/packages/trunk/utils/runc package/lean/runc\n#svn co https://github.com/openwrt/packages/trunk/lang/golang package/lang/golang\n#multiwan support\n#svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-syncdial package/lean/luci-app-syncdial\n#rm -rf feeds/packages/net/mwan3\n#rm -rf feeds/luci/applications/luci-app-mwan3\n#svn co https://github.com/coolsnowwolf/luci/trunk/applications/luci-app-mwan3 feeds/luci/applications/luci-app-mwan3\n#svn co https://github.com/coolsnowwolf/packages/trunk/net/mwan3 feeds/packages/net/mwan3\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-mwan3helper package/lean/luci-app-mwan3helper\n#Zerotier\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-zerotier package/lean/luci-app-zerotier\n#OLED display\ngit clone https://github.com/natelol/luci-app-oled package/natelol/luci-app-oled\n\n#fix some depends, useless\n#svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/utils/fuse package/utils/fuse\n#svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/services/samba36 package/network/services/samba36\n#svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libconfig package/libs/libconfig\n#svn co https://github.com/openwrt/packages/trunk/libs/nghttp2 package/libs/nghttp2\n#svn co https://github.com/openwrt/packages/trunk/libs/libcap-ng package/libs/libcap-ng\n#rm -rf ./feeds/packages/utils/collectd\n#svn co https://github.com/openwrt/packages/trunk/utils/collectd feeds/packages/utils/collectd\n\n#最大连接\nsed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf\n#lean default-settings\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/default-settings package/lean/default-settings\npatch -p1 < ../patches/zzz.patch\n\necho -e '\\nQuintus Build@'$(date \"+%Y.%m.%d\")'\\n'  >> package/base-files/files/etc/banner\nsed -i '/DISTRIB_REVISION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_REVISION='$(date \"+%Y.%m.%d\")'\" >> package/base-files/files/etc/openwrt_release\nsed -i '/DISTRIB_DESCRIPTION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_DESCRIPTION='Quintus Build@$(date \"+%Y.%m.%d\")'\" >> package/base-files/files/etc/openwrt_release\nsed -i '/luciversion/d' feeds/luci/modules/luci-base/luasrc/version.lua\necho 'luciversion = \"Quintus@🇨🇦🇹🇼🇺🇸🇭🇰\"' >> feeds/luci/modules/luci-base/luasrc/version.lua\n\n#crypto\necho '\nCONFIG_ARM64_CRYPTO=y\nCONFIG_CRYPTO_AES_ARM64=y\nCONFIG_CRYPTO_AES_ARM64_BS=y\nCONFIG_CRYPTO_AES_ARM64_CE=y\nCONFIG_CRYPTO_AES_ARM64_CE_BLK=y\nCONFIG_CRYPTO_AES_ARM64_CE_CCM=y\nCONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\nCONFIG_CRYPTO_CHACHA20=y\nCONFIG_CRYPTO_CHACHA20_NEON=y\nCONFIG_CRYPTO_CRYPTD=y\nCONFIG_CRYPTO_GF128MUL=y\nCONFIG_CRYPTO_GHASH_ARM64_CE=y\nCONFIG_CRYPTO_SHA1=y\nCONFIG_CRYPTO_SHA1_ARM64_CE=y\nCONFIG_CRYPTO_SHA256_ARM64=y\nCONFIG_CRYPTO_SHA2_ARM64_CE=y\n# CONFIG_CRYPTO_SHA3_ARM64 is not set\nCONFIG_CRYPTO_SHA512_ARM64=y\n# CONFIG_CRYPTO_SHA512_ARM64_CE is not set\nCONFIG_CRYPTO_SIMD=y\n# CONFIG_CRYPTO_SM3_ARM64_CE is not set\n# CONFIG_CRYPTO_SM4_ARM64_CE is not set\n' >> ./target/linux/rockchip/armv8/config-5.4\n\n#生成默认配置及缓存\nrm -rf .config\n#修正架构\n#sed -i \"s,boardinfo.system,'ARMv8',g\" feeds/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js\nchmod -R 755 ./\n\nexit 0\n"
  },
  {
    "path": "not_use_file/02-convert_translation.sh",
    "content": "#!/bin/bash\n# [CTCGFW]Project-OpenWrt\n# Use it under GPLv3, please.\n# --------------------------------------------------------\n# Convert translation files zh-cn to zh_Hans\n# The script is still in testing, welcome to report bugs.\n\npo_file=\"$({ find |grep -E \"[a-z0-9]+\\.zh\\-cn.+po\"; } 2>\"/dev/null\")\"\nfor a in ${po_file}\ndo\n\t[ -n \"$(grep \"Language: zh_CN\" \"$a\")\" ] && sed -i \"s/Language: zh_CN/Language: zh_Hans/g\" \"$a\"\n\tpo_new_file=\"$(echo -e \"$a\"|sed \"s/zh-cn/zh_Hans/g\")\"\n\tmv \"$a\" \"${po_new_file}\" 2>\"/dev/null\"\ndone\n\npo_file2=\"$({ find |grep \"/zh-cn/\" |grep \"\\.po\"; } 2>\"/dev/null\")\"\nfor b in ${po_file2}\ndo\n\t[ -n \"$(grep \"Language: zh_CN\" \"$b\")\" ] && sed -i \"s/Language: zh_CN/Language: zh_Hans/g\" \"$b\"\n\tpo_new_file2=\"$(echo -e \"$b\"|sed \"s/zh-cn/zh_Hans/g\")\"\n\tmv \"$b\" \"${po_new_file2}\" 2>\"/dev/null\"\ndone\n\nlmo_file=\"$({ find |grep -E \"[a-z0-9]+\\.zh_Hans.+lmo\"; } 2>\"/dev/null\")\"\nfor c in ${lmo_file}\ndo\n\tlmo_new_file=\"$(echo -e \"$c\"|sed \"s/zh_Hans/zh-cn/g\")\"\n\tmv \"$c\" \"${lmo_new_file}\" 2>\"/dev/null\"\ndone\n\nlmo_file2=\"$({ find |grep \"/zh_Hans/\" |grep \"\\.lmo\"; } 2>\"/dev/null\")\"\nfor d in ${lmo_file2}\ndo\n\tlmo_new_file2=\"$(echo -e \"$d\"|sed \"s/zh_Hans/zh-cn/g\")\"\n\tmv \"$d\" \"${lmo_new_file2}\" 2>\"/dev/null\"\ndone\n\npo_dir=\"$({ find |grep \"/zh-cn\" |sed \"/\\.po/d\" |sed \"/\\.lmo/d\"; } 2>\"/dev/null\")\"\nfor e in ${po_dir}\ndo\n\tpo_new_dir=\"$(echo -e \"$e\"|sed \"s/zh-cn/zh_Hans/g\")\"\n\tmv \"$e\" \"${po_new_dir}\" 2>\"/dev/null\"\ndone\n\nmakefile_file=\"$({ find|grep Makefile |sed \"/Makefile./d\"; } 2>\"/dev/null\")\"\nfor f in ${makefile_file}\ndo\n\t[ -n \"$(grep \"zh-cn\" \"$f\")\" ] && sed -i \"s/zh-cn/zh_Hans/g\" \"$f\"\n\t[ -n \"$(grep \"zh_Hans.lmo\" \"$f\")\" ] && sed -i \"s/zh_Hans.lmo/zh-cn.lmo/g\" \"$f\"\ndone\nexit 0\n"
  },
  {
    "path": "not_use_file/1002-add-fullconenat-and-shortcut-fe-support.patch",
    "content": "From 1efde71dce5d30c64579afbfab265a4a3cf22cb3 Mon Sep 17 00:00:00 2001\nFrom: Quintus Chu <noreply@github.com>\nDate: Sat, 2 Jan 2021 03:59:23 +0800\nSubject: [PATCH] Add fullconenat and shortcut-fe support \tnew file:  \n package/network/config/firewall/patches/fullconenat.patch \tnew file:  \n target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\n \tnew file:  \n target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\n\n---\n .../config/firewall/patches/fullconenat.patch |  63 ++++\n ...k-events-support-multiple-registrant.patch | 291 ++++++++++++++++++\n ...-linux-kernel-to-support-shortcut-fe.patch | 253 +++++++++++++++\n 3 files changed, 607 insertions(+)\n create mode 100644 package/network/config/firewall/patches/fullconenat.patch\n create mode 100644 target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\n\ndiff --git a/package/network/config/firewall/patches/fullconenat.patch b/package/network/config/firewall/patches/fullconenat.patch\nnew file mode 100644\nindex 0000000000..d69e7129ec\n--- /dev/null\n+++ b/package/network/config/firewall/patches/fullconenat.patch\n@@ -0,0 +1,63 @@\n+index 85a3750..9fac9b1 100644\n+--- a/defaults.c\n++++ b/defaults.c\n+@@ -46,7 +46,9 @@ const struct fw3_option fw3_flag_opts[] = {\n+ \tFW3_OPT(\"synflood_protect\",    bool,     defaults, syn_flood),\n+ \tFW3_OPT(\"synflood_rate\",       limit,    defaults, syn_flood_rate),\n+ \tFW3_OPT(\"synflood_burst\",      int,      defaults, syn_flood_rate.burst),\n+-\n++\t\n++\tFW3_OPT(\"fullcone\",           bool,     defaults, fullcone),\n++\t\n+ \tFW3_OPT(\"tcp_syncookies\",      bool,     defaults, tcp_syncookies),\n+ \tFW3_OPT(\"tcp_ecn\",             int,      defaults, tcp_ecn),\n+ \tFW3_OPT(\"tcp_window_scaling\",  bool,     defaults, tcp_window_scaling),\n+diff --git a/options.h b/options.h\n+index 6edd174..c02eb97 100644\n+--- a/options.h\n++++ b/options.h\n+@@ -267,6 +267,7 @@ struct fw3_defaults\n+ \tbool drop_invalid;\n+ \n+ \tbool syn_flood;\n++\tbool fullcone;\n+ \tstruct fw3_limit syn_flood_rate;\n+ \n+ \tbool tcp_syncookies;\n+diff --git a/zones.c b/zones.c\n+index 2aa7473..57eead0 100644\n+--- a/zones.c\n++++ b/zones.c\n+@@ -627,6 +627,7 @@ print_zone_rule(struct fw3_ipt_handle *h\n+ \tstruct fw3_address *msrc;\n+ \tstruct fw3_address *mdest;\n+ \tstruct fw3_ipt_rule *r;\n++\tstruct fw3_defaults *defs = &state->defaults;\n+ \n+ \tif (!fw3_is_family(zone, handle->family))\n+ \t\treturn;\n+@@ -712,8 +713,22 @@ print_zone_rule(struct fw3_ipt_handle *h\n+ \t\t\t\t{\n+ \t\t\t\t\tr = fw3_ipt_rule_new(handle);\n+ \t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n+-\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n+-\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t/*FIXME: Workaround for FULLCONE-NAT*/\n++\t\t\t\t\tif(defs->fullcone)\n++\t\t\t\t\t{\n++\t\t\t\t\t\twarn(\"%s will enable FULLCONE-NAT\", zone->name);\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t\tr = fw3_ipt_rule_new(handle);\n++\t\t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_prerouting\", zone->name);\n++\t\t\t\t\t}\n++\t\t\t\t\telse\n++\t\t\t\t\t{\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t}\n+ \t\t\t\t}\n+ \t\t\t}\n+ \t\t}\ndiff --git a/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..c4b6b03262\n--- /dev/null\n+++ b/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -148,6 +148,14 @@ config NF_CONNTRACK_RTCACHE\n+ \t  To compile it as a module, choose M here.  If unsure, say N.\n+ \t  The module will be called nf_conntrack_rtcache.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2523,6 +2523,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -116,7 +119,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -171,10 +202,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -225,6 +298,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -257,6 +331,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -277,8 +358,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -292,6 +380,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -677,13 +677,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3502,9 +3509,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\nnew file mode 100644\nindex 0000000000..04a3839233\n--- /dev/null\n+++ b/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\n@@ -0,0 +1,253 @@\n+--- a/include/linux/if_bridge.h\n++++ b/include/linux/if_bridge.h\n+@@ -52,6 +52,9 @@ struct br_ip_list {\n+ \n+ extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *));\n+ \n++extern void br_dev_update_stats(struct net_device *dev,\n++\t\t\t\tstruct rtnl_link_stats64 *nlstats);\n++\n+ #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)\n+ int br_multicast_list_adjacent(struct net_device *dev,\n+ \t\t\t       struct list_head *br_ip_list);\n+--- a/include/linux/skbuff.h\n++++ b/include/linux/skbuff.h\n+@@ -838,6 +838,10 @@ struct sk_buff {\n+ #endif\n+ \t__u8\t\t\tgro_skip:1;\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++\t__u8\t\t\tfast_forwarded:1;\n++#endif\n++\n+ #ifdef CONFIG_NET_SCHED\n+ \t__u16\t\t\ttc_index;\t/* traffic control index */\n+ #endif\n+--- a/include/linux/timer.h\n++++ b/include/linux/timer.h\n+@@ -18,6 +18,10 @@ struct timer_list {\n+ \tvoid\t\t\t(*function)(struct timer_list *);\n+ \tu32\t\t\tflags;\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++\tunsigned long\t\tcust_data;\n++#endif\n++\n+ #ifdef CONFIG_LOCKDEP\n+ \tstruct lockdep_map\tlockdep_map;\n+ #endif\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -75,6 +75,8 @@ struct nf_ct_event {\n+ #ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n+ extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb);\n+ #else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+--- a/net/bridge/br_if.c\n++++ b/net/bridge/br_if.c\n+@@ -746,6 +746,28 @@ void br_port_flags_change(struct net_bri\n+ \t\tbr_recalculate_neigh_suppress_enabled(br);\n+ }\n+ \n++void br_dev_update_stats(struct net_device *dev,\n++\t\t\t struct rtnl_link_stats64 *nlstats)\n++{\n++\tstruct net_bridge *br;\n++\tstruct pcpu_sw_netstats *stats;\n++\n++\t/* Is this a bridge? */\n++\tif (!(dev->priv_flags & IFF_EBRIDGE))\n++\t\treturn;\n++\n++\tbr = netdev_priv(dev);\n++\tstats = this_cpu_ptr(br->stats);\n++\n++\tu64_stats_update_begin(&stats->syncp);\n++\tstats->rx_packets += nlstats->rx_packets;\n++\tstats->rx_bytes += nlstats->rx_bytes;\n++\tstats->tx_packets += nlstats->tx_packets;\n++\tstats->tx_bytes += nlstats->tx_bytes;\n++\tu64_stats_update_end(&stats->syncp);\n++}\n++EXPORT_SYMBOL_GPL(br_dev_update_stats);\n++\n+ bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag)\n+ {\n+ \tstruct net_bridge_port *p;\n+--- a/net/core/dev.c\n++++ b/net/core/dev.c\n+@@ -3199,9 +3199,17 @@ static int xmit_one(struct sk_buff *skb,\n+ \tif (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all))\n+ #endif\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++\t/* If this skb has been fast forwarded then we don't want it to\n++\t * go to any taps (by definition we're trying to bypass them).\n++\t */\n++\tif (!skb->fast_forwarded) {\n++#endif\n+ \tif (dev_nit_active(dev))\n+ \t\tdev_queue_xmit_nit(skb, dev);\n+-\n++#ifdef CONFIG_SHORTCUT_FE\n++\t}\n++#endif\n+ #ifdef CONFIG_ETHERNET_PACKET_MANGLE\n+ \tif (!dev->eth_mangle_tx ||\n+ \t    (skb = dev->eth_mangle_tx(dev, skb)) != NULL)\n+@@ -4695,6 +4703,11 @@ void netdev_rx_handler_unregister(struct\n+ }\n+ EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++int (*athrs_fast_nat_recv)(struct sk_buff *skb) __rcu __read_mostly;\n++EXPORT_SYMBOL_GPL(athrs_fast_nat_recv);\n++#endif\n++\n+ /*\n+  * Limit the use of PFMEMALLOC reserves to those protocols that implement\n+  * the special handling of PFMEMALLOC skbs.\n+@@ -4745,6 +4758,10 @@ static int __netif_receive_skb_core(stru\n+ \tint ret = NET_RX_DROP;\n+ \t__be16 type;\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++\tint (*fast_recv)(struct sk_buff *skb);\n++#endif\n++\n+ \tnet_timestamp_check(!netdev_tstamp_prequeue, skb);\n+ \n+ \ttrace_netif_receive_skb(skb);\n+@@ -4784,6 +4801,16 @@ another_round:\n+ \t\t\tgoto out;\n+ \t}\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++\tfast_recv = rcu_dereference(athrs_fast_nat_recv);\n++\tif (fast_recv) {\n++\t\tif (fast_recv(skb)) {\n++\t\t\tret = NET_RX_SUCCESS;\n++\t\t\tgoto out;\n++\t\t}\n++\t}\n++#endif\n++\n+ \tif (skb_skip_tc_classify(skb))\n+ \t\tgoto skip_classify;\n+ \n+--- a/net/Kconfig\n++++ b/net/Kconfig\n+@@ -473,3 +473,6 @@ config HAVE_CBPF_JIT\n+ # Extended BPF JIT (eBPF)\n+ config HAVE_EBPF_JIT\n+ \tbool\n++\n++config SHORTCUT_FE\n++\tbool \"Enables kernel network stack path for Shortcut  Forwarding Engine\n+--- a/net/netfilter/nf_conntrack_proto_tcp.c\n++++ b/net/netfilter/nf_conntrack_proto_tcp.c\n+@@ -34,11 +34,19 @@\n+ /* Do not check the TCP window for incoming packets  */\n+ static int nf_ct_tcp_no_window_check __read_mostly = 1;\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++EXPORT_SYMBOL_GPL(nf_ct_tcp_no_window_check);\n++#endif\n++\n+ /* \"Be conservative in what you do,\n+     be liberal in what you accept from others.\"\n+     If it's non-zero, we mark only out of window RST segments as INVALID. */\n+ static int nf_ct_tcp_be_liberal __read_mostly = 0;\n+ \n++#ifdef CONFIG_SHORTCUT_FE\n++EXPORT_SYMBOL_GPL(nf_ct_tcp_be_liberal);\n++#endif\n++\n+ /* If it is set to zero, we disable picking up already established\n+    connections. */\n+ static int nf_ct_tcp_loose __read_mostly = 1;\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -158,7 +158,11 @@ int nf_conntrack_eventmask_report(unsign\n+ \n+ \trcu_read_lock();\n+ \tnotify = rcu_dereference(net->ct.nf_conntrack_event_cb);\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tif (!notify && !rcu_dereference_raw(net->ct.nf_conntrack_chain.head))\n++#else\n+ \tif (!notify)\n++#endif\n+ \t\tgoto out_unlock;\n+ \n+ \te = nf_ct_ecache_find(ct);\n+@@ -177,7 +181,14 @@ int nf_conntrack_eventmask_report(unsign\n+ \t\tif (!((eventmask | missed) & e->ctmask))\n+ \t\t\tgoto out_unlock;\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\t\tret = atomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\teventmask | missed, &item);\n++\t\tif (notify)\n++\t\t\tret = notify->fcn(eventmask | missed, &item);\n++#else\n+ \t\tret = notify->fcn(eventmask | missed, &item);\n++#endif\n+ \t\tif (unlikely(ret < 0 || missed)) {\n+ \t\t\tspin_lock_bh(&ct->lock);\n+ \t\t\tif (ret < 0) {\n+@@ -259,7 +270,11 @@ void nf_ct_deliver_cached_events(struct\n+ \n+ \trcu_read_lock();\n+ \tnotify = rcu_dereference(net->ct.nf_conntrack_event_cb);\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tif ((notify == NULL) && !rcu_dereference_raw(net->ct.nf_conntrack_chain.head))\n++#else\n+ \tif (notify == NULL)\n++#endif\n+ \t\tgoto out_unlock;\n+ \n+ \te = nf_ct_ecache_find(ct);\n+@@ -283,7 +298,15 @@ void nf_ct_deliver_cached_events(struct\n+ \titem.portid = 0;\n+ \titem.report = 0;\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tret = atomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\tif (notify != NULL)\n++\t\tret = notify->fcn(events | missed, &item);\n++#else\n+ \tret = notify->fcn(events | missed, &item);\n++#endif\n+ \n+ \tif (likely(ret == 0 && !missed))\n+ \t\tgoto out_unlock;\n+@@ -337,6 +360,11 @@ int nf_conntrack_register_notifier(struc\n+ {\n+         return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n+ }\n++int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++EXPORT_SYMBOL_GPL(nf_conntrack_register_chain_notifier);\n+ #else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+@@ -366,6 +394,11 @@ int nf_conntrack_unregister_notifier(str\n+ {\n+ \treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n+ }\n++int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++EXPORT_SYMBOL_GPL(nf_conntrack_unregister_chain_notifier);\n+ #else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n-- \n2.28.0\n\n"
  },
  {
    "path": "not_use_file/1002-luci-app-firewall_add_sfe_switch.patch",
    "content": "From: QiuSimons\ndiff --git a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n--- a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n+++ b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n@@ -7,6 +7,58 @@\n 'require firewall';\n 'require tools.firewall as fwtool';\n 'require tools.widgets as widgets';\n+var callInitList, callInitAction, sfe;\n+\n+callInitList = rpc.declare({\n+    object: 'luci',\n+    method: 'getInitList',\n+    params: ['name'],\n+    expect: {\n+        '': {}\n+    },\n+    filter: function (res) {\n+        for (var k in res)\n+            return +res[k].enabled;\n+        return null;\n+    }\n+});\n+callInitAction = rpc.declare({\n+    object: 'luci',\n+    method: 'setInitAction',\n+    params: ['name', 'action'],\n+    expect: {\n+        result: false\n+    }\n+});\n+sfe = form.DummyValue.extend({\n+    renderWidget: function (section_id, option_id, cfgvalue) {\n+        return E([], [this.sfe_support ? E('button', {\n+            'class': 'cbi-button cbi-button-save',\n+            'click': function () {\n+                this.disabled = true;\n+                this.blur();\n+                this.classList.add('spinning');\n+                callInitAction('shortcut-fe', 'stop');\n+                callInitAction('shortcut-fe', 'disable').then(L.bind(function () {\n+                    this.classList.remove('spinning');\n+                    location.reload();\n+                }, this));\n+            }\n+        }, _('Enabled')) : E('button', {\n+            'class': 'cbi-button cbi-button-reset',\n+            'click': function () {\n+                this.disabled = true;\n+                this.blur();\n+                this.classList.add('spinning');\n+                callInitAction('shortcut-fe', 'start');\n+                callInitAction('shortcut-fe', 'enable').then(L.bind(function () {\n+                    this.classList.remove('spinning');\n+                    location.reload();\n+                }, this));\n+            }\n+        }, _('Disabled'))]);\n+    },\n+});\n \n return view.extend({\n \tcallConntrackHelpers: rpc.declare({\n@@ -18,7 +70,8 @@\n \tload: function() {\n \t\treturn Promise.all([\n \t\t\tthis.callConntrackHelpers(),\n-\t\t\tfirewall.getDefaults()\n+\t\t\tfirewall.getDefaults(),\n+\t\t\tcallInitList('shortcut-fe')\n \t\t]);\n \t},\n \n@@ -32,6 +85,7 @@\n \trenderZones: function(data) {\n \t\tvar ctHelpers = data[0],\n \t\t    fwDefaults = data[1],\n+\t\t\tsfe_support = data[2],\n \t\t    m, s, o, inp, out;\n \n \t\tm = new form.Map('firewall', _('Firewall - Zone Settings'),\n@@ -58,6 +125,16 @@\n \n \t\t/* Netfilter flow offload support */\n \n+\t\ts = m.section(form.TypedSection, 'defaults', _('Routing/NAT Offloading'), _('SFE based offloading for Routing/NAT. Restart recommended.'));\n+        s.anonymous = true;\n+        s.addremove = false;\n+        o = s.option(sfe, _('SFE flow offloading'),\n+\t\t\t_('SFE flow offloading'));\n+        o.sfe_support = sfe_support;\n+        o.load = function (section_id) {\n+            return (uci.get('system', 'shortcut-fe', 'enabled') != 0) ? '1' : '0';\n+        };\n+\n \t\tif (L.hasSystemFeature('offloading')) {\n \t\t\ts = m.section(form.TypedSection, 'defaults', _('Routing/NAT Offloading'),\n \t\t\t\t_('Experimental feature. Not fully compatible with QoS/SQM.'));\n"
  },
  {
    "path": "not_use_file/1003-shortcut-fe.patch",
    "content": "From 3f2af23a85a931de429ddf632cbd64c470401d8b Mon Sep 17 00:00:00 2001\nFrom: Quintus Chu <ardanzhu@gmail.com>\nDate: Tue, 29 Dec 2020 05:45:01 +0800\nSubject: [PATCH] \tshortcut-fe \n target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\n \n target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch\n\n---\n .../base-files/files/etc/init.d/shortcut-fe   | 52 +++++++++++++++++++\n 1 file changed, 52 insertions(+)\n create mode 100644 package/base-files/files/etc/init.d/shortcut-fe\n\ndiff --git a/package/base-files/files/etc/init.d/shortcut-fe b/package/base-files/files/etc/init.d/shortcut-fe\nnew file mode 100644\nindex 0000000000..83f628bc58\n--- /dev/null\n+++ b/package/base-files/files/etc/init.d/shortcut-fe\n@@ -0,0 +1,52 @@\n+#!/bin/sh /etc/rc.common\n+#\n+# Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.\n+# Permission to use, copy, modify, and/or distribute this software for\n+# any purpose with or without fee is hereby granted, provided that the\n+# above copyright notice and this permission notice appear in all copies.\n+# THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT\n+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n+#\n+\n+#SFE connection manager has a lower priority, it should be started after other connection manager\n+#to detect the existence of connection manager with higher priority\n+START=90\n+\n+have_cm() {\n+\t[ -d \"/sys/kernel/debug/ecm\" ] && echo 1 && return\n+\n+\techo 0\n+}\n+\n+#load shortcut-fe connection manager\n+load_sfe_cm() {\n+\tlocal kernel_version=$(uname -r)\n+\n+\t#shortcut-fe-drv.ko is not needed because other connection manager is not enabled\n+\t[ -d \"/sys/module/shortcut_fe_drv\" ] && rmmod shortcut_fe_drv\n+\n+\t[ -e \"/lib/modules/$kernel_version/fast-classifier.ko\" ] && {\n+\t\t[ -d /sys/module/fast_classifier ] || insmod /lib/modules/$kernel_version/fast-classifier.ko && return\n+\t}\n+\n+\t[ -e \"/lib/modules/$kernel_version/shortcut-fe-cm.ko\" ] && {\n+\t\t[ -d /sys/module/shortcut_fe_cm ] || insmod /lib/modules/$kernel_version/shortcut-fe-cm.ko && return\n+\t}\n+}\n+\n+start() {\n+\t[ \"$(have_cm)\" = \"1\" ] || load_sfe_cm\n+\techo 1 > /sys/fast_classifier/skip_to_bridge_ingress\n+\tsfe_ipv6=$(cat /sys/sfe_ipv6/debug_dev)\n+\t[ ! -f /dev/sfe_ipv6 ] && mknod /dev/sfe_ipv6 c $sfe_ipv6 0\n+}\n+\n+stop() {\n+\t[ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm\n+\t[ -d /sys/module/fast_classifier ] && rmmod fast_classifier\n+}\n-- \n2.17.1\n\n"
  },
  {
    "path": "not_use_file/1004-fullconenat.patch",
    "content": "From ad32f898937d6491eab35ef72b97f323e8fb256e Mon Sep 17 00:00:00 2001\nFrom: Quintus Chu <31897806+ardanzhu@users.noreply.github.com>\nDate: Wed, 30 Dec 2020 04:19:03 +0800\nSubject: [PATCH] fullconenat\n\n---\n package/network/fullconenat/Makefile          | 78 +++++++++++++++++++\n package/network/fullconenat/files/Makefile    | 11 +++\n .../fullconenat/patches/000-printk.patch      | 17 ++++\n 3 files changed, 106 insertions(+)\n create mode 100755 package/network/fullconenat/Makefile\n create mode 100755 package/network/fullconenat/files/Makefile\n create mode 100755 package/network/fullconenat/patches/000-printk.patch\n\ndiff --git a/package/network/fullconenat/Makefile b/package/network/fullconenat/Makefile\nnew file mode 100755\nindex 0000000..e4f65a9\n--- /dev/null\n+++ b/package/network/fullconenat/Makefile\n@@ -0,0 +1,78 @@\n+#\n+# Copyright (C) 2018 Chion Tang <tech@chionlab.moe>\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+\n+include $(TOPDIR)/rules.mk\n+include $(INCLUDE_DIR)/kernel.mk\n+\n+PKG_NAME:=fullconenat\n+PKG_RELEASE:=1\n+\n+PKG_SOURCE_DATE:=2020-05-09\n+PKG_SOURCE_PROTO:=git\n+PKG_SOURCE_URL:=https://github.com/llccd/netfilter-full-cone-nat.git\n+PKG_SOURCE_VERSION:=cc30ca6031ef5dca5bdb10cfd5ffc0c79425af9e\n+\n+PKG_LICENSE:=GPL-2.0\n+PKG_LICENSE_FILES:=LICENSE\n+\n+include $(INCLUDE_DIR)/package.mk\n+\n+define Package/iptables-mod-fullconenat\n+  SUBMENU:=Firewall\n+  SECTION:=net\n+  CATEGORY:=Network\n+  TITLE:=FULLCONENAT iptables extension\n+  DEPENDS:=iptables +kmod-ipt-fullconenat\n+  MAINTAINER:=Chion Tang <tech@chionlab.moe>\n+endef\n+\n+define Package/iptables-mod-fullconenat/install\n+\t$(INSTALL_DIR) $(1)/usr/lib/iptables\n+\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/libipt_FULLCONENAT.so $(1)/usr/lib/iptables\n+endef\n+\n+define Package/ip6tables-mod-fullconenat\n+  SUBMENU:=Firewall\n+  SECTION:=net\n+  CATEGORY:=Network\n+  TITLE:=FULLCONENAT ip6tables extension\n+  DEPENDS:=ip6tables +kmod-nf-nat6 +kmod-ipt-fullconenat\n+  MAINTAINER:=Chion Tang <tech@chionlab.moe>\n+endef\n+\n+define Package/ip6tables-mod-fullconenat/install\n+\t$(INSTALL_DIR) $(1)/usr/lib/iptables\n+\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/libip6t_FULLCONENAT.so $(1)/usr/lib/iptables\n+endef\n+\n+define KernelPackage/ipt-fullconenat\n+  SUBMENU:=Netfilter Extensions\n+  TITLE:=FULLCONENAT netfilter module\n+  DEPENDS:=+kmod-nf-ipt +kmod-nf-nat\n+  MAINTAINER:=Chion Tang <tech@chionlab.moe>\n+  KCONFIG:=CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y\n+  FILES:=$(PKG_BUILD_DIR)/xt_FULLCONENAT.ko\n+endef\n+\n+include $(INCLUDE_DIR)/kernel-defaults.mk\n+\n+define Build/Prepare\n+\t$(call Build/Prepare/Default)\n+\t$(CP) ./files/Makefile $(PKG_BUILD_DIR)/\n+endef\n+\n+define Build/Compile\n+\t$(KERNEL_MAKE) M=\"$(PKG_BUILD_DIR)\" \\\n+\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n+\t$(PKG_EXTRA_KCONFIG) \\\n+\tmodules\n+\t$(call Build/Compile/Default)\n+endef\n+\n+$(eval $(call BuildPackage,iptables-mod-fullconenat))\n+$(eval $(call BuildPackage,ip6tables-mod-fullconenat))\n+$(eval $(call KernelPackage,ipt-fullconenat))\n\\ No newline at end of file\ndiff --git a/package/network/fullconenat/files/Makefile b/package/network/fullconenat/files/Makefile\nnew file mode 100755\nindex 0000000..0bbdc5c\n--- /dev/null\n+++ b/package/network/fullconenat/files/Makefile\n@@ -0,0 +1,11 @@\n+all: libipt_FULLCONENAT.so libip6t_FULLCONENAT.so\n+libipt_FULLCONENAT.so: libipt_FULLCONENAT.o\n+\t$(CC) -shared -lxtables -o $@ $^;\n+libipt_FULLCONENAT.o: libipt_FULLCONENAT.c\n+\t$(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<;\n+libip6t_FULLCONENAT.so: libip6t_FULLCONENAT.o\n+\t$(CC) -shared -lxtables -o $@ $^;\n+libip6t_FULLCONENAT.o: libip6t_FULLCONENAT.c\n+\t$(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<;\n+\n+obj-m += xt_FULLCONENAT.o\n\\ No newline at end of file\ndiff --git a/package/network/fullconenat/patches/000-printk.patch b/package/network/fullconenat/patches/000-printk.patch\nnew file mode 100755\nindex 0000000..778d5e5\n--- /dev/null\n+++ b/package/network/fullconenat/patches/000-printk.patch\n@@ -0,0 +1,17 @@\n+diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c\n+index 9e52eba..8658c5f 100644\n+--- a/xt_FULLCONENAT.c\n++++ b/xt_FULLCONENAT.c\n+@@ -697,9 +697,11 @@ static struct xt_target tg_reg[] __read_mostly = {\n+ \n+ static int __init fullconenat_tg_init(void)\n+ {\n++  printk(KERN_INFO \"xt_FULLCONENAT: RFC3489 Full Cone NAT module\\n\"\n++\t\"xt_FULLCONENAT: Copyright (C) 2018 Chion Tang <tech@chionlab.moe>\\n\");\n+   wq = create_singlethread_workqueue(\"xt_FULLCONENAT\");\n+   if (wq == NULL) {\n+-    printk(\"xt_FULLCONENAT: warning: failed to create workqueue\\n\");\n++    printk(KERN_WARNING \"xt_FULLCONENAT: warning: failed to create workqueue\\n\");\n+   }\n+ \n+   return xt_register_targets(tg_reg, ARRAY_SIZE(tg_reg));\n\\ No newline at end of file\n-- \n2.28.0\n\n"
  },
  {
    "path": "not_use_file/1004-netconntrack.patch",
    "content": "diff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..2981c3d906\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2748,6 +2748,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3783,9 +3790,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\n"
  },
  {
    "path": "not_use_file/18.06.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_GNUTLS_ALPN=y\nCONFIG_GNUTLS_ANON=y\nCONFIG_GNUTLS_DTLS_SRTP=y\nCONFIG_GNUTLS_HEARTBEAT=y\nCONFIG_GNUTLS_OCSP=y\nCONFIG_GNUTLS_PSK=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_CRYPTO_AUTH=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_LDAP=y\nCONFIG_LIBCURL_LDAPS=y\nCONFIG_LIBCURL_NGHTTP2=y\nCONFIG_LIBCURL_OPENSSL=y\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBCURL_TFTP=y\nCONFIG_LIBCURL_THREADED_RESOLVER=y\nCONFIG_LIBCURL_TLS_SRP=y\nCONFIG_OCSERV_HTTP_PARSER=y\nCONFIG_OCSERV_PROTOBUF=y\nCONFIG_PACKAGE_6in4=y\n#CONFIG_PACKAGE_MAC80211_DEBUGFS=y\n#CONFIG_PACKAGE_MAC80211_MESH=y\n# CONFIG_LUCI_LANG_zh-cn is not set\nCONFIG_LUCI_LANG_en=y\n\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_wrtbwmon=y\n\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_ca-bundle=y\nCONFIG_PACKAGE_certtool=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_dnsforwarder=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=m\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_i2c-tools=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip6tables=y\nCONFIG_PACKAGE_ip6tables-mod-nat=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_luci-app-smartdns=y\n\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-gf128=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-iv=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-wq=y\nCONFIG_PACKAGE_kmod-crypto-xcbc=y\nCONFIG_PACKAGE_kmod-crypto-xts=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-iptunnel=y\nCONFIG_PACKAGE_kmod-iptunnel4=y\n\nCONFIG_PACKAGE_kmod-mac80211=y\nCONFIG_PACKAGE_kmod-mt76-core=y\nCONFIG_PACKAGE_kmod-mt76-usb=y\nCONFIG_PACKAGE_kmod-mt7601u=y\nCONFIG_PACKAGE_kmod-mt76x02-common=y\nCONFIG_PACKAGE_kmod-mt76x02-usb=y\nCONFIG_PACKAGE_kmod-mt76x2-common=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-rtl8192c-common=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_kmod-sit=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\n\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libgnutls=y\nCONFIG_PACKAGE_libi2c=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libmsgpack-c=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libopenldap=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libprotobuf-c=y\nCONFIG_PACKAGE_libsasl2=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libwebsockets-full=y\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\nCONFIG_PACKAGE_luci-app-ocserv=y\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-turboacc_INCLUDE_dnsforwarder=y\nCONFIG_PACKAGE_luci-app-statistics=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_mt7601u-firmware=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_node-request=y\nCONFIG_PACKAGE_ocserv=y\nCONFIG_PACKAGE_odhcp6c=y\nCONFIG_PACKAGE_odhcp6c_ext_cer_id=0\nCONFIG_PACKAGE_odhcpd-ipv6only=y\nCONFIG_PACKAGE_odhcpd_ipv6only_ext_cer_id=0\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_rtl8192cu-firmware=y\nCONFIG_PACKAGE_kmod-rtl8812au-ac=y\nCONFIG_PACKAGE_luci-theme-opentomcat=y\n\nCONFIG_PACKAGE_luci-app-acme=y\nCONFIG_PACKAGE_acme=y\nCONFIG_PACKAGE_acme-dnsapi=y\n\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\n\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_ROOTFS_PARTSIZE=900\nCONFIG_WPA_MSG_MIN_PRIORITY=3\n\n# CONFIG_PACKAGE_UnblockNeteaseMusic is not set\n# CONFIG_PACKAGE_UnblockNeteaseMusic-Go is not set\n# CONFIG_PACKAGE_adbyby is not set\n# CONFIG_PACKAGE_etherwake is not set\n# CONFIG_PACKAGE_kmod-nf-conntrack-netlink is not set\n# CONFIG_PACKAGE_luci-app-adbyby-plus is not set\n# CONFIG_PACKAGE_luci-app-adguardhome_INCLUDE_binary is not set\n# CONFIG_PACKAGE_luci-app-nlbwmon is not set\n# CONFIG_PACKAGE_luci-i18n-nlbwmon-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-beardropper-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-frpc-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-frps-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-gost-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-oled-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-onliner-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-smartdns-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-statistics-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-ttyd-zh-cn is not set\n# CONFIG_PACKAGE_luci-i18n-wrtbwmon-zh-cn is not set\n\n# CONFIG_PACKAGE_nlbwmon is not set\n# CONFIG_PACKAGE_luci-app-rclone_INCLUDE_fuse-utils is not set\n# CONFIG_PACKAGE_luci-app-rclone_INCLUDE_rclone-ng is not set\n# CONFIG_PACKAGE_luci-app-rclone_INCLUDE_rclone-webui is not set\n# CONFIG_PACKAGE_luci-app-unblockmusic is not set\n# CONFIG_PACKAGE_luci-app-vlmcsd is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_PACKAGE_luci-app-wol is not set\n# CONFIG_PACKAGE_vlmcsd is not set\n# CONFIG_PACKAGE_vsftpd-alt is not set\n# CONFIG_PACKAGE_wol is not set\n# CONFIG_UnblockNeteaseMusic_Go is not set\n# CONFIG_UnblockNeteaseMusic_NodeJS is not set\n"
  },
  {
    "path": "not_use_file/18.06.sh",
    "content": "#!/bin/bash\nclear\n#生成时间\nVersionDate=$(git show -s --date=short --format=\"%cd\")\necho \"::set-env name=VersionDate::$VersionDate\"\necho \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\nBuild_Date=$(date +%Y.%m.%d)\necho \"::set-env name=Build_Date::$(date +%Y.%m.%d)\"\n#更新feed\n./scripts/feeds update -a && ./scripts/feeds install -a\n\npatch -p1 < ../patches/for_r2s_18.06.patch\n\n#update new version GCC\n#rm -rf ./feeds/packages/devel/gcc\n#svn co https://github.com/openwrt/packages/trunk/devel/gcc feeds/packages/devel/gcc\n#update new version Golang\n#rm -rf ./feeds/packages/lang/golang\n#svn co https://github.com/openwrt/packages/trunk/lang/golang feeds/packages/lang/golang\n\n#edge主题\n#git clone -b master --single-branch https://github.com/garypang13/luci-theme-edge package/new/luci-theme-edge\n\n#流量监视\n#rm -rf package/lean/luci-app-wrtbwmon\n#git clone -b master --single-branch https://github.com/brvphoenix/wrtbwmon package/new/wrtbwmon\n#git clone -b master --single-branch https://github.com/brvphoenix/luci-app-wrtbwmon package/new/luci-app-wrtbwmon\n#流量监管\n#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-netdata package/lean/luci-app-netdata\n#SeverChan\n#git clone -b master --single-branch https://github.com/tty228/luci-app-serverchan package/new/luci-app-serverchan\n\n#jd-dailybonus\n#git clone https://github.com/jerrykuku/node-request package/lean/node-request\n#git clone https://github.com/jerrykuku/luci-app-jd-dailybonus package/lean/luci-app-jd-dailybonus\n#wget -O package/lean/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js https://github.com/NobyDa/Script/raw/master/JD-DailyBonus/JD_DailyBonus.js\n\n#frp\nrm -rf ./package/lean/luci-app-frpc\n#rm -rf ./package/ctcgfw/luci-app-frps\n#git clone https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps\ngit clone https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc\n\necho -e '\\nQuintus Build @ '$Build_Date'\\n'  >> package/lean/default-settings/files/openwrt_banner\nwget -O package/lean/default-settings/files/zzz-default-settings https://github.com/quintus-lab/Openwrt-R2S/raw/master/script/zzz-default-settings-18.06\nsed -i 's/| Mod20.08 by CTCGFW/| Mod20.08 by CTCGFW | Build by Quintus@'$Build_Date'/g' package/lean/default-settings/files/zzz-default-settings\n\nchmod -R 755 ./\n\nexit 0\n"
  },
  {
    "path": "not_use_file/2000-zzz-default.patch",
    "content": "diff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile\nindex 9869b2511e..2e46960659 100644\n--- a/package/lean/default-settings/Makefile\n+++ b/package/lean/default-settings/Makefile\n@@ -21,7 +21,7 @@ define Package/default-settings\n   CATEGORY:=LuCI\n   TITLE:=LuCI support for Default Settings\n   PKGARCH:=all\n-  DEPENDS:=+luci-base +luci +luci-compat +@LUCI_LANG_zh-cn\n+  DEPENDS:=+luci-base +luci +luci-compat\n endef\n \n define Package/default-settings/description\n@@ -38,7 +38,6 @@ define Package/default-settings/install\n \t$(INSTALL_DIR) $(1)/etc/uci-defaults\n \t$(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings\n \t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n-\tpo2lmo ./i18n/default.zh-cn.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo\n endef\n \n $(eval $(call BuildPackage,default-settings))\ndiff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings\nindex 6e00207d52..b33126f795 100755\n--- a/package/lean/default-settings/files/zzz-default-settings\n+++ b/package/lean/default-settings/files/zzz-default-settings\n@@ -1,6 +1,6 @@\n #!/bin/sh\n \n-uci set luci.main.lang=zh_cn\n+uci set luci.main.lang=en\n uci commit luci\n \n uci set system.@system[0].timezone=CST-8\n@@ -11,50 +11,38 @@ uci set fstab.@global[0].anon_mount=1\n uci commit fstab\n \n rm -f /usr/lib/lua/luci/view/admin_status/index/mwan.htm\n-rm -f /usr/lib/lua/luci/view/admin_status/index/upnp.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/ddns.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/minidlna.htm\n+uci set uhttpd.main.rfc1918_filter=0\n+uci set uhttpd.main.redirect_https=0\n+uci commit uhttpd\n \n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/aria2.lua\n-sed -i 's/services/nas/g' /usr/lib/lua/luci/view/aria2/overview_status.htm\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/hd_idle.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/samba.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/minidlna.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/transmission.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/mjpg-streamer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/p910nd.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/usb_printer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/xunlei.lua\n-sed -i 's/services/nas/g'  /usr/lib/lua/luci/view/minidlna_status.htm\n-\n-ln -sf /sbin/ip /usr/bin/ip\n-\n-sed -i 's#http://downloads.openwrt.org#https://mirrors.cloud.tencent.com/lede#g' /etc/opkg/distfeeds.conf\n-sed -i 's/root::0:0:99999:7:::/root:$1$V4UetPzk$CYXluq4wUazHjmCDBCqXF.:0:0:99999:7:::/g' /etc/shadow\n-\n-sed -i \"s/# //g\" /etc/opkg/distfeeds.conf\n-sed -i '/openwrt_luci/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_luci/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_packages/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_routing/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_telephony/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.con\n+sed -i '/natelol/d' /etc/opkg/distfeeds.conf\n+sed -i 's,downloads.openwrt.org,mirrors.cloud.tencent.com/lede,g' /etc/opkg/distfeeds.conf\n \n sed -i '/REDIRECT --to-ports 53/d' /etc/firewall.user\n echo \"iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n echo \"iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n \n-sed -i '/option disabled/d' /etc/config/wireless\n-sed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh\n-\n-sed -i '/DISTRIB_REVISION/d' /etc/openwrt_release\n-echo \"DISTRIB_REVISION='R21.1.18'\" >> /etc/openwrt_release\n-sed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release\n-echo \"DISTRIB_DESCRIPTION='OpenWrt '\" >> /etc/openwrt_release\n-\n sed -i '/log-facility/d' /etc/dnsmasq.conf\n echo \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\n \n-sed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n-\n-echo 'hsts=0' > /root/.wgetrc\n-\n+ln -sf /sbin/ip /usr/bin/ip\n+rm /usr/lib/lua/luci/i18n/*cn*\n rm -rf /tmp/luci-modulecache/\n rm -f /tmp/luci-indexcache\n \n+echo 'luciversion = \"Quintus@🇨🇦🇹🇼🇺🇸🇭🇰\"' >> /usr/lib/lua/luci/version.lua\n+opkg flag hold luci-app-firewall\n+opkg flag hold firewall\n+opkg flag hold dnsmasq-full\n+\n+uci set ttyd.@ttyd[0].command='/bin/login'\n+uci commit ttyd\n+uci set network.globals.packet_steering='1'\n+uci commit network\n exit 0\n \n"
  },
  {
    "path": "not_use_file/2001-ssr-plus-tls-181.patch",
    "content": "diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua\nindex 8cb979bef8..7978f7a4cd 100755\n--- a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua\n+++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua\n@@ -21,8 +21,8 @@ local trojan = {\n \t\tverify = (server.insecure == \"0\") and true or false,\n \t\tverify_hostname = (server.tls == \"1\") and true or false,\n \t\tcert = \"\",\n-\t\tcipher = \"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n-\t\tcipher_tls13 = \"TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384\",\n+\t\tcipher = \"ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n+\t\tcipher_tls13 = \"TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384\",\n \t\tsni = server.tls_host,\n \t\talpn = {\"h2\", \"http/1.1\"},\n \t\tcurve = \"\",\n"
  },
  {
    "path": "not_use_file/2001-ssr-plus-tls.patch",
    "content": "diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\nindex b884c72fee..2cc9cb629d 100644\n--- a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\n+++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\n@@ -114,8 +114,8 @@ local trojan = {\n \t\tverify = (server.insecure == \"0\") and true or false,\n \t\tverify_hostname = (server.tls == \"1\") and true or false,\n \t\tcert = \"\",\n-\t\tcipher = \"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n-\t\tcipher_tls13 = \"TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384\",\n+\t\tcipher = \"ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n+\t\tcipher_tls13 = \"TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384\",\n \t\tsni = server.tls_host,\n \t\talpn = {\"h2\", \"http/1.1\"},\n \t\tcurve = \"\",\n"
  },
  {
    "path": "not_use_file/2002-luci-app-freq-r2s.patch",
    "content": "diff --git a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\nindex 0e7eaede3..f7128226f 100644\n--- a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n+++ b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n@@ -1,3 +1,6 @@\n\n config settings 'cpufreq'\n+\toption governor0 'schedutil'\n+\toption minfreq0 '816000'\n+\toption maxfreq0 '1608000'\n"
  },
  {
    "path": "not_use_file/2002-luci-app-freq-r4s.patch",
    "content": "diff --git a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\nindex 0e7eaede3..f7128226f 100644\n--- a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n+++ b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n@@ -1,3 +1,9 @@\n\n config settings 'cpufreq'\n+       option governor0 'schedutil'\n+       option minfreq0 '600000'\n+       option governor4 'schedutil'\n+       option minfreq4 '600000'\n+       option maxfreq0 '1800000'\n+       option maxfreq4 '2208000'\n"
  },
  {
    "path": "not_use_file/3829.patch",
    "content": "From d520ddaf0ad7243da7c95e638dff77e3c5496c54 Mon Sep 17 00:00:00 2001\nFrom: Tianling Shen <cnsztl@gmail.com>\nDate: Mon, 1 Feb 2021 23:11:22 +0800\nSubject: [PATCH] kernel: add \"model name\" display in `/proc/cpuinfo` for\n aarch64 arch\n\nThe restriction set for AArch32 is really useless, as it works for both\n32-bit and 64-bit SoCs functionnaly.\n\nSo, it's fine to remove the restriction, and then we can see\n\"ARMv8 Processor rev X (v8l)\" displayed on our LuCI index instead of \"?\".\n\nRuntime-tested on: bcm27xx, rockchip\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\n---\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch | 38 +++++++++++++++++++\n 1 file changed, 38 insertions(+)\n create mode 100644 target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n\ndiff --git a/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 000000000000..266475830442\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/310-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -148,9 +148,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\n"
  },
  {
    "path": "not_use_file/900-add-filter-aaaa-option.patch",
    "content": "diff -rNEZbwBdu3 a/src/dnsmasq.h b/src/dnsmasq.h\n--- a/src/dnsmasq.h\t2020-04-09 00:32:53.000000000 +0800\n+++ b/src/dnsmasq.h\t2020-06-05 23:03:45.941176855 +0800\n@@ -269,7 +269,8 @@\n #define OPT_IGNORE_CLID    59\n #define OPT_SINGLE_PORT    60\n #define OPT_LEASE_RENEW    61\n-#define OPT_LAST           62\n+#define OPT_FILTER_AAAA    62\n+#define OPT_LAST           63\n \n #define OPTION_BITS (sizeof(unsigned int)*8)\n #define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )\ndiff -rNEZbwBdu3 a/src/option.c b/src/option.c\n--- a/src/option.c\t2020-04-09 00:32:53.000000000 +0800\n+++ b/src/option.c\t2020-06-05 23:06:29.880350271 +0800\n@@ -167,6 +167,7 @@\n #define LOPT_IGNORE_CLID   358\n #define LOPT_SINGLE_PORT   359\n #define LOPT_SCRIPT_TIME   360\n+#define LOPT_FILTER_AAAA   361\n  \n #ifdef HAVE_GETOPT_LONG\n static const struct option opts[] =  \n@@ -339,6 +340,7 @@\n     { \"dumpfile\", 1, 0, LOPT_DUMPFILE },\n     { \"dumpmask\", 1, 0, LOPT_DUMPMASK },\n     { \"dhcp-ignore-clid\", 0, 0,  LOPT_IGNORE_CLID },\n+    { \"filter-aaaa\", 0, 0, LOPT_FILTER_AAAA },\n     { NULL, 0, 0, 0 }\n   };\n \n@@ -518,6 +520,7 @@\n   { LOPT_DUMPFILE, ARG_ONE, \"<path>\", gettext_noop(\"Path to debug packet dump file\"), NULL },\n   { LOPT_DUMPMASK, ARG_ONE, \"<hex>\", gettext_noop(\"Mask which packets to dump\"), NULL },\n   { LOPT_SCRIPT_TIME, OPT_LEASE_RENEW, NULL, gettext_noop(\"Call dhcp-script when lease expiry changes.\"), NULL },\n+  { LOPT_FILTER_AAAA, OPT_FILTER_AAAA, NULL, gettext_noop(\"Filter all AAAA requests.\"), NULL },\n   { 0, 0, NULL, NULL, NULL }\n }; \n \ndiff -rNEZbwBdu3 a/src/rfc1035.c b/src/rfc1035.c\n--- a/src/rfc1035.c\t2020-04-09 00:32:53.000000000 +0800\n+++ b/src/rfc1035.c\t2020-06-05 23:08:46.476106541 +0800\n@@ -1955,6 +1955,15 @@\n \t    }\n \t}\n \n+      //patch to filter aaaa forwards\n+      if (qtype == T_AAAA && option_bool(OPT_FILTER_AAAA) ){\n+        //return a null reply\n+        ans = 1;\n+        if (!dryrun) log_query(F_CONFIG | F_IPV6 | F_NEG, name, &addr, NULL);\n+        break;\n+      }\n+      //end of patch\n+\n       if (!ans)\n \treturn 0; /* failed to answer a question */\n     }\n"
  },
  {
    "path": "not_use_file/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch",
    "content": "From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\nFrom: Igor Pecovnik <igor.pecovnik@gmail.com>\nDate: Sat, 2 Jan 2021 05:23:55 +0000\nSubject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n\n---\n kernel/dma/remap.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n--- a/kernel/dma/remap.c\n+++ b/kernel/dma/remap.c\n@@ -101,7 +101,7 @@ void dma_common_free_remap(void *cpu_add\n #ifdef CONFIG_DMA_DIRECT_REMAP\n static struct gen_pool *atomic_pool __ro_after_init;\n \n-#define DEFAULT_DMA_COHERENT_POOL_SIZE  SZ_256K\n+#define DEFAULT_DMA_COHERENT_POOL_SIZE\tSZ_2M\n static size_t atomic_pool_size __initdata = DEFAULT_DMA_COHERENT_POOL_SIZE;\n \n static int __init early_coherent_pool(char *p)\n"
  },
  {
    "path": "not_use_file/991-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch",
    "content": "From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\nFrom: Tianling Shen <cnsztl@gmail.com>\nDate: Sat, 19 Dec 2020 12:42:27 +0000\nSubject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n\nIt's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\nand for better performance.\n\nSigned-off-by: Tianling Shen <cnsztl@gmail.com>\nCo-authored-by: gzelvis <gzelvis@gmail.com>\n---\n .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 153 ++++++++++++++++++\n .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n 2 files changed, 154 insertions(+), 1 deletion(-)\n create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n\n--- /dev/null\n+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n@@ -0,0 +1,153 @@\n+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n+/*\n+ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n+ */\n+\n+/ {\n+\tcluster0_opp: opp-table0 {\n+\t\tcompatible = \"operating-points-v2\";\n+\t\topp-shared;\n+\n+\t\topp00 {\n+\t\t\topp-hz = /bits/ 64 <408000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t\tclock-latency-ns = <40000>;\n+\t\t};\n+\t\topp01 {\n+\t\t\topp-hz = /bits/ 64 <600000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t};\n+\t\topp02 {\n+\t\t\topp-hz = /bits/ 64 <816000000>;\n+\t\t\topp-microvolt = <850000>;\n+\t\t};\n+\t\topp03 {\n+\t\t\topp-hz = /bits/ 64 <1008000000>;\n+\t\t\topp-microvolt = <925000>;\n+\t\t};\n+\t\topp04 {\n+\t\t\topp-hz = /bits/ 64 <1200000000>;\n+\t\t\topp-microvolt = <1000000>;\n+\t\t};\n+\t\topp05 {\n+\t\t\topp-hz = /bits/ 64 <1416000000>;\n+\t\t\topp-microvolt = <1125000>;\n+\t\t};\n+\t\topp06 {\n+\t\t\topp-hz = /bits/ 64 <1512000000>;\n+\t\t\topp-microvolt = <1150000>;\n+\t\t};\n+ \t\topp07 {\n+\t\t\topp-hz = /bits/ 64 <1608000000>;\n+\t\t\topp-microvolt = <1200000>;\n+\t\t};\n+\t\topp08 {\n+\t\t\topp-hz = /bits/ 64 <1800000000>;\n+\t\t\topp-microvolt = <1250000>;\n+\t\t};\n+\t};\n+\n+\tcluster1_opp: opp-table1 {\n+\t\tcompatible = \"operating-points-v2\";\n+\t\topp-shared;\n+\n+\t\topp00 {\n+\t\t\topp-hz = /bits/ 64 <408000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t\tclock-latency-ns = <40000>;\n+\t\t};\n+\t\topp01 {\n+\t\t\topp-hz = /bits/ 64 <600000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t};\n+\t\topp02 {\n+\t\t\topp-hz = /bits/ 64 <816000000>;\n+\t\t\topp-microvolt = <825000>;\n+\t\t};\n+\t\topp03 {\n+\t\t\topp-hz = /bits/ 64 <1008000000>;\n+\t\t\topp-microvolt = <875000>;\n+\t\t};\n+\t\topp04 {\n+\t\t\topp-hz = /bits/ 64 <1200000000>;\n+\t\t\topp-microvolt = <950000>;\n+\t\t};\n+\t\topp05 {\n+\t\t\topp-hz = /bits/ 64 <1416000000>;\n+\t\t\topp-microvolt = <1025000>;\n+\t\t};\n+\t\topp06 {\n+\t\t\topp-hz = /bits/ 64 <1608000000>;\n+\t\t\topp-microvolt = <1100000>;\n+\t\t};\n+\t\topp07 {\n+\t\t\topp-hz = /bits/ 64 <1800000000>;\n+\t\t\topp-microvolt = <1200000>;\n+\t\t};\n+\t\topp08 {\n+\t\t\topp-hz = /bits/ 64 <2016000000>;\n+\t\t\topp-microvolt = <1250000>;\n+\t\t};\n+\t\topp09 {\n+\t\t\topp-hz = /bits/ 64 <2208000000>;\n+\t\t\topp-microvolt = <1300000>;\n+\t\t};\n+\t};\n+\n+\tgpu_opp_table: opp-table2 {\n+\t\tcompatible = \"operating-points-v2\";\n+\n+\t\topp00 {\n+\t\t\topp-hz = /bits/ 64 <200000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t};\n+\t\topp01 {\n+\t\t\topp-hz = /bits/ 64 <297000000>;\n+\t\t\topp-microvolt = <800000>;\n+\t\t};\n+\t\topp02 {\n+\t\t\topp-hz = /bits/ 64 <400000000>;\n+\t\t\topp-microvolt = <825000>;\n+\t\t};\n+\t\topp03 {\n+\t\t\topp-hz = /bits/ 64 <500000000>;\n+\t\t\topp-microvolt = <875000>;\n+\t\t};\n+\t\topp04 {\n+\t\t\topp-hz = /bits/ 64 <600000000>;\n+\t\t\topp-microvolt = <925000>;\n+\t\t};\n+\t\topp05 {\n+\t\t\topp-hz = /bits/ 64 <800000000>;\n+\t\t\topp-microvolt = <1100000>;\n+\t\t};\n+\t};\n+};\n+\n+&cpu_l0 {\n+\toperating-points-v2 = <&cluster0_opp>;\n+};\n+\n+&cpu_l1 {\n+\toperating-points-v2 = <&cluster0_opp>;\n+};\n+\n+&cpu_l2 {\n+\toperating-points-v2 = <&cluster0_opp>;\n+};\n+\n+&cpu_l3 {\n+\toperating-points-v2 = <&cluster0_opp>;\n+};\n+\n+&cpu_b0 {\n+\toperating-points-v2 = <&cluster1_opp>;\n+};\n+\n+&cpu_b1 {\n+\toperating-points-v2 = <&cluster1_opp>;\n+};\n+\n+&gpu {\n+\toperating-points-v2 = <&gpu_opp_table>;\n+};\n--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n@@ -14,7 +14,7 @@\n /dts-v1/;\n #include <dt-bindings/input/linux-event-codes.h>\n #include \"rk3399.dtsi\"\n-#include \"rk3399-opp.dtsi\"\n+#include \"rk3399-nanopi4-opp.dtsi\"\n \n / {\n \tchosen {\n\n"
  },
  {
    "path": "not_use_file/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch",
    "content": "From: QiuSimons\ndiff --git a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n@@ -226,6 +226,10 @@\n \t};\n };\n \n+&i2c0 {\n+\tstatus = \"okay\";\n+};\n+\n &io_domains {\n \tstatus = \"okay\";\n \n"
  },
  {
    "path": "not_use_file/999-unlock-1608mhz-rk3328.patch",
    "content": "From: QiuSimons\ndiff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\nindex 8dabc6e29..d58c893a6 100644\n--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n@@ -125,6 +125,16 @@\n \t\t\topp-microvolt = <1300000>;\n \t\t\tclock-latency-ns = <40000>;\n \t\t};\n+\t\topp-1512000000 {\n+\t\t\topp-hz = /bits/ 64 <1512000000>;\n+\t\t\topp-microvolt = <1400000>;\n+\t\t\tclock-latency-ns = <40000>;\n+\t\t};\n+\t\topp-1608000000 {\n+\t\t\topp-hz = /bits/ 64 <1608000000>;\n+\t\t\topp-microvolt = <1450000>;\n+\t\t\tclock-latency-ns = <40000>;\n+\t\t};\n \t};\n \n \tamba {\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/000-fullconenat.patch",
    "content": "diff --git a/net/ipv4/netfilter/Kconfig b/net/ipv4/netfilter/Kconfig\nindex f17b402111ce..99f691a677a1 100644\n--- a/net/ipv4/netfilter/Kconfig\n+++ b/net/ipv4/netfilter/Kconfig\n@@ -239,6 +239,15 @@ config IP_NF_TARGET_NETMAP\n \t(e.g. when running oldconfig). It selects\n \tCONFIG_NETFILTER_XT_TARGET_NETMAP.\n \n+config IP_NF_TARGET_FULLCONENAT\n+\ttristate \"FULLCONENAT target support\"\n+\tdepends on NETFILTER_ADVANCED\n+\tselect NETFILTER_XT_TARGET_FULLCONENAT\n+\t---help---\n+\tThis is a backwards-compat option for the user's convenience\n+\t(e.g. when running oldconfig). It selects\n+\tCONFIG_NETFILTER_XT_TARGET_FULLCONENAT.\n+\n config IP_NF_TARGET_REDIRECT\n \ttristate \"REDIRECT target support\"\n \tdepends on NETFILTER_ADVANCED\ndiff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig\nindex 91efae88e8c2..17f5c748aeac 100644\n--- a/net/netfilter/Kconfig\n+++ b/net/netfilter/Kconfig\n@@ -956,6 +956,14 @@ config NETFILTER_XT_TARGET_NETMAP\n \n \tTo compile it as a module, choose M here. If unsure, say N.\n \n+config NETFILTER_XT_TARGET_FULLCONENAT\n+\ttristate '\"FULLCONENAT\" target support'\n+\tdepends on NF_NAT\n+\t---help---\n+\tFull Cone NAT\n+\n+\tTo compile it as a module, choose M here. If unsure, say N.\n+\n config NETFILTER_XT_TARGET_NFLOG\n \ttristate '\"NFLOG\" target support'\n \tdefault m if NETFILTER_ADVANCED=n\ndiff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h\nindex 12d967b..c2b98b6 100644\n--- a/include/net/netfilter/nf_conntrack_ecache.h\n+++ b/include/net/netfilter/nf_conntrack_ecache.h\n@@ -72,6 +72,10 @@ struct nf_ct_event {\n \tint report;\n };\n \n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n+extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n+#else\n struct nf_ct_event_notifier {\n \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n };\n@@ -80,7 +84,7 @@ int nf_conntrack_register_notifier(struc\n \t\t\t\t   struct nf_ct_event_notifier *nb);\n void nf_conntrack_unregister_notifier(struct net *net,\n \t\t\t\t      struct nf_ct_event_notifier *nb);\n-\n+#endif\n void nf_ct_deliver_cached_events(struct nf_conn *ct);\n int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n \t\t\t\t  u32 portid, int report);\n@@ -105,12 +108,15 @@ int nf_conntrack_eventmask_report(unsign\n nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n {\n #ifdef CONFIG_NF_CONNTRACK_EVENTS\n-\tstruct net *net = nf_ct_net(ct);\n \tstruct nf_conntrack_ecache *e;\n+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+\tstruct net *net = nf_ct_net(ct);\n \n \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n \t\treturn;\n \n+#endif\n+\n \te = nf_ct_ecache_find(ct);\n \tif (e == NULL)\n \t\treturn;\n@@ -124,10 +131,12 @@ static inline int\n \t\t\t  u32 portid, int report)\n {\n #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n \tconst struct net *net = nf_ct_net(ct);\n \n \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n \t\treturn 0;\n+#endif\n \n \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n #else\n@@ -139,11 +148,14 @@ nf_conntrack_event_report(enum ip_conntr\n nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n {\n #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n \tconst struct net *net = nf_ct_net(ct);\n \n \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n \t\treturn 0;\n \n+#endif\n+\n \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n #else\n \treturn 0;\ndiff --git a/include/net/netns/conntrack.h b/include/net/netns/conntrack.h\nindex e469e85..1d31db8 100644\n--- a/include/net/netns/conntrack.h\n+++ b/include/net/netns/conntrack.h\n@@ -112,7 +112,11 @@ struct netns_ct {\n \n \tstruct ct_pcpu __percpu *pcpu_lists;\n \tstruct ip_conntrack_stat __percpu *stat;\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+\tstruct atomic_notifier_head nf_conntrack_chain;\n+#else\n \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n+#endif\n \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n \tstruct nf_ip_net\tnf_ct_proto;\n #if defined(CONFIG_NF_CONNTRACK_LABELS)\ndiff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c\nindex 6bd1508..9b81c7c 100644\n--- a/net/netfilter/nf_conntrack_core.c\n+++ b/net/netfilter/nf_conntrack_core.c\n@@ -2522,6 +2522,10 @@ int nf_conntrack_init_net(struct net *ne\n \tnf_conntrack_ecache_pernet_init(net);\n \tnf_conntrack_helper_pernet_init(net);\n \tnf_conntrack_proto_pernet_init(net);\n+\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n+#endif\n \n \treturn 0;\n \ndiff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c\nindex da9df2d..e0e2a8f 100644\n--- a/net/netfilter/nf_conntrack_ecache.c\n+++ b/net/netfilter/nf_conntrack_ecache.c\n@@ -17,6 +17,9 @@\n #include <linux/stddef.h>\n #include <linux/err.h>\n #include <linux/percpu.h>\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+#include <linux/notifier.h>\n+#endif\n #include <linux/kernel.h>\n #include <linux/netdevice.h>\n #include <linux/slab.h>\n@@ -117,6 +120,38 @@ static void ecache_work(struct work_stru\n \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n }\n \n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+int\n+nf_conntrack_eventmask_report(unsigned int eventmask,\n+\t\t\t      struct nf_conn *ct,\n+\t\t\t      u32 portid,\n+\t\t\t      int report)\n+{\n+\tstruct nf_conntrack_ecache *e;\n+\tstruct net *net = nf_ct_net(ct);\n+\n+\te = nf_ct_ecache_find(ct);\n+\tif (e == NULL)\n+\t\treturn 0;\n+\n+\tif (nf_ct_is_confirmed(ct)) {\n+\t\tstruct nf_ct_event item = {\n+\t\t\t.ct = ct,\n+\t\t\t.portid\t= e->portid ? e->portid : portid,\n+\t\t\t.report = report\n+\t\t};\n+\t\t/* This is a resent of a destroy event? If so, skip missed */\n+\t\tunsigned long missed = e->portid ? 0 : e->missed;\n+\n+\t\tif (!((eventmask | missed) & e->ctmask))\n+\t\t\treturn 0;\n+\n+\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n+\t}\n+\n+\treturn 0;\n+}\n+#else\n int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n \t\t\t\t  u32 portid, int report)\n {\n@@ -171,10 +206,52 @@ out_unlock:\n \trcu_read_unlock();\n \treturn ret;\n }\n+#endif\n EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n \n /* deliver cached events and clear cache entry - must be called with locally\n  * disabled softirqs */\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+{\n+\tunsigned long events, missed;\n+\tstruct nf_conntrack_ecache *e;\n+\tstruct nf_ct_event item;\n+\tstruct net *net = nf_ct_net(ct);\n+\n+\te = nf_ct_ecache_find(ct);\n+\tif (e == NULL)\n+\t\treturn;\n+\n+\tevents = xchg(&e->cache, 0);\n+\n+\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n+\t\treturn;\n+\n+\t/* We make a copy of the missed event cache without taking\n+\t * the lock, thus we may send missed events twice. However,\n+\t * this does not harm and it happens very rarely. */\n+\tmissed = e->missed;\n+\n+\tif (!((events | missed) & e->ctmask))\n+\t\treturn;\n+\n+\titem.ct = ct;\n+\titem.portid = 0;\n+\titem.report = 0;\n+\n+\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n+\t\t\tevents | missed,\n+\t\t\t&item);\n+\n+\tif (likely(!missed))\n+\t\treturn;\n+\n+\tspin_lock_bh(&ct->lock);\n+\t\te->missed &= ~missed;\n+\tspin_unlock_bh(&ct->lock);\n+}\n+#else\n void nf_ct_deliver_cached_events(struct nf_conn *ct)\n {\n \tstruct net *net = nf_ct_net(ct);\n@@ -225,6 +302,7 @@ void nf_ct_deliver_cached_events(struct\n out_unlock:\n \trcu_read_unlock();\n }\n+#endif\n EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n \n void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n@@ -257,6 +335,12 @@ out_unlock:\n \trcu_read_unlock();\n }\n \n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb)\n+{\n+        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n+}\n+#else\n int nf_conntrack_register_notifier(struct net *net,\n \t\t\t\t   struct nf_ct_event_notifier *new)\n {\n@@ -277,8 +361,15 @@ out_unlock:\n \tmutex_unlock(&nf_ct_ecache_mutex);\n \treturn ret;\n }\n+#endif\n EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n \n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n+{\n+\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n+}\n+#else\n void nf_conntrack_unregister_notifier(struct net *net,\n \t\t\t\t      struct nf_ct_event_notifier *new)\n {\n@@ -292,6 +383,7 @@ void nf_conntrack_unregister_notifier(st\n \tmutex_unlock(&nf_ct_ecache_mutex);\n \t/* synchronize_rcu() is called from ctnetlink_exit. */\n }\n+#endif\n EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n \n int nf_ct_expect_register_notifier(struct net *net,\ndiff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c\nindex 04111c1..8c741f7 100644\n--- a/net/netfilter/nf_conntrack_netlink.c\n+++ b/net/netfilter/nf_conntrack_netlink.c\n@@ -28,7 +28,12 @@\n #include <linux/netlink.h>\n #include <linux/spinlock.h>\n #include <linux/interrupt.h>\n+\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+#include <linux/notifier.h>\n+#endif\n+\n #include <linux/slab.h>\n #include <linux/siphash.h>\n \n #include <linux/netfilter.h>\n@@ -676,14 +681,22 @@ static size_t ctnetlink_nlmsg_size(const\n \t       ;\n }\n \n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+static int ctnetlink_conntrack_event(struct notifier_block *this,\n+                           unsigned long events, void *ptr)\n+#else\n static int\n ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n+#endif\n {\n \tconst struct nf_conntrack_zone *zone;\n \tstruct net *net;\n \tstruct nlmsghdr *nlh;\n \tstruct nfgenmsg *nfmsg;\n \tstruct nlattr *nest_parms;\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n+#endif\n \tstruct nf_conn *ct = item->ct;\n \tstruct sk_buff *skb;\n \tunsigned int type;\n@@ -3502,9 +3515,15 @@ static int ctnetlink_stat_exp_cpu(struct\n }\n \n #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+static struct notifier_block ctnl_notifier = {\n+\t.notifier_call = ctnetlink_conntrack_event,\n+};\n+#else\n static struct nf_ct_event_notifier ctnl_notifier = {\n \t.fcn = ctnetlink_conntrack_event,\n };\n+#endif\n \n static struct nf_exp_event_notifier ctnl_notifier_exp = {\n \t.fcn = ctnetlink_expect_event,\ndiff --git a/net/netfilter/Makefile b/net/netfilter/Makefile\nindex 4fc075b612fe..094b13245406 100644\n--- a/net/netfilter/Makefile\n+++ b/net/netfilter/Makefile\n@@ -145,6 +145,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_LOG) += xt_LOG.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NETMAP) += xt_NETMAP.o\n+obj-$(CONFIG_NETFILTER_XT_TARGET_FULLCONENAT) += xt_FULLCONENAT.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NFQUEUE) += xt_NFQUEUE.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_RATEEST) += xt_RATEEST.o\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/000-kernel-add-full_cone_nat.patch",
    "content": "diff --git a/net/ipv4/netfilter/Kconfig b/net/ipv4/netfilter/Kconfig\nindex f17b402111ce..99f691a677a1 100644\n--- a/net/ipv4/netfilter/Kconfig\n+++ b/net/ipv4/netfilter/Kconfig\n@@ -239,6 +239,15 @@ config IP_NF_TARGET_NETMAP\n \t(e.g. when running oldconfig). It selects\n \tCONFIG_NETFILTER_XT_TARGET_NETMAP.\n \n+config IP_NF_TARGET_FULLCONENAT\n+\ttristate \"FULLCONENAT target support\"\n+\tdepends on NETFILTER_ADVANCED\n+\tselect NETFILTER_XT_TARGET_FULLCONENAT\n+\t---help---\n+\tThis is a backwards-compat option for the user's convenience\n+\t(e.g. when running oldconfig). It selects\n+\tCONFIG_NETFILTER_XT_TARGET_FULLCONENAT.\n+\n config IP_NF_TARGET_REDIRECT\n \ttristate \"REDIRECT target support\"\n \tdepends on NETFILTER_ADVANCED\ndiff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig\nindex 91efae88e8c2..17f5c748aeac 100644\n--- a/net/netfilter/Kconfig\n+++ b/net/netfilter/Kconfig\n@@ -956,6 +956,14 @@ config NETFILTER_XT_TARGET_NETMAP\n \n \tTo compile it as a module, choose M here. If unsure, say N.\n \n+config NETFILTER_XT_TARGET_FULLCONENAT\n+\ttristate '\"FULLCONENAT\" target support'\n+\tdepends on NF_NAT\n+\t---help---\n+\tFull Cone NAT\n+\n+\tTo compile it as a module, choose M here. If unsure, say N.\n+\n config NETFILTER_XT_TARGET_NFLOG\n \ttristate '\"NFLOG\" target support'\n \tdefault m if NETFILTER_ADVANCED=n\ndiff --git a/net/netfilter/Makefile b/net/netfilter/Makefile\nindex 4fc075b612fe..094b13245406 100644\n--- a/net/netfilter/Makefile\n+++ b/net/netfilter/Makefile\n@@ -145,6 +145,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_LOG) += xt_LOG.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NETMAP) += xt_NETMAP.o\n+obj-$(CONFIG_NETFILTER_XT_TARGET_FULLCONENAT) += xt_FULLCONENAT.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NFLOG) += xt_NFLOG.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_NFQUEUE) += xt_NFQUEUE.o\n obj-$(CONFIG_NETFILTER_XT_TARGET_RATEEST) += xt_RATEEST.o\n "
  },
  {
    "path": "not_use_file/Friendlywrt_archive/001-cpu-enable_autocore.patch",
    "content": "diff --git a/package/lean/autocore/Makefile b/package/lean/autocore/Makefile\nindex 5a3ea11..1f52537 100644\n--- a/package/lean/autocore/Makefile\n+++ b/package/lean/autocore/Makefile\n@@ -17,7 +17,7 @@ include $(INCLUDE_DIR)/package.mk\n define Package/autocore\n   TITLE:=x86/x64 auto core loadbalance script.\n   MAINTAINER:=Lean\n-  DEPENDS:=@TARGET_x86 +bc +lm-sensors +ethtool\n+  DEPENDS:=+bc +lm-sensors +ethtool\n endef\n \n define Package/autocore/description\ndiff --git a/package/lean/autocore/files/autocore b/package/lean/autocore/files/autocore\nindex 55cd519..06d202c 100755\n--- a/package/lean/autocore/files/autocore\n+++ b/package/lean/autocore/files/autocore\n@@ -33,7 +33,7 @@ start()\n \tg=${a}${b}${c}${d}${e}${f}\n \n \tmkdir -p /tmp/sysinfo\n-\techo $g > /tmp/sysinfo/model\n+\t#echo $g > /tmp/sysinfo/model\n \n \ta=$(ip address | grep ^[0-9] | awk -F: '{print $2}' | sed \"s/ //g\" | grep '^[e]' | grep -v \"@\" | grep -v \"\\.\")\n \tb=$(echo \"$a\" | wc -l)\n@@ -44,7 +44,7 @@ start()\n \t\tethtool -K $c tx-checksum-ip-generic on >/dev/null 2>&1 || (\n \t\tethtool -K $c tx-checksum-ipv4 on >/dev/null 2>&1\n \t\tethtool -K $c tx-checksum-ipv6 on >/dev/null 2>&1)\n-\t\tethtool -K $c tx-scatter-gather on >/dev/null 2>&1\n+\t\t#ethtool -K $c tx-scatter-gather on >/dev/null 2>&1\n \t\tethtool -K $c gso on >/dev/null 2>&1\n \t\tethtool -K $c tso on >/dev/null 2>&1\n \t\tethtool -K $c ufo on >/dev/null 2>&1\n#diff --git a/package/lean/autocore/files/index.htm b/package/lean/autocore/files/index.htm\n#index 22d1a55..0198c38 100644\n#--- a/package/lean/autocore/files/index.htm\n#+++ b/package/lean/autocore/files/index.htm\n#@@ -720,6 +720,7 @@\n# \t\t<tr><td width=\"33%\"><%:Firmware Version%></td><td>\n# \t\t\t<%=pcdata(ver.distname)%> <%=pcdata(ver.distversion)%> /\n# \t\t\t<%=pcdata(ver.luciname)%> (<%=pcdata(ver.luciversion)%>)\n# \t\t</td></tr>\n# \t\t<tr><td width=\"33%\"><%:Kernel Version%></td><td><%=unameinfo.release or \"?\"%></td></tr>\n# \t\t<tr><td width=\"33%\"><%:Local Time%></td><td id=\"localtime\">-</td></tr>\ndiff --git a/package/lean/autocore/files/sbin/cpuinfo b/package/lean/autocore/files/sbin/cpuinfo\nindex 19ea5fb..60e7acd 100755\n--- a/package/lean/autocore/files/sbin/cpuinfo\n+++ b/package/lean/autocore/files/sbin/cpuinfo\n@@ -2,7 +2,7 @@\n \n info()\n {\n-\tMHz=`grep 'MHz' /proc/cpuinfo | cut -c11- |sed -n '1p'`\n+\tMHz=`echo \"$(cat /sys/devices/system/cpu/cpu[04]/cpufreq/cpuinfo_cur_freq)/1000\" | bc`\n \t#获取CPU工作频率\n \n \tsensors >/dev/null\n@@ -12,7 +12,7 @@ info()\n \t\t#获取CPU核心1温度\n \n \telse\n-\t\ta=\"\"\n+\t\ta=`echo \"scale=2; $(cat /sys/class/thermal/thermal_zone0/temp)/1000\" | bc`°\n \tfi\n }\n \n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/002-enable-O3.patch",
    "content": "From 8e4c45742cfca87c0cc44e7969ab8826be9139be Mon Sep 17 00:00:00 2001\nFrom: \"Jan Alexander Steffens (heftig)\" <jan.steffens@gmail.com>\nDate: Mon, 25 Nov 2019 22:24:42 +0100\nSubject: [PATCH] ZEN: Unrestrict CONFIG_OPTIMIZE_FOR_PERFORMANCE_O3\n\n---\n init/Kconfig | 1 -\n 1 file changed, 1 deletion(-)\n\ndiff --git a/init/Kconfig b/init/Kconfig\nindex a34064a031a5e..b41b18edb10e8 100644\n--- a/init/Kconfig\n+++ b/init/Kconfig\n@@ -1228,7 +1228,6 @@ config CC_OPTIMIZE_FOR_PERFORMANCE\n \n config CC_OPTIMIZE_FOR_PERFORMANCE_O3\n \tbool \"Optimize more for performance (-O3)\"\n-\tdepends on ARC\n \timply CC_DISABLE_WARN_MAYBE_UNINITIALIZED  # avoid false positives\n \thelp\n \t  Choosing this option will pass \"-O3\" to your compiler to optimize\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/base_rk3328.seed",
    "content": "CONFIG_AUTOREMOVE=y\nCONFIG_BRCMFMAC_SDIO=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_PACKAGE_kmod-mmc=y\n\nCONFIG_IMAGEOPT=y\nCONFIG_JSON_ADD_IMAGE_INFO=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BLK_DEV_THROTTLING=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_KALLSYMS=y\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_LUCI_LANG_en=y\nCONFIG_OPENSSL_ENGINE_BUILTIN=y\nCONFIG_OPENSSL_WITH_DTLS=y\nCONFIG_OPENSSL_WITH_EC2M=y\nCONFIG_OPENSSL_WITH_NPN=y\nCONFIG_PACKAGE_antfs-mount=y\nCONFIG_PACKAGE_bash=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_diffutils=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-ikconfig=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb2-pci=y\nCONFIG_PACKAGE_kmod-usb3=y\n\nCONFIG_PACKAGE_libustream-openssl=y\nCONFIG_PACKAGE_libzstd=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_pigz=y\nCONFIG_PACKAGE_sudo=y\nCONFIG_PACKAGE_tar=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_vim-fuller=y\nCONFIG_PACKAGE_zstd=y\nCONFIG_PACKAGE_autocore=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_coreutils-nohup=y\n\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/check",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\n \nstart() {\n    nohup /bin/sh /usr/bin/check_inet.sh 1>/dev/null 2>&1 &\n}"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/check_inet.sh",
    "content": "#!/bin/sh\n# Copyright (c) 2020, Chuck <fanck0605@qq.com>\n#\n# this script is writing for openwrt\n# this script need the interface named 'lan'\n\n# usage: `/bin/sh /path/to/check_net4.sh >/dev/null 2>&1 &`\n\nget_ipv4_address() {\n  if ! if_status=$(ifstatus $1); then\n    return 1\n  fi\n  echo $if_status | jsonfilter -e \"@['ipv4-address'][0]['address']\"\n}\n\nif ! lan_addr=$(get_ipv4_address lan); then\n  logger \"Check network health: Don't support your network environment!\"\n  exit 1\nfi\n\nlogger 'Check network health: Script started!'\n\nfail_count=0\n\nwhile :; do\n  sleep 2s\n\n  # try to connect\n  if ping -W 1 -c 1 \"$lan_addr\" >/dev/null 2>&1; then\n    # No problem!\n    if [ $fail_count -gt 0 ]; then\n      logger 'Check network health: Network problems solved!'\n    fi\n    fail_count=0\n    continue\n  fi\n\n  # May have some problem\n  logger \"Check network health: Network may have some problems!\"\n  fail_count=$((fail_count + 1))\n\n  if [ $fail_count -ge 3 ]; then\n    # Must have some problem! We refresh the ip address and try again!\n    lan_addr=$(get_ipv4_address lan)\n\n    if ping -W 1 -c 1 \"$lan_addr\" >/dev/null 2>&1; then\n      continue\n    fi\n\n    logger 'Check network health: Network problem! Firewall reloading...'\n    echo -e \"$(date \"+%Y-%m-%d %H:%M:%S\"): Network problem! Firewall reloading...\" >> /var/log/check_inet.log\n    /etc/init.d/firewall reload >/dev/null 2>&1\n    sleep 2s\n\n    if ping -W 1 -c 1 \"$lan_addr\" >/dev/null 2>&1; then\n      continue\n    fi\n\n    logger 'Check network health: Network problem! Network reloading...'\n    echo -e \"$(date \"+%Y-%m-%d %H:%M:%S\"): Network problem! Network reloading...\" >> /var/log/check_inet.log\n    /etc/init.d/network restart >/dev/null 2>&1\n    sleep 2s\n  fi\ndone"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/defconfig.override",
    "content": "CONFIG_ATM_BR2684_IPFILTER=y\nCONFIG_ATM_CLIP_NO_ICMP=y\nCONFIG_ARM64_ERRATUM_826319=y\nCONFIG_ARM64_ERRATUM_827319=y\nCONFIG_ARM64_ERRATUM_824069=y\nCONFIG_ARM64_ERRATUM_819472=y\nCONFIG_ARM64_ERRATUM_832075=y\nCONFIG_ARM64_ERRATUM_1024718=y\nCONFIG_ARM64_ERRATUM_1418040=y\nCONFIG_ARM64_ERRATUM_1165522=y\nCONFIG_ARM64_ERRATUM_1286807=y\nCONFIG_ARM64_ERRATUM_1463225=y\nCONFIG_BRIDGE=y\nCONFIG_CRC32_SARWATE=y\nCONFIG_CRYPTO_PCRYPT=y\nCONFIG_DEBUG_INFO_REDUCED=y\nCONFIG_FLATMEM_MANUAL=y\nCONFIG_FORTIFY_SOURCE=y\nCONFIG_HZ_100=y\nCONFIG_IO_STRICT_DEVMEM=y\nCONFIG_IP_MROUTE_MULTIPLE_TABLES=y\nCONFIG_IP_NF_TARGET_FULLCONENAT=m\nCONFIG_JFFS2_COMPRESSION_OPTIONS=y\nCONFIG_JFFS2_FS_XATTR=y\nCONFIG_JFFS2_FS=y\nCONFIG_JFFS2_LZMA=y\nCONFIG_JFFS2_SUMMARY=y\nCONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y\nCONFIG_LEDS_TRIGGER_NETDEV=y\nCONFIG_MODULE_STRIPPED=y\nCONFIG_MTD_BLOCK=y\nCONFIG_MTD_CFI_AMDSTD=y\nCONFIG_MTD_CFI_INTELEXT=y\nCONFIG_MTD_CFI=y\nCONFIG_MTD_COMPLEX_MAPPINGS=y\nCONFIG_MTD_SPLIT_SQUASHFS_ROOT=y\nCONFIG_MTD=y\nCONFIG_NET_SCH_FQ_CODEL=m\nCONFIG_NET_SCHED=y\nCONFIG_NETFILTER_ADVANCED=y\nCONFIG_NETFILTER_INGRESS=y\nCONFIG_NETFILTER_XT_MARK=m\nCONFIG_NETFILTER_XT_MATCH_COMMENT=m\nCONFIG_NETFILTER_XT_MATCH_CONNTRACK=m\nCONFIG_NETFILTER_XT_MATCH_LIMIT=m\nCONFIG_NETFILTER_XT_MATCH_MAC=m\nCONFIG_NETFILTER_XT_MATCH_MULTIPORT=m\nCONFIG_NETFILTER_XT_MATCH_STATE=m\nCONFIG_NETFILTER_XT_MATCH_TIME=m\nCONFIG_NETFILTER_XT_NAT=m\nCONFIG_NETFILTER_XT_TARGET_CT=m\nCONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD=m\nCONFIG_NETFILTER_XT_TARGET_LOG=m\nCONFIG_NETFILTER_XT_TARGET_TCPMSS=m\nCONFIG_NETFILTER_XTABLES=m\nCONFIG_NF_CONNTRACK_RTCACHE=m\nCONFIG_NF_CONNTRACK_CHAIN_EVENTS=y\nCONFIG_NF_FLOW_TABLE_HW=m\nCONFIG_NF_FLOW_TABLE=m\nCONFIG_PANIC_ON_OOPS=y\nCONFIG_PINCTRL_SINGLE=y\nCONFIG_PROC_STRIPPED=y\nCONFIG_RCU_EXPERT=y\nCONFIG_RFKILL_INPUT=y\nCONFIG_RFKILL=y\nCONFIG_SECURITY_DMESG_RESTRICT=y\nCONFIG_SND_OSSEMUL=y\nCONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y\nCONFIG_SQUASHFS_EMBEDDED=y\nCONFIG_STRIP_ASM_SYMS=y\nCONFIG_USB_EHCI_FSL=m\nCONFIG_USB_EHCI_ROOT_HUB_TT=y\nCONFIG_USB_OHCI_HCD_PCI=m\nCONFIG_USB_SERIAL_SAFE_PADDED=y\nCONFIG_USB_UHCI_HCD=m\nCONFIG_VLAN_8021Q=y\nCONFIG_USB_RTL8152=y\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/opt.seed",
    "content": "CONFIG_LUCI_LANG_zh-cn=y\nCONFIG_LUCI_LANG_zh-tw=y\n\n#wireless card support\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=y\nCONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_kmod-brcmfmac=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wpad-mini=y\nCONFIG_PACKAGE_wpa-supplicant=y\n\n#Support Hilink 4G USB dongle & USB Tethering\n#CONFIG_PACKAGE_usb-modeswitch=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_usbutils=y\n\n# CONFIG_PACKAGE_kmod-mt76 is not set\n# CONFIG_PACKAGE_kmod-mt7601u is not set\n# CONFIG_PACKAGE_kmod-rtl8192cu is not set\n# CONFIG_PACKAGE_kmod-rtl8821ae is not set\n# CONFIG_PACKAGE_kmod-rtl8180 is not set\n# CONFIG_PACKAGE_kmod-rtl8187 is not set\n# CONFIG_PACKAGE_kmod-rtl8812au-ct is not set\n# CONFIG_PACKAGE_kmod-rtl8821ae is not set\n\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#OLED\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-i18n-oled-zh-cn=y\n\nCONFIG_PACKAGE_luci-app-accesscontrol=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_luci-app-diskman_INCLUDE_btrfs_progs=y\nCONFIG_PACKAGE_luci-app-diskman_INCLUDE_lsblk=y\nCONFIG_PACKAGE_luci-app-diskman=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-flowoffload=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_luci-app-nlbwmon=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-i18n-ssr-plus-zh-cn=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-app-trojan-server=y\n#CONFIG_PACKAGE_luci-app-oaf=y\nCONFIG_PACKAGE_kmod-oaf=y\nCONFIG_PACKAGE_luci-app-cifs-mount=y\nCONFIG_PACKAGE_luci-app-music-remote-center=y\nCONFIG_PACKAGE_luci-app-airplay2=y\nCONFIG_PACKAGE_luci-app-rclone=y\nCONFIG_PACKAGE_openssh-sftp-server=y\n\nCONFIG_PACKAGE_luci-app-dockerman=y\nCONFIG_PACKAGE_luci-lib-docker=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_docker-ce=y\n\nCONFIG_PACKAGE_luci-app-nps=y\n\nCONFIG_PACKAGE_luci-app-transmission=y\nCONFIG_PACKAGE_luci-theme-opentomcat=y\nCONFIG_PACKAGE_transmission-daemon-openssl=y\nCONFIG_PACKAGE_transmission-web-control=y\nCONFIG_PACKAGE_transmission-remote-openssl=y\n\nCONFIG_PACKAGE_luci-app-samba4=y\nCONFIG_PACKAGE_samba4-admin=y\nCONFIG_PACKAGE_samba4-client=y\nCONFIG_PACKAGE_samba4-utils=y\n#usb sound card support\nCONFIG_PACKAGE_kmod-sound-core=y\nCONFIG_PACKAGE_kmod-usb-audio=y\nCONFIG_PACKAGE_stress=y\n# CONFIG_PACKAGE_luci-app-adbyby-plus is not set\n# CONFIG_PACKAGE_adbyby is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_PACKAGE_luci-app-unblockmusic is not set\n# CONFIG_PACKAGE_luci-app-vlmcsd is not set\n# CONFIG_UnblockNeteaseMusic_Go is not set\n# CONFIG_UnblockNeteaseMusic_NodeJS is not set\n\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/patch_kernel_5.4.sh",
    "content": "cd friendlywrt-rk3328\ncd kernel/\ngit apply ../../r2s/add_fullconenat.diff\nwget https://github.com/armbian/build/raw/master/patch/kernel/rockchip64-dev/RK3328-enable-1512mhz-opp.patch\ngit apply RK3328-enable-1512mhz-opp.patch\ncd ../\ngit clone https://github.com/openwrt/openwrt && cd openwrt/\n#git checkout 4e0c54bc5bc8381e031af5147b66b4dadeecc626\nrm target/linux/generic/pending-5.4/403-mtd-hook-mtdsplit-to-Kbuild.patch\nrm target/linux/generic/hack-5.4/700-swconfig_switch_drivers.patch\n./scripts/patch-kernel.sh ../kernel target/linux/generic/backport-5.4\n./scripts/patch-kernel.sh ../kernel target/linux/generic/pending-5.4\n./scripts/patch-kernel.sh ../kernel target/linux/generic/hack-5.4\ncd ../\nwget https://github.com/torvalds/linux/raw/master/scripts/kconfig/merge_config.sh && chmod +x merge_config.sh\ngrep -i '_NETFILTER_\\|FLOW' ../r2s/.config.override > .config.override\n./merge_config.sh -m .config.override kernel/arch/arm64/configs/nanopi-r2_linux_defconfig && mv .config kernel/arch/arm64/configs/nanopi-r2_linux_defconfig\nsed -i -r 's/# (CONFIG_.*_ERRATUM_.*?) is.*/\\1=y/g' kernel/arch/arm64/configs/nanopi-r2_linux_defconfig\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s-mwan3.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S opt\n#=================================================\n\nname: FriendlyWrt R2S slim mwan3\n\non:\n  release:\n    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-mwan3.yml'\n  #schedule:\n  #  - cron: 30 20 * * *\n  watch:\n    types: started\n\nenv:\n  REPO_BRANCH: master\n  CONFIG_FILE: seed/slim.seed\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: true\n  UPLOAD_RELEASE: false\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-latest\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: free disk space\n        run: |\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n          \n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          /bin/bash r2s_step/00_init_env.sh\n\n      - name: Install friendlywrt source\n        run: |\n          /bin/bash r2s_step/01_friendlywrt.sh\n\n      - name: rebase lean opwrt\n        run: |\n          /bin/bash r2s_step/02_rebase2lean.sh\n\n#      - name: install kernel\n#        run: |\n#          /bin/bash r2s_step/03_kernel.sh\n\n      - name: Enable Kernel feature\n        run: |\n          /bin/bash r2s_step/04_fullcone_1.5g.sh\n \n      - name: Enable cpu autocore\n        run: |\n          cd friendlywrt-rk3328/friendlywrt/\n          git apply ../../patches/001-cpu-enable_autocore.patch\n          \n      - name: MOD the OpenWrt\n        run: |\n          /bin/bash r2s_step/06_mod_slim.sh\n\n      - name: Load config\n        run: |\n          cd friendlywrt-rk3328\n          wget https://github.com/torvalds/linux/raw/master/scripts/kconfig/merge_config.sh && chmod +x merge_config.sh\n          ./merge_config.sh -m kernel/arch/arm64/configs/nanopi-r2_linux_defconfig ../seed/defconfig.override\n          cat .config > kernel/arch/arm64/configs/nanopi-r2_linux_defconfig\n          rm -f friendlywrt/.config*\n          cat configs/config_rk3328 | grep \"TARGET\" >> ../seed/base_rk3328.seed\n          cat ../$CONFIG_FILE >> ../seed/base_rk3328.seed\n          cat ../seed/base_rk3328.seed > configs/config_rk3328\n          echo '\n          CONFIG_KERNEL_CGROUPS=y\n          CONFIG_PACKAGE_luci-app-mwan3=y\n          CONFIG_PACKAGE_luci-app-mwan3helper=y\n          CONFIG_PACKAGE_mwan3=y\n          CONFIG_PACKAGE_luci-app-syncdial=y\n          ' >> configs/config_rk3328\n          \n      - name: Build OpenWrt\n        run: |\n          cd friendlywrt-rk3328\n          ./build.sh nanopi_r2s.mk\n      \n      - name: Fix Rootfs Owner and Group\n        run: |\n          /bin/bash r2s_step/10_fix_rootfs.sh\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv friendlywrt-rk3328/out/*img* ./artifact/\n          cd ./artifact/\n          gzip *.img\n          zip R2S-slim-mwan3-$(date +%Y-%m-%d).zip *.img.gz\n          rm *.img.gz\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          echo \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n          release_tag=\"NanoPi-R2S-mwan3 ${{ env.DATE }}\"\n          echo \"##[set-output name=release_tag;]$release_tag\"\n          cd ../friendlywrt-rk3328/friendlywrt\n          cp .config ../../artifact/config-mwan3-full\n          ./scripts/diffconfig.sh > ../../artifact/config-mwan3.seed\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_mwan3_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: 最新编译时间:${{ env.DATE }}\n          allowUpdates: true\n          tag: FriendlyWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          body: |\n            最新编译版本: ${{ steps.organize.outputs.release_tag }}\n            源码更新日期: ${{ env.VersionDate }}\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s-opt.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S opt\n#=================================================\n\nname: FriendlyWrt R2S Opt\n\non:\n  release:\n    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-opt.yml'\n      - 'seed/opt.seed'\n      - 'r2s_step/06_mod_opt.sh'\n#  schedule:\n#    - cron: 30 20 * * *\n  watch:\n    types: started\n\nenv:\n  REPO_URL: https://github.com/coolsnowwolf/lede\n  REPO_BRANCH: master\n  CONFIG_FILE: seed/opt.seed\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: true\n  UPLOAD_RELEASE: false\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: free disk space\n        run: |\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          /bin/bash r2s_step/00_init_env.sh\n\n      - name: Install friendlywrt source\n        run: |\n          /bin/bash r2s_step/01_friendlywrt.sh\n\n      - name: Install openwrt source\n        run: |\n          /bin/bash r2s_step/02_rebase2lean.sh\n\n#      - name: Patch 5.4 Kernel\n#        run: |\n#          /bin/bash r2s_step/03_kernel.sh\n\n      - name: Enable Kernel feature\n        run: |\n          /bin/bash r2s_step/04_fullcone_1.5g.sh\n \n      - name: Enable cpu autocore\n        run: |\n          cd friendlywrt-rk3328/friendlywrt/\n          git apply ../../patches/001-cpu-enable_autocore.patch\n          \n      - name: MOD the OpenWrt\n        run: |\n          /bin/bash r2s_step/06_mod_opt.sh\n\n      - name: Load config\n        run: |\n          /bin/bash r2s_step/09_load_config.sh\n\n      - name: SSH connection to Actions\n        uses: P3TERX/debugger-action@master\n        if: env.SSH_ACTIONS == 'true'\n\n      - name: Build OpenWrt\n        run: |\n          cd friendlywrt-rk3328\n          ./build.sh nanopi_r2s.mk\n      \n      - name: Fix Rootfs Owner and Group\n        run: |\n          /bin/bash r2s_step/10_fix_rootfs.sh\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv friendlywrt-rk3328/out/*img* ./artifact/\n          cd ./artifact/\n          gzip *.img\n          zip R2S-opt-$(date +%Y-%m-%d).zip *.img.gz\n          rm *.img.gz\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          echo \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n          release_tag=\"NanoPi-R2S-opt ${{ env.DATE }}\"\n          echo \"##[set-output name=release_tag;]$release_tag\"\n          cd ../friendlywrt-rk3328/friendlywrt\n          cp .config ../../artifact/config-opt-full\n          ./scripts/diffconfig.sh > ../../artifact/config-opt.seed\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_opt_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: FriendlyWrt-R2S固件\n          allowUpdates: true\n          tag: FriendlyWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          body: |\n            基于FriendlyWrt架构\n            最新编译时间:${{ env.DATE }}\n            最新编译版本: ${{ steps.organize.outputs.release_tag }}\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s-slim-test.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S slim\n#=================================================\n\nname: FriendlyWrt R2S slim test\n\non:\n  release:\n    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-slim-test.yml'\n#      - 'seed/slim.seed'\n#      - 'r2s_step/06_mod_slim.sh'\n#  schedule:\n#    - cron: 30 20 * * *\n#  watch:\n#    types: started\n\nenv:\n  REPO_BRANCH: master\n  CONFIG_FILE: seed/slim.seed\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: true\n  UPLOAD_RELEASE: false\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n        \n      - name: free disk space\n        run: |\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          /bin/bash r2s_step/00_init_env.sh\n\n      - name: Install friendlywrt source\n        run: |\n          /bin/bash r2s_step/01_friendlywrt.sh\n          cd friendlywrt-rk3328\n          sed -i 's|friendlyarm/rtl8821CU|fanck0605/rtl8821CU|g' ./scripts/sd-fuse/build-kernel.sh\n\n      - name: Install openwrt\n        run: |\n          /bin/bash r2s_step/02_rebase2lean.sh\n      - name: install kernel\n        run: |\n          /bin/bash r2s_step/03_kernel.sh\n\n      - name: Patch 5.4 Kernel\n        run: |\n          /bin/bash r2s_step/03_kernel.sh\n\n      - name: Enable Kernel feature\n        run: |\n          /bin/bash r2s_step/04_fullcone_1.5g.sh\n \n      - name: Enable cpu autocore\n        run: |\n          cd friendlywrt-rk3328/friendlywrt/\n          git apply ../../patches/001-cpu-enable_autocore.patch\n          \n      - name: MOD the OpenWrt\n        run: |\n          /bin/bash r2s_step/06_mod_slim.sh\n          svn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/rtl8821cu package/rtl8821cu\n\n      - name: Load config\n        run: |\n          /bin/bash r2s_step/09_load_config.sh\n          cd friendlywrt-rk3328\n          echo 'CONFIG_PACKAGE_kmod-rtl8821cu=y' >> configs/config_rk3328\n\n      - name: SSH connection to Actions\n        uses: P3TERX/debugger-action@master\n        if: env.SSH_ACTIONS == 'true'\n      \n      - name: Build OpenWrt\n        run: |\n          cd friendlywrt-rk3328\n          ./build.sh nanopi_r2s.mk\n      \n      - name: Fix Rootfs Owner and Group\n        run: |\n          /bin/bash r2s_step/10_fix_rootfs.sh\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv friendlywrt-rk3328/out/*img* ./artifact/\n          cd ./artifact/\n          gzip *.img\n          zip R2S-slim-$(date +%Y-%m-%d).zip *.img.gz\n          rm *.img.gz\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          echo \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n          release_tag=\"NanoPi-R2S-${{ env.DATE }}-slim\"\n          echo \"##[set-output name=release_tag;]$release_tag\"\n          cd ../friendlywrt-rk3328/friendlywrt\n          cp .config ../../artifact/config-slim-full\n          ./scripts/diffconfig.sh > ../../artifact/config-slim.seed\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_slim_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: FriendlyWrt-R2S固件\n          allowUpdates: true\n          tag: FriendlyWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          body: |\n            基于FriendlyWrt架构\n            最新编译时间:${{ env.DATE }}\n            最新编译版本: ${{ steps.organize.outputs.release_tag }}\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s-slim.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S slim\n#=================================================\n\nname: FriendlyWrt R2S Slim\n\non:\n  release:\n    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-slim.yml'\n      - 'seed/slim.seed'\n      - 'r2s_step/06_mod_slim.sh'\n# schedule:\n#   - cron: 30 20 * * *\n  watch:\n    types: started\n\nenv:\n  REPO_BRANCH: master\n  CONFIG_FILE: seed/slim.seed\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: true\n  UPLOAD_RELEASE: false\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n      - name: free disk space\n        run: |\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          /bin/bash r2s_step/00_init_env.sh\n\n      - name: Install friendlywrt source\n        run: |\n          /bin/bash r2s_step/01_friendlywrt.sh\n\n      - name: install openwrt\n        run: |\n          /bin/bash r2s_step/02_rebase2lean.sh\n\n#      - name: Install 5.4 Kernel\n#        run: |\n#          /bin/bash r2s_step/03_kernel.sh\n\n      - name: Enable Kernel feature\n        run: |\n          /bin/bash r2s_step/04_fullcone_1.5g.sh\n \n      - name: Enable cpu autocore\n        run: |\n          cd friendlywrt-rk3328/friendlywrt/\n          git apply ../../patches/001-cpu-enable_autocore.patch\n          \n      - name: MOD the OpenWrt\n        run: |\n          /bin/bash r2s_step/06_mod_slim.sh\n\n      - name: Load config\n        run: |\n          /bin/bash r2s_step/09_load_config.sh\n      \n      - name: Build OpenWrt\n        run: |\n          cd friendlywrt-rk3328\n          ./build.sh nanopi_r2s.mk\n      \n      - name: Fix Rootfs Owner and Group\n        run: |\n          /bin/bash r2s_step/10_fix_rootfs.sh\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv friendlywrt-rk3328/out/*img* ./artifact/\n          cd ./artifact/\n          gzip *.img\n          zip R2S-slim-$(date +%Y-%m-%d).zip *.img.gz\n          rm *.img.gz\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          echo \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n          release_tag=\"NanoPi-R2S-slim ${{ env.DATE }}\"\n          echo \"##[set-output name=release_tag;]$release_tag\"\n          cd ../friendlywrt-rk3328/friendlywrt\n          cp .config ../../artifact/config-slim-full\n          ./scripts/diffconfig.sh > ../../artifact/config-slim.seed\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_slim_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: FriendlyWrt-R2S固件\n          allowUpdates: true\n          tag: FriendlyWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          body: |\n            基于FriendlyWrt架构编译，自用固件，风险自负\n            最新编译时间:${{ env.DATE }}\n            最新编译版本: ${{ steps.organize.outputs.release_tag }}\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s-tiny.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S slim\n#=================================================\n\nname: FriendlyWrt R2S tiny\n\non:\n  release:\n    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-tiny.yml'\n      - 'seed/tiny.seed'\n  schedule:\n    - cron: 30 20 * * *\n  watch:\n    types: started\n\nenv:\n  REPO_BRANCH: master\n  CONFIG_FILE: seed/tiny.seed\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: false\n  UPLOAD_RELEASE: true\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: free disk space\n        run: |\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          /bin/bash r2s_step/00_init_env.sh\n\n      - name: Install friendlywrt source\n        run: |\n          /bin/bash r2s_step/01_friendlywrt.sh\n\n      - name: Install openwrt source\n        run: |\n          /bin/bash r2s_step/02_rebase2lean.sh\n      - name: install kernel\n        run: |\n          /bin/bash r2s_step/03_kernel.sh\n      - name: Enable Kernel feature\n        run: |\n          /bin/bash r2s_step/04_fullcone_1.5g.sh\n      - name: Enable cpu autocore\n        run: |\n          cd friendlywrt-rk3328/friendlywrt/\n          git apply ../../patches/001-cpu-enable_autocore.patch\n          \n      - name: MOD the OpenWrt\n        run: |\n          /bin/bash r2s_step/06_mod_slim.sh\n      - name: Load config\n        run: |\n          /bin/bash r2s_step/09_load_config.sh\n      \n      - name: Build OpenWrt\n        run: |\n          cd friendlywrt-rk3328\n          ./build.sh nanopi_r2s.mk\n      \n      - name: Fix Rootfs Owner and Group\n        run: |\n          /bin/bash r2s_step/10_fix_rootfs.sh\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv friendlywrt-rk3328/out/*img* ./artifact/\n          cd ./artifact/\n          gzip *.img\n          zip R2S-tiny-$(date +%Y-%m-%d).zip *.img.gz\n          rm *.img.gz\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          echo \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n          release_tag=\"NanoPi-R2S-tiny ${{ env.DATE }}\"\n          echo \"##[set-output name=release_tag;]$release_tag\"\n          cd ../friendlywrt-rk3328/friendlywrt\n          cp .config ../../artifact/config-tiny-full\n          ./scripts/diffconfig.sh > ../../artifact/config-tiny.seed\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_tiny_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: FriendlyWrt-R2S固件\n          allowUpdates: true\n          tag: FriendlyWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          body: |\n            基于FriendlyWrt架构编译，自用固件，风险自负\n            最新编译时间:${{ env.DATE }}          \n            最新编译版本: ${{ steps.organize.outputs.release_tag }}\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/00_init_env.sh",
    "content": "#!/bin/bash\nclear\nsudo rm -rf /etc/apt/sources.list.d\nsudo apt-get update\nsudo apt-get -y --no-install-recommends install build-essential asciidoc binutils bison bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf python3\ncurl https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh  | sed '/#/d' | sed 's/\\\\//g' | sed 's/exit 0//g' | sed 's/sudo apt -y install//g' | sed 's/sudo apt-get -y install//g' | sed 's/:i386//g' | xargs sudo apt-get -y --no-install-recommends install\nsudo rm -rf /usr/share/dotnet /usr/local/lib/android/sdk /usr/local/share/boost /opt/ghc\ngit config --global user.name \"Actions\"\ngit config --global user.email \"actions@github.com\"\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/01_friendlywrt.sh",
    "content": "#!/bin/bash\nexport TERM=linux\ngit clone https://github.com/friendlyarm/repo\nsudo cp repo/repo /usr/bin/\nrm -rf friendlywrt-rk3328\nmkdir friendlywrt-rk3328 && cd friendlywrt-rk3328\nrepo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v19.07.1 -m rk3328.xml --repo-url=https://github.com/friendlyarm/repo --no-clone-bundle\nrepo sync -c --no-tags --no-clone-bundle -j8\n#sed -i 's|friendlyarm/rtl8821CU|fanck0605/rtl8821CU|g' ./scripts/sd-fuse/build-kernel.sh\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/02_rebase2lean.sh",
    "content": "#!/bin/bash\nclear\ncd friendlywrt-rk3328/friendlywrt/\ngit config --local user.email \"action@github.com\" && git config --local user.name \"GitHub Action\"\ngit remote add upstream https://github.com/coolsnowwolf/lede && git fetch upstream\ngit rebase adc1a9a3676b8d7be1b48b5aed185a94d8e42728^ --onto upstream/master -X theirs\nrm target/linux/rockchip-rk3328/patches-4.14/0001-net-thunderx-workaround-BGX-TX-Underflow-issue.patch\ngit checkout upstream/master -- feeds.conf.default\nsed -i '$a\\src-git helloworld https://github.com/fw876/helloworld' ./feeds.conf.default\nsed -i 's/^src-git telephony/#src-git telephony/g' ./feeds.conf.default\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/03_kernel.sh",
    "content": "#!/bin/bash\nexport TERM=linux\ncd friendlywrt-rk3328/kernel\ngit config --local user.email \"action@github.com\" && git config --local user.name \"GitHub Action\"\ngit remote add upstream https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git && git fetch upstream\ngit rebase upstream/linux-5.4.y\ncd ../\n#patch openwrt 5.4 kernel\ngit clone https://git.openwrt.org/openwrt/openwrt.git --depth=1 && cd openwrt/\nwget -p https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/952-net-conntrack-events-support-multiple-registrant.patch ./target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\ncp -a ./target/linux/generic/files/* ../kernel/\n./scripts/patch-kernel.sh ../kernel target/linux/generic/backport-5.4\n./scripts/patch-kernel.sh ../kernel target/linux/generic/pending-5.4\n./scripts/patch-kernel.sh ../kernel target/linux/generic/hack-5.4\n./scripts/patch-kernel.sh ../kernel target/linux/octeontx/patches-5.4\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/04_fullcone_1.5g.sh",
    "content": "#!/bin/bash\nclear\nexport TERM=linux\ncd friendlywrt-rk3328/kernel/\nwget -O net/netfilter/xt_FULLCONENAT.c https://raw.githubusercontent.com/Chion82/netfilter-full-cone-nat/master/xt_FULLCONENAT.c\ngit apply ../../patches/000-fullconenat.patch\ngit apply ../../patches/002-enable-O3.patch\nwget https://github.com/armbian/build/raw/master/patch/kernel/rockchip64-dev/RK3328-enable-1512mhz-opp.patch\ngit apply RK3328-enable-1512mhz-opp.patch\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/06_mod_opt.sh",
    "content": "#!/bin/bash\nclear\nexport TERM=linux\n#进入friendlywrt目录\ncd friendlywrt-rk3328/friendlywrt/\n#增加防掉线脚本\nmv ../../script/check_inet.sh package/base-files/files/usr/bin/ && chmod +x package/base-files/files/usr/bin/check_inet.sh\nmv ../../script/check package/base-files/files/etc/init.d/ && chmod +x package/base-files/files/etc/init.d/check\n#刷机脚本\nmv ../../script/update.sh package/base-files/files/root/update.sh && chmod +x package/base-files/files/root/update.sh\n#生成时间\nVersionDate=$(git show -s --date=short --format=\"%cd\")\necho \"::set-env name=VersionDate::$VersionDate\"\necho \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n#改为Ofast make coremark，跑分\nsed -i 's,-DMULTIT,-Ofast -DMULTIT,g' package/lean/coremark/Makefile\n#修改版本号\nsed -i 's/OpenWrt/Quintus Build @ $(date \"+%Y.%m.%d\")/g' package/lean/default-settings/files/zzz-default-settings\necho -e '\\nQuintus Build\\n'  >> package/base-files/files/etc/banner\n#更新替换软件包\nrm -rf package/lean/luci-theme-opentomcat\nrm -rf package/lean/luci-app-frpc\nrm -rf package/lean/luci-app-frps\nrm -rf package/lean/luci-app-dockerman\nrm -rf package/lean/luci-app-diskman\n#rm -rf package/lean/luci-app-samba4\n#rm -rf package/lean/samba4\n#rm -rf package/feeds/packages/ttyd\n#rm -rf package/lean/luci-app-ttyd\n#rm -rf package/lean/luci-app-zerotier\n#git clone https://github.com/rufengsuixing/luci-app-zerotier.git package/lean/luci-app-zerotier\n#OLED display\ngit clone https://github.com/natelol/luci-app-oled package/natelol/luci-app-oled\n#\ngit clone https://github.com/Leo-Jo-My/luci-theme-opentomcat.git package/lean/luci-theme-opentomcat\ngit clone https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps\ngit clone https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc\ngit clone https://github.com/lisaac/luci-app-dockerman.git package/lean/luci-app-dockerman\ngit clone https://github.com/lisaac/luci-app-diskman.git package/lean/luci-app-diskman\nsvn co https://github.com/songchenwen/nanopi-r2s/trunk/luci-app-r2sflasher package/luci-app-r2sflasher\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/gost package/gost\nsvn co https://github.com/Lienol/openwrt-package/trunk/lienol/luci-app-trojan-server package/luci-app-trojan-server\n#git clone https://github.com/destan19/OpenAppFilter.git package/OpenAppFilter\n#svn co https://github.com/openwrt/luci/trunk/applications/luci-app-samba4 package/lean/luci-app-samba4\n#svn co https://github.com/openwrt/packages/trunk/net/samba4 package/lean/samba4\n#svn co https://github.com/openwrt/packages/trunk/utils/ttyd package/ttyd\n#svn co https://github.com/openwrt/luci/trunk/applications/luci-app-ttyd package/luci-app-ttyd\n#jd-dailybonus\ngit clone https://github.com/jerrykuku/node-request package/lean/node-request\ngit clone https://github.com/jerrykuku/luci-app-jd-dailybonus package/lean/luci-app-jd-dailybonus\n#git clone https://github.com/ElonH/Rclone-OpenWrt.git\n#rm -rf lean/rclone\n#rm -rf lean/luci-app-rclone\n\n#更改默認主題及界面語言\nsed -i '/uci commit luci/i\\uci set luci.main.mediaurlbase=\"/luci-static/opentomcat\"' package/lean/default-settings/files/zzz-default-settings\nsed -i 's/luci.main.lang=zh_cn/luci.main.lang=auto/g' package/lean/default-settings/files/zzz-default-settings\n\n#關閉wan外部傳入及轉發\nsed -i '/firewall/d' ../device/friendlyelec/rk3328/default-settings/install.sh\n#只允許ssh在lan內部連接\nsed -i '/uci commit luci/a\\uci commit dropbear' package/lean/default-settings/files/zzz-default-settings\nsed -i '/uci commit luci/a\\uci set dropbear.@dropbear[0].Interface='lan'' package/lean/default-settings/files/zzz-default-settings\n\n#关闭ipv6\nsed -i '/uci commit/i\\uci delete network.lan.ip6assign' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete network.wan6' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.ra' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.dhcpv6' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.ndp' package/base-files/files/root/setup.sh\n#默认dnsmasq-full\nsed -i 's/dnsmasq /dnsmasq-full default-settings luci /' include/target.mk\n#install upx\nmkdir -p staging_dir/host/bin/\nln -s /usr/bin/upx-ucl staging_dir/host/bin/upx\n#增加最大连接\nsed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf\n#其它\n#sed -i '/exit/i\\chown -R root:root /usr/share/netdata/web' package/lean/default-settings/files/zzz-default-settings\n#sed -i '/exit/i\\find /etc/rc.d/ -name *docker* -delete' package/lean/default-settings/files/zzz-default-settings\n#sed -i '/8.8.8.8/d' package/base-files/files/root/setup.sh\n#sed -i 's/option fullcone\\t1/option fullcone\\t0/' package/network/config/firewall/files/firewall.config\n# Modify default IP\n#sed -i 's/192.168.1.1/192.168.50.5/g' package/base-files/files/bin/config_generate\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/06_mod_slim.sh",
    "content": "#!/bin/bash\nclear\nexport TERM=linux\n#进入friendlywrt目录\ncd friendlywrt-rk3328/friendlywrt/\n#增加防掉线脚本\nmv ../../script/check_inet.sh package/base-files/files/usr/bin/ && chmod +x package/base-files/files/usr/bin/check_inet.sh\nmv ../../script/check package/base-files/files/etc/init.d/ && chmod +x package/base-files/files/etc/init.d/check\n#刷机脚本\nmv ../../script/update.sh package/base-files/files/root/update.sh && chmod +x package/base-files/files/root/update.sh\n#修改版本号\nsed -i 's/OpenWrt/Quintus Build @ $(date \"+%Y.%m.%d\")/g' package/lean/default-settings/files/zzz-default-settings\necho -e '\\nQuintus Build\\n'  >> package/base-files/files/etc/banner\n#生成时间\nVersionDate=$(git show -s --date=short --format=\"%cd\")\necho \"::set-env name=VersionDate::$VersionDate\"\necho \"::set-env name=DATE::$(date \"+%Y-%m-%d %H:%M:%S\")\"\n#改为Ofast make coremark，跑分\nsed -i 's,-DMULTIT,-Ofast -DMULTIT,g' package/lean/coremark/Makefile\n#更新替换软件包\nrm -rf package/lean/luci-theme-opentomcat\nrm -rf package/lean/luci-app-frpc\nrm -rf package/lean/luci-app-frps\nrm -rf package/lean/luci-app-diskman\n#rm -rf package/lean/luci-app-samba4\n#rm -rf package/lean/samba4\n#rm -rf package/feeds/packages/ttyd\n#rm -rf package/lean/luci-app-ttyd\n#rm -rf package/lean/luci-app-zerotier\n#git clone https://github.com/rufengsuixing/luci-app-zerotier.git package/lean/luci-app-zerotier\n#OLED display\ngit clone https://github.com/natelol/luci-app-oled package/natelol/luci-app-oled\ngit clone https://github.com/Leo-Jo-My/luci-theme-opentomcat.git package/lean/luci-theme-opentomcat\ngit clone https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps\ngit clone https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc\n#git clone https://github.com/lisaac/luci-app-diskman.git package/lean/luci-app-diskman\nsvn co https://github.com/songchenwen/nanopi-r2s/trunk/luci-app-r2sflasher package/luci-app-r2sflasher\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/gost package/gost\ngit clone https://github.com/lisaac/luci-app-dockerman.git package/lean/luci-app-dockerman\n#svn co https://github.com/openwrt/luci/trunk/applications/luci-app-samba4 package/lean/luci-app-samba4\n#svn co https://github.com/openwrt/packages/trunk/net/samba4 package/lean/samba4\n#svn co https://github.com/openwrt/packages/trunk/utils/ttyd package/ttyd\n#svn co https://github.com/openwrt/luci/trunk/applications/luci-app-ttyd package/luci-app-ttyd\n#jd-dailybonus\ngit clone https://github.com/jerrykuku/node-request package/lean/node-request\ngit clone https://github.com/jerrykuku/luci-app-jd-dailybonus package/lean/luci-app-jd-dailybonus\n#更改默認主題及界面语言\nsed -i '/uci commit luci/i\\uci set luci.main.mediaurlbase=\"/luci-static/opentomcat\"' package/lean/default-settings/files/zzz-default-settings\nsed -i 's/luci.main.lang=zh_cn/luci.main.lang=auto/g' package/lean/default-settings/files/zzz-default-settings\n\n#關閉wan外部傳入及轉發\nsed -i '/firewall/d' ../device/friendlyelec/rk3328/default-settings/install.sh\n#只允許ssh在lan內部連接\nsed -i '/uci commit luci/a\\uci commit dropbear' package/lean/default-settings/files/zzz-default-settings\nsed -i '/uci commit luci/a\\uci set dropbear.@dropbear[0].Interface='lan'' package/lean/default-settings/files/zzz-default-settings\n#关闭ipv6\nsed -i '/uci commit/i\\uci delete network.lan.ip6assign' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete network.wan6' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.ra' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.dhcpv6' package/base-files/files/root/setup.sh\nsed -i '/uci commit/i\\uci delete dhcp.lan.ndp' package/base-files/files/root/setup.sh\n#默认dnsmasq-full\nsed -i 's/dnsmasq /dnsmasq-full default-settings luci /' include/target.mk\n#增加最大连接\nsed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf\n#install upx\nmkdir -p staging_dir/host/bin/\nln -s /usr/bin/upx-ucl staging_dir/host/bin/upx\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/09_load_config.sh",
    "content": "#!/bin/bash\nexport TERM=linux\ncd friendlywrt-rk3328\n#deconfig\n#wget https://github.com/fanck0605/nanopi-r2s/raw/lean/nanopi-r2_linux_defconfig\nwget https://github.com/fanck0605/nanopi-r2s/raw/openwrt-lienol/nanopi-r2_linux_defconfig\ncat ./nanopi-r2_linux_defconfig > ./kernel/arch/arm64/configs/nanopi-r2_linux_defconfig\necho '\nCONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED=y\nCONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3=y\n' >> ./kernel/arch/arm64/configs/nanopi-r2_linux_defconfig\n#.config\nrm -f friendlywrt/.config*\ncat configs/config_rk3328 | grep \"TARGET\" >> ../seed/base_rk3328.seed\ncat ../$CONFIG_FILE >> ../seed/base_rk3328.seed\ncat ../seed/base_rk3328.seed > configs/config_rk3328\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/r2s_step/10_fix_rootfs.sh",
    "content": "#!/bin/bash\nexport TERM=linux\nsudo df -lh\nlodev=$(sudo losetup -f)\necho \"found unused loop dev $lodev\"\nsudo losetup -P $lodev friendlywrt-rk3328/out/*.img\nsudo rm -rf /mnt/friendlywrt-tmp\nsudo mkdir -p /mnt/friendlywrt-tmp\nsudo mount ${lodev}p1 /mnt/friendlywrt-tmp\nsudo chown -R root:root /mnt/friendlywrt-tmp\nsudo umount /mnt/friendlywrt-tmp\nsudo losetup -d $lodev\nexit 0\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/slim.seed",
    "content": "CONFIG_LUCI_LANG_zh-cn=y\n#luci-app\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-flowoffload=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-theme-opentomcat=y\nCONFIG_PACKAGE_stress=y\n\n#Disable default package\n# CONFIG_PACKAGE_luci-app-adbyby-plus is not set\n# CONFIG_PACKAGE_adbyby is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_PACKAGE_luci-app-unblockmusic is not set\n# CONFIG_PACKAGE_luci-app-vlmcsd is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_LUCI_LANG_zh-tw is not set\n# CONFIG_PACKAGE_luci-app-wol is not set\n# CONFIG_PACKAGE_luci-app-arpbind is not set\n# CONFIG_PACKAGE_luci-app-nlbwmon is not set\n# CONFIG_PACKAGE_luci-app-accesscontrol is not set\n# CONFIG_UnblockNeteaseMusic_Go is not set\n# CONFIG_UnblockNeteaseMusic_NodeJS is not set\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#docker support\n#CONFIG_PACKAGE_luci-app-dockerman=y\n#CONFIG_PACKAGE_luci-lib-docker=y\n#CONFIG_PACKAGE_luci-lib-jsonc=y\n#CONFIG_PACKAGE_docker-ce=y\n\n#wireless card support\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=y\nCONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_kmod-brcmfmac=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wpad-mini=y\nCONFIG_PACKAGE_wpa-supplicant=y\n\n#Support Hilink 4G USB dongle & USB Tethering\n#CONFIG_PACKAGE_usb-modeswitch=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_usbutils=y\n\n#OLED\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-i18n-oled-zh-cn=y\n\n#zerotier\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_zerotier=y\n\nCONFIG_PACKAGE_luci-app-accesscontrol=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-wol=y\n\n#frp\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/slim.seed copy",
    "content": "CONFIG_LUCI_LANG_zh-cn=y\nCONFIG_LUCI_LANG_zh-tw=y\n#wireless card support\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=y\nCONFIG_PACKAGE_hostapd-utils=y\n#CONFIG_PACKAGE_kmod-mmc=y\n# CONFIG_PACKAGE_kmod-mt76 is not set\n# CONFIG_PACKAGE_kmod-mt7601u is not set\n# CONFIG_PACKAGE_kmod-rtl8192cu is not set\n# CONFIG_PACKAGE_kmod-rtl8821ae is not set\n# CONFIG_PACKAGE_kmod-rtl8180 is not set\n# CONFIG_PACKAGE_kmod-rtl8187 is not set\n# CONFIG_PACKAGE_kmod-rtl8812au-ct is not set\n# CONFIG_PACKAGE_kmod-rtl8821ae is not set\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\n# CONFIG_PACKAGE_kmod-brcmfmac is not set\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpa-supplicant=y\n\n#luci-app\nCONFIG_PACKAGE_luci-app-accesscontrol=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\n\n#diskman\n#CONFIG_PACKAGE_luci-app-diskman_INCLUDE_btrfs_progs=y\n#CONFIG_PACKAGE_luci-app-diskman_INCLUDE_lsblk=y\n#CONFIG_PACKAGE_luci-app-diskman=y\n\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-flowoffload=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\n\nCONFIG_PACKAGE_luci-app-nlbwmon=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_ttyd=y\n\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_zerotier=y\n\nCONFIG_PACKAGE_luci-theme-opentomcat=y\nCONFIG_PACKAGE_stress=y\n#CONFIG_PACKAGE_luci-app-nps=y\n# CONFIG_PACKAGE_luci-app-adbyby-plus is not set\n# CONFIG_PACKAGE_adbyby is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_PACKAGE_luci-app-unblockmusic is not set\n# CONFIG_PACKAGE_luci-app-vlmcsd is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_UnblockNeteaseMusic_Go is not set\n# CONFIG_UnblockNeteaseMusic_NodeJS is not set\n"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/test.seed",
    "content": "CONFIG_LUCI_LANG_zh-cn=y\n#wireless card support\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\n# CONFIG_PACKAGE_kmod-brcmfmac is not set\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpa-supplicant=y\n#luci-app\nCONFIG_PACKAGE_luci-app-accesscontrol=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\n#diskman\nCONFIG_PACKAGE_luci-app-diskman_INCLUDE_btrfs_progs=y\nCONFIG_PACKAGE_luci-app-diskman_INCLUDE_lsblk=y\nCONFIG_PACKAGE_luci-app-diskman=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-flowoffload=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_luci-app-nlbwmon=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_luci-theme-opentomcat=y\nCONFIG_PACKAGE_stress=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n# CONFIG_LUCI_CSSTIDY is not set\n# CONFIG_LUCI_JSMIN is not set\nCONFIG_LUCI_LANG_zh_Hans=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_addition-trans-zh=y\nCONFIG_PACKAGE_autocore=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_irqbalance=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-nlbwmon=y\nCONFIG_PACKAGE_luci-app-openclash=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray_plugin=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Server=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_wget=y\n# CONFIG_COLLECT_KERNEL_DEBUG is not set\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/tiny.seed",
    "content": "CONFIG_LUCI_LANG_zh-cn=y\n#luci-app\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-flowoffload=y\nCONFIG_PACKAGE_luci-app-r2sflasher=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-theme-opentomcat=y\nCONFIG_PACKAGE_stress=y\n# CONFIG_PACKAGE_luci-app-adbyby-plus is not set\n# CONFIG_PACKAGE_adbyby is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_PACKAGE_luci-app-unblockmusic is not set\n# CONFIG_PACKAGE_luci-app-vlmcsd is not set\n# CONFIG_PACKAGE_luci-app-vsftpd is not set\n# CONFIG_LUCI_LANG_zh-tw is not set\n# CONFIG_PACKAGE_luci-app-wol is not set\n# CONFIG_PACKAGE_luci-app-arpbind is not set\n# CONFIG_PACKAGE_luci-app-nlbwmon is not set\n# CONFIG_PACKAGE_luci-app-accesscontrol is not set\n# CONFIG_UnblockNeteaseMusic_Go is not set\n# CONFIG_UnblockNeteaseMusic_NodeJS is not set\n\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-i18n-oled-zh-cn=y\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y"
  },
  {
    "path": "not_use_file/Friendlywrt_archive/update.sh",
    "content": "#!/bin/sh\n\nrom=0; \t#rom值若为0，则会出现可选菜单，也可手动改为1-3，将不会出现选项\nbackup=0; \t#backup值若为0，则会出现可选菜单，也可手动改为1-3，将不会出现选项\nmode=0; \t#mode值若为0，则会出现可选菜单，也可手动改为1-3，将不会出现选项\nchecknet=0; \t#checknet值若为0，则会出现可选菜单，也可手动改为1-3，将不会出现选项\nsuffix=1; \t#判定升级文件名后缀，无需改动，保持1即可\nwhile [ $rom -eq 0 ]\n\tdo\n\t\techo\n\t\techo \"...........欢迎使用 R2S 一键升级脚本..........\"\n\t\techo \" 1. 升级R2S-Minimal（klever1988编译）\"\n\t\techo\n\t\techo \" 2. 升级R2S-Lean（klever1988编译）\"\n\t\techo\n\t\techo \" 3. 升级R2S-slim（ardanzhu编译）\"\n\t\techo\n\t\techo \" 4. 升级R2S-opt（ardanzhu编译）\"\n\t\techo\n\t\techo \" 5. 本地升级（固件以R2S*.zip或Friendly*.img.gz格式放在/tmp/upload目录，优先判定zip格式）\"\n\t\techo\n\t\techo \" 6. 输入zip格式固件下载地址\"\n\t\techo\n\t\techo \" 7. 输入img.gz格式固件下载地址\"\n\t\techo\n\t\techo \" 8. 退出\"\n\t\techo\n\t\tread -p \"$(echo -e \"请选择 [\\e[95m1-8\\e[0m]:\")\" rom\n\t\tcase $rom in\n\t\t1)\n\t\t\trom=1;;\t\t\n\t\t2)\n\t\t\trom=2;;\n\t\t3)\n\t\t\trom=3;;\n\t\t4)\n\t\t\trom=4;;\n\t\t5)\n\t\t\trom=5;;\n\t\t6)\n\t\t\trom=6\n\t\t\tread -p \"$(echo -e \"\\e[92m请输入固件下载地址\\e[0m:\")\" address\n\t\t\t;;\t\n\t\t7)\n\t\t\trom=7\n\t\t\tread -p \"$(echo -e \"\\e[92m请输入固件下载地址\\e[0m:\")\" address\n\t\t\t;;\t\n\t\t8)\n\t\t\texit 1\n\t\t\t;;\n\t\t*)\n\t\t\trom=0\n\t\t\techo\n\t\t\techo -e '\\e[91m输入错误，请重新输入\\e[0m'\n\t\t\t;;\n\t\tesac\n\tdone\n\nwhile [ $backup -eq 0 ]\n\tdo\n\t\techo\n\t\techo \"...........欢迎使用 R2S 一键升级脚本..........\"\n\t\techo \" 1. 升级保留配置（同系列的固件直接升级推荐使用）\"\n\t\techo\n\t\techo \" 2. 特殊保留模式（只保留网口配置、防火墙、端口转发、DDNS和SSRP的数据，方便跨版本刷机）\"\n\t\techo\n\t\techo \" 3. 升级不保留配置\"\n\t\techo\n\t\techo\n\t\tread -p \"$(echo -e \"请选择 [\\e[95m1-3\\e[0m]，默认为1:\")\" backup\n\t\t[[ -z $backup ]] && backup=\"1\"\n\t\tcase $backup in\n\t\t1)\n\t\t\tbackup=1;;\n\t\t2)\n\t\t\tbackup=2;;\n\t\t3)\n\t\t\tbackup=3;;\n\t\t*)\n\t\t\tbackup=0\n\t\t\techo\n\t\t\techo -e '\\e[91m输入错误，请重新输入\\e[0m'\n\t\t\t;;\n\t\tesac\n\tdone\n\nwhile [ $checknet -eq 0 ]\n\tdo\n\t\techo\n\t\techo \"...........欢迎使用 R2S 一键升级脚本..........\"\n\t\techo \" 防断线脚本是为了处理pppoe模式下网络断连和防火墙崩溃的折中解决方案，若没上述问题，请谨慎刷入\"\n\t\techo\t\t\n\t\techo \" 1. 写入防掉线脚本并于凌晨4点重启网络（开机自动运行）\"\n\t\techo\n\t\techo \" 2. 写入防掉线脚本（开机自动运行）\"\n\t\techo\n\t\techo \" 3. 不写入\"\n\t\techo\n\t\techo\n\t\tread -p \"$(echo -e \"请选择 [\\e[95m1-3\\e[0m]，默认为3:\")\" checknet\n\t\t[[ -z $checknet ]] && mode=\"3\"\n\t\tcase $checknet in\n\t\t1)\n\t\t\tchecknet=1;;\n\t\t2)\n\t\t\tchecknet=2;;\n\t\t3)\n\t\t\tchecknet=3;;\n\t\t*)\n\t\t\tchecknet=0\n\t\t\techo\n\t\t\techo -e '\\e[91m输入错误，请重新输入\\e[0m'\n\t\t\t;;\n\t\tesac\n\tdone\n\nwhile [ $mode -eq 0 ]\n\tdo\n\t\techo\n\t\techo \"...........欢迎使用 R2S 一键升级脚本..........\"\n\t\techo \" 1. 使用pigz刷机（速度更快）\"\n\t\techo\n\t\techo \" 2. 使用zstd刷机（理论上，更新成功率更高）\"\n\t\techo\n\t\techo \" 3. 不刷机，只保留上述修改的刷机文件（可以此制作适合自己已保留配置的刷机镜像，卡刷时救砖用）\"\n\t\techo\t\t\n\t\techo\n\t\tread -p \"$(echo -e \"请选择 [\\e[95m1-3\\e[0m]，默认为3:\")\" mode\n\t\t[[ -z $mode ]] && mode=\"3\"\n\t\tcase $mode in\n\t\t1)\n\t\t\tmode=1;;\n\t\t2)\n\t\t\tmode=2;;\n\t\t3)\n\t\t\tmode=3;;\n\t\t*)\n\t\t\tmode=0\n\t\t\techo\n\t\t\techo -e '\\e[91m输入错误，请重新输入\\e[0m'\n\t\t\t;;\n\t\tesac\n\tdone\n\nif [  ! -d /mnt/mmcblk0p2 ] ; then #部分固件没有挂载/dev/mmcblk0p2分区，增加一个简单检测\n\tmkdir /mnt/mmcblk0p2\n\tmount /dev/mmcblk0p2 /mnt/mmcblk0p2\nfi\nchmod +x update.sh\ncp -f update.sh /mnt/mmcblk0p2/; #对update文件的简单处理，使网络运行的脚本可以直接写入更新后的固件中，下次直接输入update.sh即可使用\ncd /mnt/mmcblk0p2\necho '检查依赖文件...'\nif ! type \"unzip\" > /dev/null; then\n\topkg update ; opkg install unzip\n\tif ! type \"unzip\" > /dev/null; then\n\t\techo 'unzip安装失败，退出...'\n\t\texit 1\n\tfi\nfi\nif ! type \"pv\" > /dev/null; then\n\topkg update ; opkg install pv\n\tif ! type \"pv\" > /dev/null; then\n\t\techo 'pv安装失败，退出...'\n\t\texit 1\n\tfi\nfi\nif ! type \"losetup\" > /dev/null; then\n\topkg update ; opkg install losetup\n\tif ! type \"losetup\" > /dev/null; then\n\t\techo 'losetup安装失败，退出...'\n\t\texit 1\n\tfi\nfi\nif [ $mode -eq 1 ] || [ $mode -eq 3 ]; then \n\tif ! type \"pigz\" > /dev/null; then\n\t\tif [ -f /www/pigz_2.4-1_aarch64_cortex-a53.ipk ]; then\n\t\topkg install /www/pigz_2.4-1_aarch64_cortex-a53.ipk\n\t\telif [ -f /tmp/upload/pigz_2.4-1_aarch64_cortex-a53.ipk ]; then\n\t\topkg install /www/pigz_2.4-1_aarch64_cortex-a53.ipk\n\t\telse\n\t\t\trm pigz_2.4-1_aarch64_cortex-a53.ipk\n\t\t\twget https://github.com/lsl330/R2S-SCRIPTS/raw/master/pigz_2.4-1_aarch64_cortex-a53.ipk\n\t\t\topkg install pigz_2.4-1_aarch64_cortex-a53.ipk\n\t\t\tcp pigz_2.4-1_aarch64_cortex-a53.ipk /www\n\t\tfi\n\t\tif ! type \"pigz\" > /dev/null; then\n\t\t\techo 'pigz安装失败，退出...'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\nif [ $mode -eq 2 ]; then \n\tif ! type \"zstd\" > /dev/null; then\n\t\topkg update ; opkg install zstd\n\t\tif ! type \"zstd\" > /dev/null; then\n\t\t\techo 'zstd安装失败，退出...'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n\nrm -rf artifact R2S*.zip FriendlyWrt*img*\n\nif [ $rom -eq 1 ]; then\t#下载R2S-Minimal固件\n\twget https://github.com/klever1988/nanopi-openwrt/releases/download/R2S-Minimal-$(date +%Y-%m-%d)/R2S-Minimal-$(date +%Y-%m-%d)-ROM.zip\n\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\techo -e '\\e[92m今天固件已下载，准备解压\\e[0m'\n\telse\n\t\techo '今天的固件还没更新，尝试下载昨天的固件'\n\t\twget https://github.com/klever1988/nanopi-openwrt/releases/download/R2S-Minimal-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d)/R2S-Minimal-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d)-ROM.zip\n\t\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\t\techo -e '\\e[92m昨天的固件已下载，准备解压\\e[0m'\n\t\telse\n\t\t\techo -e '\\e[91m没找到最新的固件，脚本退出\\e[0m'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n\nif [ $rom -eq 2 ]; then\t#下载R2S-Lean固件\n\twget https://github.com/klever1988/nanopi-openwrt/releases/download/R2S-Lean-$(date +%Y-%m-%d)/R2S-Lean-$(date +%Y-%m-%d)-ROM.zip\n\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\techo -e '\\e[92m今天固件已下载，准备解压\\e[0m'\n\telse\n\t\techo '今天的固件还没更新，尝试下载昨天的固件'\n\t\twget https://github.com/klever1988/nanopi-openwrt/releases/download/R2S-Lean-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d)/R2S-Lean-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d)-ROM.zip\n\t\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\t\techo -e '\\e[92m昨天的固件已下载，准备解压\\e[0m'\n\t\telse\n\t\t\techo -e '\\e[91m没找到最新的固件，脚本退出\\e[0m'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n\nif [ $rom -eq 3 ]; then\t#下载R2S-slim固件\n\twget https://github.com/ardanzhu/Opwrt_Actions/releases/download/R2S/R2S-slim-$(date +%Y-%m-%d).zip\n\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\techo -e '\\e[92m今天固件已下载，准备解压\\e[0m'\n\telse\n\t\techo -e '\\e[91m今天的固件还没更新，尝试下载昨天的固件\\e[0m'\n\t\twget https://github.com/ardanzhu/Opwrt_Actions/releases/download/R2S/R2S-slim-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d).zip\n\t\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\t\techo -e '\\e[92m昨天的固件已下载，准备解压\\e[0m'\n\t\telse\n\t\t\techo -e '\\e[91m没找到最新的固件，脚本退出\\e[0m'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n\nif [ $rom -eq 4 ]; then\t#下载R2S-opt固件\n\twget https://github.com/ardanzhu/Opwrt_Actions/releases/download/R2S/R2S-opt-$(date +%Y-%m-%d).zip\n\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\techo -e '\\e[92m今天固件已下载，准备解压\\e[0m'\n\telse\n\t\techo -e '\\e[91m今天的固件还没更新，尝试下载昨天的固件\\e[0m'\n\t\twget https://github.com/ardanzhu/Opwrt_Actions/releases/download/R2S/R2S-opt-$(date -d \"@$(( $(busybox date +%s) - 86400))\" +%Y-%m-%d).zip\n\t\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\t\techo -e '\\e[92m昨天的固件已下载，准备解压\\e[0m'\n\t\telse\n\t\t\techo -e '\\e[91m没找到最新的固件，脚本退出\\e[0m'\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n\nif [ $rom -eq 5 ]; then\t#上传本地rom\n\tif [ -f /tmp/upload/R2S*.zip ]; then  #检测upload目录是否有zip升级文件\n\t\techo -e '\\e[92m找到本地固件，准备解压\\e[0m'\n\t\tmv /tmp/upload/R2S*.zip /mnt/mmcblk0p2/\n\telif [ -f /tmp/upload/Friendly*.img.gz ]; then\t #检测upload目录是否有img.gz升级文件\n\t\tsuffix=2\n\t\tmv /tmp/upload/Friendly*.img.gz /mnt/mmcblk0p2/FriendlyWrt-ROM.img.gz\n\telif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then  #检测upload目录是否有升级文件\n\t\techo -e '\\e[92m找到本地固件，准备解压\\e[0m'\n\telse\n\t\techo -e '\\e[91m没找到本地固件，脚本退出\\e[0m'\n\t\texit 1\n\tfi\nfi\n\nif [ $rom -eq 6 ]; then\t#指定下载地址\n\twget $address -O /mnt/mmcblk0p2/R2S-ROM.zip\n\tif [ -f /mnt/mmcblk0p2/R2S*.zip ]; then\n\t\techo -e '\\e[92m固件已下载，准备解压\\e[0m'\n\telse\n\t\techo -e '\\e[91m指定位置没找到固件，脚本退出\\e[0m'\n\t\texit 1\n\tfi\nfi\n\nif [ $rom -eq 7 ]; then\t#指定下载地址\n\twget $address -O /mnt/mmcblk0p2/FriendlyWrt-ROM.img.gz\n\tif [ -f /mnt/mmcblk0p2/FriendlyWrt-ROM.img.gz ]; then\n\t\tsuffix=2\n\t\techo -e '\\e[92m固件已下载，准备解压\\e[0m'\n\telse\n\t\techo -e '\\e[91m指定位置没找到固件，脚本退出\\e[0m'\n\t\texit 1\n\tfi\nfi\n\nif [ $suffix -eq 1 ]; then\t#zip格式固件，进行解压\n\tunzip R2S*.zip\n\trm R2S*.zip\nfi\n\nif [ -f /mnt/mmcblk0p2/artifact/FriendlyWrt*.img.gz ]; then  #统一解压固件路径\n\tpv /mnt/mmcblk0p2/artifact/FriendlyWrt*.img.gz | gunzip -dc > FriendlyWrt.img\n\techo -e '\\e[92m准备解压镜像文件\\e[0m'\nelif [ -f /mnt/mmcblk0p2/FriendlyWrt*.img.gz ]; then\n\tpv /mnt/mmcblk0p2/FriendlyWrt*.img.gz | gunzip -dc > FriendlyWrt.img\n\techo -e '\\e[92m准备解压镜像文件\\e[0m'\nfi\nmkdir /mnt/img\nlosetup -o 100663296 /dev/loop0 /mnt/mmcblk0p2/FriendlyWrt.img\nmount /dev/loop0 /mnt/img\necho -e '\\e[92m解压已完成，准备编辑镜像文件，写入备份信息\\e[0m'\ncd /mnt/img\nif [ -f /tmp/upload/update.sh ]; then\n\tcp\t/tmp/upload/update.sh /mnt/img/bin/\n\techo -e '\\e[92m写入升级脚本\\e[0m'\nelif [ -f /mnt/mmcblk0p2/update.sh ]; then\n\tcp\t/mnt/mmcblk0p2/update.sh /mnt/img/bin/\n\techo -e '\\e[92m写入升级脚本\\e[0m'\nelif [ -f /bin/update.sh ]; then\n\tcp\t/bin/update.sh /mnt/img/bin/\n\techo -e '\\e[92m写入升级脚本\\e[0m'\nfi\nif [ $checknet -le 2 ]; then   #写入防掉线脚本\n\twget -nv https://github.com/lsl330/R2S-SCRIPTS/raw/master/checkwan.sh -O /mnt/img/bin/checkwan.sh\n\tchmod +x /mnt/img/bin/checkwan.sh\n\tif [ $checknet -eq 1 ]; then   #写入防掉线脚本并凌晨四点重启网络（开机启动）\n\t\twget -nv https://github.com/lsl330/R2S-SCRIPTS/raw/master/restartnetwork.sh -O /mnt/img/bin/restartnetwork.sh\n\t\tchmod +x /mnt/img/bin/restartnetwork.sh\n\t\twget -nv https://github.com/lsl330/R2S-SCRIPTS/raw/master/check2  -O /etc/init.d/check\n\telse\n\t\twget -nv https://github.com/lsl330/R2S-SCRIPTS/raw/master/check  -O /etc/init.d/check\n\tfi\n\tchmod 777 /etc/init.d/check\n\tln -s /etc/init.d/check /etc/rc.d/S95check\n\tcp\t/etc/init.d/check /mnt/img/etc/init.d/check\n\tcp -d /etc/rc.d/S95check /mnt/img/etc/rc.d/S95check\nfi\nif [ -f /www/pigz_2.4-1_aarch64_cortex-a53.ipk ]; then\n\tcp /www/pigz_2.4-1_aarch64_cortex-a53.ipk /mnt/img/www/\nelif [ -f /tmp/upload/pigz_2.4-1_aarch64_cortex-a53.ipk ]; then\n\tcp /tmp/upload/pigz_2.4-1_aarch64_cortex-a53.ipk /mnt/img/www/\nfi\nif [ $backup -eq 1 ]; then \n\tsysupgrade -b /mnt/img/back.tar.gz\n\ttar zxf back.tar.gz\n\techo -e '\\e[92m备份文件已经写入，移除挂载\\e[0m'\n\trm back.tar.gz\nelif [ $backup -eq 2 ]; then\n\tcp -f /etc/config/network /mnt/img/etc/config/; #网络配置文件\n\trm -rf /mnt/img/etc/board.d\n\tcp -f /etc/board.d /mnt/img/etc/\n\tcp -f /etc/board.json /mnt/img/etc/\n\tcp -f /etc/config/ddns /mnt/img/etc/config/; #ddns配置文件\n\tcp -f /etc/passwd /mnt/img/etc/; #账号文件配置文件\n\tcp -f /etc/shadow /mnt/img/etc/; #账号密码配置文件\t\n\tcp -f /etc/config/ddns /mnt/img/etc/config/; #ddns配置文件\n\tcp -f /etc/config/firewall /mnt/img/etc/config/; #防火墙及端口转发配置文件\n\tcp -f /etc/config/shadowsocksr /mnt/img/etc/config/; #ssrp配置文件\n\tcp -f /etc/config/netflixip.list /mnt/img/etc/config/; #ssrp配置文件\n\tcp -f /etc/china_ssr.txt /mnt/img/etc/; #ssrp配置文件\n\tmkdir /mnt/img/etc/dnsmasq.ssr; #ssrp配置文件\n\tcp -f /etc/dnsmasq.ssr/gfw_list.conf /mnt/img/etc/dnsmasq.ssr/; #ssrp配置文件\nelse\n\techo -e '\\e[92m升级文件已经写入，移除挂载\\e[0m'\nfi\ncd /tmp\numount /mnt/img\nlosetup -d /dev/loop0\necho -e '\\e[92m准备重新打包\\e[0m'\nif [ $mode -eq 3 ]; then\n\tmkdir /tmp/upload\n\tpv /mnt/mmcblk0p2/FriendlyWrt.img | pigz > /tmp/upload/FriendlyWrtupdate.img.gz\n\techo -e '\\e[92m刷机镜像已保存在/tmp/upload目录，请及时导出\\e[0m'\n\texit 1\nfi\nif [ $mode -eq 1 ]; then\n\tpv /mnt/mmcblk0p2/FriendlyWrt.img | pigz --fast > /tmp/FriendlyWrtupdate.img.gz\nelse\n\tzstdmt /mnt/mmcblk0p2/FriendlyWrt.img -o /tmp/FriendlyWrtupdate.img.zst\nfi\necho -e '\\e[92m打包完毕，准备刷机\\e[0m'\t\nif [ -f /tmp/FriendlyWrtupdate.img.gz ]; then\n\techo 1 > /proc/sys/kernel/sysrq\n\techo u > /proc/sysrq-trigger || umount /\n\tpv /tmp/FriendlyWrtupdate.img.gz | gunzip -dc > /dev/mmcblk0\n\techo -e '\\e[92m刷机完毕，正在重启...\\e[0m'\t\n\techo b > /proc/sysrq-trigger\nfi\nif [ -f /tmp/FriendlyWrtupdate.img.zst ]; then\n\techo 1 > /proc/sys/kernel/sysrq\n\techo u > /proc/sysrq-trigger || umount /\n\tpv /tmp/FriendlyWrtupdate.img.zst | zstdcat | dd of=/dev/mmcblk0 conv=fsync\n\techo -e '\\e[92m刷机完毕，正在重启...稍等片刻后重新登录\\e[0m'\t\n\techo b > /proc/sysrq-trigger\nfi"
  },
  {
    "path": "not_use_file/Remove old artifacts.yml",
    "content": "name: Remove old artifacts\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/Remove old artifacts.yml'\n  schedule:\n    # Every day at 1am\n    - cron: '0 1 * * *'\n  watch:\n    types: started\n\njobs:\n  remove-old-artifacts:\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n\n    steps:\n    - name: Remove old artifacts\n      uses: c-hive/gha-remove-artifacts@v1\n      with:\n        age: '1 month'\n        # Optional inputs\n        # skip-tags: true\n        # skip-recent: 5"
  },
  {
    "path": "not_use_file/Support-hardware-random-number-generator-for-RK3328.patch",
    "content": "From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\nFrom: wevsty <ty@wevs.org>\nDate: Mon, 24 Aug 2020 02:27:11 +0800\nSubject: [PATCH] Support hardware random number generator for RK3328\n\nSigned-off-by: wevsty <ty@wevs.org>\n---\n target/linux/rockchip/armv8/config-5.4        |   2 +\n ...rockchip-hardware-random-dev-support.patch | 385 ++++++++++++++++++\n ...rockchip-add-hardware-rng-for-RK3328.patch |  28 ++\n ...rockchip-add-hardware-rng-for-RK3399.patch |  27 ++\n ...p-enable-hardware-rng-for-NanoPi-R2S.patch |  17 +\n 5 files changed, 459 insertions(+)\n create mode 100644 target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch\n create mode 100644 target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch\n create mode 100644 target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch\n create mode 100644 target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch\n\ndiff -rNEZbwBdu3 a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4\n--- a/target/linux/rockchip/armv8/config-5.4\t2020-08-27 16:16:43.088264763 +0800\n+++ b/target/linux/rockchip/armv8/config-5.4\t2020-08-27 16:20:13.937869695 +0800\n@@ -182,6 +182,8 @@\n CONFIG_HWMON=y\n CONFIG_HWSPINLOCK=y\n CONFIG_HW_CONSOLE=y\n+CONFIG_HW_RANDOM=y\n+CONFIG_HW_RANDOM_ROCKCHIP=y\n # CONFIG_HZ_PERIODIC is not set\n CONFIG_I2C=y\n CONFIG_I2C_ALGOBIT=y\ndiff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch b/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch\n--- a/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch\t1970-01-01 08:00:00.000000000 +0800\n+++ b/target/linux/rockchip/patches-5.4/012-rockchip-hardware-random-dev-support.patch\t2020-08-27 16:19:22.785477444 +0800\n@@ -0,0 +1,385 @@\n+From: wevsty <ty@wevs.org>\n+Subject: Support for rockchip hardware random number generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -345,6 +345,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- /dev/null\n++++ b/drivers/char/hw_random/rockchip-rng.c\n+@@ -0,0 +1,340 @@\n++// SPDX-License-Identifier: GPL-2.0\n++/*\n++ * rockchip-rng.c Random Number Generator driver for the Rockchip\n++ *\n++ * Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd.\n++ * Author: Lin Jinhan <troy.lin@rock-chips.com>\n++ *\n++ */\n++#include <linux/clk.h>\n++#include <linux/hw_random.h>\n++#include <linux/iopoll.h>\n++#include <linux/module.h>\n++#include <linux/mod_devicetable.h>\n++#include <linux/of.h>\n++#include <linux/platform_device.h>\n++#include <linux/pm_runtime.h>\n++\n++#define _SBF(s, v)\t((v) << (s))\n++#define HIWORD_UPDATE(val, mask, shift) \\\n++\t\t\t((val) << (shift) | (mask) << ((shift) + 16))\n++\n++#define ROCKCHIP_AUTOSUSPEND_DELAY\t\t100\n++#define ROCKCHIP_POLL_PERIOD_US\t\t\t100\n++#define ROCKCHIP_POLL_TIMEOUT_US\t\t10000\n++#define RK_MAX_RNG_BYTE\t\t\t\t(32)\n++\n++/* start of CRYPTO V1 register define */\n++#define CRYPTO_V1_CTRL\t\t\t\t0x0008\n++#define CRYPTO_V1_RNG_START\t\t\tBIT(8)\n++#define CRYPTO_V1_RNG_FLUSH\t\t\tBIT(9)\n++\n++#define CRYPTO_V1_TRNG_CTRL\t\t\t0x0200\n++#define CRYPTO_V1_OSC_ENABLE\t\t\tBIT(16)\n++#define CRYPTO_V1_TRNG_SAMPLE_PERIOD(x)\t\t(x)\n++\n++#define CRYPTO_V1_TRNG_DOUT_0\t\t\t0x0204\n++/* end of CRYPTO V1 register define */\n++\n++/* start of CRYPTO V2 register define */\n++#define CRYPTO_V2_RNG_CTL\t\t\t0x0400\n++#define CRYPTO_V2_RNG_64_BIT_LEN\t\t_SBF(4, 0x00)\n++#define CRYPTO_V2_RNG_128_BIT_LEN\t\t_SBF(4, 0x01)\n++#define CRYPTO_V2_RNG_192_BIT_LEN\t\t_SBF(4, 0x02)\n++#define CRYPTO_V2_RNG_256_BIT_LEN\t\t_SBF(4, 0x03)\n++#define CRYPTO_V2_RNG_FATESY_SOC_RING\t\t_SBF(2, 0x00)\n++#define CRYPTO_V2_RNG_SLOWER_SOC_RING_0\t\t_SBF(2, 0x01)\n++#define CRYPTO_V2_RNG_SLOWER_SOC_RING_1\t\t_SBF(2, 0x02)\n++#define CRYPTO_V2_RNG_SLOWEST_SOC_RING\t\t_SBF(2, 0x03)\n++#define CRYPTO_V2_RNG_ENABLE\t\t\tBIT(1)\n++#define CRYPTO_V2_RNG_START\t\t\tBIT(0)\n++#define CRYPTO_V2_RNG_SAMPLE_CNT\t\t0x0404\n++#define CRYPTO_V2_RNG_DOUT_0\t\t\t0x0410\n++/* end of CRYPTO V2 register define */\n++\n++struct rk_rng_soc_data {\n++\tconst char * const *clks;\n++\tint clks_num;\n++\tint (*rk_rng_read)(struct hwrng *rng, void *buf, size_t max, bool wait);\n++};\n++\n++struct rk_rng {\n++\tstruct device\t\t*dev;\n++\tstruct hwrng\t\trng;\n++\tvoid __iomem\t\t*mem;\n++\tstruct rk_rng_soc_data\t*soc_data;\n++\tu32\t\t\tclk_num;\n++\tstruct clk_bulk_data\t*clk_bulks;\n++};\n++\n++static const char * const rk_rng_v1_clks[] = {\n++\t\"hclk_crypto\",\n++\t\"clk_crypto\",\n++};\n++\n++static const char * const rk_rng_v2_clks[] = {\n++\t\"hclk_crypto\",\n++\t\"aclk_crypto\",\n++\t\"clk_crypto\",\n++\t\"clk_crypto_apk\",\n++};\n++\n++static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset)\n++{\n++\t__raw_writel(val, rng->mem + offset);\n++}\n++\n++static u32 rk_rng_readl(struct rk_rng *rng, u32 offset)\n++{\n++\treturn __raw_readl(rng->mem + offset);\n++}\n++\n++static int rk_rng_init(struct hwrng *rng)\n++{\n++\tint ret;\n++\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n++\n++\tdev_dbg(rk_rng->dev, \"clk_bulk_prepare_enable.\\n\");\n++\n++\tret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks);\n++\tif (ret < 0) {\n++\t\tdev_err(rk_rng->dev, \"failed to enable clks %d\\n\", ret);\n++\t\treturn ret;\n++\t}\n++\n++\treturn 0;\n++}\n++\n++static void rk_rng_cleanup(struct hwrng *rng)\n++{\n++\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n++\n++\tdev_dbg(rk_rng->dev, \"clk_bulk_disable_unprepare.\\n\");\n++\tclk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks);\n++}\n++\n++static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf,\n++\t\t\t     size_t size)\n++{\n++\tu32 i;\n++\n++\tfor (i = 0; i < size; i += 4)\n++\t\t*(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));\n++}\n++\n++static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n++{\n++\tint ret = 0;\n++\tu32 reg_ctrl = 0;\n++\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n++\n++\tret = pm_runtime_get_sync(rk_rng->dev);\n++\tif (ret < 0) {\n++\t\tpm_runtime_put_noidle(rk_rng->dev);\n++\t\treturn ret;\n++\t}\n++\n++\t/* enable osc_ring to get entropy, sample period is set as 100 */\n++\treg_ctrl = CRYPTO_V1_OSC_ENABLE | CRYPTO_V1_TRNG_SAMPLE_PERIOD(100);\n++\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_TRNG_CTRL);\n++\n++\treg_ctrl = HIWORD_UPDATE(CRYPTO_V1_RNG_START, CRYPTO_V1_RNG_START, 0);\n++\n++\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_CTRL);\n++\n++\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V1_CTRL, reg_ctrl,\n++\t\t\t\t !(reg_ctrl & CRYPTO_V1_RNG_START),\n++\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n++\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n++\tif (ret < 0)\n++\t\tgoto out;\n++\n++\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n++\n++\trk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret);\n++\n++out:\n++\t/* close TRNG */\n++\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, CRYPTO_V1_RNG_START, 0),\n++\t\t      CRYPTO_V1_CTRL);\n++\n++\tpm_runtime_mark_last_busy(rk_rng->dev);\n++\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n++\n++\treturn ret;\n++}\n++\n++static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n++{\n++\tint ret = 0;\n++\tu32 reg_ctrl = 0;\n++\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n++\n++\tret = pm_runtime_get_sync(rk_rng->dev);\n++\tif (ret < 0) {\n++\t\tpm_runtime_put_noidle(rk_rng->dev);\n++\t\treturn ret;\n++\t}\n++\n++\t/* enable osc_ring to get entropy, sample period is set as 100 */\n++\trk_rng_writel(rk_rng, 100, CRYPTO_V2_RNG_SAMPLE_CNT);\n++\n++\treg_ctrl |= CRYPTO_V2_RNG_256_BIT_LEN;\n++\treg_ctrl |= CRYPTO_V2_RNG_SLOWER_SOC_RING_0;\n++\treg_ctrl |= CRYPTO_V2_RNG_ENABLE;\n++\treg_ctrl |= CRYPTO_V2_RNG_START;\n++\n++\trk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0),\n++\t\t\tCRYPTO_V2_RNG_CTL);\n++\n++\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V2_RNG_CTL, reg_ctrl,\n++\t\t\t\t !(reg_ctrl & CRYPTO_V2_RNG_START),\n++\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n++\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n++\tif (ret < 0)\n++\t\tgoto out;\n++\n++\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n++\n++\trk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret);\n++\n++out:\n++\t/* close TRNG */\n++\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), CRYPTO_V2_RNG_CTL);\n++\n++\tpm_runtime_mark_last_busy(rk_rng->dev);\n++\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n++\n++\treturn ret;\n++}\n++\n++static const struct rk_rng_soc_data rk_rng_v1_soc_data = {\n++\t.clks_num = ARRAY_SIZE(rk_rng_v1_clks),\n++\t.clks = rk_rng_v1_clks,\n++\t.rk_rng_read = rk_rng_v1_read,\n++};\n++\n++static const struct rk_rng_soc_data rk_rng_v2_soc_data = {\n++\t.clks_num = ARRAY_SIZE(rk_rng_v2_clks),\n++\t.clks = rk_rng_v2_clks,\n++\t.rk_rng_read = rk_rng_v2_read,\n++};\n++\n++static const struct of_device_id rk_rng_dt_match[] = {\n++\t{\n++\t\t.compatible = \"rockchip,cryptov1-rng\",\n++\t\t.data = (void *)&rk_rng_v1_soc_data,\n++\t},\n++\t{\n++\t\t.compatible = \"rockchip,cryptov2-rng\",\n++\t\t.data = (void *)&rk_rng_v2_soc_data,\n++\t},\n++\t{ },\n++};\n++\n++MODULE_DEVICE_TABLE(of, rk_rng_dt_match);\n++\n++static int rk_rng_probe(struct platform_device *pdev)\n++{\n++\tint i;\n++\tint ret;\n++\tstruct rk_rng *rk_rng;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\n++\tdev_dbg(&pdev->dev, \"probing...\\n\");\n++\trk_rng = devm_kzalloc(&pdev->dev, sizeof(struct rk_rng), GFP_KERNEL);\n++\tif (!rk_rng)\n++\t\treturn -ENOMEM;\n++\n++\tmatch = of_match_node(rk_rng_dt_match, np);\n++\trk_rng->soc_data = (struct rk_rng_soc_data *)match->data;\n++\n++\trk_rng->dev = &pdev->dev;\n++\trk_rng->rng.name    = \"rockchip\";\n++#ifndef CONFIG_PM\n++\trk_rng->rng.init    = rk_rng_init;\n++\trk_rng->rng.cleanup = rk_rng_cleanup,\n++#endif\n++\trk_rng->rng.read    = rk_rng->soc_data->rk_rng_read;\n++\trk_rng->rng.quality = 999;\n++\n++\trk_rng->clk_bulks =\n++\t\tdevm_kzalloc(&pdev->dev, sizeof(*rk_rng->clk_bulks) *\n++\t\t\t     rk_rng->soc_data->clks_num, GFP_KERNEL);\n++\n++\trk_rng->clk_num = rk_rng->soc_data->clks_num;\n++\n++\tfor (i = 0; i < rk_rng->soc_data->clks_num; i++)\n++\t\trk_rng->clk_bulks[i].id = rk_rng->soc_data->clks[i];\n++\n++\trk_rng->mem = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL);\n++\tif (IS_ERR(rk_rng->mem))\n++\t\treturn PTR_ERR(rk_rng->mem);\n++\n++\tret = devm_clk_bulk_get(&pdev->dev, rk_rng->clk_num,\n++\t\t\t\trk_rng->clk_bulks);\n++\tif (ret) {\n++\t\tdev_err(&pdev->dev, \"failed to get clks property\\n\");\n++\t\treturn ret;\n++\t}\n++\n++\tplatform_set_drvdata(pdev, rk_rng);\n++\n++\tpm_runtime_set_autosuspend_delay(&pdev->dev,\n++\t\t\t\t\tROCKCHIP_AUTOSUSPEND_DELAY);\n++\tpm_runtime_use_autosuspend(&pdev->dev);\n++\tpm_runtime_enable(&pdev->dev);\n++\n++\tret = devm_hwrng_register(&pdev->dev, &rk_rng->rng);\n++\tif (ret) {\n++\t\tpm_runtime_dont_use_autosuspend(&pdev->dev);\n++\t\tpm_runtime_disable(&pdev->dev);\n++\t}\n++\n++\treturn ret;\n++}\n++\n++#ifdef CONFIG_PM\n++static int rk_rng_runtime_suspend(struct device *dev)\n++{\n++\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n++\n++\trk_rng_cleanup(&rk_rng->rng);\n++\n++\treturn 0;\n++}\n++\n++static int rk_rng_runtime_resume(struct device *dev)\n++{\n++\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n++\n++\treturn rk_rng_init(&rk_rng->rng);\n++}\n++\n++static const struct dev_pm_ops rk_rng_pm_ops = {\n++\tSET_RUNTIME_PM_OPS(rk_rng_runtime_suspend,\n++\t\t\t\trk_rng_runtime_resume, NULL)\n++\tSET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,\n++\t\t\t\tpm_runtime_force_resume)\n++};\n++\n++#endif\n++\n++static struct platform_driver rk_rng_driver = {\n++\t.driver\t= {\n++\t\t.name\t= \"rockchip-rng\",\n++#ifdef CONFIG_PM\n++\t\t.pm\t= &rk_rng_pm_ops,\n++#endif\n++\t\t.of_match_table = rk_rng_dt_match,\n++\t},\n++\t.probe\t= rk_rng_probe,\n++};\n++\n++module_platform_driver(rk_rng_driver);\n++\n++MODULE_DESCRIPTION(\"ROCKCHIP H/W Random Number Generator driver\");\n++MODULE_AUTHOR(\"Lin Jinhan <troy.lin@rock-chips.com>\");\n++MODULE_LICENSE(\"GPL v2\");\n++\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -32,6 +32,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch b/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch\n--- a/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch\t1970-01-01 08:00:00.000000000 +0800\n+++ b/target/linux/rockchip/patches-5.4/013-rockchip-add-hardware-rng-for-RK3328.patch\t2020-08-27 16:19:22.785477444 +0800\n@@ -0,0 +1,28 @@\n+From: wevsty <ty@wevs.org>\n+Subject: Add hardware random number generator for RK3328\n+\n+Adding Hardware Random Number Generator Resources to the RK3328.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -269,6 +269,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\ndiff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch b/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch\n--- a/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch\t1970-01-01 08:00:00.000000000 +0800\n+++ b/target/linux/rockchip/patches-5.4/014-rockchip-add-hardware-rng-for-RK3399.patch\t2020-08-27 16:19:22.785477444 +0800\n@@ -0,0 +1,27 @@\n+From: wevsty <ty@wevs.org>\n+Subject: Add hardware random number generator for RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1886,6 +1886,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff -rNEZbwBdu3 a/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch\n--- a/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch\t1970-01-01 08:00:00.000000000 +0800\n+++ b/target/linux/rockchip/patches-5.4/015-rockchip-enable-hardware-rng-for-NanoPi-R2S.patch\t2020-08-27 16:19:22.785477444 +0800\n@@ -0,0 +1,17 @@\n+From: wevsty <ty@wevs.org>\n+Subject: Enable hardware random number generator for RK3328\n+\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -140,3 +140,7 @@\n+ \t\t};\n+ \t};\n+ };\n++\n++&rng {\n++\tstatus = \"okay\";\n++};\n"
  },
  {
    "path": "not_use_file/cleanup.yml",
    "content": "name: cleanup space\n\non:\n#  release:\n#    types: published\n  push:\n    paths:\n      - '.github/workflows/cleanup.yml'\n  watch:\n    types: started\n\nenv:\n  SSH_ACTIONS: false\n  TZ: Asia/Shanghai\n\njobs:\n  build:\n    runs-on: ubuntu-18.04\n    if: github.event.repository.owner.id == github.event.sender.id\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@master\n\n    - name: free disk space\n      run: |\n        sudo swapoff -a\n        sudo rm -f /swapfile\n        sudo apt clean\n        docker rmi $(docker image ls -aq)\n        df -h\n        /bin/bash ./script/free_disk_space.sh\n\n    - name: SSH connection to Actions\n      uses: P3TERX/debugger-action@master\n      if: env.SSH_ACTIONS == 'true'\n\n    - name: Make script executable\n      run: chmod +x .github/workflows/purge_artifacts.sh\n\n    - name: cleanup old action artifacts\n      run: .github/workflows/purge_artifacts.sh ${{ secrets.RELEASES_TOKEN }}\n\n"
  },
  {
    "path": "not_use_file/cod.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyelec_nanopi-r2-rev00=y\nCONFIG_PACKAGE_arm-trusted-firmware-rockchip=y\nCONFIG_TARGET_OPTIMIZATION=\"-O3 -pipe -march=armv8-a+crc+simd+crypto\"\n# CONFIG_TARGET_IMAGES_GZIP is not set\n# CONFIG_TARGET_ROOTFS_EXT4FS is not set\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_ROOTFS_PARTSIZE=400\nCONFIG_LUCI_LANG_zh_Hans=y\nCONFIG_LUCI_LANG_en=y\n\n# CONFIG_LUCI_CSSTIDY is not set\n# CONFIG_LUCI_JSMIN is not set\nCONFIG_AUTOREMOVE=y\nCONFIG_IMAGEOPT=y\nCONFIG_JSON_ADD_IMAGE_INFO=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BLK_DEV_THROTTLING=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_KALLSYMS=y\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_ENGINE_BUILTIN=y\nCONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO=y\n\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\n\n#SFE\nCONFIG_PACKAGE_kmod-shortcut-fe=y\n# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set\nCONFIG_PACKAGE_kmod-fast-classifier=y\n\n#OLED\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-i18n-oled-zh-cn=y\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#support usb asix 100M/1000M网卡\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\n\nCONFIG_PACKAGE_addition-trans-zh=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_coremark=y\n\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\n\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\n\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-ntfs=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\n\nCONFIG_PACKAGE_luci-app-transmission=y\nCONFIG_PACKAGE_transmission-daemon-openssl=y\nCONFIG_PACKAGE_transmission-web-control=y\nCONFIG_PACKAGE_transmission-remote-openssl=y\n\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libubus-lua=y\n\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb3=y\nCONFIG_BRCMFMAC_SDIO=y\n\n#Support some Hilink 4G USB dongle\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\n\n#Support some USB wireless\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=y\nCONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_PACKAGE_kmod-cfg80211=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wpad-mini=y\nCONFIG_PACKAGE_wpa-supplicant=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-mt7601u=y\n#--End-- \n#Support NCM mode 4G dongle\n#CONFIG_PACKAGE_comgt\n#CONFIG_PACKAGE_comgt-ncm \n#CONFIG_PACKAGE_kmod-usb-net-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-qmi-wwan\n#CONFIG_PACKAGE_luci-proto-ncm \n#CONFIG_PACKAGE_kmod-usb-serial-wwan \n#CONFIG_PACKAGE_kmod-usb-serial \n#CONFIG_PACKAGE_kmod-usb-serial-option\n--End--\nCONFIG_PACKAGE_kmod-mmc=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adguardhome=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-oaf=y\nCONFIG_PACKAGE_luci-app-openclash=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-serverchan=y\nCONFIG_PACKAGE_luci-app-smartdns=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray_plugin=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Server=y\n\n#CONFIG_PACKAGE_luci-app-ssrserver-python=y\nCONFIG_PACKAGE_luci-app-v2ray-server=y\n# CONFIG_PACKAGE_luci-app-openclash is not set\nCONFIG_PACKAGE_luci-app-clash=y\n\n#passwall\nCONFIG_PACKAGE_luci-app-passwall=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_ipt2socks=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_Shadowsocks=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_ShadowsocksR=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_ShadowsocksR_Server=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_V2ray=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_Trojan=y\n# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Trojan_GO is not set\n# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Brook is not set\n# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_kcptun is not set\n# CONFIG_PACKAGE_luci-app-passwall_INCLUDE_haproxy is not set\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_ChinaDNS_NG=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_pdnsd=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_dns2socks=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_v2ray-plugin=y\nCONFIG_PACKAGE_luci-app-passwall_INCLUDE_simple-obfs=y\n#end-passwall\n\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-trojan-server=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-usb-printer=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_openssl-util=y\n\nCONFIG_PACKAGE_wget=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_socat=y\n\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-ttyd=y\n\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_stress=y\n\n# CONFIG_PACKAGE_luci-app-dockerman=y\n# CONFIG_PACKAGE_luci-lib-docker=y\n# CONFIG_PACKAGE_luci-lib-jsonc=y\n# CONFIG_PACKAGE_docker-ce=y\n\n# CONFIG_PACKAGE_luci-app-transmission=y\n# CONFIG_PACKAGE_transmission-daemon-openssl=y\n# CONFIG_PACKAGE_transmission-web-control=y\n# CONFIG_PACKAGE_transmission-remote-openssl=y\n\nCONFIG_PACKAGE_luci-app-samba4=y\nCONFIG_PACKAGE_samba4-admin=y\nCONFIG_PACKAGE_samba4-client=y\nCONFIG_PACKAGE_samba4-utils=y\n\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_luci-app-zerotier=y\n\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_smartmontools=y\n\n#Support Hilink 4G USB dongle & USB Tethering\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_usbutils=y\n\n# CONFIG_KERNEL_CGROUPS=y\n# CONFIG_PACKAGE_luci-app-mwan3=y\n# CONFIG_PACKAGE_luci-app-mwan3helper=y\n# CONFIG_PACKAGE_mwan3=y\n# CONFIG_PACKAGE_luci-app-syncdial=y\n\n# CONFIG_COLLECT_KERNEL_DEBUG is not set\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set\n"
  },
  {
    "path": "not_use_file/customization.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S org\n#=================================================\n\nname: OpenWrt R2S cod\n\n#on:\n#  release:\n#    types: published\n#  push:\n#    branches:\n#      - master\n#    paths:\n#      - '.github/workflows/customization.yml'\n#      - 'step/01-prepare_package.sh'\n#      - 'seed/cod.seed'\n#  schedule:\n#    - cron: 35 20 * * *\n#  watch:\n#    types: started\n\nenv:\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: false\n  UPLOAD_RELEASE: true\n  CONFIG_FILE: cod.seed\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo rm -rf /etc/apt/sources.list.d\n          sudo apt-get -y purge dotnet* ghc* google* llvm* mysql* php* zulu* firefox hhvm\n          sudo rm -rf /usr/share/dotnet /usr/local/lib/android/sdk\n          sudo apt-get update\n          sudo apt-get -y --no-install-recommends install build-essential asciidoc binutils bison bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf python3\n          curl https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh  | sed '/#/d' | sed 's/\\\\//g' | sed 's/exit 0//g' | sed 's/sudo apt -y install//g' | sed 's/sudo apt-get -y install//g' | sed 's/:i386//g' | xargs sudo apt-get -y --no-install-recommends install\n          sudo rm -rf /usr/share/dotnet /usr/local/lib/android/sdk\n          git config --global user.name \"Actions\"\n          git config --global user.email \"actions@github.com\"\n      - name: Install OpenWrt source\n        run: |\n          git clone https://git.openwrt.org/openwrt/openwrt.git\n\n      - name: Prepare openwrt package\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 01-prepare_package.sh\n\n      - name: Convert Translation\n        run: |\n          cd openwrt\n          /bin/bash 02-convert_translation.sh\n\n      - name: Remove Upx\n        run: |\n          cd openwrt\n          /bin/bash 03-remove_upx.sh\n      - name: Load Config\n        run: |\n          cd openwrt\n          mv ../seed/$CONFIG_FILE .config\n          make defconfig\n          chmod -R 755 ./\n      - name: Make Toolchain\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make toolchain/install -j${make_process} V=s\n      - name: Compile Openwrt\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/*/*/*squashfs-sysupgrade.img* ./artifact/\n          cd ./artifact/\n          gzip -d *.gz && exit 0\n          gzip *.img\n          zip R2S-cod-$(date +%Y-%m-%d)-squashfs.zip *.img*\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          release_tag=\"R2S-origin-full ${{ env.DATE }}\"\n          echo \"##[set-output name=Release_tag;]$release_tag\"\n          cd ../openwrt\n          cp .config ../artifact/config-origin-full\n          ./scripts/diffconfig.sh > ../artifact/config-full.seed\n        \n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_origin_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWrt-R2S固件\n          allowUpdates: true\n          tag: OpenWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*\n"
  },
  {
    "path": "not_use_file/dnsmasq-add-filter-aaaa-option.patch",
    "content": "From 23ddcf0e475059b9111d3f321a1a340cf1b48698 Mon Sep 17 00:00:00 2001\nFrom: Chuck <fanck0605@qq.com>\nDate: Thu, 28 May 2020 22:26:04 -0700\nSubject: [PATCH] dnsmasq: add filter-aaaa option\n\nSigned-off-by: Chuck <fanck0605@qq.com>\n---\n .../network/services/dnsmasq/files/dhcp.conf  |  1 +\n .../services/dnsmasq/files/dnsmasq.init       |  1 +\n 2 files changed, 2 insertions(+)\n\ndiff --git a/package/network/services/dnsmasq/files/dhcp.conf b/package/network/services/dnsmasq/files/dhcp.conf\nindex 360c7d79eee..c9407f5e649 100644\n--- a/package/network/services/dnsmasq/files/dhcp.conf\n+++ b/package/network/services/dnsmasq/files/dhcp.conf\n@@ -20,7 +20,8 @@ config dnsmasq\n \t#list notinterface\tlo\n \t#list bogusnxdomain     '64.94.110.11'\n \toption localservice\t1  # disable to allow DNS requests from non-local subnets\n+\toption filteraaaa\t1\n \toption ednspacket_max\t1232\n\n config dhcp lan\n \toption interface\tlan\ndiff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init\nindex 06d83b06deb..08ff64d659f 100644\n--- a/package/network/services/dnsmasq/files/dnsmasq.init\n+++ b/package/network/services/dnsmasq/files/dnsmasq.init\n@@ -865,6 +865,7 @@ dnsmasq_start()\n \tappend_bool \"$cfg\" sequential_ip \"--dhcp-sequential-ip\"\n \tappend_bool \"$cfg\" allservers \"--all-servers\"\n \tappend_bool \"$cfg\" noping \"--no-ping\"\n+\tappend_bool \"$cfg\" filteraaaa \"--filter-aaaa\"\n \tappend_bool \"$cfg\" rapidcommit \"--dhcp-rapid-commit\"\n \tappend_bool \"$cfg\" scriptarp \"--script-arp\"\n \n"
  },
  {
    "path": "not_use_file/for_r2s_18.06.patch",
    "content": "diff --git a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\nindex 0e7eaede33..63908d1d53 100644\n--- a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n+++ b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n@@ -1,8 +1,8 @@\n \n config settings 'cpufreq'\n-\toption governor ''\n-\toption minfreq ''\n-\toption maxfreq ''\n+\toption governor 'schedutil'\n+\toption minfreq '816000'\n+\toption maxfreq '1512000'\n \toption upthreshold '50'\n \toption factor '10'\n\ndiff --git a/package/ctcgfw/luci-app-turboacc/Makefile b/package/ctcgfw/luci-app-turboacc/Makefile\nindex dfd78c845c..deb85f9246 100644\n--- a/package/ctcgfw/luci-app-turboacc/Makefile\n+++ b/package/ctcgfw/luci-app-turboacc/Makefile\n@@ -22,7 +22,7 @@ LUCI_PKGARCH:=all\n define Package/$(PKG_NAME)/config\n config PACKAGE_$(PKG_NAME)_INCLUDE_flow-offload\n \tbool \"Include Flow Offload\"\n-\tdepends on PACKAGE_$(PKG_NAME)_INCLUDE_shortcut-fe=n\n+\t#depends on PACKAGE_$(PKG_NAME)_INCLUDE_shortcut-fe=n\n \tdefault y\n \n config PACKAGE_$(PKG_NAME)_INCLUDE_shortcut-fe\ndiff --git a/package/ctcgfw/luci-app-turboacc/root/etc/config/turboacc b/package/ctcgfw/luci-app-turboacc/root/etc/config/turboacc\nindex 067aad2763..b221186ba4 100644\n--- a/package/ctcgfw/luci-app-turboacc/root/etc/config/turboacc\n+++ b/package/ctcgfw/luci-app-turboacc/root/etc/config/turboacc\n@@ -1,9 +1,9 @@\n \n config turboacc 'config'\n \toption sw_flow '1'\n-\toption hw_flow '1'\n-\toption sfe_flow '1'\n-\toption sfe_bridge '1'\n+\toption hw_flow '0'\n+\toption sfe_flow '0'\n+\toption sfe_bridge '0'\n \toption sfe_ipv6 '0'\n \toption bbr_cca '1'\n \toption fullcone_nat '1'\ndiff --git a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4\nindex 189855b05b..4fbc919f32 100644\n--- a/target/linux/rockchip/armv8/config-5.4\n+++ b/target/linux/rockchip/armv8/config-5.4\n@@ -9,6 +9,7 @@ CONFIG_ARCH_ROCKCHIP=y\n CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y\n CONFIG_ARC_EMAC_CORE=y\n CONFIG_ARM64_CNP=y\n+CONFIG_ARM64_CRYPTO=y\n # CONFIG_ARM64_ERRATUM_1165522 is not set\n # CONFIG_ARM64_ERRATUM_1286807 is not set\n # CONFIG_ARM64_ERRATUM_1418040 is not set\n@@ -115,15 +116,138 @@ CONFIG_CRC16=y\n CONFIG_CRC32_SLICEBY8=y\n CONFIG_CRC_T10DIF=y\n CONFIG_CROSS_MEMORY_ATTACH=y\n+CONFIG_CRYPTO_842=y\n+CONFIG_CRYPTO_ACOMP2=y\n+CONFIG_CRYPTO_ADIANTUM=y\n+CONFIG_CRYPTO_AEGIS128=y\n+CONFIG_CRYPTO_AEGIS128_SIMD=y\n+CONFIG_CRYPTO_AES_ARM64=y\n+CONFIG_CRYPTO_AES_ARM64_BS=y\n+CONFIG_CRYPTO_AES_ARM64_CE=y\n+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y\n+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y\n+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\n+CONFIG_CRYPTO_AES_TI=y\n+CONFIG_CRYPTO_AKCIPHER=y\n+CONFIG_CRYPTO_AKCIPHER2=y\n+CONFIG_CRYPTO_ANSI_CPRNG=y\n+CONFIG_CRYPTO_ANUBIS=y\n+CONFIG_CRYPTO_ARC4=y\n+CONFIG_CRYPTO_AUTHENC=y\n+CONFIG_CRYPTO_BLOWFISH=y\n+CONFIG_CRYPTO_BLOWFISH_COMMON=y\n+CONFIG_CRYPTO_CAMELLIA=y\n+CONFIG_CRYPTO_CAST5=y\n+CONFIG_CRYPTO_CAST6=y\n+CONFIG_CRYPTO_CAST_COMMON=y\n+CONFIG_CRYPTO_CBC=y\n+CONFIG_CRYPTO_CCM=y\n+CONFIG_CRYPTO_CFB=y\n+CONFIG_CRYPTO_CHACHA20=y\n+CONFIG_CRYPTO_CHACHA20POLY1305=y\n+CONFIG_CRYPTO_CHACHA20_NEON=y\n+CONFIG_CRYPTO_CMAC=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y\n+CONFIG_CRYPTO_CRYPTD=y\n+CONFIG_CRYPTO_CTR=y\n+CONFIG_CRYPTO_CTS=y\n+CONFIG_CRYPTO_DEFLATE=y\n+CONFIG_CRYPTO_DES=y\n+CONFIG_CRYPTO_DEV_CCP=y\n+CONFIG_CRYPTO_DEV_CCP_DD=y\n+CONFIG_CRYPTO_DEV_CCREE=y\n+CONFIG_CRYPTO_DEV_HISI_SEC=y\n+CONFIG_CRYPTO_DEV_ROCKCHIP=y\n+CONFIG_CRYPTO_DEV_SAFEXCEL=y\n+CONFIG_CRYPTO_DEV_SP_CCP=y\n+CONFIG_CRYPTO_DH=y\n CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_CTR=y\n+CONFIG_CRYPTO_DRBG_HASH=y\n CONFIG_CRYPTO_DRBG_HMAC=y\n CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_ECB=y\n+CONFIG_CRYPTO_ECC=y\n+CONFIG_CRYPTO_ECDH=y\n+CONFIG_CRYPTO_ECHAINIV=y\n+CONFIG_CRYPTO_ECRDSA=y\n+CONFIG_CRYPTO_ESSIV=y\n+CONFIG_CRYPTO_FCRYPT=y\n+CONFIG_CRYPTO_GCM=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_GHASH=y\n+CONFIG_CRYPTO_GHASH_ARM64_CE=y\n+CONFIG_CRYPTO_HASH_INFO=y\n+CONFIG_CRYPTO_HMAC=y\n+CONFIG_CRYPTO_HW=y\n CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_KEYWRAP=y\n+CONFIG_CRYPTO_KHAZAD=y\n+CONFIG_CRYPTO_KPP=y\n+CONFIG_CRYPTO_KPP2=y\n+CONFIG_CRYPTO_LIB_DES=y\n+CONFIG_CRYPTO_LIB_SHA256=y\n+CONFIG_CRYPTO_LRW=y\n+CONFIG_CRYPTO_LZ4=y\n+CONFIG_CRYPTO_LZ4HC=y\n+CONFIG_CRYPTO_LZO=y\n+CONFIG_CRYPTO_MD4=y\n+CONFIG_CRYPTO_MD5=y\n+CONFIG_CRYPTO_MICHAEL_MIC=y\n+CONFIG_CRYPTO_NHPOLY1305=y\n+CONFIG_CRYPTO_NHPOLY1305_NEON=y\n+CONFIG_CRYPTO_NULL=y\n+CONFIG_CRYPTO_OFB=y\n+CONFIG_CRYPTO_PCBC=y\n+CONFIG_CRYPTO_POLY1305=y\n+CONFIG_CRYPTO_RMD128=y\n+CONFIG_CRYPTO_RMD160=y\n+CONFIG_CRYPTO_RMD256=y\n+CONFIG_CRYPTO_RMD320=y\n CONFIG_CRYPTO_RNG=y\n CONFIG_CRYPTO_RNG2=y\n CONFIG_CRYPTO_RNG_DEFAULT=y\n+CONFIG_CRYPTO_RSA=y\n+CONFIG_CRYPTO_SALSA20=y\n+CONFIG_CRYPTO_SEED=y\n+CONFIG_CRYPTO_SEQIV=y\n+CONFIG_CRYPTO_SERPENT=y\n+CONFIG_CRYPTO_SHA1=y\n+CONFIG_CRYPTO_SHA1_ARM64_CE=y\n+CONFIG_CRYPTO_SHA256=y\n+CONFIG_CRYPTO_SHA256_ARM64=y\n+CONFIG_CRYPTO_SHA2_ARM64_CE=y\n+CONFIG_CRYPTO_SHA3=y\n+CONFIG_CRYPTO_SHA3_ARM64=y\n+CONFIG_CRYPTO_SHA512=y\n+CONFIG_CRYPTO_SHA512_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64_CE=y\n+CONFIG_CRYPTO_SIMD=y\n+CONFIG_CRYPTO_SM3=y\n+CONFIG_CRYPTO_SM3_ARM64_CE=y\n+CONFIG_CRYPTO_SM4=y\n+CONFIG_CRYPTO_SM4_ARM64_CE=y\n+CONFIG_CRYPTO_STATS=y\n+CONFIG_CRYPTO_STREEBOG=y\n+CONFIG_CRYPTO_TEA=y\n+CONFIG_CRYPTO_TEST=m\n+CONFIG_CRYPTO_TGR192=y\n+CONFIG_CRYPTO_TWOFISH=y\n+CONFIG_CRYPTO_TWOFISH_COMMON=y\n+CONFIG_CRYPTO_USER=y\n+CONFIG_CRYPTO_USER_API=y\n+CONFIG_CRYPTO_USER_API_AEAD=y\n+CONFIG_CRYPTO_USER_API_HASH=y\n+CONFIG_CRYPTO_USER_API_RNG=y\n+CONFIG_CRYPTO_USER_API_SKCIPHER=y\n+CONFIG_CRYPTO_VMAC=y\n+CONFIG_CRYPTO_WP512=y\n+CONFIG_CRYPTO_XCBC=y\n+CONFIG_CRYPTO_XTS=y\n+CONFIG_CRYPTO_XXHASH=y\n+CONFIG_CRYPTO_ZSTD=y\n CONFIG_DEBUG_BUGVERBOSE=y\n # CONFIG_DEVFREQ_GOV_PASSIVE is not set\n CONFIG_DEVFREQ_GOV_PERFORMANCE=y\n\ndiff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile\nindex cf8524dde..3551bc216\n--- a/package/lean/default-settings/Makefile\n+++ b/package/lean/default-settings/Makefile\n@@ -21,7 +21,7 @@ define Package/default-settings\n   CATEGORY:=LuCI\n   TITLE:=LuCI support for Default Settings\n   PKGARCH:=all\n-  DEPENDS:=+luci-base +@LUCI_LANG_zh-cn \\\n+  DEPENDS:=+luci-base +@LUCI_LANG_en \\\n \t   +bash\n endef\n\n@@ -41,8 +41,6 @@ define Package/default-settings/install\n \t$(INSTALL_DIR) $(1)/etc/uci-defaults\n \t$(INSTALL_DATA) ./files/openwrt_banner $(1)/etc/openwrt_banner\n \t$(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings\n-\tpo2lmo ./i18n/default.zh-cn.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo\n-\tpo2lmo ./i18n/more.zh-cn.po $(1)/usr/lib/lua/luci/i18n/more.zh-cn.lmo\n endef\n\n $(eval $(call BuildPackage,default-settings))\n\n"
  },
  {
    "path": "not_use_file/for_r2s_19.07_config-default.patch",
    "content": "diff --git a/target/linux/rockchip/armv8/config-5.4 b/target/linux/rockchip/armv8/config-5.4\nindex d7256a84a1..d09c03a1a5 100644\n--- a/target/linux/rockchip/armv8/config-5.4\n+++ b/target/linux/rockchip/armv8/config-5.4\n@@ -9,6 +9,7 @@ CONFIG_ARCH_ROCKCHIP=y\n CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y\n CONFIG_ARC_EMAC_CORE=y\n CONFIG_ARM64_CNP=y\n+CONFIG_ARM64_CRYPTO=y\n # CONFIG_ARM64_ERRATUM_1165522 is not set\n # CONFIG_ARM64_ERRATUM_1286807 is not set\n # CONFIG_ARM64_ERRATUM_1418040 is not set\n@@ -115,8 +116,138 @@ CONFIG_CRC16=y\n CONFIG_CRC32_SLICEBY8=y\n CONFIG_CRC_T10DIF=y\n CONFIG_CROSS_MEMORY_ATTACH=y\n+CONFIG_ARM64_CRYPTO=y\n+CONFIG_CRYPTO_842=y\n+CONFIG_CRYPTO_ACOMP2=y\n+CONFIG_CRYPTO_ADIANTUM=y\n+CONFIG_CRYPTO_AEGIS128=y\n+CONFIG_CRYPTO_AEGIS128_SIMD=y\n+CONFIG_CRYPTO_AES_ARM64=y\n+CONFIG_CRYPTO_AES_ARM64_BS=y\n+CONFIG_CRYPTO_AES_ARM64_CE=y\n+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y\n+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y\n+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\n+CONFIG_CRYPTO_AES_TI=y\n+CONFIG_CRYPTO_AKCIPHER=y\n+CONFIG_CRYPTO_AKCIPHER2=y\n+CONFIG_CRYPTO_ANSI_CPRNG=y\n+CONFIG_CRYPTO_ANUBIS=y\n+CONFIG_CRYPTO_ARC4=y\n+CONFIG_CRYPTO_AUTHENC=y\n+CONFIG_CRYPTO_BLOWFISH=y\n+CONFIG_CRYPTO_BLOWFISH_COMMON=y\n+CONFIG_CRYPTO_CAMELLIA=y\n+CONFIG_CRYPTO_CAST5=y\n+CONFIG_CRYPTO_CAST6=y\n+CONFIG_CRYPTO_CAST_COMMON=y\n+CONFIG_CRYPTO_CBC=y\n+CONFIG_CRYPTO_CCM=y\n+CONFIG_CRYPTO_CFB=y\n+CONFIG_CRYPTO_CHACHA20=y\n+CONFIG_CRYPTO_CHACHA20POLY1305=y\n+CONFIG_CRYPTO_CHACHA20_NEON=y\n+CONFIG_CRYPTO_CMAC=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y\n+CONFIG_CRYPTO_CRYPTD=y\n+CONFIG_CRYPTO_CTR=y\n+CONFIG_CRYPTO_CTS=y\n+CONFIG_CRYPTO_DEFLATE=y\n+CONFIG_CRYPTO_DES=y\n+CONFIG_CRYPTO_DEV_CCP=y\n+CONFIG_CRYPTO_DEV_CCP_DD=y\n+CONFIG_CRYPTO_DEV_CCREE=y\n+CONFIG_CRYPTO_DEV_HISI_SEC=y\n+CONFIG_CRYPTO_DEV_ROCKCHIP=y\n+CONFIG_CRYPTO_DEV_SAFEXCEL=y\n+CONFIG_CRYPTO_DEV_SP_CCP=y\n+CONFIG_CRYPTO_DH=y\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_CTR=y\n+CONFIG_CRYPTO_DRBG_HASH=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_ECB=y\n+CONFIG_CRYPTO_ECC=y\n+CONFIG_CRYPTO_ECDH=y\n+CONFIG_CRYPTO_ECHAINIV=y\n+CONFIG_CRYPTO_ECRDSA=y\n+CONFIG_CRYPTO_ESSIV=y\n+CONFIG_CRYPTO_FCRYPT=y\n+CONFIG_CRYPTO_GCM=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_GHASH=y\n+CONFIG_CRYPTO_GHASH_ARM64_CE=y\n+CONFIG_CRYPTO_HASH_INFO=y\n+CONFIG_CRYPTO_HMAC=y\n+CONFIG_CRYPTO_HW=y\n+CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_KEYWRAP=y\n+CONFIG_CRYPTO_KHAZAD=y\n+CONFIG_CRYPTO_KPP=y\n+CONFIG_CRYPTO_KPP2=y\n+CONFIG_CRYPTO_LIB_DES=y\n+CONFIG_CRYPTO_LIB_SHA256=y\n+CONFIG_CRYPTO_LRW=y\n+CONFIG_CRYPTO_LZ4=y\n+CONFIG_CRYPTO_LZ4HC=y\n+CONFIG_CRYPTO_LZO=y\n+CONFIG_CRYPTO_MD4=y\n+CONFIG_CRYPTO_MD5=y\n+CONFIG_CRYPTO_MICHAEL_MIC=y\n+CONFIG_CRYPTO_NHPOLY1305=y\n+CONFIG_CRYPTO_NHPOLY1305_NEON=y\n+CONFIG_CRYPTO_NULL=y\n+CONFIG_CRYPTO_OFB=y\n+CONFIG_CRYPTO_PCBC=y\n+CONFIG_CRYPTO_POLY1305=y\n+CONFIG_CRYPTO_RMD128=y\n+CONFIG_CRYPTO_RMD160=y\n+CONFIG_CRYPTO_RMD256=y\n+CONFIG_CRYPTO_RMD320=y\n+CONFIG_CRYPTO_RNG=y\n+CONFIG_CRYPTO_RNG_DEFAULT=y\n+CONFIG_CRYPTO_RSA=y\n+CONFIG_CRYPTO_SALSA20=y\n+CONFIG_CRYPTO_SEED=y\n+CONFIG_CRYPTO_SEQIV=y\n+CONFIG_CRYPTO_SERPENT=y\n+CONFIG_CRYPTO_SHA1=y\n+CONFIG_CRYPTO_SHA1_ARM64_CE=y\n+CONFIG_CRYPTO_SHA256=y\n+CONFIG_CRYPTO_SHA256_ARM64=y\n+CONFIG_CRYPTO_SHA2_ARM64_CE=y\n+CONFIG_CRYPTO_SHA3=y\n+CONFIG_CRYPTO_SHA3_ARM64=y\n+CONFIG_CRYPTO_SHA512=y\n+CONFIG_CRYPTO_SHA512_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64_CE=y\n+CONFIG_CRYPTO_SIMD=y\n+CONFIG_CRYPTO_SM3=y\n+CONFIG_CRYPTO_SM3_ARM64_CE=y\n+CONFIG_CRYPTO_SM4=y\n+CONFIG_CRYPTO_SM4_ARM64_CE=y\n+CONFIG_CRYPTO_STATS=y\n+CONFIG_CRYPTO_STREEBOG=y\n+CONFIG_CRYPTO_TEA=y\n+CONFIG_CRYPTO_TEST=m\n+CONFIG_CRYPTO_TGR192=y\n+CONFIG_CRYPTO_TWOFISH=y\n+CONFIG_CRYPTO_TWOFISH_COMMON=y\n+CONFIG_CRYPTO_USER=y\n+CONFIG_CRYPTO_USER_API=y\n+CONFIG_CRYPTO_USER_API_AEAD=y\n+CONFIG_CRYPTO_USER_API_HASH=y\n+CONFIG_CRYPTO_USER_API_RNG=y\n+CONFIG_CRYPTO_USER_API_SKCIPHER=y\n+CONFIG_CRYPTO_VMAC=y\n+CONFIG_CRYPTO_WP512=y\n+CONFIG_CRYPTO_XCBC=y\n+CONFIG_CRYPTO_XTS=y\n+CONFIG_CRYPTO_XXHASH=y\n+CONFIG_CRYPTO_ZSTD=y\n CONFIG_DEBUG_BUGVERBOSE=y\n # CONFIG_DEVFREQ_GOV_PASSIVE is not set\n CONFIG_DEVFREQ_GOV_PERFORMANCE=y\ndiff --git a/target/linux/rockchip/config-default b/target/linux/rockchip/config-default\nindex 1b2d5e1903..b2d0f89b77 100644\n--- a/target/linux/rockchip/config-default\n+++ b/target/linux/rockchip/config-default\n@@ -104,6 +104,7 @@ CONFIG_CC_HAS_KASAN_GENERIC=y\n CONFIG_CLKDEV_LOOKUP=y\n CONFIG_CLONE_BACKWARDS=y\n CONFIG_COMMON_CLK=y\n+# CONFIG_CGROUP_HUGETLB is not set\n CONFIG_CPU_RMAP=y\n CONFIG_CRYPTO_AEAD=y\n CONFIG_CRYPTO_AEAD2=y\ndiff --git a/package/feeds/packages/dnsdist/Makefile b/package/feeds/packages/dnsdist/Makefile\n--- a/package/feeds/packages/dnsdist/Makefile\n+++ b/package/feeds/packages/dnsdist/Makefile\n@@ -29,7 +29,7 @@\n\n choice\n         prompt \"Selected SSL library\"\n-        default DNSDIST_OPENSSSL\n+        default DNSDIST_OPENSSL\n\n         config DNSDIST_OPENSSL\n                 bool \"OpenSSL\"\ndiff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile\nindex 680a5d439..483513325 100644\n--- a/package/lean/default-settings/Makefile\n+++ b/package/lean/default-settings/Makefile\n@@ -21,7 +21,7 @@ define Package/default-settings\n   CATEGORY:=LuCI\n   TITLE:=LuCI support for Default Settings\n   PKGARCH:=all\n-  DEPENDS:=+luci-base +luci +luci-compat +@LUCI_LANG_zh-cn\n+  DEPENDS:=+luci-base +luci +luci-compat +@LUCI_LANG_en\n endef\n\n define Package/default-settings/description\n@@ -38,7 +38,7 @@ define Package/default-settings/install\n        $(INSTALL_DIR) $(1)/etc/uci-defaults\n        $(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings\n-       $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n-       po2lmo ./i18n/default.zh-cn.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo\n endef\n\n $(eval $(call BuildPackage,default-settings))"
  },
  {
    "path": "not_use_file/fullconenat/Makefile",
    "content": "#\n# Copyright (C) 2018 Chion Tang <tech@chionlab.moe>\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\nPKG_NAME:=fullconenat\nPKG_RELEASE:=1\n\nPKG_SOURCE_DATE:=2020-05-09\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/llccd/netfilter-full-cone-nat.git\nPKG_SOURCE_VERSION:=cc30ca6031ef5dca5bdb10cfd5ffc0c79425af9e\n\nPKG_LICENSE:=GPL-2.0\nPKG_LICENSE_FILES:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/iptables-mod-fullconenat\n  SUBMENU:=Firewall\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=FULLCONENAT iptables extension\n  DEPENDS:=iptables +kmod-ipt-fullconenat\n  MAINTAINER:=Chion Tang <tech@chionlab.moe>\nendef\n\ndefine Package/iptables-mod-fullconenat/install\n\t$(INSTALL_DIR) $(1)/usr/lib/iptables\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/libipt_FULLCONENAT.so $(1)/usr/lib/iptables\nendef\n\ndefine Package/ip6tables-mod-fullconenat\n  SUBMENU:=Firewall\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=FULLCONENAT ip6tables extension\n  DEPENDS:=ip6tables +kmod-nf-nat6 +kmod-ipt-fullconenat\n  MAINTAINER:=Chion Tang <tech@chionlab.moe>\nendef\n\ndefine Package/ip6tables-mod-fullconenat/install\n\t$(INSTALL_DIR) $(1)/usr/lib/iptables\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/libip6t_FULLCONENAT.so $(1)/usr/lib/iptables\nendef\n\ndefine KernelPackage/ipt-fullconenat\n  SUBMENU:=Netfilter Extensions\n  TITLE:=FULLCONENAT netfilter module\n  DEPENDS:=+kmod-nf-ipt +kmod-nf-nat\n  MAINTAINER:=Chion Tang <tech@chionlab.moe>\n  KCONFIG:=CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y\n  FILES:=$(PKG_BUILD_DIR)/xt_FULLCONENAT.ko\nendef\n\ninclude $(INCLUDE_DIR)/kernel-defaults.mk\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\n\t$(CP) ./files/Makefile $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(KERNEL_MAKE) M=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(PKG_EXTRA_KCONFIG) \\\n\tmodules\n\t$(call Build/Compile/Default)\nendef\n\n$(eval $(call BuildPackage,iptables-mod-fullconenat))\n$(eval $(call BuildPackage,ip6tables-mod-fullconenat))\n$(eval $(call KernelPackage,ipt-fullconenat))"
  },
  {
    "path": "not_use_file/fullconenat/files/Makefile",
    "content": "all: libipt_FULLCONENAT.so libip6t_FULLCONENAT.so\nlibipt_FULLCONENAT.so: libipt_FULLCONENAT.o\n\t$(CC) -shared -lxtables -o $@ $^;\nlibipt_FULLCONENAT.o: libipt_FULLCONENAT.c\n\t$(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<;\nlibip6t_FULLCONENAT.so: libip6t_FULLCONENAT.o\n\t$(CC) -shared -lxtables -o $@ $^;\nlibip6t_FULLCONENAT.o: libip6t_FULLCONENAT.c\n\t$(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<;\n\nobj-m += xt_FULLCONENAT.o"
  },
  {
    "path": "not_use_file/fullconenat/patches/000-printk.patch",
    "content": "diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c\nindex 9e52eba..8658c5f 100644\n--- a/xt_FULLCONENAT.c\n+++ b/xt_FULLCONENAT.c\n@@ -697,9 +697,11 @@ static struct xt_target tg_reg[] __read_mostly = {\n \n static int __init fullconenat_tg_init(void)\n {\n+  printk(KERN_INFO \"xt_FULLCONENAT: RFC3489 Full Cone NAT module\\n\"\n+\t\"xt_FULLCONENAT: Copyright (C) 2018 Chion Tang <tech@chionlab.moe>\\n\");\n   wq = create_singlethread_workqueue(\"xt_FULLCONENAT\");\n   if (wq == NULL) {\n-    printk(\"xt_FULLCONENAT: warning: failed to create workqueue\\n\");\n+    printk(KERN_WARNING \"xt_FULLCONENAT: warning: failed to create workqueue\\n\");\n   }\n \n   return xt_register_targets(tg_reg, ARRAY_SIZE(tg_reg));"
  },
  {
    "path": "not_use_file/k5.10.20.patch",
    "content": "diff --git a/include/kernel-version.mk b/include/kernel-version.mk\nindex 9fbd861440..33fe6b2d0e 100644\n--- a/include/kernel-version.mk\n+++ b/include/kernel-version.mk\n@@ -7,10 +7,10 @@ ifdef CONFIG_TESTING_KERNEL\n endif\n \n LINUX_VERSION-5.4 = .102\n-LINUX_VERSION-5.10 = .18\n+LINUX_VERSION-5.10 = .20\n \n LINUX_KERNEL_HASH-5.4.102 = fd697ce1c3f6024d4ae77d4eb5a1552199407b60cb8e90bc621e23cbce639aed\n-LINUX_KERNEL_HASH-5.10.18 = 3bc1ee2b1bf73b5ba936721953f3f9599fd165cef906cd5163c68d23cb9bb611\n+LINUX_KERNEL_HASH-5.10.20 = 9be37146feba42be05137cf900a7d9012990b5a1d5e59bc0c8da1f86952930a3\n \n remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))\n sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))\n"
  },
  {
    "path": "not_use_file/kernel_crypto-add-rk3328-crypto-support.patch",
    "content": "From 7662626ba699090aa3ec98e9d406e7b056703438 Mon Sep 17 00:00:00 2001\nFrom: CN_SZTL <cnsztl@project-openwrt.eu.org>\nDate: Sun, 19 Jul 2020 18:02:52 +0800\nSubject: [PATCH] kernel/crypto: add rk3328 crypto support\n\nSigned-off-by: CN_SZTL <cnsztl@project-openwrt.eu.org>\n---\n package/kernel/linux/modules/crypto.mk | 12 ++++++++++++\n 1 file changed, 12 insertions(+)\n\ndiff --git a/package/kernel/linux/modules/crypto.mk b/package/kernel/linux/modules/crypto.mk\nindex 48777764a8..2e71bb3e75 100644\n--- a/package/kernel/linux/modules/crypto.mk\n+++ b/package/kernel/linux/modules/crypto.mk\n@@ -842,3 +843,14 @@ endef\n \n $(eval $(call KernelPackage,crypto-xts))\n \n+\n+define KernelPackage/crypto-rk3328\n+  TITLE:=Rockchip RK3328 CryptoAPI module\n+  DEPENDS:=@TARGET_rockchip +kmod-crypto-des +kmod-crypto-md5 +kmod-crypto-sha1 +kmod-crypto-sha256\n+  KCONFIG:=CONFIG_CRYPTO_DEV_ROCKCHIP\n+  FILES:=$(LINUX_DIR)/drivers/crypto/rockchip/rk_crypto.ko\n+  AUTOLOAD:=$(call AutoLoad,09,rk_crypto)\n+  $(call AddDepends/crypto)\n+endef\n+\n+$(eval $(call KernelPackage,crypto-rk3328))\n"
  },
  {
    "path": "not_use_file/luci-add-filter-aaaa-option.patch",
    "content": "From d5714003b9ba288b45e6866472315a99230292f5 Mon Sep 17 00:00:00 2001\nFrom: Chuck <fanck0605@qq.com>\nDate: Wed, 3 Jun 2020 16:37:41 +0800\nSubject: [PATCH] dnsmasq: add filter-aaaa option\n\nSigned-off-by: Chuck <fanck0605@qq.com>\n---\n .../feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js        | 5 +++++\n 1 file changed, 5 insertions(+)\n\ndiff --git a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\nindex 6693dc0eac..1c8f943758 100644\n--- a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\n+++ b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\n@@ -199,6 +199,11 @@ return view.extend({\n \t\ts.taboption('files', form.DynamicList, 'addnhosts',\n \t\t\t_('Additional Hosts files')).optional = true;\n \n+\t\to = s.taboption('advanced', form.Flag, 'filteraaaa',\n+\t\t\t_('Filter IPv6 Records'),\n+\t\t\t_('Filter IPv6(AAAA) Records during DNS resolution'));\n+\t\to.optional = true;\n+\n \t\to = s.taboption('advanced', form.Flag, 'quietdhcp',\n \t\t\t_('Suppress logging'),\n \t\t\t_('Suppress logging of the routine operation of these protocols'));\n"
  },
  {
    "path": "not_use_file/luci-app-firewall_add_sfe_switch.patch",
    "content": "From: QiuSimons\ndiff --git a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n--- a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n+++ b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n@@ -7,6 +7,58 @@\n 'require firewall';\n 'require tools.firewall as fwtool';\n 'require tools.widgets as widgets';\n+var callInitList, callInitAction, sfe;\n+\n+callInitList = rpc.declare({\n+    object: 'luci',\n+    method: 'getInitList',\n+    params: ['name'],\n+    expect: {\n+        '': {}\n+    },\n+    filter: function (res) {\n+        for (var k in res)\n+            return +res[k].enabled;\n+        return null;\n+    }\n+});\n+callInitAction = rpc.declare({\n+    object: 'luci',\n+    method: 'setInitAction',\n+    params: ['name', 'action'],\n+    expect: {\n+        result: false\n+    }\n+});\n+sfe = form.DummyValue.extend({\n+    renderWidget: function (section_id, option_id, cfgvalue) {\n+        return E([], [this.sfe_support ? E('button', {\n+            'class': 'cbi-button cbi-button-save',\n+            'click': function () {\n+                this.disabled = true;\n+                this.blur();\n+                this.classList.add('spinning');\n+                callInitAction('shortcut-fe', 'stop');\n+                callInitAction('shortcut-fe', 'disable').then(L.bind(function () {\n+                    this.classList.remove('spinning');\n+                    location.reload();\n+                }, this));\n+            }\n+        }, _('Enabled')) : E('button', {\n+            'class': 'cbi-button cbi-button-reset',\n+            'click': function () {\n+                this.disabled = true;\n+                this.blur();\n+                this.classList.add('spinning');\n+                callInitAction('shortcut-fe', 'start');\n+                callInitAction('shortcut-fe', 'enable').then(L.bind(function () {\n+                    this.classList.remove('spinning');\n+                    location.reload();\n+                }, this));\n+            }\n+        }, _('Disabled'))]);\n+    },\n+});\n \n return view.extend({\n \tcallConntrackHelpers: rpc.declare({\n@@ -18,7 +70,8 @@\n \tload: function() {\n \t\treturn Promise.all([\n \t\t\tthis.callConntrackHelpers(),\n-\t\t\tfirewall.getDefaults()\n+\t\t\tfirewall.getDefaults(),\n+\t\t\tcallInitList('shortcut-fe')\n \t\t]);\n \t},\n \n@@ -32,6 +85,7 @@\n \trenderZones: function(data) {\n \t\tvar ctHelpers = data[0],\n \t\t    fwDefaults = data[1],\n+\t\t\tsfe_support = data[2],\n \t\t    m, s, o, inp, out;\n \n \t\tm = new form.Map('firewall', _('Firewall - Zone Settings'),\n@@ -58,6 +112,16 @@\n \n \t\t/* Netfilter flow offload support */\n \n+\t\ts = m.section(form.TypedSection, 'defaults', _('Routing/NAT Offloading'), _('SFE based offloading for Routing/NAT. Restart recommended.'));\n+        s.anonymous = true;\n+        s.addremove = false;\n+        o = s.option(sfe, _('SFE flow offloading'),\n+\t\t\t_('SFE flow offloading'));\n+        o.sfe_support = sfe_support;\n+        o.load = function (section_id) {\n+            return (uci.get('system', 'shortcut-fe', 'enabled') != 0) ? '1' : '0';\n+        };\n+\n \t\tif (L.hasSystemFeature('offloading')) {\n \t\t\ts = m.section(form.TypedSection, 'defaults', _('Routing/NAT Offloading'),\n \t\t\t\t_('Experimental feature. Not fully compatible with QoS/SQM.'));\n"
  },
  {
    "path": "not_use_file/luci-app-freq.patch",
    "content": "diff --git a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\nindex 0e7eaede3..f7128226f 100644\n--- a/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n+++ b/package/lean/luci-app-cpufreq/root/etc/config/cpufreq\n@@ -1,8 +1,8 @@\n \n config settings 'cpufreq'\n-\toption governor ''\n-\toption minfreq ''\n-\toption maxfreq ''\n+\toption governor 'schedutil'\n+\toption minfreq '816000'\n+\toption maxfreq '1608000'\n \toption upthreshold '50'\n \toption factor '10'\n \n"
  },
  {
    "path": "not_use_file/luci_network-add-packet-steering.patch",
    "content": "diff -rNEZbwBdu3 a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js\n--- a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js\t2020-08-11 17:54:35.854075042 +0800\n+++ b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js\t2020-08-17 20:32:46.229218269 +0800\n@@ -867,6 +867,10 @@\n \t\to.datatype = 'cidr6';\n \n \n+\t\to = s.option(form.Flag, 'packet_steering', _('Packet Steering'), _('Enable packet steering across all CPUs. May help or hinder network speed.'));\n+\t\to.optional = true;\n+\n+\n \t\tif (dslModemType != null) {\n \t\t\ts = m.section(form.TypedSection, 'dsl', _('DSL'));\n \t\t\ts.anonymous = true;\n"
  },
  {
    "path": "not_use_file/modules/cryptodev-linux/Makefile",
    "content": "#\n# Copyright (C) 2014 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n# $Id$\n\ninclude $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\nPKG_NAME:=cryptodev-linux\nPKG_VERSION:=1.11\nPKG_RELEASE:=1\n\nPKG_SOURCE_URL:=https://codeload.github.com/$(PKG_NAME)/$(PKG_NAME)/tar.gz/$(PKG_NAME)-$(PKG_VERSION)?\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_HASH:=d71fd8dafc40147586f5bc6acca8fce5088d9c576d1142fe5aeb7b0813186a11\nPKG_LICENSE:=GPL-2.0\nPKG_LICENSE_FILES:=COPYING\n\nPKG_MAINTAINER:=Ansuel Smith <ansuelsmth@gmail.com>\n\nPKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_NAME)-$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine KernelPackage/cryptodev\n  SUBMENU:=Cryptographic API modules\n  TITLE:=Driver for cryptographic acceleration\n  URL:=http://cryptodev-linux.org/\n  VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE)\n  DEPENDS:=+kmod-crypto-authenc +kmod-crypto-hash\n  FILES:=$(PKG_BUILD_DIR)/cryptodev.$(LINUX_KMOD_SUFFIX)\n  AUTOLOAD:=$(call AutoLoad,50,cryptodev)\n  MODPARAMS.cryptodev:=cryptodev_verbosity=-1\nendef\n\ndefine KernelPackage/cryptodev/description\n  This is a driver for that allows to use the Linux kernel supported\n  hardware ciphers by user-space applications.\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(KERNEL_MAKE_FLAGS) \\\n\t\tKERNEL_DIR=\"$(LINUX_DIR)\"\nendef\n\ndefine Build/InstallDev\n\t$(INSTALL_DIR) $(STAGING_DIR)/usr/include/crypto\n\t$(CP) $(PKG_BUILD_DIR)/crypto/cryptodev.h $(STAGING_DIR)/usr/include/crypto/\nendef\n\n$(eval $(call KernelPackage,cryptodev))\n"
  },
  {
    "path": "not_use_file/nanopi-openwrt copy.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n\nname: OpenWrt-R2S-Firmware\n\non:\n#  release:\n#    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/nanopi-openwrt.yml'\n      - 'step/01-prepare_package.sh'\n      - 'seed/r2s.seed'\n  schedule:\n    - cron: 35 20 * * *\n  watch:\n    types: started\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@main\n\n      - name: Show CPU Model and Free Space\n        run: |\n          echo -e \"Total CPU cores\\t: $(nproc)\"\n          cat /proc/cpuinfo | grep 'model name'\n          free -h\n\n      - name: Set env\n        run: |\n          echo \"SSH_ACTIONS=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_BIN_DIR=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_FIRMWARE=true\" >> $GITHUB_ENV\n          echo \"UPLOAD_RELEASE=true\" >> $GITHUB_ENV\n          echo \"CONFIG_FILE=r2s.seed\" >> $GITHUB_ENV\n          echo \"TZ=Asia/Shanghai\" >>$GITHUB_ENV\n          echo \"Build_Date=$(date +%Y.%m.%d)\" >> $GITHUB_ENV\n          \n      - name: Show env\n        run: echo $GITHUB_ENV\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo -E rm -rf /etc/apt/sources.list.d\n          sudo -E apt-get update -y\n          sudo -E apt-get install -y build-essential rsync asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python3 python3-pip python3-ply haveged lrzsz device-tree-compiler scons\n          wget -qO - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | sed 's/python-/python3-/g' | /bin/bash\n          sudo -E apt-get clean -y\n          git config --global user.name 'GitHub Actions' && git config --global user.email 'noreply@github.com'\n          df -h\n\n      - name: Install OpenWrt source\n        run: |\n          git clone -b master --single-branch https://git.openwrt.org/openwrt/openwrt.git openwrt\n\n      - name: Prepare openwrt\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 00-prepare_openwrt.sh\n\n      - name: Prepare application packages\n        run: |\n          cd openwrt\n          /bin/bash 01-prepare_package.sh\n\n#      - name: Remove Upx\n#        run: |\n#          cd openwrt\n#          /bin/bash 02-remove_upx.sh\n\n      - name: Add ACL\n        run: |\n          cd openwrt\n          /bin/bash 03-create_acl_for_luci.sh -a\n\n      - name: Load Config\n        run: |\n          cd openwrt\n          mv ../seed/$CONFIG_FILE .config\n          make defconfig\n          chmod -R 755 ./\n      - name: Make Toolchain\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make toolchain/install -j${make_process} V=s\n      - name: Compile Openwrt\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/*/*/*sysupgrade.img* ./artifact/\n          cd ./artifact/\n          gzip -d *.gz && exit 0\n          gzip *.img\n          zip R2S-slim-$(date +%Y-%m-%d)-squashfs.zip *squashfs*\n          zip R2S-slim-$(date +%Y-%m-%d)-ext4.zip *ext4*\n          cd ../openwrt\n          cp .config ../artifact/full.config\n          ./scripts/diffconfig.sh > ../artifact/slim.seed\n        \n      - name: Upload artifact\n        uses: actions/upload-artifact@main\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_origin_firmware\n          path: ./artifact/\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWrt-R2S FIRMWARES\n          allowUpdates: true\n          tag: OpenWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ./artifact/*.zip,./artifact/slim*\n"
  },
  {
    "path": "not_use_file/origin-full.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyelec_nanopi-r2-rev00=y\nCONFIG_PACKAGE_arm-trusted-firmware-rockchip=y\nCONFIG_TARGET_OPTIMIZATION=\"-O3 -pipe -march=armv8-a+crc+simd+crypto\"\n# CONFIG_TARGET_IMAGES_GZIP is not set\nCONFIG_TARGET_ROOTFS_EXT4FS=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_ROOTFS_PARTSIZE=400\nCONFIG_LUCI_LANG_zh_Hans=y\nCONFIG_LUCI_LANG_en=y\n\n# CONFIG_LUCI_CSSTIDY is not set\n# CONFIG_LUCI_JSMIN is not set\nCONFIG_AUTOREMOVE=y\nCONFIG_IMAGEOPT=y\nCONFIG_JSON_ADD_IMAGE_INFO=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BLK_DEV_THROTTLING=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_KALLSYMS=y\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_ENGINE_BUILTIN=y\nCONFIG_OPENSSL_ENGINE_BUILTIN_DEVCRYPTO=y\n\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\n\n#SFE\nCONFIG_PACKAGE_kmod-shortcut-fe=y\n# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set\nCONFIG_PACKAGE_kmod-fast-classifier=y\n\n#OLED\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-i18n-oled-zh-cn=y\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#support usb asix 100M/1000M网卡\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\n\nCONFIG_PACKAGE_addition-trans-zh=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_cgi-io=y\n\nCONFIG_PACKAGE_coremark=y\n\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\n\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\n\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-ntfs=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\n\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libubus-lua=y\n\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb3=y\nCONFIG_BRCMFMAC_SDIO=y\n\n#Support some Hilink 4G USB dongle\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\n\n#Support some USB wireless\nCONFIG_PACKAGE_hostapd=y\nCONFIG_PACKAGE_hostapd-basic=y\nCONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_PACKAGE_kmod-cfg80211=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wpad-mini=y\nCONFIG_PACKAGE_wpa-supplicant=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-mt7601u=y\n#--End-- \n\n#Support NCM mode 4G dongle\n#CONFIG_PACKAGE_comgt\n#CONFIG_PACKAGE_comgt-ncm \n#CONFIG_PACKAGE_kmod-usb-net-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-qmi-wwan\n#CONFIG_PACKAGE_luci-proto-ncm \n#CONFIG_PACKAGE_kmod-usb-serial-wwan \n#CONFIG_PACKAGE_kmod-usb-serial \n#CONFIG_PACKAGE_kmod-usb-serial-option\n#--End--\n\nCONFIG_PACKAGE_kmod-mmc=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adbyby-plus=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-oaf=y\nCONFIG_PACKAGE_luci-app-openclash=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-serverchan=y\nCONFIG_PACKAGE_luci-app-smartdns=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray_plugin=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Server=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-trojan-server=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-usb-printer=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_openssl-util=y\n\nCONFIG_PACKAGE_wget=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_socat=y\n\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-ttyd=y\n\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_stress=y\n\nCONFIG_PACKAGE_luci-app-dockerman=y\nCONFIG_PACKAGE_luci-lib-docker=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_docker-ce=y\nCONFIG_DOCKER_KERNEL_OPTIONS=y\nCONFIG_DOCKER_NET_MACVLAN=y\nCONFIG_DOCKER_SECCOMP=y\nCONFIG_DOCKER_RES_SHAPE=y\nCONFIG_DOCKER_NET_OVERLAY=y\nCONFIG_DOCKER_NET_ENCRYPT=y\nCONFIG_DOCKER_NET_TFTP=y\nCONFIG_DOCKER_STO_EXT4=y\nCONFIG_DOCKER_STO_BTRFS=y\n\nCONFIG_PACKAGE_luci-app-transmission=y\nCONFIG_PACKAGE_transmission-daemon-openssl=y\nCONFIG_PACKAGE_transmission-web-control=y\nCONFIG_PACKAGE_transmission-remote-openssl=y\n\nCONFIG_PACKAGE_luci-app-samba4=y\nCONFIG_PACKAGE_samba4-admin=y\nCONFIG_PACKAGE_samba4-client=y\nCONFIG_PACKAGE_samba4-utils=y\n\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_luci-app-zerotier=y\n\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_smartmontools=y\n\nCONFIG_KERNEL_CGROUPS=y\nCONFIG_PACKAGE_luci-app-mwan3=y\n# CONFIG_PACKAGE_luci-app-mwan3helper is not set\nCONFIG_PACKAGE_mwan3=y\nCONFIG_PACKAGE_luci-app-syncdial=y\n\n# CONFIG_COLLECT_KERNEL_DEBUG is not set\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set\n\nCONFIG_KERNEL_KEYS=y\nCONFIG_BUSYBOX_DEFAULT_FEATURE_SUID=y\nCONFIG_PACKAGE_diffutils=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-user=y\nCONFIG_PACKAGE_kmod-cryptodev=y\nCONFIG_PACKAGE_kmod-fs-antfs=y\nCONFIG_PACKAGE_kmod-lib-textsearch=y\nCONFIG_PACKAGE_kmod-nf-nathelper=y\nCONFIG_PACKAGE_kmod-nf-nathelper-extra=y\nCONFIG_PACKAGE_kmod-iptunnel=y\nCONFIG_PACKAGE_kmod-iptunnel4=y\nCONFIG_PACKAGE_kmod-mppe=y\nCONFIG_PACKAGE_kmod-sit=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_antfs-mount=y\nCONFIG_PACKAGE_bash=y\nCONFIG_DOCKER_KERNEL_OPTIONS=y\nCONFIG_PACKAGE_shellsync=y\nCONFIG_PACKAGE_libustream-openssl=y\nCONFIG_PACKAGE_kmod-sit=y\nCONFIG_PACKAGE_kmod-iptunnel=y\nCONFIG_PACKAGE_kmod-iptunnel4=y\nCONFIG_BUSYBOX_DEFAULT_FSYNC=y"
  },
  {
    "path": "not_use_file/origin-full.sh",
    "content": "#!/bin/bash\ngit clone https://git.openwrt.org/openwrt/openwrt.git\ncd openwrt\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/rockchip-add-support-for-FriendlyARM-NanoPi-R2S.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/rockchip-add-support-for-rk3328-radxa-rock-pi-e.patch\npatch -p1 < ./rockchip-add-support-for-rk3328-radxa-rock-pi-e.patch\npatch -p1 < ./rockchip-add-support-for-FriendlyARM-NanoPi-R2S.patch\n#\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/01-prepare_package.sh\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/02-convert_translation.sh\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/03-remove_upx.sh\nbash 01-prepare_package.sh\nbash 02-convert_translation.sh\nbash 03-remove_upx.sh\nrm .config\nwget -O .config https://github.com/quintus-lab/Openwrt-R2S/raw/master/seed/origin-full.seed\nmake defconfig\nmake download -j10\nchmod -R 755 ./\nlet make_process=$(nproc)+1\nmake toolchain/install -j${make_process} V=s\nlet make_process=$(nproc)+1\nmake -j${make_process} V=s || make -j${make_process} V=s\ncd bin/targets/rockchip/armv8\ngzip -d *.gz\ngzip *.img\n"
  },
  {
    "path": "not_use_file/origin-full.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S org\n#=================================================\n\nname: OpenWrt R2S origin-full\n\n#on:\n#  release:\n#    types: published\n#  push:\n#    branches:\n#      - master\n#    paths:\n#      - '.github/workflows/origin-full.yml'\n#      - 'step/01-prepare_package.sh'\n#      - 'seed/origin-full.seed'\n#   schedule:\n#    - cron: 35 20 * * *\n#  watch:\n#    types: started\n\nenv:\n  SSH_ACTIONS: false\n  UPLOAD_BIN_DIR: false\n  UPLOAD_FIRMWARE: false\n  UPLOAD_RELEASE: true\n  CONFIG_FILE: origin-full.seed\n  TZ: Asia/Shanghai\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo rm -rf /etc/apt/sources.list.d\n          sudo apt-get -y purge dotnet* ghc* google* llvm* mysql* php* zulu* firefox hhvm\n          sudo rm -rf /usr/share/dotnet /usr/local/lib/android/sdk\n          sudo apt-get update\n          sudo apt-get -y --no-install-recommends install build-essential asciidoc binutils bison bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf python3\n          curl https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh  | sed '/#/d' | sed 's/\\\\//g' | sed 's/exit 0//g' | sed 's/sudo apt -y install//g' | sed 's/sudo apt-get -y install//g' | sed 's/:i386//g' | xargs sudo apt-get -y --no-install-recommends install\n          sudo rm -rf /usr/share/dotnet /usr/local/lib/android/sdk\n          git config --global user.name \"Actions\"\n          git config --global user.email \"actions@github.com\"\n      - name: Install OpenWrt source\n        run: |\n          git clone https://git.openwrt.org/openwrt/openwrt.git\n\n      - name: Prepare openwrt package\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 01-prepare_package.sh\n\n      - name: Convert Translation\n        run: |\n          cd openwrt\n          /bin/bash 02-convert_translation.sh\n\n      - name: Remove Upx\n        run: |\n          cd openwrt\n          /bin/bash 03-remove_upx.sh\n      - name: Load Config\n        run: |\n          cd openwrt\n          mv ../seed/$CONFIG_FILE .config\n          make defconfig\n          chmod -R 755 ./\n      - name: Make Toolchain\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make toolchain/install -j${make_process} V=s\n          df -h\n      - name: Compile Openwrt\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n          df -h\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/*/*/*sysupgrade.img* ./artifact/\n          cd ./artifact/\n          gzip -d *.gz && exit 0\n          gzip *.img\n          zip R2S-full-$(date +%Y-%m-%d)-squashfs.zip *squashfs*\n          zip R2S-full-$(date +%Y-%m-%d)-ext4.zip *ext4*\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          release_tag=\"R2S-origin-full ${{ env.DATE }}\"\n          echo \"##[set-output name=Release_tag;]$release_tag\"\n          cd ../openwrt\n          cp .config ../artifact/config-origin-full\n          ./scripts/diffconfig.sh > ../artifact/config-full.seed\n        \n      - name: Upload artifact\n        uses: actions/upload-artifact@master\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_origin_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWrt-R2S固件\n          allowUpdates: true\n          tag: OpenWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/config*\n"
  },
  {
    "path": "not_use_file/origin-slim.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_PACKAGE_arm-trusted-firmware-rockchip=y\nCONFIG_EXTRA_OPTIMIZATION=\"-fno-caller-saves -fno-plt -O3\"\nCONFIG_TARGET_OPTIMIZATION=\"-O3 -pipe -mcpu=generic\"\n\n# CONFIG_TARGET_IMAGES_GZIP is not set\nCONFIG_TARGET_ROOTFS_EXT4FS=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_ROOTFS_PARTSIZE=900\n# CONFIG_LUCI_LANG_zh_Hans is not set\nCONFIG_LUCI_LANG_en=y\n\n# CONFIG_LUCI_CSSTIDY is not set\n# CONFIG_LUCI_JSMIN is not set\nCONFIG_AUTOREMOVE=y\nCONFIG_IMAGEOPT=y\nCONFIG_JSON_ADD_IMAGE_INFO=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BLK_DEV_THROTTLING=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_KALLSYMS=y\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n\nCONFIG_PACKAGE_libustream-openssl=y\n# CONFIG_PACKAGE_libustream-wolfssl is not set\n\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_PACKAGE_kmod-cryptodev=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_PACKAGE_libopenssl-devcrypto=y\nCONFIG_PACKAGE_libopenssl-afalg=y\nCONFIG_PACKAGE_libopenssl-devcrypto=y\nCONFIG_PACKAGE_libopenssl-conf=y\n\n# Cryptographic API modules\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-xcbc=y\nCONFIG_PACKAGE_kmod-crypto-xts=y\n# end of Cryptographic API modules\n\nCONFIG_PACKAGE_default-settings=y\n\n#SFE\nCONFIG_PACKAGE_kmod-shortcut-fe=y\n# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set\nCONFIG_PACKAGE_kmod-fast-classifier=y\n\n#OLED\nCONFIG_PACKAGE_luci-app-oled=y\n# CONFIG_PACKAGE_luci-i18n-oled-zh-cn is not set\n\n#jd-dailybonus\nCONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#support usb asix 100M/1000M网卡\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\n\n# CONFIG_PACKAGE_addition-trans-zh is not set\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_cgi-io=y\n\nCONFIG_PACKAGE_coremark=y\n\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\n\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\n\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-ntfs=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\n\n#--transmission\n#CONFIG_PACKAGE_luci-app-transmission=y\n#CONFIG_PACKAGE_transmission-daemon-openssl=y\n#CONFIG_PACKAGE_transmission-web-control=y\n#CONFIG_PACKAGE_transmission-remote-openssl=y\n#\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libubus-lua=y\n\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb3=y\nCONFIG_BRCMFMAC_SDIO=y\n\n#Support Hilink 4G USB dongle & USB Tethering\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_usbutils=y\n\n#Support some USB wireless\n#CONFIG_PACKAGE_hostapd=y\n#CONFIG_PACKAGE_hostapd-basic=y\n#CONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_PACKAGE_kmod-cfg80211=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\n#CONFIG_PACKAGE_wpa-supplicant=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\n#CONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-mt7601u=y\nCONFIG_PACKAGE_kmod-rtl8812au-ac=y\nCONFIG_WPA_MSG_MIN_PRIORITY=3\n\n#--End-- \n#Support NCM mode 4G dongle\n#CONFIG_PACKAGE_comgt\n#CONFIG_PACKAGE_comgt-ncm \n#CONFIG_PACKAGE_kmod-usb-net-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-qmi-wwan\n#CONFIG_PACKAGE_luci-proto-ncm \n#CONFIG_PACKAGE_kmod-usb-serial-wwan \n#CONFIG_PACKAGE_kmod-usb-serial \n#CONFIG_PACKAGE_kmod-usb-serial-option\n#--End--\nCONFIG_PACKAGE_kmod-mmc=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\n# CONFIG_PACKAGE_luci-app-adguardhome=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-firewall=y\n#CONFIG_PACKAGE_luci-app-oaf=y\nCONFIG_PACKAGE_luci-app-onliner=y\n# CONFIG_PACKAGE_luci-app-openclash=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\n# CONFIG_PACKAGE_luci-app-serverchan=y\nCONFIG_PACKAGE_luci-app-smartdns=y\nCONFIG_PACKAGE_luci-app-ocserv=y\n# CONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray_plugin=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Server=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-upnp=y\n# CONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-beardropper=y\n# CONFIG_PACKAGE_luci-app-trojan-server is not set\nCONFIG_PACKAGE_luci-app-gost=y\n# CONFIG_PACKAGE_luci-app-usb-printer is not set\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-acme=y\nCONFIG_PACKAGE_luci-app-statistics=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_acme-dnsapi=y\nCONFIG_PACKAGE_wget=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_luci-app-zerotier=y\n\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_smartmontools=y\n\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-ttyd=y\n\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_stress=y\n\n# CONFIG_PACKAGE_kmod-lib-zstd is not set\n\n# CONFIG_PACKAGE_luci-app-dockerman=y\n# CONFIG_PACKAGE_luci-lib-docker=y\n# CONFIG_PACKAGE_luci-lib-jsonc=y\n# CONFIG_PACKAGE_docker-ce=y\n\n# CONFIG_PACKAGE_luci-app-transmission=y\n# CONFIG_PACKAGE_transmission-daemon-openssl=y\n# CONFIG_PACKAGE_transmission-web-control=y\n# CONFIG_PACKAGE_transmission-remote-openssl=y\n\n# CONFIG_PACKAGE_luci-app-samba4=y\n# CONFIG_PACKAGE_samba4-admin=y\n# CONFIG_PACKAGE_samba4-client=y\n# CONFIG_PACKAGE_samba4-utils=y\n\n#CONFIG_KERNEL_CGROUPS=y\n#CONFIG_PACKAGE_luci-app-mwan3=y\n#CONFIG_PACKAGE_luci-app-mwan3helper=y\n#CONFIG_PACKAGE_mwan3=y\n#CONFIG_PACKAGE_luci-app-syncdial=y\n\n# CONFIG_COLLECT_KERNEL_DEBUG is not set\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set\n"
  },
  {
    "path": "not_use_file/purge-slim.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_PACKAGE_arm-trusted-firmware-rockchip=y\nCONFIG_EXTRA_OPTIMIZATION=\"-fno-caller-saves -fno-plt -O3\"\nCONFIG_TARGET_OPTIMIZATION=\"-O3 -pipe -mcpu=generic\"\n\n# CONFIG_TARGET_IMAGES_GZIP is not set\nCONFIG_TARGET_ROOTFS_EXT4FS=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_ROOTFS_PARTSIZE=900\n# CONFIG_LUCI_LANG_zh_Hans is not set\nCONFIG_LUCI_LANG_en=y\n\n# CONFIG_LUCI_CSSTIDY is not set\n# CONFIG_LUCI_JSMIN is not set\nCONFIG_AUTOREMOVE=y\nCONFIG_IMAGEOPT=y\nCONFIG_JSON_ADD_IMAGE_INFO=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BLK_DEV_THROTTLING=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_KALLSYMS=y\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n\nCONFIG_PACKAGE_libustream-openssl=y\n# CONFIG_PACKAGE_libustream-wolfssl is not set\n\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_PACKAGE_kmod-cryptodev=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_PACKAGE_libopenssl-devcrypto=y\nCONFIG_PACKAGE_libopenssl-afalg=y\nCONFIG_PACKAGE_libopenssl-devcrypto=y\nCONFIG_PACKAGE_libopenssl-conf=y\n\n# Cryptographic API modules\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-rk3328=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-xcbc=y\nCONFIG_PACKAGE_kmod-crypto-xts=y\n# end of Cryptographic API modules\n\nCONFIG_PACKAGE_default-settings=y\n\n#SFE\nCONFIG_PACKAGE_kmod-shortcut-fe=y\n# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set\nCONFIG_PACKAGE_kmod-fast-classifier=y\n\n#OLED\n#CONFIG_PACKAGE_luci-app-oled=y\n# CONFIG_PACKAGE_luci-i18n-oled-zh-cn is not set\n\n#jd-dailybonus\n#CONFIG_PACKAGE_luci-app-jd-dailybonus=y\n\n#support usb asix 100M/1000M网卡\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\n\n# CONFIG_PACKAGE_addition-trans-zh is not set\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_cgi-io=y\n\nCONFIG_PACKAGE_coremark=y\n\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\n\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\n\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-ntfs=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\n\n#--transmission\n#CONFIG_PACKAGE_luci-app-transmission=y\n#CONFIG_PACKAGE_transmission-daemon-openssl=y\n#CONFIG_PACKAGE_transmission-web-control=y\n#CONFIG_PACKAGE_transmission-remote-openssl=y\n#\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libubus-lua=y\n\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8152=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb3=y\nCONFIG_BRCMFMAC_SDIO=y\n\n#Support Hilink 4G USB dongle & USB Tethering\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_usbutils=y\n\n#Support some USB wireless\n#CONFIG_PACKAGE_hostapd=y\n#CONFIG_PACKAGE_hostapd-basic=y\n#CONFIG_PACKAGE_hostapd-utils=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_DRIVER_11W_SUPPORT=y\nCONFIG_PACKAGE_kmod-cfg80211=y\n#CONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\n#CONFIG_PACKAGE_wpa-supplicant=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\n#CONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-mt7601u=y\nCONFIG_PACKAGE_kmod-rtl8812au-ac=y\nCONFIG_WPA_MSG_MIN_PRIORITY=3\n\n#--End-- \n#Support NCM mode 4G dongle\n#CONFIG_PACKAGE_comgt\n#CONFIG_PACKAGE_comgt-ncm \n#CONFIG_PACKAGE_kmod-usb-net-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm \n#CONFIG_PACKAGE_kmod-usb-net-qmi-wwan\n#CONFIG_PACKAGE_luci-proto-ncm \n#CONFIG_PACKAGE_kmod-usb-serial-wwan \n#CONFIG_PACKAGE_kmod-usb-serial \n#CONFIG_PACKAGE_kmod-usb-serial-option\n#--End--\nCONFIG_PACKAGE_kmod-mmc=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\n# CONFIG_PACKAGE_luci-app-adguardhome=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-firewall=y\n#CONFIG_PACKAGE_luci-app-oaf=y\nCONFIG_PACKAGE_luci-app-onliner=y\n# CONFIG_PACKAGE_luci-app-openclash=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\n# CONFIG_PACKAGE_luci-app-serverchan=y\n# CONFIG_PACKAGE_luci-app-smartdns=y\nCONFIG_PACKAGE_luci-app-ocserv=y\n# CONFIG_PACKAGE_luci-app-sqm=y\n# CONFIG_PACKAGE_luci-app-ssr-plus=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray_plugin=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_V2ray=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Kcptun=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_ShadowsocksR_Server=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-upnp=y\n# CONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-beardropper=y\n# CONFIG_PACKAGE_luci-app-trojan-server is not set\n# CONFIG_PACKAGE_luci-app-gost=y\n# CONFIG_PACKAGE_luci-app-usb-printer is not set\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-acme=y\nCONFIG_PACKAGE_luci-app-statistics=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_acme-dnsapi=y\nCONFIG_PACKAGE_wget=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipv6helper=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_luci-app-zerotier=y\n\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_smartmontools=y\n\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_luci-app-ttyd=y\n\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_stress=y\n\n# CONFIG_PACKAGE_kmod-lib-zstd is not set\n\n# CONFIG_PACKAGE_luci-app-dockerman=y\n# CONFIG_PACKAGE_luci-lib-docker=y\n# CONFIG_PACKAGE_luci-lib-jsonc=y\n# CONFIG_PACKAGE_docker-ce=y\n\n# CONFIG_PACKAGE_luci-app-transmission=y\n# CONFIG_PACKAGE_transmission-daemon-openssl=y\n# CONFIG_PACKAGE_transmission-web-control=y\n# CONFIG_PACKAGE_transmission-remote-openssl=y\n\n# CONFIG_PACKAGE_luci-app-samba4=y\n# CONFIG_PACKAGE_samba4-admin=y\n# CONFIG_PACKAGE_samba4-client=y\n# CONFIG_PACKAGE_samba4-utils=y\n\n#CONFIG_KERNEL_CGROUPS=y\n#CONFIG_PACKAGE_luci-app-mwan3=y\n#CONFIG_PACKAGE_luci-app-mwan3helper=y\n#CONFIG_PACKAGE_mwan3=y\n#CONFIG_PACKAGE_luci-app-syncdial=y\n\n# CONFIG_COLLECT_KERNEL_DEBUG is not set\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set\n"
  },
  {
    "path": "not_use_file/purge-slim.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S org\n#=================================================\n\nname: OpenWrt R2S purge-slim\n\non:\n#  release:\n#    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/purge-slim.yml'\n      - 'step/01-prepare_package.sh'\n      - 'seed/purge-slim.seed'\n#  schedule:\n#    - cron: 50 23 * * *\n  watch:\n    types: started\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@main\n\n      - name: Set env\n        run: |\n          echo \"SSH_ACTIONS=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_BIN_DIR=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_FIRMWARE=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_RELEASE=true\" >> $GITHUB_ENV\n          echo \"CONFIG_FILE=purge-slim.seed\" >> $GITHUB_ENV\n          echo \"TZ=Asia/Shanghai\" >>$GITHUB_ENV\n      - name: Show env\n        run: echo $GITHUB_ENV\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo -E rm -rf /etc/apt/sources.list.d\n          sudo -E apt-get update -y\n          sudo -E apt-get install -y build-essential rsync asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python3 python3-pip python3-ply haveged lrzsz device-tree-compiler scons\n          wget -qO - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | sed 's/python-/python3-/g' | /bin/bash\n          sudo -E apt-get clean -y\n          git config --global user.name 'GitHub Actions' && git config --global user.email 'noreply@github.com'\n          df -h\n          git config --global user.name \"Actions\"\n          git config --global user.email \"actions@github.com\"\n\n      - name: Install OpenWrt source\n        run: |\n          git clone -b master https://git.openwrt.org/openwrt/openwrt.git openwrt\n      - name: Prepare openwrt package\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 01-prepare_package.sh\n\n#      - name: Convert Translation\n#        run: |\n#          cd openwrt\n#          #/bin/bash 02-convert_translation.sh\n\n      - name: Remove Upx\n        run: |\n          cd openwrt\n          /bin/bash 03-remove_upx.sh\n\n      - name: Add ACL\n        run: |\n          cd openwrt\n          /bin/bash 04-create_acl_for_luci.sh -a\n\n      - name: Load Config\n        run: |\n          cd openwrt\n          mv ../seed/$CONFIG_FILE .config\n          make defconfig\n          chmod -R 755 ./\n      - name: Make Toolchain\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make toolchain/install -j${make_process} V=s\n      - name: Compile Openwrt\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/*/*/*sysupgrade.img* ./artifact/\n          cd ./artifact/\n          gzip -d *.gz && exit 0\n          gzip *.img\n          zip R2S-purge-$(date +%Y-%m-%d)-squashfs.zip *squashfs*\n          zip R2S-purge-$(date +%Y-%m-%d)-ext4.zip *ext4*\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          release_tag=\"R2S-purge-slim ${{ env.DATE }}\"\n          echo \"##[set-output name=Release_tag;]$release_tag\"\n          cd ../openwrt\n          cp .config ../artifact/purge.config\n          ./scripts/diffconfig.sh > ../artifact/purge.seed\n        \n      - name: Upload artifact\n        uses: actions/upload-artifact@main\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_purge_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWrt-R2S FIRMWARES\n          allowUpdates: true\n          tag: OpenWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/purge*\n"
  },
  {
    "path": "not_use_file/purge_artifacts.sh",
    "content": "#!/bin/bash\n\n# Customize those three lines with your repository and credentials:\nREPO=https://api.github.com/repos/${GITHUB_REPOSITORY}\nGITHUB_USER=${GITHUB_REPOSITORY%%/*}\nGITHUB_TOKEN=${1}\n\n# Number of most recent versions to keep for each artifact:\nKEEP=4\n\n# A shortcut to call GitHub API.\nghapi() { curl --silent --location --user $GITHUB_USER:$GITHUB_TOKEN \"$@\"; }\n\n# A temporary file which receives HTTP response headers.\nTMPFILE=/tmp/tmp.$$\n\n# An associative array, key: artifact name, value: number of artifacts of that name.\ndeclare -A ARTCOUNT\n\n# Process all artifacts on this repository, loop on returned \"pages\".\nURL=$REPO/actions/artifacts\nwhile [[ -n \"$URL\" ]]; do\n\n    # Get current page, get response headers in a temporary file.\n    JSON=$(ghapi --dump-header $TMPFILE \"$URL\")\n\n    # Get URL of next page. Will be empty if we are at the last page.\n    URL=$(grep '^Link:' \"$TMPFILE\" | tr ',' '\\n' | grep 'rel=\"next\"' | head -1 | sed -e 's/.*<//' -e 's/>.*//')\n    rm -f ${TMPFILE}\n\n    # Number of artifacts on this page:\n    COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') ))\n\n    # Loop on all artifacts on this page.\n    for ((i=0; $i < $COUNT; i++)); do\n\n        # Get name of artifact and count instances of this name.\n        STR=$(jq <<<$JSON -r \".artifacts[$i].name?\")\n        name=${STR%%-*}-${STR##*-}\n        ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1))\n\n        printf \"Found '%s' #%d, \" $STR ${ARTCOUNT[$name]}\n        # Check if we must delete this one.\n        if [[ ${ARTCOUNT[$name]} -gt $KEEP ]]; then\n            id=$(jq <<<$JSON -r \".artifacts[$i].id?\")\n            size=$(( $(jq <<<$JSON -r \".artifacts[$i].size_in_bytes?\") ))\n            printf \"deleting %d bytes\\n\" $size\n            ghapi -X DELETE $REPO/actions/artifacts/$id\n        else\n            printf \"OK\\n\"\n        fi\n    done\ndone\n\nexit 0\n"
  },
  {
    "path": "not_use_file/r2s-18.06.yml",
    "content": "#=================================================\n# Description: Build OpenWrt using GitHub Actions\n# Lisence: MIT\n# Author: Mod from P3TERX\n# For NanoPi R2S org\n#=================================================\n\nname: OpenWrt R2S-18.06\n\non:\n#  release:\n#    types: published\n  push:\n    branches:\n      - master\n    paths:\n      - '.github/workflows/r2s-18.06.yml'\n      - 'step/18.06.sh'\n      - 'seed/18.06.seed'\n  #schedule:\n  #  - cron: 35 20 * * *\n  watch:\n    types: started\n\njobs:\n    build:\n      runs-on: ubuntu-18.04\n      if: github.event.repository.owner.id == github.event.sender.id\n\n      steps:\n      - name: Checkout\n        uses: actions/checkout@master\n\n      - name: Set env\n        run: |\n          echo \"SSH_ACTIONS=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_BIN_DIR=false\" >> $GITHUB_ENV\n          echo \"UPLOAD_FIRMWARE=true\" >> $GITHUB_ENV\n          echo \"UPLOAD_RELEASE=true\" >> $GITHUB_ENV\n          echo \"CONFIG_FILE=18.06.seed\" >> $GITHUB_ENV\n          echo \"TZ=Asia/Shanghai\" >>$GITHUB_ENV\n      - name: Show env\n        run: echo $GITHUB_ENV\n\n      - name: free disk space\n        run: |\n          df -h\n          sudo swapoff -a\n          sudo rm -f /swapfile\n          sudo apt clean\n          docker rmi $(docker image ls -aq)\n          df -h\n          /bin/bash ./script/free_disk_space.sh\n\n      - name: Initialization environment\n        env:\n          DEBIAN_FRONTEND: noninteractive\n        run: |\n          sudo -E rm -rf /etc/apt/sources.list.d\n          sudo -E apt-get update -y\n          sudo -E apt-get install -y build-essential rsync asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python3 python3-pip python3-ply haveged lrzsz device-tree-compiler scons\n          wget -qO - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | sed 's/python-/python3-/g' | /bin/bash\n          sudo -E apt-get clean -y\n          git config --global user.name 'GitHub Actions' && git config --global user.email 'noreply@github.com'\n          df -h\n          git config --global user.name \"Actions\"\n          git config --global user.email \"actions@github.com\"\n      - name: Install OpenWrt source\n        run: |\n          git clone --branch \"openwrt-18.06-k5.4\" --single-branch \"https://github.com/project-openwrt/openwrt\" \"openwrt\"\n\n      - name: Prepare openwrt package\n        run: |\n          cd openwrt\n          cp -r ../step/* ./\n          /bin/bash 18.06.sh\n\n      - name: Remove Upx\n        run: |\n          cd openwrt\n          /bin/bash 03-remove_upx.sh\n\n      - name: Load Config\n        run: |\n          cd openwrt\n          mv ../seed/$CONFIG_FILE .config\n          make defconfig\n          chmod -R 755 ./\n      - name: Make Toolchain\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make toolchain/install -j${make_process} V=s\n      - name: Compile Openwrt\n        run: |\n          cd openwrt\n          let make_process=$(nproc)+1\n          make -j${make_process} V=s || make -j${make_process} V=s\n\n      - name: Organize files\n        id: organize\n        run: |\n          rm -rf ./artifact/\n          mkdir -p ./artifact/\n          mv openwrt/bin/targets/*/*/*sysupgrade.img* ./artifact/\n          cd ./artifact/\n          gzip -d *.gz && exit 0\n          gzip *.img\n          zip R2S-18.06-$(date +%Y-%m-%d)-squashfs.zip *squashfs*\n          zip R2S-18.06-$(date +%Y-%m-%d)-ext4.zip *ext4*\n          echo \"::set-env name=FIRMWARE::$PWD\"\n          echo \"::set-output name=status::success\"\n          release_tag=\"R2S-18.06 ${{ env.DATE }}\"\n          echo \"##[set-output name=Release_tag;]$release_tag\"\n          cd ../openwrt\n          cp .config ../artifact/18.06.config\n          ./scripts/diffconfig.sh > ../artifact/18.06.seed\n        \n      - name: Upload artifact\n        uses: actions/upload-artifact@main\n        if: env.UPLOAD_FIRMWARE == 'true' && !cancelled()\n        with:\n          name: OpenWrt_R2S_origin_firmware\n          path: ${{ env.FIRMWARE }}\n\n      - name: Create release\n        id: create_release\n        uses: ncipollo/release-action@v1.6.1\n        if: env.UPLOAD_RELEASE == 'true' && !cancelled()\n        with:\n          name: OpenWrt-R2S FIRMWARES\n          allowUpdates: true\n          tag: OpenWrt\n          commit: master\n          replacesArtifacts: true\n          token: ${{ secrets.RELEASES_TOKEN }}\n          bodyFile: \"body-origin.md\"\n          artifacts: ${{ env.FIRMWARE }}/*.zip,${{ env.FIRMWARE }}/18.06*\n"
  },
  {
    "path": "not_use_file/shortcut-fe",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.\n# Permission to use, copy, modify, and/or distribute this software for\n# any purpose with or without fee is hereby granted, provided that the\n# above copyright notice and this permission notice appear in all copies.\n# THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT\n# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n#\n\n#SFE connection manager has a lower priority, it should be started after other connection manager\n#to detect the existence of connection manager with higher priority\nSTART=90\n\nhave_cm() {\n\t[ -d \"/sys/kernel/debug/ecm\" ] && echo 1 && return\n\n\techo 0\n}\n\n#load shortcut-fe connection manager\nload_sfe_cm() {\n\tlocal kernel_version=$(uname -r)\n\n\t#shortcut-fe-drv.ko is not needed because other connection manager is not enabled\n\t[ -d \"/sys/module/shortcut_fe_drv\" ] && rmmod shortcut_fe_drv\n\n\t[ -e \"/lib/modules/$kernel_version/fast-classifier.ko\" ] && {\n\t\t[ -d /sys/module/fast_classifier ] || insmod /lib/modules/$kernel_version/fast-classifier.ko && return\n\t}\n\n\t[ -e \"/lib/modules/$kernel_version/shortcut-fe-cm.ko\" ] && {\n\t\t[ -d /sys/module/shortcut_fe_cm ] || insmod /lib/modules/$kernel_version/shortcut-fe-cm.ko && return\n\t}\n}\n\nstart() {\n\t[ \"$(have_cm)\" = \"1\" ] || load_sfe_cm\n\techo 1 > /sys/fast_classifier/skip_to_bridge_ingress\n\tsfe_ipv6=$(cat /sys/sfe_ipv6/debug_dev)\n\t[ ! -f /dev/sfe_ipv6 ] && mknod /dev/sfe_ipv6 c $sfe_ipv6 0\n}\n\nstop() {\n\t[ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm\n\t[ -d /sys/module/fast_classifier ] && rmmod fast_classifier\n}\n"
  },
  {
    "path": "not_use_file/ssr-plus-tls.patch",
    "content": "diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\nindex b884c72fee..2cc9cb629d 100644\n--- a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\n+++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua\n@@ -114,8 +114,8 @@ local trojan = {\n \t\tverify = (server.insecure == \"0\") and true or false,\n \t\tverify_hostname = (server.tls == \"1\") and true or false,\n \t\tcert = \"\",\n-\t\tcipher = \"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n-\t\tcipher_tls13 = \"TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384\",\n+\t\tcipher = \"ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\",\n+\t\tcipher_tls13 = \"TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384\",\n \t\tsni = server.tls_host,\n \t\talpn = {\"h2\", \"http/1.1\"},\n \t\tcurve = \"\",\n"
  },
  {
    "path": "not_use_file/use_json_object_new_int64.patch",
    "content": "From f0972c84d9ed457ba9b430792c4809bc6207399a Mon Sep 17 00:00:00 2001\nFrom: lisaac <lisaac.cn@gmail.com>\nDate: Fri, 27 Mar 2020 07:19:17 +0000\nSubject: [PATCH] luci-lib-jsonc: stringify int use json_object_new_int64\n instead\n\n---\n feeds/luci/libs/luci-lib-jsonc/src/jsonc.c | 9 ++++-----\n 1 file changed, 4 insertions(+), 5 deletions(-)\n\ndiff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\nindex 2f56a4a688..1ccfda8765 100644\n--- a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\n+++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\n@@ -365,12 +365,11 @@ static struct json_object * _lua_to_json_rec(lua_State *L, int index,\n \n \tcase LUA_TNUMBER:\n \t\tnd = lua_tonumber(L, index);\n-\t\tni = lua_tointeger(L, index);\n \n-\t\tif (nd == ni)\n-\t\t\treturn json_object_new_int(nd);\n-\n-\t\treturn json_object_new_double(nd);\n+\t\tif(nd >= INT64_MIN && nd <= INT64_MAX)\n+\t\t\treturn json_object_new_int64(nd);\n+\t\telse\n+\t\t\treturn json_object_new_double(nd);\n \n \tcase LUA_TSTRING:\n \t\treturn json_object_new_string(lua_tostring(L, index));\n"
  },
  {
    "path": "not_use_file/zzz-default-settings-18.06",
    "content": "#!/bin/sh\n\n#uci set luci.main.mediaurlbase='/luci-static/argon'\n#uci commit luci\n\nuci set system.@system[0].timezone=CST-8\nuci set system.@system[0].zonename=Asia/Shanghai\nuci commit system\n\nln -sf /sbin/ip /usr/bin/ip\n\nsed -i 's#http://downloads.openwrt.org#https://mirrors.cloud.tencent.com/lede#g' /etc/opkg/distfeeds.conf\nsed -i '/openwrt_base/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\nsed -i '/openwrt_luci/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\nsed -i '/openwrt_packages/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\nsed -i \"s/# //g\" /etc/opkg/distfeeds.conf\n\n\nuci set fstab.@global[0].anon_mount=1\nuci commit fstab\n\nrm -f /usr/lib/lua/luci/view/admin_status/index/mwan.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/upnp.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/ddns.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/minidlna.htm\n\nuci set uhttpd.main.rfc1918_filter=0\n#uci set uhttpd.main.redirect_https=0\nuci commit uhttpd\n\nsed -i '/REDIRECT --to-ports 53/d' /etc/firewall.user\necho \"iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\necho \"iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n\nsed -i '/option disabled/d' /etc/config/wireless\nsed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh\n\nsed -i '/DISTRIB_REVISION/d' /etc/openwrt_release\necho \"DISTRIB_REVISION='| Mod20.08 by CTCGFW'\" >> /etc/openwrt_release\nsed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release\necho \"DISTRIB_DESCRIPTION='OpenWrt 18.06 by Lean'\" >> /etc/openwrt_release\n\nsed -i 's/LuCI openwrt-18.06 branch/LuCI 18.06 by Lean/g' /usr/lib/lua/luci/version.lua\nsed -i '/luciversion/d' /usr/lib/lua/luci/version.lua\necho 'luciversion = \"Mod20.08 by CTCGFW\"' >> /usr/lib/lua/luci/version.lua\n\nsed -i '/log-facility/d' /etc/dnsmasq.conf\necho \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\n\nsed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n\necho 'hsts=0' > /root/.wgetrc\n\nrm -rf /tmp/luci-modulecache/\nrm -f /tmp/luci-indexcache\n\nmv /etc/openwrt_banner /etc/banner\n\n#mark build date at banner\n#echo -e '\\nQuintus Build @ '$Build_Date'\\n'  >> /etc/banner\n\n#SSL\nsed -i 's,#afalg,afalg,g' /etc/ssl/openssl.cnf\nsed -i 's/#devcrypto/devcrypto/g' /etc/ssl/openssl.cnf\nsed -i 's/#USE_SOFTDRIVERS = 2/USE_SOFTDRIVERS = 1/g' /etc/ssl/openssl.cnf\n\nsed -i '/log-facility/d' /etc/dnsmasq.conf\necho \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\nrm -rf /tmp/luci-modulecache/\nrm -f /tmp/luci-indexcache\n\n#uci delete network.lan.ip6assign\n#uci delete network.wan6\n#uci set dhcp.lan.ra=disabled\n#uci set dhcp.lan.dhcpv6=disabled\n#uci commit \n\nuci set ttyd.@ttyd[0].command='/bin/login'\n\nuci set luci.main.lang=en\nuci commit\n\nexit 0\n"
  },
  {
    "path": "not_use_file/zzz.patch",
    "content": "diff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile\nindex 858587f71f..c7bb45eded 100644\n--- a/package/lean/default-settings/Makefile\n+++ b/package/lean/default-settings/Makefile\n@@ -21,7 +21,7 @@ define Package/default-settings\n   CATEGORY:=LuCI\n   TITLE:=LuCI support for Default Settings\n   PKGARCH:=all\n-  DEPENDS:=+luci-base +luci +luci-compat +@LUCI_LANG_zh-cn\n+  DEPENDS:=+luci-base +luci +luci-compat\n endef\n \n define Package/default-settings/description\n@@ -38,7 +38,6 @@ define Package/default-settings/install\n \t$(INSTALL_DIR) $(1)/etc/uci-defaults\n \t$(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings\n \t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n-\tpo2lmo ./i18n/default.zh-cn.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo\n endef\n \n $(eval $(call BuildPackage,default-settings))\ndiff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings\nindex 5a012b9989..ac0a083cd9 100755\n--- a/package/lean/default-settings/files/zzz-default-settings\n+++ b/package/lean/default-settings/files/zzz-default-settings\n@@ -1,6 +1,6 @@\n #!/bin/sh\n \n-uci set luci.main.lang=zh_cn\n+uci set luci.main.lang=en\n uci commit luci\n \n uci set system.@system[0].timezone=CST-8\n@@ -15,46 +15,29 @@ rm -f /usr/lib/lua/luci/view/admin_status/index/upnp.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/ddns.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/minidlna.htm\n \n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/aria2.lua\n-sed -i 's/services/nas/g' /usr/lib/lua/luci/view/aria2/overview_status.htm\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/hd_idle.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/samba.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/minidlna.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/transmission.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/mjpg-streamer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/p910nd.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/usb_printer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/xunlei.lua\n-sed -i 's/services/nas/g'  /usr/lib/lua/luci/view/minidlna_status.htm\n+uci set uhttpd.main.rfc1918_filter=0\n+uci set uhttpd.main.redirect_https=0\n+uci commit uhttpd\n \n-ln -sf /sbin/ip /usr/bin/ip\n-\n-sed -i 's#http://downloads.openwrt.org#https://mirrors.cloud.tencent.com/lede#g' /etc/opkg/distfeeds.conf\n-sed -i 's/root::0:0:99999:7:::/root:$1$V4UetPzk$CYXluq4wUazHjmCDBCqXF.:0:0:99999:7:::/g' /etc/shadow\n-\n-sed -i \"s/# //g\" /etc/opkg/distfeeds.conf\n-sed -i '/openwrt_luci/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_luci/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_packages/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_routing/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_telephony/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/natelol/d' /etc/opkg/distfeeds.conf\n+sed -i 's,downloads.openwrt.org,mirrors.cloud.tencent.com/lede,g' /etc/opkg/distfeeds.conf\n \n-sed -i '/REDIRECT --to-ports 53/d' /etc/firewall.user\n-echo \"iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n-echo \"iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n-\n-sed -i '/option disabled/d' /etc/config/wireless\n-sed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh\n-\n-sed -i '/DISTRIB_REVISION/d' /etc/openwrt_release\n-echo \"DISTRIB_REVISION='R20.12.12'\" >> /etc/openwrt_release\n-sed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release\n-echo \"DISTRIB_DESCRIPTION='OpenWrt '\" >> /etc/openwrt_release\n+rm -rf /tmp/luci-modulecache/\n+rm -f /tmp/luci-indexcache\n+ln -sf /sbin/ip /usr/bin/ip\n+rm /usr/lib/lua/luci/i18n/*cn*\n \n sed -i '/log-facility/d' /etc/dnsmasq.conf\n echo \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\n+opkg flag hold luci-app-firewall\n+opkg flag hold firewall\n+opkg flag hold dnsmasq-full\n \n-sed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n-\n-echo 'hsts=0' > /root/.wgetrc\n-\n-rm -rf /tmp/luci-modulecache/\n-rm -f /tmp/luci-indexcache\n+uci set ttyd.@ttyd[0].command='/bin/login'\n+uci commit ttyd\n \n exit 0\n"
  },
  {
    "path": "not_use_file/zzzzz.patch",
    "content": "diff --git a/package/lean/default-settings/Makefile b/package/lean/default-settings/Makefile\nindex 858587f71f..c7bb45eded 100644\n--- a/package/lean/default-settings/Makefile\n+++ b/package/lean/default-settings/Makefile\n@@ -21,7 +21,7 @@ define Package/default-settings\n   CATEGORY:=LuCI\n   TITLE:=LuCI support for Default Settings\n   PKGARCH:=all\n-  DEPENDS:=+luci-base +luci +luci-compat +@LUCI_LANG_zh-cn\n+  DEPENDS:=+luci-base +luci +luci-compat\n endef\n \n define Package/default-settings/description\n@@ -38,7 +38,6 @@ define Package/default-settings/install\n \t$(INSTALL_DIR) $(1)/etc/uci-defaults\n \t$(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings\n \t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n-\tpo2lmo ./i18n/default.zh-cn.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo\n endef\n \n $(eval $(call BuildPackage,default-settings))\ndiff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings\nindex 5a012b9989..3415976488 100755\n--- a/package/lean/default-settings/files/zzz-default-settings\n+++ b/package/lean/default-settings/files/zzz-default-settings\n@@ -1,6 +1,6 @@\n #!/bin/sh\n \n-uci set luci.main.lang=zh_cn\n+uci set luci.main.lang=en\n uci commit luci\n \n uci set system.@system[0].timezone=CST-8\n@@ -15,46 +15,32 @@ rm -f /usr/lib/lua/luci/view/admin_status/index/upnp.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/ddns.htm\n rm -f /usr/lib/lua/luci/view/admin_status/index/minidlna.htm\n \n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/aria2.lua\n-sed -i 's/services/nas/g' /usr/lib/lua/luci/view/aria2/overview_status.htm\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/hd_idle.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/samba.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/minidlna.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/transmission.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/mjpg-streamer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/p910nd.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/usb_printer.lua\n-sed -i 's/\\\"services\\\"/\\\"nas\\\"/g' /usr/lib/lua/luci/controller/xunlei.lua\n-sed -i 's/services/nas/g'  /usr/lib/lua/luci/view/minidlna_status.htm\n+uci set uhttpd.main.rfc1918_filter=0\n+uci set uhttpd.main.redirect_https=0\n+uci commit uhttpd\n \n-ln -sf /sbin/ip /usr/bin/ip\n-\n-sed -i 's#http://downloads.openwrt.org#https://mirrors.cloud.tencent.com/lede#g' /etc/opkg/distfeeds.conf\n-sed -i 's/root::0:0:99999:7:::/root:$1$V4UetPzk$CYXluq4wUazHjmCDBCqXF.:0:0:99999:7:::/g' /etc/shadow\n-\n-sed -i \"s/# //g\" /etc/opkg/distfeeds.conf\n-sed -i '/openwrt_luci/ { s/snapshots/releases\\/18.06.8/g; }'  /etc/opkg/distfeeds.conf\n-\n-sed -i '/REDIRECT --to-ports 53/d' /etc/firewall.user\n-echo \"iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n-echo \"iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53\" >> /etc/firewall.user\n-\n-sed -i '/option disabled/d' /etc/config/wireless\n-sed -i '/set wireless.radio${devidx}.disabled/d' /lib/wifi/mac80211.sh\n-\n-sed -i '/DISTRIB_REVISION/d' /etc/openwrt_release\n-echo \"DISTRIB_REVISION='R20.12.12'\" >> /etc/openwrt_release\n-sed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release\n-echo \"DISTRIB_DESCRIPTION='OpenWrt '\" >> /etc/openwrt_release\n-\n-sed -i '/log-facility/d' /etc/dnsmasq.conf\n-echo \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\n-\n-sed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n-\n-echo 'hsts=0' > /root/.wgetrc\n+sed -i '/openwrt_luci/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_packages/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_routing/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/openwrt_telephony/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\n+sed -i '/natelol/d' /etc/opkg/distfeeds.conf\n+sed -i 's,downloads.openwrt.org,mirrors.cloud.tencent.com/lede,g' /etc/opkg/distfeeds.conf\n \n rm -rf /tmp/luci-modulecache/\n rm -f /tmp/luci-indexcache\n-\n+ln -sf /sbin/ip /usr/bin/ip\n+rm /usr/lib/lua/luci/i18n/*cn*\n+echo 'luciversion = \"Quintus@🇨🇦🇹🇼🇺🇸🇭🇰\"' >> /usr/lib/lua/luci/version.lua\n+sed -i '/log-facility/d' /etc/dnsmasq.conf\n+echo \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\n+opkg flag hold luci-app-firewall\n+opkg flag hold firewall\n+opkg flag hold dnsmasq-full\n+\n+uci set ttyd.@ttyd[0].command='/bin/login'\n+uci commit ttyd\n+uci set firewall.@zone[1].fullcone='1'\n+uci commit firewall\n+uci set network.globals.packet_steering='1'\n+uci commit network\n exit 0\n"
  },
  {
    "path": "patches/0000-use_json_object_new_int64.patch",
    "content": "From f0972c84d9ed457ba9b430792c4809bc6207399a Mon Sep 17 00:00:00 2001\nFrom: lisaac <lisaac.cn@gmail.com>\nDate: Fri, 27 Mar 2020 07:19:17 +0000\nSubject: [PATCH] luci-lib-jsonc: stringify int use json_object_new_int64\n instead\n\n---\n feeds/luci/libs/luci-lib-jsonc/src/jsonc.c | 9 ++++-----\n 1 file changed, 4 insertions(+), 5 deletions(-)\n\ndiff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\nindex 2f56a4a688..1ccfda8765 100644\n--- a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\n+++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c\n@@ -365,12 +365,11 @@ static struct json_object * _lua_to_json_rec(lua_State *L, int index,\n \n \tcase LUA_TNUMBER:\n \t\tnd = lua_tonumber(L, index);\n-\t\tni = lua_tointeger(L, index);\n \n-\t\tif (nd == ni)\n-\t\t\treturn json_object_new_int(nd);\n-\n-\t\treturn json_object_new_double(nd);\n+\t\tif(nd >= INT64_MIN && nd <= INT64_MAX)\n+\t\t\treturn json_object_new_int64(nd);\n+\t\telse\n+\t\t\treturn json_object_new_double(nd);\n \n \tcase LUA_TSTRING:\n \t\treturn json_object_new_string(lua_tostring(L, index));\n"
  },
  {
    "path": "patches/0001-tools-add-upx-ucl-support.patch",
    "content": "From 70e08dad563e9520459faa0aef00a5e3645a796c Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 11 Jun 2021 15:52:05 +0800\nSubject: [PATCH] tools-add-upx-ucl-support.patch\n\n\tmodified:   tools/Makefile\n\tnew file:   tools/ucl/Makefile\n\tnew file:   tools/upx/Makefile\n---\n tools/Makefile     |  2 ++\n tools/ucl/Makefile | 49 ++++++++++++++++++++++++++++++++++++++++++++++\n tools/upx/Makefile | 35 +++++++++++++++++++++++++++++++++\n 3 files changed, 86 insertions(+)\n create mode 100644 tools/ucl/Makefile\n create mode 100644 tools/upx/Makefile\n\ndiff --git a/tools/Makefile b/tools/Makefile\nindex 8752a3e2b5..97b5c5df49 100644\n--- a/tools/Makefile\n+++ b/tools/Makefile\n@@ -26,6 +26,7 @@ tools-y += e2fsprogs fakeroot findutils firmware-utils flex gengetopt\n tools-y += libressl libtool lzma m4 make-ext4fs missing-macros mkimage\n tools-y += mklibs mm-macros mtd-utils mtools padjffs2 patch-image\n tools-y += patchelf pkgconf quilt squashfskit4 sstrip xxd zip zlib zstd\n+tools-y += ucl upx\n tools-$(BUILD_B43_TOOLS) += b43-tools\n tools-$(BUILD_ISL) += isl\n tools-$(BUILD_TOOLCHAIN) += expat gmp mpc mpfr\n@@ -37,6 +38,7 @@ tools-$(CONFIG_USES_MINOR) += kernel2minor\n tools-$(CONFIG_USE_SPARSE) += sparse\n \n # builddir dependencies\n+$(curdir)/upx/compile := $(curdir)/ucl/compile\n $(curdir)/autoconf/compile := $(curdir)/m4/compile\n $(curdir)/automake/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/pkgconf/compile $(curdir)/xz/compile\n $(curdir)/b43-tools/compile := $(curdir)/bison/compile\ndiff --git a/tools/ucl/Makefile b/tools/ucl/Makefile\nnew file mode 100644\nindex 0000000000..cf1c25bd8d\n--- /dev/null\n+++ b/tools/ucl/Makefile\n@@ -0,0 +1,49 @@\n+#\n+# Copyright (C) 2019 OpenWrt.org\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+include $(TOPDIR)/rules.mk\n+\n+PKG_NAME:=ucl\n+PKG_VERSION:=1.03\n+\n+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\n+PKG_SOURCE_URL:=http://www.oberhumer.com/opensource/ucl/download/$(PKG_SOURCE)\n+PKG_HASH:=b865299ffd45d73412293369c9754b07637680e5c826915f097577cd27350348\n+\n+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)\n+\n+include $(INCLUDE_DIR)/host-build.mk\n+\n+HOSTCC :=gcc\n+HOST_CFLAGS +=-std=gnu89\n+\n+define Host/Prepare\n+\t$(Host/Prepare/Default)\n+\tmkdir -p $(STAGING_DIR_HOST)/include/ucl\n+endef\n+\n+define Host/Configure\n+\t(cd $(HOST_BUILD_DIR); \\\n+\tCC=\"$(HOSTCC)\" \\\n+\tCFLAGS=\"$(HOST_CFLAGS)\" \\\n+\t./configure --prefix=$(STAGING_DIR_HOST) \\\n+\t);\n+\t$(call Host/Configure/Default)\n+endef\n+\n+define Host/Compile\n+\t$(MAKE) -C $(HOST_BUILD_DIR)\n+endef\n+\n+define Host/Install\n+\t$(MAKE) -C $(HOST_BUILD_DIR) install\n+endef\n+\n+define Host/Clean\n+\trm -rf $(STAGING_DIR_HOST)/include/ucl\n+endef\n+\n+$(eval $(call HostBuild))\ndiff --git a/tools/upx/Makefile b/tools/upx/Makefile\nnew file mode 100644\nindex 0000000000..fbf1dfbd2e\n--- /dev/null\n+++ b/tools/upx/Makefile\n@@ -0,0 +1,35 @@\n+#\n+# Copyright (C) 2011-2020 OpenWrt.org\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+include $(TOPDIR)/rules.mk\n+\n+PKG_NAME:=upx\n+PKG_VERSION:=3.95\n+\n+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-src.tar.xz\n+PKG_SOURCE_URL:=https://github.com/upx/upx/releases/download/v$(PKG_VERSION)\n+PKG_HASH:=3b0f55468d285c760fcf5ea865a070b27696393002712054c69ff40d8f7f5592\n+\n+HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)-src\n+\n+include $(INCLUDE_DIR)/host-build.mk\n+\n+define Host/Compile\n+\tUPX_UCLDIR=$(STAGING_DIR_HOST) \\\n+\t$(MAKE) -C $(HOST_BUILD_DIR)/src \\\n+\t\tCXXFLAGS_WERROR=\"\" LDFLAGS=\"$(HOST_LDFLAGS)\" \\\n+\t\tCXX=\"$(HOSTCXX)\"\n+endef\n+\n+define Host/Install\n+\t$(CP) $(HOST_BUILD_DIR)/src/upx.out $(STAGING_DIR_HOST)/bin/upx\n+endef\n+\n+define Host/Clean\n+\trm -f $(STAGING_DIR_HOST)/bin/upx\n+endef\n+\n+$(eval $(call HostBuild))\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/0003-rockchip-rk3328-dmc.patch",
    "content": "From 8d6cb03b0df27ce167d83f8b855a9621aaf9ee19 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 11 Jun 2021 17:37:52 +0800\nSubject: [PATCH] rockchip-rk3328-dmc\n\n\tnew file:   package/boot/arm-trusted-firmware-rk3328/Makefile\n\tnew file:   package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n\tmodified:   package/boot/uboot-rockchip/Makefile\n\tnew file:   target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n\tnew file:   target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n\tnew file:   target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n\tnew file:   target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n\tmodified:   target/linux/rockchip/image/Makefile\n\tmodified:   target/linux/rockchip/image/armv8.mk\n\tnew file:   target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n\tnew file:   target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n\tnew file:   target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n\tnew file:   target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n\tnew file:   target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n---\n .../boot/arm-trusted-firmware-rk3328/Makefile |  55 ++\n .../arm-trusted-firmware-rk3328/src/trust.ini |  15 +\n package/boot/uboot-rockchip/Makefile          |  14 +-\n .../rockchip/rk3328-dram-nanopi2-timing.dtsi  | 311 +++++++\n .../files/drivers/devfreq/rk3328_dmc.c        | 852 ++++++++++++++++++\n .../include/dt-bindings/clock/rockchip-ddr.h  |  63 ++\n .../include/dt-bindings/memory/rk3328-dram.h  | 159 ++++\n target/linux/rockchip/image/Makefile          |  20 +\n target/linux/rockchip/image/armv8.mk          |   2 +-\n ...ip-add-devfreq-driver-for-rk3328-dmc.patch |  44 +\n ...setting-ddr-clock-via-SIP-Version-2-.patch | 218 +++++\n ...eq-rockchip-dfi-add-more-soc-support.patch | 662 ++++++++++++++\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |  27 +\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 +++\n 14 files changed, 2564 insertions(+), 4 deletions(-)\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/Makefile\n create mode 100644 package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n create mode 100644 target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n create mode 100644 target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n create mode 100644 target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n create mode 100644 target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n create mode 100644 target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n create mode 100644 target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n create mode 100644 target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n create mode 100644 target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/Makefile b/package/boot/arm-trusted-firmware-rk3328/Makefile\nnew file mode 100644\nindex 0000000000..5810e60d85\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/Makefile\n@@ -0,0 +1,55 @@\n+#\n+# Copyright (C) 2021 ImmortalWrt\n+# (https://immortalwrt.org)\n+#\n+# This is free software, licensed under the GNU General Public License v2.\n+# See /LICENSE for more information.\n+#\n+\n+include $(TOPDIR)/rules.mk\n+\n+PKG_NAME:=arm-trusted-firmware-rk3328\n+PKG_RELEASE:=2\n+\n+PKG_SOURCE_PROTO:=git\n+PKG_SOURCE_URL=https://github.com/rockchip-linux/rkbin.git\n+PKG_SOURCE_DATE:=2021-06-01\n+PKG_SOURCE_VERSION:=7d631e0d5b2d373b54d4533580d08fb9bd2eaad4\n+PKG_MIRROR_HASH:=73deb217d7f1dc87bb7a32a1b6855f957aeeb21dca86cdd5840c463683dc0f7d\n+\n+PKG_MAINTAINER:=AmadeusGhost <amadeus@immortalwrt.org>\n+\n+MAKE_PATH:=$(PKG_NAME)\n+\n+include $(INCLUDE_DIR)/package.mk\n+\n+define Package/arm-trusted-firmware-rk3328\n+    SECTION:=boot\n+    CATEGORY:=Boot Loaders\n+    TITLE:=ARM Trusted Firmware for Rockchip\n+    DEPENDS:=@TARGET_rockchip_armv8\n+endef\n+\n+define Build/Configure\n+\t$(SED) 's,$$$$(PKG_BUILD_DIR),$(PKG_BUILD_DIR),g' $(PKG_BUILD_DIR)/trust.ini\n+\t$(call Build/Configure/Default)\n+endef\n+\n+define Build/Compile\n+\tmkimage -n rk3328 -T rksd -d $(PKG_BUILD_DIR)/bin/rk33/rk3328_ddr_333MHz_v1.17.bin $(PKG_BUILD_DIR)/idbloader.bin\n+\tcat $(PKG_BUILD_DIR)/bin/rk33/rk322xh_miniloader_v2.50.bin >> $(PKG_BUILD_DIR)/idbloader.bin\n+\t$(PKG_BUILD_DIR)/tools/trust_merger --replace bl31.elf $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.46.elf $(PKG_BUILD_DIR)/trust.ini\n+endef\n+\n+define Build/InstallDev\n+\t$(INSTALL_DIR) -p $(STAGING_DIR_IMAGE)\n+\t$(CP) $(PKG_BUILD_DIR)/bin/rk33/rk322xh_bl31_v1.46.elf $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/tools/loaderimage $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/idbloader.bin $(STAGING_DIR_IMAGE)/\n+\t$(CP) $(PKG_BUILD_DIR)/trust.bin $(STAGING_DIR_IMAGE)/\n+endef\n+\n+define Package/arm-trusted-firmware-rk3328/install\n+endef\n+\n+$(eval $(call BuildPackage,arm-trusted-firmware-rk3328))\ndiff --git a/package/boot/arm-trusted-firmware-rk3328/src/trust.ini b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\nnew file mode 100644\nindex 0000000000..b95797427e\n--- /dev/null\n+++ b/package/boot/arm-trusted-firmware-rk3328/src/trust.ini\n@@ -0,0 +1,15 @@\n+[VERSION]\n+MAJOR=1\n+MINOR=0\n+[BL30_OPTION]\n+SEC=0\n+[BL31_OPTION]\n+SEC=1\n+PATH=bl31.elf\n+ADDR=0x10000\n+[BL32_OPTION]\n+SEC=0\n+[BL33_OPTION]\n+SEC=0\n+[OUTPUT]\n+PATH=$(PKG_BUILD_DIR)/trust.bin\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 75825ce690..da9af4f3f0 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -29,9 +29,10 @@ define U-Boot/nanopi-r2s-rk3328\n   NAME:=NanoPi R2S\n   BUILD_DEVICES:= \\\n     friendlyarm_nanopi-r2s\n-  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rockchip\n-  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rockchip\n-  ATF:=rk3328_bl31.elf\n+  DEPENDS:=+PACKAGE_u-boot-nanopi-r2s-rk3328:arm-trusted-firmware-rk3328\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rk3328\n+  ATF:=rk322xh_bl31_v1.46.elf\n+  USE_RKBIN:=1\n   OF_PLATDATA:=$(1)\n endef\n \n@@ -96,8 +97,15 @@ endef\n \n define Build/InstallDev\n \t$(INSTALL_DIR) $(STAGING_DIR_IMAGE)\n+ifneq ($(USE_RKBIN),)\n+\t$(STAGING_DIR_IMAGE)/loaderimage --pack --uboot $(PKG_BUILD_DIR)/u-boot-dtb.bin $(PKG_BUILD_DIR)/uboot.img 0x200000\n+\t$(CP) $(PKG_BUILD_DIR)/uboot.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-uboot.img\n+\t$(CP) $(STAGING_DIR_IMAGE)/idbloader.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.bin\n+\t$(CP) $(STAGING_DIR_IMAGE)/trust.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-trust.bin\n+else\n \t$(CP) $(PKG_BUILD_DIR)/idbloader.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-idbloader.img\n \t$(CP) $(PKG_BUILD_DIR)/u-boot.itb $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-u-boot.itb\n+endif\n endef\n \n define Package/u-boot/install/default\ndiff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\nnew file mode 100644\nindex 0000000000..a3f5ff4bdc\n--- /dev/null\n+++ b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi\n@@ -0,0 +1,311 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#include <dt-bindings/clock/rockchip-ddr.h>\n+#include <dt-bindings/memory/rk3328-dram.h>\n+\n+/ {\n+\tddr_timing: ddr_timing {\n+\t\tcompatible = \"rockchip,ddr-timing\";\n+\t\tddr3_speed_bin = <DDR3_DEFAULT>;\n+\t\tddr4_speed_bin = <DDR4_DEFAULT>;\n+\t\tpd_idle = <0>;\n+\t\tsr_idle = <0>;\n+\t\tsr_mc_gate_idle = <0>;\n+\t\tsrpd_lite_idle\t= <0>;\n+\t\tstandby_idle = <0>;\n+\n+\t\tauto_pd_dis_freq = <1066>;\n+\t\tauto_sr_dis_freq = <800>;\n+\t\tddr3_dll_dis_freq = <300>;\n+\t\tddr4_dll_dis_freq = <625>;\n+\t\tphy_dll_dis_freq = <400>;\n+\n+\t\tddr3_odt_dis_freq = <100>;\n+\t\tphy_ddr3_odt_dis_freq = <100>;\n+\t\tddr3_drv = <DDR3_DS_40ohm>;\n+\t\tddr3_odt = <DDR3_ODT_120ohm>;\n+\t\tphy_ddr3_ca_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_ck_drv = <PHY_DDR3_RON_RTT_45ohm>;\n+\t\tphy_ddr3_dq_drv = <PHY_DDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr3_odt = <PHY_DDR3_RON_RTT_225ohm>;\n+\n+\t\tlpddr3_odt_dis_freq = <666>;\n+\t\tphy_lpddr3_odt_dis_freq = <666>;\n+\t\tlpddr3_drv = <LP3_DS_40ohm>;\n+\t\tlpddr3_odt = <LP3_ODT_240ohm>;\n+\t\tphy_lpddr3_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_lpddr3_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_lpddr3_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\tlpddr4_odt_dis_freq = <800>;\n+\t\tphy_lpddr4_odt_dis_freq = <800>;\n+\t\tlpddr4_drv = <LP4_PDDS_60ohm>;\n+\t\tlpddr4_dq_odt = <LP4_DQ_ODT_40ohm>;\n+\t\tlpddr4_ca_odt = <LP4_CA_ODT_40ohm>;\n+\t\tphy_lpddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_40ohm>;\n+\t\tphy_lpddr4_ck_cs_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_80ohm>;\n+\t\tphy_lpddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_60ohm>;\n+\n+\t\tddr4_odt_dis_freq = <666>;\n+\t\tphy_ddr4_odt_dis_freq = <666>;\n+\t\tddr4_drv = <DDR4_DS_34ohm>;\n+\t\tddr4_odt = <DDR4_RTT_NOM_240ohm>;\n+\t\tphy_ddr4_ca_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_ck_drv = <PHY_DDR4_LPDDR3_RON_RTT_43ohm>;\n+\t\tphy_ddr4_dq_drv = <PHY_DDR4_LPDDR3_RON_RTT_34ohm>;\n+\t\tphy_ddr4_odt = <PHY_DDR4_LPDDR3_RON_RTT_240ohm>;\n+\n+\t\t/* CA de-skew, one step is 47.8ps, range 0-15 */\n+\t\tddr3a1_ddr4a9_de-skew = <7>;\n+\t\tddr3a0_ddr4a10_de-skew = <7>;\n+\t\tddr3a3_ddr4a6_de-skew = <8>;\n+\t\tddr3a2_ddr4a4_de-skew = <8>;\n+\t\tddr3a5_ddr4a8_de-skew = <7>;\n+\t\tddr3a4_ddr4a5_de-skew = <9>;\n+\t\tddr3a7_ddr4a11_de-skew = <7>;\n+\t\tddr3a6_ddr4a7_de-skew = <9>;\n+\t\tddr3a9_ddr4a0_de-skew = <8>;\n+\t\tddr3a8_ddr4a13_de-skew = <7>;\n+\t\tddr3a11_ddr4a3_de-skew = <9>;\n+\t\tddr3a10_ddr4cs0_de-skew = <7>;\n+\t\tddr3a13_ddr4a2_de-skew = <8>;\n+\t\tddr3a12_ddr4ba1_de-skew = <7>;\n+\t\tddr3a15_ddr4odt0_de-skew = <7>;\n+\t\tddr3a14_ddr4a1_de-skew = <8>;\n+\t\tddr3ba1_ddr4a15_de-skew = <7>;\n+\t\tddr3ba0_ddr4bg0_de-skew = <7>;\n+\t\tddr3ras_ddr4cke_de-skew = <7>;\n+\t\tddr3ba2_ddr4ba0_de-skew = <8>;\n+\t\tddr3we_ddr4bg1_de-skew = <8>;\n+\t\tddr3cas_ddr4a12_de-skew = <7>;\n+\t\tddr3ckn_ddr4ckn_de-skew = <8>;\n+\t\tddr3ckp_ddr4ckp_de-skew = <8>;\n+\t\tddr3cke_ddr4a16_de-skew = <8>;\n+\t\tddr3odt0_ddr4a14_de-skew = <7>;\n+\t\tddr3cs0_ddr4act_de-skew = <8>;\n+\t\tddr3reset_ddr4reset_de-skew = <7>;\n+\t\tddr3cs1_ddr4cs1_de-skew = <7>;\n+\t\tddr3odt1_ddr4odt1_de-skew = <7>;\n+\n+\t\t/* DATA de-skew\n+\t\t * RX one step is 25.1ps, range 0-15\n+\t\t * TX one step is 47.8ps, range 0-15\n+\t\t */\n+\t\tcs0_dm0_rx_de-skew = <7>;\n+\t\tcs0_dm0_tx_de-skew = <8>;\n+\t\tcs0_dq0_rx_de-skew = <7>;\n+\t\tcs0_dq0_tx_de-skew = <8>;\n+\t\tcs0_dq1_rx_de-skew = <7>;\n+\t\tcs0_dq1_tx_de-skew = <8>;\n+\t\tcs0_dq2_rx_de-skew = <7>;\n+\t\tcs0_dq2_tx_de-skew = <8>;\n+\t\tcs0_dq3_rx_de-skew = <7>;\n+\t\tcs0_dq3_tx_de-skew = <8>;\n+\t\tcs0_dq4_rx_de-skew = <7>;\n+\t\tcs0_dq4_tx_de-skew = <8>;\n+\t\tcs0_dq5_rx_de-skew = <7>;\n+\t\tcs0_dq5_tx_de-skew = <8>;\n+\t\tcs0_dq6_rx_de-skew = <7>;\n+\t\tcs0_dq6_tx_de-skew = <8>;\n+\t\tcs0_dq7_rx_de-skew = <7>;\n+\t\tcs0_dq7_tx_de-skew = <8>;\n+\t\tcs0_dqs0_rx_de-skew = <6>;\n+\t\tcs0_dqs0p_tx_de-skew = <9>;\n+\t\tcs0_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm1_rx_de-skew = <7>;\n+\t\tcs0_dm1_tx_de-skew = <7>;\n+\t\tcs0_dq8_rx_de-skew = <7>;\n+\t\tcs0_dq8_tx_de-skew = <8>;\n+\t\tcs0_dq9_rx_de-skew = <7>;\n+\t\tcs0_dq9_tx_de-skew = <7>;\n+\t\tcs0_dq10_rx_de-skew = <7>;\n+\t\tcs0_dq10_tx_de-skew = <8>;\n+\t\tcs0_dq11_rx_de-skew = <7>;\n+\t\tcs0_dq11_tx_de-skew = <7>;\n+\t\tcs0_dq12_rx_de-skew = <7>;\n+\t\tcs0_dq12_tx_de-skew = <8>;\n+\t\tcs0_dq13_rx_de-skew = <7>;\n+\t\tcs0_dq13_tx_de-skew = <7>;\n+\t\tcs0_dq14_rx_de-skew = <7>;\n+\t\tcs0_dq14_tx_de-skew = <8>;\n+\t\tcs0_dq15_rx_de-skew = <7>;\n+\t\tcs0_dq15_tx_de-skew = <7>;\n+\t\tcs0_dqs1_rx_de-skew = <7>;\n+\t\tcs0_dqs1p_tx_de-skew = <9>;\n+\t\tcs0_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm2_rx_de-skew = <7>;\n+\t\tcs0_dm2_tx_de-skew = <8>;\n+\t\tcs0_dq16_rx_de-skew = <7>;\n+\t\tcs0_dq16_tx_de-skew = <8>;\n+\t\tcs0_dq17_rx_de-skew = <7>;\n+\t\tcs0_dq17_tx_de-skew = <8>;\n+\t\tcs0_dq18_rx_de-skew = <7>;\n+\t\tcs0_dq18_tx_de-skew = <8>;\n+\t\tcs0_dq19_rx_de-skew = <7>;\n+\t\tcs0_dq19_tx_de-skew = <8>;\n+\t\tcs0_dq20_rx_de-skew = <7>;\n+\t\tcs0_dq20_tx_de-skew = <8>;\n+\t\tcs0_dq21_rx_de-skew = <7>;\n+\t\tcs0_dq21_tx_de-skew = <8>;\n+\t\tcs0_dq22_rx_de-skew = <7>;\n+\t\tcs0_dq22_tx_de-skew = <8>;\n+\t\tcs0_dq23_rx_de-skew = <7>;\n+\t\tcs0_dq23_tx_de-skew = <8>;\n+\t\tcs0_dqs2_rx_de-skew = <6>;\n+\t\tcs0_dqs2p_tx_de-skew = <9>;\n+\t\tcs0_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs0_dm3_rx_de-skew = <7>;\n+\t\tcs0_dm3_tx_de-skew = <7>;\n+\t\tcs0_dq24_rx_de-skew = <7>;\n+\t\tcs0_dq24_tx_de-skew = <8>;\n+\t\tcs0_dq25_rx_de-skew = <7>;\n+\t\tcs0_dq25_tx_de-skew = <7>;\n+\t\tcs0_dq26_rx_de-skew = <7>;\n+\t\tcs0_dq26_tx_de-skew = <7>;\n+\t\tcs0_dq27_rx_de-skew = <7>;\n+\t\tcs0_dq27_tx_de-skew = <7>;\n+\t\tcs0_dq28_rx_de-skew = <7>;\n+\t\tcs0_dq28_tx_de-skew = <7>;\n+\t\tcs0_dq29_rx_de-skew = <7>;\n+\t\tcs0_dq29_tx_de-skew = <7>;\n+\t\tcs0_dq30_rx_de-skew = <7>;\n+\t\tcs0_dq30_tx_de-skew = <7>;\n+\t\tcs0_dq31_rx_de-skew = <7>;\n+\t\tcs0_dq31_tx_de-skew = <7>;\n+\t\tcs0_dqs3_rx_de-skew = <7>;\n+\t\tcs0_dqs3p_tx_de-skew = <9>;\n+\t\tcs0_dqs3n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm0_rx_de-skew = <7>;\n+\t\tcs1_dm0_tx_de-skew = <8>;\n+\t\tcs1_dq0_rx_de-skew = <7>;\n+\t\tcs1_dq0_tx_de-skew = <8>;\n+\t\tcs1_dq1_rx_de-skew = <7>;\n+\t\tcs1_dq1_tx_de-skew = <8>;\n+\t\tcs1_dq2_rx_de-skew = <7>;\n+\t\tcs1_dq2_tx_de-skew = <8>;\n+\t\tcs1_dq3_rx_de-skew = <7>;\n+\t\tcs1_dq3_tx_de-skew = <8>;\n+\t\tcs1_dq4_rx_de-skew = <7>;\n+\t\tcs1_dq4_tx_de-skew = <8>;\n+\t\tcs1_dq5_rx_de-skew = <7>;\n+\t\tcs1_dq5_tx_de-skew = <8>;\n+\t\tcs1_dq6_rx_de-skew = <7>;\n+\t\tcs1_dq6_tx_de-skew = <8>;\n+\t\tcs1_dq7_rx_de-skew = <7>;\n+\t\tcs1_dq7_tx_de-skew = <8>;\n+\t\tcs1_dqs0_rx_de-skew = <6>;\n+\t\tcs1_dqs0p_tx_de-skew = <9>;\n+\t\tcs1_dqs0n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm1_rx_de-skew = <7>;\n+\t\tcs1_dm1_tx_de-skew = <7>;\n+\t\tcs1_dq8_rx_de-skew = <7>;\n+\t\tcs1_dq8_tx_de-skew = <8>;\n+\t\tcs1_dq9_rx_de-skew = <7>;\n+\t\tcs1_dq9_tx_de-skew = <7>;\n+\t\tcs1_dq10_rx_de-skew = <7>;\n+\t\tcs1_dq10_tx_de-skew = <8>;\n+\t\tcs1_dq11_rx_de-skew = <7>;\n+\t\tcs1_dq11_tx_de-skew = <7>;\n+\t\tcs1_dq12_rx_de-skew = <7>;\n+\t\tcs1_dq12_tx_de-skew = <8>;\n+\t\tcs1_dq13_rx_de-skew = <7>;\n+\t\tcs1_dq13_tx_de-skew = <7>;\n+\t\tcs1_dq14_rx_de-skew = <7>;\n+\t\tcs1_dq14_tx_de-skew = <8>;\n+\t\tcs1_dq15_rx_de-skew = <7>;\n+\t\tcs1_dq15_tx_de-skew = <7>;\n+\t\tcs1_dqs1_rx_de-skew = <7>;\n+\t\tcs1_dqs1p_tx_de-skew = <9>;\n+\t\tcs1_dqs1n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm2_rx_de-skew = <7>;\n+\t\tcs1_dm2_tx_de-skew = <8>;\n+\t\tcs1_dq16_rx_de-skew = <7>;\n+\t\tcs1_dq16_tx_de-skew = <8>;\n+\t\tcs1_dq17_rx_de-skew = <7>;\n+\t\tcs1_dq17_tx_de-skew = <8>;\n+\t\tcs1_dq18_rx_de-skew = <7>;\n+\t\tcs1_dq18_tx_de-skew = <8>;\n+\t\tcs1_dq19_rx_de-skew = <7>;\n+\t\tcs1_dq19_tx_de-skew = <8>;\n+\t\tcs1_dq20_rx_de-skew = <7>;\n+\t\tcs1_dq20_tx_de-skew = <8>;\n+\t\tcs1_dq21_rx_de-skew = <7>;\n+\t\tcs1_dq21_tx_de-skew = <8>;\n+\t\tcs1_dq22_rx_de-skew = <7>;\n+\t\tcs1_dq22_tx_de-skew = <8>;\n+\t\tcs1_dq23_rx_de-skew = <7>;\n+\t\tcs1_dq23_tx_de-skew = <8>;\n+\t\tcs1_dqs2_rx_de-skew = <6>;\n+\t\tcs1_dqs2p_tx_de-skew = <9>;\n+\t\tcs1_dqs2n_tx_de-skew = <9>;\n+\n+\t\tcs1_dm3_rx_de-skew = <7>;\n+\t\tcs1_dm3_tx_de-skew = <7>;\n+\t\tcs1_dq24_rx_de-skew = <7>;\n+\t\tcs1_dq24_tx_de-skew = <8>;\n+\t\tcs1_dq25_rx_de-skew = <7>;\n+\t\tcs1_dq25_tx_de-skew = <7>;\n+\t\tcs1_dq26_rx_de-skew = <7>;\n+\t\tcs1_dq26_tx_de-skew = <7>;\n+\t\tcs1_dq27_rx_de-skew = <7>;\n+\t\tcs1_dq27_tx_de-skew = <7>;\n+\t\tcs1_dq28_rx_de-skew = <7>;\n+\t\tcs1_dq28_tx_de-skew = <7>;\n+\t\tcs1_dq29_rx_de-skew = <7>;\n+\t\tcs1_dq29_tx_de-skew = <7>;\n+\t\tcs1_dq30_rx_de-skew = <7>;\n+\t\tcs1_dq30_tx_de-skew = <7>;\n+\t\tcs1_dq31_rx_de-skew = <7>;\n+\t\tcs1_dq31_tx_de-skew = <7>;\n+\t\tcs1_dqs3_rx_de-skew = <7>;\n+\t\tcs1_dqs3p_tx_de-skew = <9>;\n+\t\tcs1_dqs3n_tx_de-skew = <9>;\n+\t};\n+};\ndiff --git a/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\nnew file mode 100644\nindex 0000000000..72601a0904\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/devfreq/rk3328_dmc.c\n@@ -0,0 +1,852 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd.\n+ * Author: Lin Huang <hl@rock-chips.com>\n+ */\n+\n+#include <linux/arm-smccc.h>\n+#include <linux/clk.h>\n+#include <linux/delay.h>\n+#include <linux/devfreq.h>\n+#include <linux/devfreq-event.h>\n+#include <linux/interrupt.h>\n+#include <linux/iversion.h>\n+#include <linux/mfd/syscon.h>\n+#include <linux/module.h>\n+#include <linux/of.h>\n+#include <linux/platform_device.h>\n+#include <linux/pm_opp.h>\n+#include <linux/regmap.h>\n+#include <linux/regulator/consumer.h>\n+#include <linux/rwsem.h>\n+#include <linux/suspend.h>\n+#include <linux/version.h>\n+\n+#include <soc/rockchip/rockchip_sip.h>\n+\n+#define DTS_PAR_OFFSET\t\t(4096)\n+\n+struct share_params {\n+\tu32 hz;\n+\tu32 lcdc_type;\n+\tu32 vop;\n+\tu32 vop_dclk_mode;\n+\tu32 sr_idle_en;\n+\tu32 addr_mcu_el3;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag1;\n+\t/*\n+\t * 1: need to wait flag1\n+\t * 0: never wait flag1\n+\t */\n+\tu32 wait_flag0;\n+\tu32 complt_hwirq;\n+\t/* if need, add parameter after */\n+};\n+\n+static struct share_params *ddr_psci_param;\n+\n+/* hope this define can adapt all future platform */\n+static const char * const rk3328_dts_timing[] = {\n+\t\"ddr3_speed_bin\",\n+\t\"ddr4_speed_bin\",\n+\t\"pd_idle\",\n+\t\"sr_idle\",\n+\t\"sr_mc_gate_idle\",\n+\t\"srpd_lite_idle\",\n+\t\"standby_idle\",\n+\n+\t\"auto_pd_dis_freq\",\n+\t\"auto_sr_dis_freq\",\n+\t\"ddr3_dll_dis_freq\",\n+\t\"ddr4_dll_dis_freq\",\n+\t\"phy_dll_dis_freq\",\n+\n+\t\"ddr3_odt_dis_freq\",\n+\t\"phy_ddr3_odt_dis_freq\",\n+\t\"ddr3_drv\",\n+\t\"ddr3_odt\",\n+\t\"phy_ddr3_ca_drv\",\n+\t\"phy_ddr3_ck_drv\",\n+\t\"phy_ddr3_dq_drv\",\n+\t\"phy_ddr3_odt\",\n+\n+\t\"lpddr3_odt_dis_freq\",\n+\t\"phy_lpddr3_odt_dis_freq\",\n+\t\"lpddr3_drv\",\n+\t\"lpddr3_odt\",\n+\t\"phy_lpddr3_ca_drv\",\n+\t\"phy_lpddr3_ck_drv\",\n+\t\"phy_lpddr3_dq_drv\",\n+\t\"phy_lpddr3_odt\",\n+\n+\t\"lpddr4_odt_dis_freq\",\n+\t\"phy_lpddr4_odt_dis_freq\",\n+\t\"lpddr4_drv\",\n+\t\"lpddr4_dq_odt\",\n+\t\"lpddr4_ca_odt\",\n+\t\"phy_lpddr4_ca_drv\",\n+\t\"phy_lpddr4_ck_cs_drv\",\n+\t\"phy_lpddr4_dq_drv\",\n+\t\"phy_lpddr4_odt\",\n+\n+\t\"ddr4_odt_dis_freq\",\n+\t\"phy_ddr4_odt_dis_freq\",\n+\t\"ddr4_drv\",\n+\t\"ddr4_odt\",\n+\t\"phy_ddr4_ca_drv\",\n+\t\"phy_ddr4_ck_drv\",\n+\t\"phy_ddr4_dq_drv\",\n+\t\"phy_ddr4_odt\",\n+};\n+\n+static const char * const rk3328_dts_ca_timing[] = {\n+\t\"ddr3a1_ddr4a9_de-skew\",\n+\t\"ddr3a0_ddr4a10_de-skew\",\n+\t\"ddr3a3_ddr4a6_de-skew\",\n+\t\"ddr3a2_ddr4a4_de-skew\",\n+\t\"ddr3a5_ddr4a8_de-skew\",\n+\t\"ddr3a4_ddr4a5_de-skew\",\n+\t\"ddr3a7_ddr4a11_de-skew\",\n+\t\"ddr3a6_ddr4a7_de-skew\",\n+\t\"ddr3a9_ddr4a0_de-skew\",\n+\t\"ddr3a8_ddr4a13_de-skew\",\n+\t\"ddr3a11_ddr4a3_de-skew\",\n+\t\"ddr3a10_ddr4cs0_de-skew\",\n+\t\"ddr3a13_ddr4a2_de-skew\",\n+\t\"ddr3a12_ddr4ba1_de-skew\",\n+\t\"ddr3a15_ddr4odt0_de-skew\",\n+\t\"ddr3a14_ddr4a1_de-skew\",\n+\t\"ddr3ba1_ddr4a15_de-skew\",\n+\t\"ddr3ba0_ddr4bg0_de-skew\",\n+\t\"ddr3ras_ddr4cke_de-skew\",\n+\t\"ddr3ba2_ddr4ba0_de-skew\",\n+\t\"ddr3we_ddr4bg1_de-skew\",\n+\t\"ddr3cas_ddr4a12_de-skew\",\n+\t\"ddr3ckn_ddr4ckn_de-skew\",\n+\t\"ddr3ckp_ddr4ckp_de-skew\",\n+\t\"ddr3cke_ddr4a16_de-skew\",\n+\t\"ddr3odt0_ddr4a14_de-skew\",\n+\t\"ddr3cs0_ddr4act_de-skew\",\n+\t\"ddr3reset_ddr4reset_de-skew\",\n+\t\"ddr3cs1_ddr4cs1_de-skew\",\n+\t\"ddr3odt1_ddr4odt1_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs0_timing[] = {\n+\t\"cs0_dm0_rx_de-skew\",\n+\t\"cs0_dm0_tx_de-skew\",\n+\t\"cs0_dq0_rx_de-skew\",\n+\t\"cs0_dq0_tx_de-skew\",\n+\t\"cs0_dq1_rx_de-skew\",\n+\t\"cs0_dq1_tx_de-skew\",\n+\t\"cs0_dq2_rx_de-skew\",\n+\t\"cs0_dq2_tx_de-skew\",\n+\t\"cs0_dq3_rx_de-skew\",\n+\t\"cs0_dq3_tx_de-skew\",\n+\t\"cs0_dq4_rx_de-skew\",\n+\t\"cs0_dq4_tx_de-skew\",\n+\t\"cs0_dq5_rx_de-skew\",\n+\t\"cs0_dq5_tx_de-skew\",\n+\t\"cs0_dq6_rx_de-skew\",\n+\t\"cs0_dq6_tx_de-skew\",\n+\t\"cs0_dq7_rx_de-skew\",\n+\t\"cs0_dq7_tx_de-skew\",\n+\t\"cs0_dqs0_rx_de-skew\",\n+\t\"cs0_dqs0p_tx_de-skew\",\n+\t\"cs0_dqs0n_tx_de-skew\",\n+\n+\t\"cs0_dm1_rx_de-skew\",\n+\t\"cs0_dm1_tx_de-skew\",\n+\t\"cs0_dq8_rx_de-skew\",\n+\t\"cs0_dq8_tx_de-skew\",\n+\t\"cs0_dq9_rx_de-skew\",\n+\t\"cs0_dq9_tx_de-skew\",\n+\t\"cs0_dq10_rx_de-skew\",\n+\t\"cs0_dq10_tx_de-skew\",\n+\t\"cs0_dq11_rx_de-skew\",\n+\t\"cs0_dq11_tx_de-skew\",\n+\t\"cs0_dq12_rx_de-skew\",\n+\t\"cs0_dq12_tx_de-skew\",\n+\t\"cs0_dq13_rx_de-skew\",\n+\t\"cs0_dq13_tx_de-skew\",\n+\t\"cs0_dq14_rx_de-skew\",\n+\t\"cs0_dq14_tx_de-skew\",\n+\t\"cs0_dq15_rx_de-skew\",\n+\t\"cs0_dq15_tx_de-skew\",\n+\t\"cs0_dqs1_rx_de-skew\",\n+\t\"cs0_dqs1p_tx_de-skew\",\n+\t\"cs0_dqs1n_tx_de-skew\",\n+\n+\t\"cs0_dm2_rx_de-skew\",\n+\t\"cs0_dm2_tx_de-skew\",\n+\t\"cs0_dq16_rx_de-skew\",\n+\t\"cs0_dq16_tx_de-skew\",\n+\t\"cs0_dq17_rx_de-skew\",\n+\t\"cs0_dq17_tx_de-skew\",\n+\t\"cs0_dq18_rx_de-skew\",\n+\t\"cs0_dq18_tx_de-skew\",\n+\t\"cs0_dq19_rx_de-skew\",\n+\t\"cs0_dq19_tx_de-skew\",\n+\t\"cs0_dq20_rx_de-skew\",\n+\t\"cs0_dq20_tx_de-skew\",\n+\t\"cs0_dq21_rx_de-skew\",\n+\t\"cs0_dq21_tx_de-skew\",\n+\t\"cs0_dq22_rx_de-skew\",\n+\t\"cs0_dq22_tx_de-skew\",\n+\t\"cs0_dq23_rx_de-skew\",\n+\t\"cs0_dq23_tx_de-skew\",\n+\t\"cs0_dqs2_rx_de-skew\",\n+\t\"cs0_dqs2p_tx_de-skew\",\n+\t\"cs0_dqs2n_tx_de-skew\",\n+\n+\t\"cs0_dm3_rx_de-skew\",\n+\t\"cs0_dm3_tx_de-skew\",\n+\t\"cs0_dq24_rx_de-skew\",\n+\t\"cs0_dq24_tx_de-skew\",\n+\t\"cs0_dq25_rx_de-skew\",\n+\t\"cs0_dq25_tx_de-skew\",\n+\t\"cs0_dq26_rx_de-skew\",\n+\t\"cs0_dq26_tx_de-skew\",\n+\t\"cs0_dq27_rx_de-skew\",\n+\t\"cs0_dq27_tx_de-skew\",\n+\t\"cs0_dq28_rx_de-skew\",\n+\t\"cs0_dq28_tx_de-skew\",\n+\t\"cs0_dq29_rx_de-skew\",\n+\t\"cs0_dq29_tx_de-skew\",\n+\t\"cs0_dq30_rx_de-skew\",\n+\t\"cs0_dq30_tx_de-skew\",\n+\t\"cs0_dq31_rx_de-skew\",\n+\t\"cs0_dq31_tx_de-skew\",\n+\t\"cs0_dqs3_rx_de-skew\",\n+\t\"cs0_dqs3p_tx_de-skew\",\n+\t\"cs0_dqs3n_tx_de-skew\",\n+};\n+\n+static const char * const rk3328_dts_cs1_timing[] = {\n+\t\"cs1_dm0_rx_de-skew\",\n+\t\"cs1_dm0_tx_de-skew\",\n+\t\"cs1_dq0_rx_de-skew\",\n+\t\"cs1_dq0_tx_de-skew\",\n+\t\"cs1_dq1_rx_de-skew\",\n+\t\"cs1_dq1_tx_de-skew\",\n+\t\"cs1_dq2_rx_de-skew\",\n+\t\"cs1_dq2_tx_de-skew\",\n+\t\"cs1_dq3_rx_de-skew\",\n+\t\"cs1_dq3_tx_de-skew\",\n+\t\"cs1_dq4_rx_de-skew\",\n+\t\"cs1_dq4_tx_de-skew\",\n+\t\"cs1_dq5_rx_de-skew\",\n+\t\"cs1_dq5_tx_de-skew\",\n+\t\"cs1_dq6_rx_de-skew\",\n+\t\"cs1_dq6_tx_de-skew\",\n+\t\"cs1_dq7_rx_de-skew\",\n+\t\"cs1_dq7_tx_de-skew\",\n+\t\"cs1_dqs0_rx_de-skew\",\n+\t\"cs1_dqs0p_tx_de-skew\",\n+\t\"cs1_dqs0n_tx_de-skew\",\n+\n+\t\"cs1_dm1_rx_de-skew\",\n+\t\"cs1_dm1_tx_de-skew\",\n+\t\"cs1_dq8_rx_de-skew\",\n+\t\"cs1_dq8_tx_de-skew\",\n+\t\"cs1_dq9_rx_de-skew\",\n+\t\"cs1_dq9_tx_de-skew\",\n+\t\"cs1_dq10_rx_de-skew\",\n+\t\"cs1_dq10_tx_de-skew\",\n+\t\"cs1_dq11_rx_de-skew\",\n+\t\"cs1_dq11_tx_de-skew\",\n+\t\"cs1_dq12_rx_de-skew\",\n+\t\"cs1_dq12_tx_de-skew\",\n+\t\"cs1_dq13_rx_de-skew\",\n+\t\"cs1_dq13_tx_de-skew\",\n+\t\"cs1_dq14_rx_de-skew\",\n+\t\"cs1_dq14_tx_de-skew\",\n+\t\"cs1_dq15_rx_de-skew\",\n+\t\"cs1_dq15_tx_de-skew\",\n+\t\"cs1_dqs1_rx_de-skew\",\n+\t\"cs1_dqs1p_tx_de-skew\",\n+\t\"cs1_dqs1n_tx_de-skew\",\n+\n+\t\"cs1_dm2_rx_de-skew\",\n+\t\"cs1_dm2_tx_de-skew\",\n+\t\"cs1_dq16_rx_de-skew\",\n+\t\"cs1_dq16_tx_de-skew\",\n+\t\"cs1_dq17_rx_de-skew\",\n+\t\"cs1_dq17_tx_de-skew\",\n+\t\"cs1_dq18_rx_de-skew\",\n+\t\"cs1_dq18_tx_de-skew\",\n+\t\"cs1_dq19_rx_de-skew\",\n+\t\"cs1_dq19_tx_de-skew\",\n+\t\"cs1_dq20_rx_de-skew\",\n+\t\"cs1_dq20_tx_de-skew\",\n+\t\"cs1_dq21_rx_de-skew\",\n+\t\"cs1_dq21_tx_de-skew\",\n+\t\"cs1_dq22_rx_de-skew\",\n+\t\"cs1_dq22_tx_de-skew\",\n+\t\"cs1_dq23_rx_de-skew\",\n+\t\"cs1_dq23_tx_de-skew\",\n+\t\"cs1_dqs2_rx_de-skew\",\n+\t\"cs1_dqs2p_tx_de-skew\",\n+\t\"cs1_dqs2n_tx_de-skew\",\n+\n+\t\"cs1_dm3_rx_de-skew\",\n+\t\"cs1_dm3_tx_de-skew\",\n+\t\"cs1_dq24_rx_de-skew\",\n+\t\"cs1_dq24_tx_de-skew\",\n+\t\"cs1_dq25_rx_de-skew\",\n+\t\"cs1_dq25_tx_de-skew\",\n+\t\"cs1_dq26_rx_de-skew\",\n+\t\"cs1_dq26_tx_de-skew\",\n+\t\"cs1_dq27_rx_de-skew\",\n+\t\"cs1_dq27_tx_de-skew\",\n+\t\"cs1_dq28_rx_de-skew\",\n+\t\"cs1_dq28_tx_de-skew\",\n+\t\"cs1_dq29_rx_de-skew\",\n+\t\"cs1_dq29_tx_de-skew\",\n+\t\"cs1_dq30_rx_de-skew\",\n+\t\"cs1_dq30_tx_de-skew\",\n+\t\"cs1_dq31_rx_de-skew\",\n+\t\"cs1_dq31_tx_de-skew\",\n+\t\"cs1_dqs3_rx_de-skew\",\n+\t\"cs1_dqs3p_tx_de-skew\",\n+\t\"cs1_dqs3n_tx_de-skew\",\n+};\n+\n+struct rk3328_ddr_dts_config_timing {\n+\tunsigned int ddr3_speed_bin;\n+\tunsigned int ddr4_speed_bin;\n+\tunsigned int pd_idle;\n+\tunsigned int sr_idle;\n+\tunsigned int sr_mc_gate_idle;\n+\tunsigned int srpd_lite_idle;\n+\tunsigned int standby_idle;\n+\n+\tunsigned int auto_pd_dis_freq;\n+\tunsigned int auto_sr_dis_freq;\n+\t/* for ddr3 only */\n+\tunsigned int ddr3_dll_dis_freq;\n+\t/* for ddr4 only */\n+\tunsigned int ddr4_dll_dis_freq;\n+\tunsigned int phy_dll_dis_freq;\n+\n+\tunsigned int ddr3_odt_dis_freq;\n+\tunsigned int phy_ddr3_odt_dis_freq;\n+\tunsigned int ddr3_drv;\n+\tunsigned int ddr3_odt;\n+\tunsigned int phy_ddr3_ca_drv;\n+\tunsigned int phy_ddr3_ck_drv;\n+\tunsigned int phy_ddr3_dq_drv;\n+\tunsigned int phy_ddr3_odt;\n+\n+\tunsigned int lpddr3_odt_dis_freq;\n+\tunsigned int phy_lpddr3_odt_dis_freq;\n+\tunsigned int lpddr3_drv;\n+\tunsigned int lpddr3_odt;\n+\tunsigned int phy_lpddr3_ca_drv;\n+\tunsigned int phy_lpddr3_ck_drv;\n+\tunsigned int phy_lpddr3_dq_drv;\n+\tunsigned int phy_lpddr3_odt;\n+\n+\tunsigned int lpddr4_odt_dis_freq;\n+\tunsigned int phy_lpddr4_odt_dis_freq;\n+\tunsigned int lpddr4_drv;\n+\tunsigned int lpddr4_dq_odt;\n+\tunsigned int lpddr4_ca_odt;\n+\tunsigned int phy_lpddr4_ca_drv;\n+\tunsigned int phy_lpddr4_ck_cs_drv;\n+\tunsigned int phy_lpddr4_dq_drv;\n+\tunsigned int phy_lpddr4_odt;\n+\n+\tunsigned int ddr4_odt_dis_freq;\n+\tunsigned int phy_ddr4_odt_dis_freq;\n+\tunsigned int ddr4_drv;\n+\tunsigned int ddr4_odt;\n+\tunsigned int phy_ddr4_ca_drv;\n+\tunsigned int phy_ddr4_ck_drv;\n+\tunsigned int phy_ddr4_dq_drv;\n+\tunsigned int phy_ddr4_odt;\n+\n+\tunsigned int ca_skew[15];\n+\tunsigned int cs0_skew[44];\n+\tunsigned int cs1_skew[44];\n+\n+\tunsigned int available;\n+};\n+\n+struct rk3328_ddr_de_skew_setting {\n+\tunsigned int ca_de_skew[30];\n+\tunsigned int cs0_de_skew[84];\n+\tunsigned int cs1_de_skew[84];\n+};\n+\n+struct rk3328_dmcfreq {\n+\tstruct device *dev;\n+\tstruct devfreq *devfreq;\n+\tstruct devfreq_simple_ondemand_data ondemand_data;\n+\tstruct clk *dmc_clk;\n+\tstruct devfreq_event_dev *edev;\n+\tstruct mutex lock;\n+\tstruct regulator *vdd_center;\n+\tunsigned long rate, target_rate;\n+\tunsigned long volt, target_volt;\n+\n+\tint (*set_auto_self_refresh)(u32 en);\n+};\n+\n+static void\n+rk3328_de_skew_setting_2_register(struct rk3328_ddr_de_skew_setting *de_skew,\n+\t\t\t\t  struct rk3328_ddr_dts_config_timing *tim)\n+{\n+\tu32 n;\n+\tu32 offset;\n+\tu32 shift;\n+\n+\tmemset_io(tim->ca_skew, 0, sizeof(tim->ca_skew));\n+\tmemset_io(tim->cs0_skew, 0, sizeof(tim->cs0_skew));\n+\tmemset_io(tim->cs1_skew, 0, sizeof(tim->cs1_skew));\n+\n+\t/* CA de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->ca_de_skew); n++) {\n+\t\toffset = n / 2;\n+\t\tshift = n % 2;\n+\t\t/* 0 => 4; 1 => 0 */\n+\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->ca_skew[offset] &= ~(0xf << shift);\n+\t\ttim->ca_skew[offset] |= (de_skew->ca_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS0 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs0_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs0_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs0_skew[offset] |= (de_skew->cs0_de_skew[n] << shift);\n+\t}\n+\n+\t/* CS1 data de-skew */\n+\tfor (n = 0; n < ARRAY_SIZE(de_skew->cs1_de_skew); n++) {\n+\t\toffset = ((n / 21) * 11) + ((n % 21) / 2);\n+\t\tshift = ((n % 21) % 2);\n+\t\tif ((n % 21) == 20)\n+\t\t\tshift = 0;\n+\t\telse\n+\t\t\t/* 0 => 4; 1 => 0 */\n+\t\t\tshift = (shift == 0) ? 4 : 0;\n+\t\ttim->cs1_skew[offset] &= ~(0xf << shift);\n+\t\ttim->cs1_skew[offset] |= (de_skew->cs1_de_skew[n] << shift);\n+\t}\n+}\n+\n+static void of_get_rk3328_timings(struct device *dev,\n+\t\t\t\t  struct device_node *np, uint32_t *timing)\n+{\n+\tstruct device_node *np_tim;\n+\tu32 *p;\n+\tstruct rk3328_ddr_dts_config_timing *dts_timing;\n+\tstruct rk3328_ddr_de_skew_setting *de_skew;\n+\tint ret = 0;\n+\tu32 i;\n+\n+\tdts_timing =\n+\t\t(struct rk3328_ddr_dts_config_timing *)(timing +\n+\t\t\t\t\t\t\tDTS_PAR_OFFSET / 4);\n+\n+\tnp_tim = of_parse_phandle(np, \"ddr_timing\", 0);\n+\tif (!np_tim) {\n+\t\tret = -EINVAL;\n+\t\tgoto end;\n+\t}\n+\tde_skew = kmalloc(sizeof(*de_skew), GFP_KERNEL);\n+\tif (!de_skew) {\n+\t\tret = -ENOMEM;\n+\t\tgoto end;\n+\t}\n+\n+\tp = (u32 *)dts_timing;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->ca_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_ca_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_ca_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs0_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs0_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs0_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tp = (u32 *)de_skew->cs1_de_skew;\n+\tfor (i = 0; i < ARRAY_SIZE(rk3328_dts_cs1_timing); i++) {\n+\t\tret |= of_property_read_u32(np_tim, rk3328_dts_cs1_timing[i],\n+\t\t\t\t\tp + i);\n+\t}\n+\tif (!ret)\n+\t\trk3328_de_skew_setting_2_register(de_skew, dts_timing);\n+\n+\tkfree(de_skew);\n+end:\n+\tif (!ret) {\n+\t\tdts_timing->available = 1;\n+\t} else {\n+\t\tdts_timing->available = 0;\n+\t\tdev_err(dev, \"of_get_ddr_timings: fail\\n\");\n+\t}\n+\n+\tof_node_put(np_tim);\n+}\n+\n+static int rockchip_ddr_set_auto_self_refresh(uint32_t en)\n+{\n+\tstruct arm_smccc_res res;\n+\n+\tddr_psci_param->sr_idle_en = en;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR,\n+\t\t      0, 0, 0, 0, &res);\n+\n+\treturn res.a0;\n+}\n+\n+static int rk3328_dmc_init(struct platform_device *pdev,\n+\t\t\t   struct rk3328_dmcfreq *dmcfreq)\n+{\n+\tstruct arm_smccc_res res;\n+\tu32 size, page_num;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      0, 0, ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 || (res.a1 < 0x101)) {\n+\t\tdev_err(&pdev->dev,\n+\t\t\t\"trusted firmware need to update or is invalid\\n\");\n+\t\treturn -ENXIO;\n+\t}\n+\n+\tdev_notice(&pdev->dev, \"current ATF version 0x%lx\\n\", res.a1);\n+\n+\t/*\n+\t * first 4KB is used for interface parameters\n+\t * after 4KB * N is dts parameters\n+\t */\n+\tsize = sizeof(struct rk3328_ddr_dts_config_timing);\n+\tpage_num = DIV_ROUND_UP(size, 4096) + 1;\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n+\t\t      page_num, SHARE_PAGE_TYPE_DDR, 0,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0 != 0) {\n+\t\tdev_err(&pdev->dev, \"no ATF memory for init\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tddr_psci_param = ioremap(res.a1, page_num << 12);\n+\tof_get_rk3328_timings(&pdev->dev, pdev->dev.of_node,\n+\t\t\t      (uint32_t *)ddr_psci_param);\n+\n+\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n+\t\t      SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_INIT,\n+\t\t      0, 0, 0, 0, &res);\n+\tif (res.a0) {\n+\t\tdev_err(&pdev->dev, \"Rockchip dram init error %lx\\n\", res.a0);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tdmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh;\n+\n+\treturn 0;\n+}\n+\n+static int rk3328_dmcfreq_target(struct device *dev, unsigned long *freq,\n+\t\t\t\t u32 flags)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct dev_pm_opp *opp;\n+\tunsigned long old_clk_rate = dmcfreq->rate;\n+\tunsigned long target_volt, target_rate;\n+\tint err;\n+\n+\topp = devfreq_recommended_opp(dev, freq, flags);\n+\tif (IS_ERR(opp))\n+\t\treturn PTR_ERR(opp);\n+\n+\ttarget_rate = dev_pm_opp_get_freq(opp);\n+\ttarget_volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\tif (dmcfreq->rate == target_rate)\n+\t\treturn 0;\n+\n+\tmutex_lock(&dmcfreq->lock);\n+\n+\t/*\n+\t * If frequency scaling from low to high, adjust voltage first.\n+\t * If frequency scaling from high to low, adjust frequency first.\n+\t */\n+\tif (old_clk_rate < target_rate) {\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\t\tif (err) {\n+\t\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\",\n+\t\t\t\ttarget_volt);\n+\t\t\tgoto out;\n+\t\t}\n+\t}\n+\n+\terr = clk_set_rate(dmcfreq->dmc_clk, target_rate);\n+\tif (err) {\n+\t\tdev_err(dev, \"Cannot set frequency %lu (%d)\\n\", target_rate,\n+\t\t\terr);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t}\n+\n+\t/*\n+\t * Check the dpll rate,\n+\t * There only two result we will get,\n+\t * 1. Ddr frequency scaling fail, we still get the old rate.\n+\t * 2. Ddr frequency scaling sucessful, we get the rate we set.\n+\t */\n+\tdmcfreq->rate = clk_get_rate(dmcfreq->dmc_clk);\n+\n+\t/* If get the incorrect rate, set voltage to old value. */\n+\tif (dmcfreq->rate != target_rate) {\n+\t\tdev_err(dev, \"Got wrong frequency, Request %lu, Current %lu\\n\",\n+\t\t\ttarget_rate, dmcfreq->rate);\n+\t\tregulator_set_voltage(dmcfreq->vdd_center, dmcfreq->volt,\n+\t\t\t\t      dmcfreq->volt);\n+\t\tgoto out;\n+\t} else if (old_clk_rate > target_rate)\n+\t\terr = regulator_set_voltage(dmcfreq->vdd_center, target_volt,\n+\t\t\t\t\t    target_volt);\n+\tif (err)\n+\t\tdev_err(dev, \"Cannot set voltage %lu uV\\n\", target_volt);\n+\n+\tdmcfreq->rate = target_rate;\n+\tdmcfreq->volt = target_volt;\n+\n+out:\n+\tmutex_unlock(&dmcfreq->lock);\n+\treturn err;\n+}\n+\n+static int rk3328_dmcfreq_get_dev_status(struct device *dev,\n+\t\t\t\t\t struct devfreq_dev_status *stat)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tstruct devfreq_event_data edata;\n+\tint ret = 0;\n+\n+\tret = devfreq_event_get_event(dmcfreq->edev, &edata);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tstat->current_frequency = dmcfreq->rate;\n+\tstat->busy_time = edata.load_count;\n+\tstat->total_time = edata.total_count;\n+\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_get_cur_freq(struct device *dev, unsigned long *freq)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\n+\t*freq = dmcfreq->rate;\n+\n+\treturn 0;\n+}\n+\n+static struct devfreq_dev_profile rk3328_devfreq_dmc_profile = {\n+\t.polling_ms\t= 200,\n+\t.target\t\t= rk3328_dmcfreq_target,\n+\t.get_dev_status\t= rk3328_dmcfreq_get_dev_status,\n+\t.get_cur_freq\t= rk3328_dmcfreq_get_cur_freq,\n+};\n+\n+static __maybe_unused int rk3328_dmcfreq_suspend(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_disable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to disable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_suspend_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to suspend the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static __maybe_unused int rk3328_dmcfreq_resume(struct device *dev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(dev);\n+\tint ret = 0;\n+\n+\tret = devfreq_event_enable_edev(dmcfreq->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable the devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = devfreq_resume_device(dmcfreq->devfreq);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to resume the devfreq devices\\n\");\n+\t\treturn ret;\n+\t}\n+\treturn ret;\n+}\n+\n+static SIMPLE_DEV_PM_OPS(rk3328_dmcfreq_pm, rk3328_dmcfreq_suspend,\n+\t\t\t rk3328_dmcfreq_resume);\n+\n+static int rk3328_dmcfreq_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct device_node *np = pdev->dev.of_node;\n+\tstruct rk3328_dmcfreq *data;\n+\tstruct dev_pm_opp *opp;\n+\tint ret;\n+\n+\tdata = devm_kzalloc(dev, sizeof(struct rk3328_dmcfreq), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tmutex_init(&data->lock);\n+\n+\tdata->vdd_center = devm_regulator_get(dev, \"center\");\n+\tif (IS_ERR(data->vdd_center)) {\n+\t\tif (PTR_ERR(data->vdd_center) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the regulator \\\"center\\\"\\n\");\n+\t\treturn PTR_ERR(data->vdd_center);\n+\t}\n+\n+\tdata->dmc_clk = devm_clk_get(dev, \"dmc_clk\");\n+\tif (IS_ERR(data->dmc_clk)) {\n+\t\tif (PTR_ERR(data->dmc_clk) == -EPROBE_DEFER)\n+\t\t\treturn -EPROBE_DEFER;\n+\n+\t\tdev_err(dev, \"Cannot get the clk dmc_clk\\n\");\n+\t\treturn PTR_ERR(data->dmc_clk);\n+\t}\n+\n+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, 0);\n+#else\n+\tdata->edev = devfreq_event_get_edev_by_phandle(dev, \"devfreq-events\", 0);\n+#endif\n+\tif (IS_ERR(data->edev))\n+\t\treturn -EPROBE_DEFER;\n+\n+\tret = devfreq_event_enable_edev(data->edev);\n+\tif (ret < 0) {\n+\t\tdev_err(dev, \"failed to enable devfreq-event devices\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tret = rk3328_dmc_init(pdev, data);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/*\n+\t * We add a devfreq driver to our parent since it has a device tree node\n+\t * with operating points.\n+\t */\n+\tif (dev_pm_opp_of_add_table(dev)) {\n+\t\tdev_err(dev, \"Invalid operating-points in device tree.\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tof_property_read_u32(np, \"upthreshold\",\n+\t\t\t     &data->ondemand_data.upthreshold);\n+\tof_property_read_u32(np, \"downdifferential\",\n+\t\t\t     &data->ondemand_data.downdifferential);\n+\n+\tdata->rate = clk_get_rate(data->dmc_clk);\n+\n+\topp = devfreq_recommended_opp(dev, &data->rate, 0);\n+\tif (IS_ERR(opp)) {\n+\t\tret = PTR_ERR(opp);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdata->rate = dev_pm_opp_get_freq(opp);\n+\tdata->volt = dev_pm_opp_get_voltage(opp);\n+\tdev_pm_opp_put(opp);\n+\n+\trk3328_devfreq_dmc_profile.initial_freq = data->rate;\n+\n+\tdata->devfreq = devm_devfreq_add_device(dev,\n+\t\t\t\t\t   &rk3328_devfreq_dmc_profile,\n+\t\t\t\t\t   DEVFREQ_GOV_SIMPLE_ONDEMAND,\n+\t\t\t\t\t   &data->ondemand_data);\n+\tif (IS_ERR(data->devfreq)) {\n+\t\tret = PTR_ERR(data->devfreq);\n+\t\tgoto err_free_opp;\n+\t}\n+\n+\tdevm_devfreq_register_opp_notifier(dev, data->devfreq);\n+\n+\tdata->dev = dev;\n+\tplatform_set_drvdata(pdev, data);\n+\n+\treturn 0;\n+\n+err_free_opp:\n+\tdev_pm_opp_of_remove_table(&pdev->dev);\n+\treturn ret;\n+}\n+\n+static int rk3328_dmcfreq_remove(struct platform_device *pdev)\n+{\n+\tstruct rk3328_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev);\n+\n+\t/*\n+\t * Before remove the opp table we need to unregister the opp notifier.\n+\t */\n+\tdevm_devfreq_unregister_opp_notifier(dmcfreq->dev, dmcfreq->devfreq);\n+\tdev_pm_opp_of_remove_table(dmcfreq->dev);\n+\n+\treturn 0;\n+}\n+\n+static const struct of_device_id rk3328dmc_devfreq_of_match[] = {\n+\t{ .compatible = \"rockchip,rk3328-dmc\" },\n+\t{ },\n+};\n+MODULE_DEVICE_TABLE(of, rk3328dmc_devfreq_of_match);\n+\n+static struct platform_driver rk3328_dmcfreq_driver = {\n+\t.probe\t= rk3328_dmcfreq_probe,\n+\t.remove = rk3328_dmcfreq_remove,\n+\t.driver = {\n+\t\t.name\t= \"rk3328-dmc-freq\",\n+\t\t.pm\t= &rk3328_dmcfreq_pm,\n+\t\t.of_match_table = rk3328dmc_devfreq_of_match,\n+\t},\n+};\n+module_platform_driver(rk3328_dmcfreq_driver);\n+\n+MODULE_LICENSE(\"GPL v2\");\n+MODULE_AUTHOR(\"Lin Huang <hl@rock-chips.com>\");\n+MODULE_DESCRIPTION(\"RK3328 dmcfreq driver with devfreq framework\");\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\nnew file mode 100644\nindex 0000000000..b065432e77\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/clock/rockchip-ddr.h\n@@ -0,0 +1,63 @@\n+/*\n+ *\n+ * Copyright (C) 2017 ROCKCHIP, Inc.\n+ *\n+ * This software is licensed under the terms of the GNU General Public\n+ * License version 2, as published by the Free Software Foundation, and\n+ * may be copied, distributed, and modified under those terms.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ */\n+\n+#ifndef _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+#define _DT_BINDINGS_CLOCK_ROCKCHIP_DDR_H\n+\n+#define DDR2_DEFAULT\t(0)\n+\n+#define DDR3_800D\t(0)\t/* 5-5-5 */\n+#define DDR3_800E\t(1)\t/* 6-6-6 */\n+#define DDR3_1066E\t(2)\t/* 6-6-6 */\n+#define DDR3_1066F\t(3)\t/* 7-7-7 */\n+#define DDR3_1066G\t(4)\t/* 8-8-8 */\n+#define DDR3_1333F\t(5)\t/* 7-7-7 */\n+#define DDR3_1333G\t(6)\t/* 8-8-8 */\n+#define DDR3_1333H\t(7)\t/* 9-9-9 */\n+#define DDR3_1333J\t(8)\t/* 10-10-10 */\n+#define DDR3_1600G\t(9)\t/* 8-8-8 */\n+#define DDR3_1600H\t(10)\t/* 9-9-9 */\n+#define DDR3_1600J\t(11)\t/* 10-10-10 */\n+#define DDR3_1600K\t(12)\t/* 11-11-11 */\n+#define DDR3_1866J\t(13)\t/* 10-10-10 */\n+#define DDR3_1866K\t(14)\t/* 11-11-11 */\n+#define DDR3_1866L\t(15)\t/* 12-12-12 */\n+#define DDR3_1866M\t(16)\t/* 13-13-13 */\n+#define DDR3_2133K\t(17)\t/* 11-11-11 */\n+#define DDR3_2133L\t(18)\t/* 12-12-12 */\n+#define DDR3_2133M\t(19)\t/* 13-13-13 */\n+#define DDR3_2133N\t(20)\t/* 14-14-14 */\n+#define DDR3_DEFAULT\t(21)\n+#define DDR_DDR2\t(22)\n+#define DDR_LPDDR\t(23)\n+#define DDR_LPDDR2\t(24)\n+\n+#define DDR4_1600J\t(0)\t/* 10-10-10 */\n+#define DDR4_1600K\t(1)\t/* 11-11-11 */\n+#define DDR4_1600L\t(2)\t/* 12-12-12 */\n+#define DDR4_1866L\t(3)\t/* 12-12-12 */\n+#define DDR4_1866M\t(4)\t/* 13-13-13 */\n+#define DDR4_1866N\t(5)\t/* 14-14-14 */\n+#define DDR4_2133N\t(6)\t/* 14-14-14 */\n+#define DDR4_2133P\t(7)\t/* 15-15-15 */\n+#define DDR4_2133R\t(8)\t/* 16-16-16 */\n+#define DDR4_2400P\t(9)\t/* 15-15-15 */\n+#define DDR4_2400R\t(10)\t/* 16-16-16 */\n+#define DDR4_2400U\t(11)\t/* 18-18-18 */\n+#define DDR4_DEFAULT\t(12)\n+\n+#define PAUSE_CPU_STACK_SIZE\t16\n+\n+#endif\ndiff --git a/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\nnew file mode 100644\nindex 0000000000..171f41c256\n--- /dev/null\n+++ b/target/linux/rockchip/files/include/dt-bindings/memory/rk3328-dram.h\n@@ -0,0 +1,159 @@\n+/*\n+ * Copyright (c) 2017 Fuzhou Rockchip Electronics Co., Ltd\n+ *\n+ * This file is dual-licensed: you can use it either under the terms\n+ * of the GPL or the X11 license, at your option. Note that this dual\n+ * licensing only applies to this file, and not this project as a\n+ * whole.\n+ *\n+ *  a) This library is free software; you can redistribute it and/or\n+ *     modify it under the terms of the GNU General Public License as\n+ *     published by the Free Software Foundation; either version 2 of the\n+ *     License, or (at your option) any later version.\n+ *\n+ *     This library is distributed in the hope that it will be useful,\n+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *     GNU General Public License for more details.\n+ *\n+ * Or, alternatively,\n+ *\n+ *  b) Permission is hereby granted, free of charge, to any person\n+ *     obtaining a copy of this software and associated documentation\n+ *     files (the \"Software\"), to deal in the Software without\n+ *     restriction, including without limitation the rights to use,\n+ *     copy, modify, merge, publish, distribute, sublicense, and/or\n+ *     sell copies of the Software, and to permit persons to whom the\n+ *     Software is furnished to do so, subject to the following\n+ *     conditions:\n+ *\n+ *     The above copyright notice and this permission notice shall be\n+ *     included in all copies or substantial portions of the Software.\n+ *\n+ *     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n+ *     OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+#ifndef _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+#define _DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H\n+\n+#define DDR3_DS_34ohm\t\t\t(34)\n+#define DDR3_DS_40ohm\t\t\t(40)\n+\n+#define DDR3_ODT_DIS\t\t\t(0)\n+#define DDR3_ODT_40ohm\t\t\t(40)\n+#define DDR3_ODT_60ohm\t\t\t(60)\n+#define DDR3_ODT_120ohm\t\t\t(120)\n+\n+#define LP2_DS_34ohm\t\t\t(34)\n+#define LP2_DS_40ohm\t\t\t(40)\n+#define LP2_DS_48ohm\t\t\t(48)\n+#define LP2_DS_60ohm\t\t\t(60)\n+#define LP2_DS_68_6ohm\t\t\t(68)\t/* optional */\n+#define LP2_DS_80ohm\t\t\t(80)\n+#define LP2_DS_120ohm\t\t\t(120)\t/* optional */\n+\n+#define LP3_DS_34ohm\t\t\t(34)\n+#define LP3_DS_40ohm\t\t\t(40)\n+#define LP3_DS_48ohm\t\t\t(48)\n+#define LP3_DS_60ohm\t\t\t(60)\n+#define LP3_DS_80ohm\t\t\t(80)\n+#define LP3_DS_34D_40U\t\t\t(3440)\n+#define LP3_DS_40D_48U\t\t\t(4048)\n+#define LP3_DS_34D_48U\t\t\t(3448)\n+\n+#define LP3_ODT_DIS\t\t\t(0)\n+#define LP3_ODT_60ohm\t\t\t(60)\n+#define LP3_ODT_120ohm\t\t\t(120)\n+#define LP3_ODT_240ohm\t\t\t(240)\n+\n+#define LP4_PDDS_40ohm\t\t\t(40)\n+#define LP4_PDDS_48ohm\t\t\t(48)\n+#define LP4_PDDS_60ohm\t\t\t(60)\n+#define LP4_PDDS_80ohm\t\t\t(80)\n+#define LP4_PDDS_120ohm\t\t\t(120)\n+#define LP4_PDDS_240ohm\t\t\t(240)\n+\n+#define LP4_DQ_ODT_40ohm\t\t(40)\n+#define LP4_DQ_ODT_48ohm\t\t(48)\n+#define LP4_DQ_ODT_60ohm\t\t(60)\n+#define LP4_DQ_ODT_80ohm\t\t(80)\n+#define LP4_DQ_ODT_120ohm\t\t(120)\n+#define LP4_DQ_ODT_240ohm\t\t(240)\n+#define LP4_DQ_ODT_DIS\t\t\t(0)\n+\n+#define LP4_CA_ODT_40ohm\t\t(40)\n+#define LP4_CA_ODT_48ohm\t\t(48)\n+#define LP4_CA_ODT_60ohm\t\t(60)\n+#define LP4_CA_ODT_80ohm\t\t(80)\n+#define LP4_CA_ODT_120ohm\t\t(120)\n+#define LP4_CA_ODT_240ohm\t\t(240)\n+#define LP4_CA_ODT_DIS\t\t\t(0)\n+\n+#define DDR4_DS_34ohm\t\t\t(34)\n+#define DDR4_DS_48ohm\t\t\t(48)\n+#define DDR4_RTT_NOM_DIS\t\t(0)\n+#define DDR4_RTT_NOM_60ohm\t\t(60)\n+#define DDR4_RTT_NOM_120ohm\t\t(120)\n+#define DDR4_RTT_NOM_40ohm\t\t(40)\n+#define DDR4_RTT_NOM_240ohm\t\t(240)\n+#define DDR4_RTT_NOM_48ohm\t\t(48)\n+#define DDR4_RTT_NOM_80ohm\t\t(80)\n+#define DDR4_RTT_NOM_34ohm\t\t(34)\n+\n+#define PHY_DDR3_RON_RTT_DISABLE\t(0)\n+#define PHY_DDR3_RON_RTT_451ohm\t\t(1)\n+#define PHY_DDR3_RON_RTT_225ohm\t\t(2)\n+#define PHY_DDR3_RON_RTT_150ohm\t\t(3)\n+#define PHY_DDR3_RON_RTT_112ohm\t\t(4)\n+#define PHY_DDR3_RON_RTT_90ohm\t\t(5)\n+#define PHY_DDR3_RON_RTT_75ohm\t\t(6)\n+#define PHY_DDR3_RON_RTT_64ohm\t\t(7)\n+#define PHY_DDR3_RON_RTT_56ohm\t\t(16)\n+#define PHY_DDR3_RON_RTT_50ohm\t\t(17)\n+#define PHY_DDR3_RON_RTT_45ohm\t\t(18)\n+#define PHY_DDR3_RON_RTT_41ohm\t\t(19)\n+#define PHY_DDR3_RON_RTT_37ohm\t\t(20)\n+#define PHY_DDR3_RON_RTT_34ohm\t\t(21)\n+#define PHY_DDR3_RON_RTT_33ohm\t\t(22)\n+#define PHY_DDR3_RON_RTT_30ohm\t\t(23)\n+#define PHY_DDR3_RON_RTT_28ohm\t\t(24)\n+#define PHY_DDR3_RON_RTT_26ohm\t\t(25)\n+#define PHY_DDR3_RON_RTT_25ohm\t\t(26)\n+#define PHY_DDR3_RON_RTT_23ohm\t\t(27)\n+#define PHY_DDR3_RON_RTT_22ohm\t\t(28)\n+#define PHY_DDR3_RON_RTT_21ohm\t\t(29)\n+#define PHY_DDR3_RON_RTT_20ohm\t\t(30)\n+#define PHY_DDR3_RON_RTT_19ohm\t\t(31)\n+\n+#define PHY_DDR4_LPDDR3_RON_RTT_DISABLE (0)\n+#define PHY_DDR4_LPDDR3_RON_RTT_480ohm\t(1)\n+#define PHY_DDR4_LPDDR3_RON_RTT_240ohm\t(2)\n+#define PHY_DDR4_LPDDR3_RON_RTT_160ohm\t(3)\n+#define PHY_DDR4_LPDDR3_RON_RTT_120ohm\t(4)\n+#define PHY_DDR4_LPDDR3_RON_RTT_96ohm\t(5)\n+#define PHY_DDR4_LPDDR3_RON_RTT_80ohm\t(6)\n+#define PHY_DDR4_LPDDR3_RON_RTT_68ohm\t(7)\n+#define PHY_DDR4_LPDDR3_RON_RTT_60ohm\t(16)\n+#define PHY_DDR4_LPDDR3_RON_RTT_53ohm\t(17)\n+#define PHY_DDR4_LPDDR3_RON_RTT_48ohm\t(18)\n+#define PHY_DDR4_LPDDR3_RON_RTT_43ohm\t(19)\n+#define PHY_DDR4_LPDDR3_RON_RTT_40ohm\t(20)\n+#define PHY_DDR4_LPDDR3_RON_RTT_37ohm\t(21)\n+#define PHY_DDR4_LPDDR3_RON_RTT_34ohm\t(22)\n+#define PHY_DDR4_LPDDR3_RON_RTT_32ohm\t(23)\n+#define PHY_DDR4_LPDDR3_RON_RTT_30ohm\t(24)\n+#define PHY_DDR4_LPDDR3_RON_RTT_28ohm\t(25)\n+#define PHY_DDR4_LPDDR3_RON_RTT_26ohm\t(26)\n+#define PHY_DDR4_LPDDR3_RON_RTT_25ohm\t(27)\n+#define PHY_DDR4_LPDDR3_RON_RTT_24ohm\t(28)\n+#define PHY_DDR4_LPDDR3_RON_RTT_22ohm\t(29)\n+#define PHY_DDR4_LPDDR3_RON_RTT_21ohm\t(30)\n+#define PHY_DDR4_LPDDR3_RON_RTT_20ohm\t(31)\n+\n+#endif /*_DT_BINDINGS_DRAM_ROCKCHIP_RK3328_H*/\ndiff --git a/target/linux/rockchip/image/Makefile b/target/linux/rockchip/image/Makefile\nindex f5fdff637f..5791f5c064 100644\n--- a/target/linux/rockchip/image/Makefile\n+++ b/target/linux/rockchip/image/Makefile\n@@ -45,6 +45,26 @@ define Build/pine64-img\n \tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-u-boot.itb of=\"$@\" seek=16384 conv=notrunc\n endef\n \n+define Build/pine64-bin\n+\t# Typical Rockchip boot flow with Rockchip miniloader\n+\t# Rockchp idbLoader which is combinded by Rockchip ddr init bin\n+\t# and miniloader bin from Rockchip rkbin project\n+\n+\t# Generate a new partition table in $@ with 32 MiB of alignment\n+\t# padding for the idbloader, uboot and trust image to fit:\n+\t# http://opensource.rock-chips.com/wiki_Boot_option#Boot_flow\n+\t$(SCRIPT_DIR)/gen_image_generic.sh \\\n+\t\t$@ \\\n+\t\t$(CONFIG_TARGET_KERNEL_PARTSIZE) $@.boot \\\n+\t\t$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(IMAGE_ROOTFS) \\\n+\t\t32768\n+\n+\t# Copy the idbloader, uboot and trust image to the image at sector 0x40, 0x4000 and 0x6000\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-idbloader.bin of=\"$@\" seek=64 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-uboot.img of=\"$@\" seek=16384 conv=notrunc\n+\tdd if=\"$(STAGING_DIR_IMAGE)\"/$(UBOOT_DEVICE_NAME)-trust.bin of=\"$@\" seek=24576 conv=notrunc\n+endef\n+\n ### Devices ###\n define Device/Default\n   PROFILES := Default\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex ee411d266b..e255970f28 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -7,7 +7,7 @@ define Device/friendlyarm_nanopi-r2s\n   DEVICE_MODEL := NanoPi R2S\n   SOC := rk3328\n   UBOOT_DEVICE_NAME := nanopi-r2s-rk3328\n-  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-img | gzip | append-metadata\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-bin | gzip | append-metadata\n   DEVICE_PACKAGES := kmod-usb-net-rtl8152\n endef\n TARGET_DEVICES += friendlyarm_nanopi-r2s\ndiff --git a/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\nnew file mode 100644\nindex 0000000000..a4b8340be4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n@@ -0,0 +1,44 @@\n+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 13:53:25 +0800\n+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/Kconfig      |  18 +-\n+ drivers/devfreq/Makefile     |   1 +\n+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++\n+ 3 files changed, 862 insertions(+), 3 deletions(-)\n+ create mode 100644 drivers/devfreq/rk3328_dmc.c\n+\n+--- a/drivers/devfreq/Kconfig\n++++ b/drivers/devfreq/Kconfig\n+@@ -131,6 +131,18 @@ config ARM_TEGRA20_DEVFREQ\n+ \t  It reads Memory Controller counters and adjusts the operating\n+ \t  frequencies and voltages with OPP support.\n+ \n++config ARM_RK3328_DMC_DEVFREQ\n++\ttristate \"ARM RK3328 DMC DEVFREQ Driver\"\n++\tdepends on ARCH_ROCKCHIP\n++\tselect DEVFREQ_EVENT_ROCKCHIP_DFI\n++\tselect DEVFREQ_GOV_SIMPLE_ONDEMAND\n++\tselect PM_DEVFREQ_EVENT\n++\tselect PM_OPP\n++\thelp\n++\t  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).\n++\t  It sets the frequency for the memory controller and reads the usage counts\n++\t  from hardware.\n++\n+ config ARM_RK3399_DMC_DEVFREQ\n+ \ttristate \"ARM RK3399 DMC DEVFREQ Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \\\n+--- a/drivers/devfreq/Makefile\n++++ b/drivers/devfreq/Makefile\n+@@ -12,6 +12,7 @@ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)\t+=\n+ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ)\t+= imx-bus.o\n+ obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ)\t+= imx8m-ddrc.o\n+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)\t+= rk3399_dmc.o\n++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)\t+= rk3328_dmc.o\n+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)\t\t+= tegra30-devfreq.o\n+ obj-$(CONFIG_ARM_TEGRA20_DEVFREQ)\t+= tegra20-devfreq.o\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\nnew file mode 100644\nindex 0000000000..4e688f8eb4\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n@@ -0,0 +1,218 @@\n+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001\n+From: Tang Yun ping <typ@rock-chips.com>\n+Date: Thu, 4 May 2017 20:49:58 +0800\n+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2\n+ APIs\n+\n+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.\n+\n+Signed-off-by: Tang Yun ping <typ@rock-chips.com>\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++\n+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-\n+ drivers/clk/rockchip/clk.h          |   3 +-\n+ include/soc/rockchip/rockchip_sip.h |  11 +++\n+ 4 files changed, 147 insertions(+), 4 deletions(-)\n+\n+diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c\n+index 9273bce4d7b6..555aaf4e758d 100644\n+--- a/drivers/clk/rockchip/clk-ddr.c\n++++ b/drivers/clk/rockchip/clk-ddr.c\n+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddrclk_sip_ops = {\n+ \t.get_parent = rockchip_ddrclk_get_parent,\n+ };\n+ \n++/* See v4.4/include/dt-bindings/display/rk_fb.h */\n++#define SCREEN_NULL\t\t\t0\n++#define SCREEN_HDMI\t\t\t6\n++\n++static inline int rk_drm_get_lcdc_type(void)\n++{\n++\treturn SCREEN_NULL;\n++}\n++\n++struct share_params {\n++\tu32 hz;\n++\tu32 lcdc_type;\n++\tu32 vop;\n++\tu32 vop_dclk_mode;\n++\tu32 sr_idle_en;\n++\tu32 addr_mcu_el3;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag1;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag0;\n++\tu32 complt_hwirq;\n++\t /* if need, add parameter after */\n++};\n++\n++struct rockchip_ddrclk_data {\n++\tu32 inited_flag;\n++\tvoid __iomem *share_memory;\n++};\n++\n++static struct rockchip_ddrclk_data ddr_data;\n++\n++static void rockchip_ddrclk_data_init(void)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n++\t\t      1, SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif (!res.a0) {\n++\t\tddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);\n++\t\tddr_data.inited_flag = 1;\n++\t}\n++}\n++\n++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t   unsigned long drate,\n++\t\t\t\t\t   unsigned long prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = drate;\n++\tp->lcdc_type = rk_drm_get_lcdc_type();\n++\tp->wait_flag1 = 1;\n++\tp->wait_flag0 = 1;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif ((int)res.a1 == -6) {\n++\t\tpr_err(\"%s: timeout, drate = %lumhz\\n\", __func__, drate/1000000);\n++\t\t/* TODO: rockchip_dmcfreq_wait_complete(); */\n++\t}\n++\n++\treturn res.a0;\n++}\n++\n++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2\n++\t\t\t(struct clk_hw *hw, unsigned long parent_rate)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t      unsigned long rate,\n++\t\t\t\t\t      unsigned long *prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = rate;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {\n++\t.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,\n++\t.set_rate = rockchip_ddrclk_sip_set_rate_v2,\n++\t.round_rate = rockchip_ddrclk_sip_round_rate_v2,\n++\t.get_parent = rockchip_ddrclk_get_parent,\n++};\n++\n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+ \t\t\t\t\t u8 num_parents, int mux_offset,\n+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \tcase ROCKCHIP_DDRCLK_SIP:\n+ \t\tinit.ops = &rockchip_ddrclk_sip_ops;\n+ \t\tbreak;\n++\tcase ROCKCHIP_DDRCLK_SIP_V2:\n++\t\tinit.ops = &rockchip_ddrclk_sip_ops_v2;\n++\t\tbreak;\n+ \tdefault:\n+ \t\tpr_err(\"%s: unsupported ddrclk type %d\\n\", __func__, ddr_flag);\n+ \t\tkfree(ddrclk);\n+diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c\n+index c186a1985bf4..ac6e6163a232 100644\n+--- a/drivers/clk/rockchip/clk-rk3328.c\n++++ b/drivers/clk/rockchip/clk-rk3328.c\n+@@ -314,9 +314,10 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {\n+ \t\t\tRK3328_CLKGATE_CON(14), 1, GFLAGS),\n+ \n+ \t/* PD_DDR */\n+-\tCOMPOSITE(0, \"clk_ddr\", mux_ddrphy_p, CLK_IGNORE_UNUSED,\n+-\t\t\tRK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,\n+-\t\t\tRK3328_CLKGATE_CON(0), 4, GFLAGS),\n++\tCOMPOSITE_DDRCLK(SCLK_DDRCLK, \"sclk_ddrc\", mux_ddrphy_p, 0,\n++\t\t\tRK3328_CLKSEL_CON(3), 8, 2, 0, 3,\n++\t\t\tROCKCHIP_DDRCLK_SIP_V2),\n++\n+ \tGATE(0, \"clk_ddrmsch\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+ \t\t\tRK3328_CLKGATE_CON(18), 6, GFLAGS),\n+ \tGATE(0, \"clk_ddrupctl\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h\n+index 2271a84124b0..7405aaf965ec 100644\n+--- a/drivers/clk/rockchip/clk.h\n++++ b/drivers/clk/rockchip/clk.h\n+@@ -362,7 +362,8 @@ struct clk *rockchip_clk_register_mmc(const char *name,\n+  * DDRCLK flags, including method of setting the rate\n+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.\n+  */\n+-#define ROCKCHIP_DDRCLK_SIP\t\tBIT(0)\n++#define ROCKCHIP_DDRCLK_SIP\t\t0x01\n++#define ROCKCHIP_DDRCLK_SIP_V2\t\t0x03\n+ \n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h\n+index c46a9ae2a2ab..fa7e0a2d72cc 100644\n+--- a/include/soc/rockchip/rockchip_sip.h\n++++ b/include/soc/rockchip/rockchip_sip.h\n+@@ -16,5 +16,16 @@\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ\t0x06\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM\t0x07\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD\t0x08\n++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION\t0x08\n++\n++#define ROCKCHIP_SIP_SHARE_MEM\t\t\t0x82000009\n++\n++/* Share mem page types */\n++typedef enum {\n++    SHARE_PAGE_TYPE_INVALID = 0,\n++    SHARE_PAGE_TYPE_UARTDBG,\n++    SHARE_PAGE_TYPE_DDR,\n++    SHARE_PAGE_TYPE_MAX,\n++} share_page_type_t;\n+ \n+ #endif\ndiff --git a/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\nnew file mode 100644\nindex 0000000000..283e4abd2f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n@@ -0,0 +1,662 @@\n+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 12:49:48 +0800\n+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---\n+ 1 file changed, 505 insertions(+), 49 deletions(-)\n+\n+--- a/drivers/devfreq/event/rockchip-dfi.c\n++++ b/drivers/devfreq/event/rockchip-dfi.c\n+@@ -18,25 +18,66 @@\n+ #include <linux/list.h>\n+ #include <linux/of.h>\n+ \n+-#include <soc/rockchip/rk3399_grf.h>\n+-\n+-#define RK3399_DMC_NUM_CH\t2\n++#define PX30_PMUGRF_OS_REG2\t\t0x208\n+ \n++#define RK3128_GRF_SOC_CON0\t\t0x140\n++#define RK3128_GRF_OS_REG1\t\t0x1cc\n++#define RK3128_GRF_DFI_WRNUM\t\t0x220\n++#define RK3128_GRF_DFI_RDNUM\t\t0x224\n++#define RK3128_GRF_DFI_TIMERVAL\t\t0x22c\n++#define RK3128_DDR_MONITOR_EN\t\t((1 << (16 + 6)) + (1 << 6))\n++#define RK3128_DDR_MONITOR_DISB\t\t((1 << (16 + 6)) + (0 << 6))\n++\n++#define RK3288_PMU_SYS_REG2\t\t0x9c\n++#define RK3288_GRF_SOC_CON4\t\t0x254\n++#define RK3288_GRF_SOC_STATUS(n)\t(0x280 + (n) * 4)\n++#define RK3288_DFI_EN\t\t\t(0x30003 << 14)\n++#define RK3288_DFI_DIS\t\t\t(0x30000 << 14)\n++#define RK3288_LPDDR_SEL\t\t(0x10001 << 13)\n++#define RK3288_DDR3_SEL\t\t\t(0x10000 << 13)\n++\n++#define RK3328_GRF_OS_REG2\t\t0x5d0\n++\n++#define RK3368_GRF_DDRC0_CON0\t\t0x600\n++#define RK3368_GRF_SOC_STATUS5\t\t0x494\n++#define RK3368_GRF_SOC_STATUS6\t\t0x498\n++#define RK3368_GRF_SOC_STATUS8\t\t0x4a0\n++#define RK3368_GRF_SOC_STATUS9\t\t0x4a4\n++#define RK3368_GRF_SOC_STATUS10\t\t0x4a8\n++#define RK3368_DFI_EN\t\t\t(0x30003 << 5)\n++#define RK3368_DFI_DIS\t\t\t(0x30000 << 5)\n++\n++#define MAX_DMC_NUM_CH\t\t\t2\n++#define READ_DRAMTYPE_INFO(n)\t\t(((n) >> 13) & 0x7)\n++#define READ_CH_INFO(n)\t\t\t(((n) >> 28) & 0x3)\n+ /* DDRMON_CTRL */\n+-#define DDRMON_CTRL\t0x04\n+-#define CLR_DDRMON_CTRL\t(0x1f0000 << 0)\n+-#define LPDDR4_EN\t(0x10001 << 4)\n+-#define HARDWARE_EN\t(0x10001 << 3)\n+-#define LPDDR3_EN\t(0x10001 << 2)\n+-#define SOFTWARE_EN\t(0x10001 << 1)\n+-#define SOFTWARE_DIS\t(0x10000 << 1)\n+-#define TIME_CNT_EN\t(0x10001 << 0)\n++#define DDRMON_CTRL\t\t\t0x04\n++#define CLR_DDRMON_CTRL\t\t\t(0x3f0000 << 0)\n++#define DDR4_EN\t\t\t\t(0x10001 << 5)\n++#define LPDDR4_EN\t\t\t(0x10001 << 4)\n++#define HARDWARE_EN\t\t\t(0x10001 << 3)\n++#define LPDDR2_3_EN\t\t\t(0x10001 << 2)\n++#define SOFTWARE_EN\t\t\t(0x10001 << 1)\n++#define SOFTWARE_DIS\t\t\t(0x10000 << 1)\n++#define TIME_CNT_EN\t\t\t(0x10001 << 0)\n+ \n+ #define DDRMON_CH0_COUNT_NUM\t\t0x28\n+ #define DDRMON_CH0_DFI_ACCESS_NUM\t0x2c\n+ #define DDRMON_CH1_COUNT_NUM\t\t0x3c\n+ #define DDRMON_CH1_DFI_ACCESS_NUM\t0x40\n+ \n++/* pmu grf */\n++#define PMUGRF_OS_REG2\t\t\t0x308\n++\n++enum {\n++\tDDR4 = 0,\n++\tDDR3 = 3,\n++\tLPDDR2 = 5,\n++\tLPDDR3 = 6,\n++\tLPDDR4 = 7,\n++\tUNUSED = 0xFF\n++};\n++\n+ struct dmc_usage {\n+ \tu32 access;\n+ \tu32 total;\n+@@ -50,33 +91,261 @@ struct dmc_usage {\n+ struct rockchip_dfi {\n+ \tstruct devfreq_event_dev *edev;\n+ \tstruct devfreq_event_desc *desc;\n+-\tstruct dmc_usage ch_usage[RK3399_DMC_NUM_CH];\n++\tstruct dmc_usage ch_usage[MAX_DMC_NUM_CH];\n+ \tstruct device *dev;\n+ \tvoid __iomem *regs;\n+ \tstruct regmap *regmap_pmu;\n++\tstruct regmap *regmap_grf;\n++\tstruct regmap *regmap_pmugrf;\n+ \tstruct clk *clk;\n++\tu32 dram_type;\n++\t/*\n++\t * available mask, 1: available, 0: not available\n++\t * each bit represent a channel\n++\t */\n++\tu32 ch_msk;\n++};\n++\n++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_EN);\n++}\n++\n++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_DISB);\n++}\n++\n++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi_wr, dfi_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);\n++\n++\tedata->load_count = (dfi_wr + dfi_rd) * 4;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3128_dfi_ops = {\n++\t.disable = rk3128_dfi_disable,\n++\t.enable = rk3128_dfi_enable,\n++\t.get_event = rk3128_dfi_get_event,\n++\t.set_event = rk3128_dfi_set_event,\n++};\n++\n++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);\n++}\n++\n++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);\n++}\n++\n++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tu32 tmp, max = 0;\n++\tu32 i, busier_ch = 0;\n++\tu32 rd_count, wr_count, total_count;\n++\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\t/* Find out which channel is busier */\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);\n++\t\tinfo->ch_usage[i].access = (wr_count + rd_count) * 4;\n++\t\tinfo->ch_usage[i].total = total_count;\n++\t\ttmp = info->ch_usage[i].access;\n++\t\tif (tmp > max) {\n++\t\t\tbusier_ch = i;\n++\t\t\tmax = tmp;\n++\t\t}\n++\t}\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn busier_ch;\n++}\n++\n++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tint busier_ch;\n++\tunsigned long flags;\n++\n++\tlocal_irq_save(flags);\n++\tbusier_ch = rk3288_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n++\n++\tedata->load_count = info->ch_usage[busier_ch].access;\n++\tedata->total_count = info->ch_usage[busier_ch].total;\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3288_dfi_ops = {\n++\t.disable = rk3288_dfi_disable,\n++\t.enable = rk3288_dfi_enable,\n++\t.get_event = rk3288_dfi_get_event,\n++\t.set_event = rk3288_dfi_set_event,\n++};\n++\n++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);\n++}\n++\n++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);\n++}\n++\n++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);\n++\n++\tedata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3368_dfi_ops = {\n++\t.disable = rk3368_dfi_disable,\n++\t.enable = rk3368_dfi_enable,\n++\t.get_event = rk3368_dfi_get_event,\n++\t.set_event = rk3368_dfi_set_event,\n+ };\n+ \n+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tvoid __iomem *dfi_regs = info->regs;\n+-\tu32 val;\n+-\tu32 ddr_type;\n+-\n+-\t/* get ddr type */\n+-\tregmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);\n+-\tddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &\n+-\t\t    RK3399_PMUGRF_DDRTYPE_MASK;\n+ \n+ \t/* clear DDRMON_CTRL setting */\n+ \twritel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* set ddr type to dfi */\n+-\tif (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)\n+-\t\twritel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);\n+-\telse if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)\n++\tif (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)\n++\t\twritel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == LPDDR4)\n+ \t\twritel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == DDR4)\n++\t\twritel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* enable count, use software mode */\n+ \twritel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);\n+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st\n+ \trockchip_dfi_stop_hardware_counter(edev);\n+ \n+ \t/* Find out which channel is busier */\n+-\tfor (i = 0; i < RK3399_DMC_NUM_CH; i++) {\n+-\t\tinfo->ch_usage[i].access = readl_relaxed(dfi_regs +\n+-\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\n+ \t\tinfo->ch_usage[i].total = readl_relaxed(dfi_regs +\n+ \t\t\t\tDDRMON_CH0_COUNT_NUM + i * 20);\n+-\t\ttmp = info->ch_usage[i].access;\n++\n++\t\t/* LPDDR4 BL = 16,other DDR type BL = 8 */\n++\t\ttmp = readl_relaxed(dfi_regs +\n++\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20);\n++\t\tif (info->dram_type == LPDDR4)\n++\t\t\ttmp *= 8;\n++\t\telse\n++\t\t\ttmp *= 4;\n++\t\tinfo->ch_usage[i].access = tmp;\n++\n+ \t\tif (tmp > max) {\n+ \t\t\tbusier_ch = i;\n+ \t\t\tmax = tmp;\n+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \n+ \trockchip_dfi_stop_hardware_counter(edev);\n+-\tclk_disable_unprepare(info->clk);\n++\tif (info->clk)\n++\t\tclk_disable_unprepare(info->clk);\n+ \n+ \treturn 0;\n+ }\n+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint ret;\n+ \n+-\tret = clk_prepare_enable(info->clk);\n+-\tif (ret) {\n+-\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\", ret);\n+-\t\treturn ret;\n++\tif (info->clk) {\n++\t\tret = clk_prepare_enable(info->clk);\n++\t\tif (ret) {\n++\t\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\",\n++\t\t\t\tret);\n++\t\t\treturn ret;\n++\t\t}\n+ \t}\n+ \n+ \trockchip_dfi_start_hardware_counter(edev);\n+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint busier_ch;\n++\tunsigned long flags;\n+ \n++\tlocal_irq_save(flags);\n+ \tbusier_ch = rockchip_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n+ \n+ \tedata->load_count = info->ch_usage[busier_ch].access;\n+ \tedata->total_count = info->ch_usage[busier_ch].total;\n+@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro\n+ \t.set_event = rockchip_dfi_set_event,\n+ };\n+ \n+-static const struct of_device_id rockchip_dfi_id_match[] = {\n+-\t{ .compatible = \"rockchip,rk3399-dfi\" },\n+-\t{ },\n+-};\n+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++static __init int px30_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n+ \n+-static int rockchip_dfi_probe(struct platform_device *pdev)\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmugrf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmugrf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmugrf))\n++\t\t\treturn PTR_ERR(data->regmap_pmugrf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3128_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n+ {\n+-\tstruct device *dev = &pdev->dev;\n+-\tstruct rockchip_dfi *data;\n+-\tstruct devfreq_event_desc *desc;\n+ \tstruct device_node *np = pdev->dev.of_node, *node;\n+ \n+-\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n+-\tif (!data)\n+-\t\treturn -ENOMEM;\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tdesc->ops = &rk3128_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3288_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmu\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmu = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmu))\n++\t\t\treturn PTR_ERR(data->regmap_pmu);\n++\t}\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tif (data->dram_type == DDR3)\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_DDR3_SEL);\n++\telse\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_LPDDR_SEL);\n++\n++\tdesc->ops = &rk3288_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3368_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\n++\tif (!dev->parent || !dev->parent->of_node)\n++\t\treturn -EINVAL;\n++\n++\tdata->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);\n++\tif (IS_ERR(data->regmap_grf))\n++\t\treturn PTR_ERR(data->regmap_grf);\n++\n++\tdesc->ops = &rk3368_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rockchip_dfi_init(struct platform_device *pdev,\n++\t\t\t\t    struct rockchip_dfi *data,\n++\t\t\t\t    struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n+ \n+ \tdata->regs = devm_platform_ioremap_resource(pdev, 0);\n+ \tif (IS_ERR(data->regs))\n+@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla\n+ \t\tif (IS_ERR(data->regmap_pmu))\n+ \t\t\treturn PTR_ERR(data->regmap_pmu);\n+ \t}\n+-\tdata->dev = dev;\n++\n++\tregmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3328_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n++\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static const struct of_device_id rockchip_dfi_id_match[] = {\n++\t{ .compatible = \"rockchip,px30-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk1808-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk3128-dfi\", .data = rk3128_dfi_init },\n++\t{ .compatible = \"rockchip,rk3288-dfi\", .data = rk3288_dfi_init },\n++\t{ .compatible = \"rockchip,rk3328-dfi\", .data = rk3328_dfi_init },\n++\t{ .compatible = \"rockchip,rk3368-dfi\", .data = rk3368_dfi_init },\n++\t{ .compatible = \"rockchip,rk3399-dfi\", .data = rockchip_dfi_init },\n++\t{ },\n++};\n++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++\n++static int rockchip_dfi_probe(struct platform_device *pdev)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct rockchip_dfi *data;\n++\tstruct devfreq_event_desc *desc;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\tint (*init)(struct platform_device *pdev, struct rockchip_dfi *data,\n++\t\t    struct devfreq_event_desc *desc);\n++\n++\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n++\tif (!data)\n++\t\treturn -ENOMEM;\n+ \n+ \tdesc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);\n+ \tif (!desc)\n+ \t\treturn -ENOMEM;\n+ \n+-\tdesc->ops = &rockchip_dfi_ops;\n++\tmatch = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);\n++\tif (match) {\n++\t\tinit = match->data;\n++\t\tif (init) {\n++\t\t\tif (init(pdev, data, desc))\n++\t\t\t\treturn -EINVAL;\n++\t\t} else {\n++\t\t\treturn 0;\n++\t\t}\n++\t} else {\n++\t\treturn 0;\n++\t}\n++\n+ \tdesc->driver_data = data;\n+ \tdesc->name = np->name;\n+ \tdata->desc = desc;\n++\tdata->dev = dev;\n+ \n+-\tdata->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);\n++\tdata->edev = devm_devfreq_event_add_edev(dev, desc);\n+ \tif (IS_ERR(data->edev)) {\n+-\t\tdev_err(&pdev->dev,\n+-\t\t\t\"failed to add devfreq-event device\\n\");\n++\t\tdev_err(dev, \"failed to add devfreq-event device\\n\");\n+ \t\treturn PTR_ERR(data->edev);\n+ \t}\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nnew file mode 100644\nindex 0000000000..8a5222da22\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -0,0 +1,27 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[adjusted commit title]\n+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -1041,6 +1041,13 @@\n+ \t\t};\n+ \t};\n+ \n++\tdfi: dfi@ff790000 {\n++\t\treg = <0x00 0xff790000 0x00 0x400>;\n++\t\tcompatible = \"rockchip,rk3328-dfi\";\n++\t\trockchip,grf = <&grf>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nnew file mode 100644\nindex 0000000000..d93b9a77b2\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -0,0 +1,126 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++\n+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-\n+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++\n+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++\n+ 4 files changed, 617 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi\n+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h\n+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -7,6 +7,7 @@\n+ \n+ #include <dt-bindings/input/input.h>\n+ #include <dt-bindings/gpio/gpio.h>\n++#include \"rk3328-dram-nanopi2-timing.dtsi\"\n+ #include \"rk3328.dtsi\"\n+ \n+ / {\n+@@ -115,6 +116,72 @@\n+ \t\tregulator-min-microvolt = <5000000>;\n+ \t\tregulator-max-microvolt = <5000000>;\n+ \t};\n++\n++\tdmc: dmc {\n++\t\tcompatible = \"rockchip,rk3328-dmc\";\n++\t\tdevfreq-events = <&dfi>;\n++\t\tcenter-supply = <&vdd_log>;\n++\t\tclocks = <&cru SCLK_DDRCLK>;\n++\t\tclock-names = \"dmc_clk\";\n++\t\toperating-points-v2 = <&dmc_opp_table>;\n++\t\tddr_timing = <&ddr_timing>;\n++\t\tupthreshold = <40>;\n++\t\tdowndifferential = <20>;\n++\t\tauto-min-freq = <786000>;\n++\t\tauto-freq-en = <0>;\n++\t\t#cooling-cells = <2>;\n++\t\tstatus = \"okay\";\n++\n++\t\tddr_power_model: ddr_power_model {\n++\t\t\tcompatible = \"ddr_power_model\";\n++\t\t\tdynamic-power-coefficient = <120>;\n++\t\t\tstatic-power-coefficient = <200>;\n++\t\t\tts = <32000 4700 (-80) 2>;\n++\t\t\tthermal-zone = \"soc-thermal\";\n++\t\t};\n++\t};\n++\n++\tdmc_opp_table: dmc-opp-table {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\trockchip,leakage-voltage-sel = <\n++\t\t\t1   10    0\n++\t\t\t11  254   1\n++\t\t>;\n++\t\tnvmem-cells = <&logic_leakage>;\n++\t\tnvmem-cell-names = \"ddr_leakage\";\n++\n++\t\topp-786000000 {\n++\t\t\topp-hz = /bits/ 64 <786000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-798000000 {\n++\t\t\topp-hz = /bits/ 64 <798000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-840000000 {\n++\t\t\topp-hz = /bits/ 64 <840000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-924000000 {\n++\t\t\topp-hz = /bits/ 64 <924000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t\topp-microvolt-L0 = <1100000>;\n++\t\t\topp-microvolt-L1 = <1075000>;\n++\t\t};\n++\t\topp-1056000000 {\n++\t\t\topp-hz = /bits/ 64 <1056000000>;\n++\t\t\topp-microvolt = <1175000>;\n++\t\t\topp-microvolt-L0 = <1175000>;\n++\t\t\topp-microvolt-L1 = <1150000>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -137,6 +204,10 @@\n+ \tstatus = \"disabled\";\n+ };\n+ \n++&dfi {\n++\tstatus = \"okay\";\n++};\n++\n+ &gmac2io {\n+ \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n+ \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n+@@ -202,6 +273,7 @@\n+ \t\t\t\tregulator-name = \"vdd_log\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1075000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n+@@ -216,6 +288,7 @@\n+ \t\t\t\tregulator-name = \"vdd_arm\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1225000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/0004-add-new-rk33xx-support-k510.patch",
    "content": "From 9a8da8467bb9d616cfc5fc26408ca6cf973271cf Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 11 Jun 2021 17:42:43 +0800\nSubject: [PATCH] add new rk33xx support k510\n\n\tnew file:   target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n\tnew file:   target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n\tmodified:   target/linux/rockchip/armv8/config-5.10\n\tnew file:   target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n\tnew file:   target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n\tnew file:   target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n\tnew file:   target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n\tnew file:   target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n\tnew file:   target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n\tnew file:   target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n---\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |  38 +++\n ...k-events-support-multiple-registrant.patch | 291 ++++++++++++++++++\n target/linux/rockchip/armv8/config-5.10       |  51 ++-\n ...dd-compatible-to-NanoPi-R2S-ethernet.patch |  25 ++\n ...d-OF-node-for-pcie-eth-on-NanoPi-R4S.patch |  22 ++\n ...-initial-signal-voltage-on-power-off.patch |  35 +++\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 ++\n ...adjust-default-coherent_pool-to-2MiB.patch |  28 ++\n ...ip-add-more-cpu-operating-points-for.patch |  44 +++\n ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 182 +++++++++++\n 10 files changed, 737 insertions(+), 1 deletion(-)\n create mode 100644 target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n create mode 100644 target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n create mode 100644 target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n create mode 100644 target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n create mode 100644 target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n create mode 100644 target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n\ndiff --git a/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..2664758304\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -139,9 +139,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..b9743c9681\n--- /dev/null\n+++ b/target/linux/generic/hack-5.10/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,291 @@\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -112,7 +112,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -136,6 +136,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2744,6 +2744,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&ctnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,13 +703,20 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nfgenmsg *nfmsg;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3784,9 +3791,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/rockchip/armv8/config-5.10 b/target/linux/rockchip/armv8/config-5.10\nindex 734530a9c7..42e9eedc4c 100644\n--- a/target/linux/rockchip/armv8/config-5.10\n+++ b/target/linux/rockchip/armv8/config-5.10\n@@ -18,6 +18,7 @@ CONFIG_ARC_EMAC_CORE=y\n CONFIG_ARM64=y\n CONFIG_ARM64_4K_PAGES=y\n CONFIG_ARM64_CNP=y\n+CONFIG_ARM64_CRYPTO=y\n # CONFIG_ARM64_ERRATUM_1165522 is not set\n # CONFIG_ARM64_ERRATUM_1286807 is not set\n # CONFIG_ARM64_ERRATUM_1418040 is not set\n@@ -61,6 +62,7 @@ CONFIG_ARM_MHU=y\n CONFIG_ARM_PSCI_CPUIDLE=y\n CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y\n CONFIG_ARM_PSCI_FW=y\n+CONFIG_ARM_RK3328_DMC_DEVFREQ=y\n # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set\n # CONFIG_ARM_SCMI_PROTOCOL is not set\n CONFIG_ARM_SCPI_CPUFREQ=y\n@@ -158,18 +160,63 @@ CONFIG_CRC_T10DIF=y\n CONFIG_CROSS_MEMORY_ATTACH=y\n CONFIG_CRYPTO_AEAD=y\n CONFIG_CRYPTO_AEAD2=y\n+CONFIG_CRYPTO_AES_ARM64=y\n+CONFIG_CRYPTO_AES_ARM64_BS=y\n+CONFIG_CRYPTO_AES_ARM64_CE=y\n+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y\n+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y\n+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y\n+CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y\n+CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y\n+CONFIG_CRYPTO_CCM=y\n+CONFIG_CRYPTO_CHACHA20_NEON=y\n CONFIG_CRYPTO_CRC32=y\n CONFIG_CRYPTO_CRC32C=y\n CONFIG_CRYPTO_CRCT10DIF=y\n+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y\n+CONFIG_CRYPTO_CRYPTD=y\n+CONFIG_CRYPTO_CTR=y\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_GCM=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_GHASH=y\n+CONFIG_CRYPTO_GHASH_ARM64_CE=y\n # CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n CONFIG_CRYPTO_HASH=y\n CONFIG_CRYPTO_HASH2=y\n+CONFIG_CRYPTO_HMAC=y\n+CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y\n+CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y\n+CONFIG_CRYPTO_LIB_SHA256=y\n CONFIG_CRYPTO_MANAGER=y\n CONFIG_CRYPTO_MANAGER2=y\n+CONFIG_CRYPTO_NHPOLY1305=y\n+CONFIG_CRYPTO_NHPOLY1305_NEON=y\n+CONFIG_CRYPTO_NULL=y\n CONFIG_CRYPTO_NULL2=y\n+CONFIG_CRYPTO_POLY1305_NEON=y\n+CONFIG_CRYPTO_RNG=y\n CONFIG_CRYPTO_RNG2=y\n+CONFIG_CRYPTO_SHA1=y\n+CONFIG_CRYPTO_SHA1_ARM64_CE=y\n+CONFIG_CRYPTO_SHA256=y\n+CONFIG_CRYPTO_SHA256_ARM64=y\n+CONFIG_CRYPTO_SHA2_ARM64_CE=y\n+CONFIG_CRYPTO_SHA3=y\n+CONFIG_CRYPTO_SHA3_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64=y\n+CONFIG_CRYPTO_SHA512_ARM64_CE=y\n+CONFIG_CRYPTO_SIMD=y\n+CONFIG_CRYPTO_SM3=y\n+CONFIG_CRYPTO_SM3_ARM64_CE=y\n+CONFIG_CRYPTO_SM4=y\n+CONFIG_CRYPTO_SM4_ARM64_CE=y\n CONFIG_DCACHE_WORD_ACCESS=y\n CONFIG_DEBUG_BUGVERBOSE=y\n+CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y\n # CONFIG_DEVFREQ_GOV_PASSIVE is not set\n CONFIG_DEVFREQ_GOV_PERFORMANCE=y\n CONFIG_DEVFREQ_GOV_POWERSAVE=y\n@@ -271,6 +318,8 @@ CONFIG_HUGETLB_PAGE=y\n CONFIG_HWMON=y\n CONFIG_HWSPINLOCK=y\n CONFIG_HW_CONSOLE=y\n+CONFIG_HW_RANDOM=y\n+CONFIG_HW_RANDOM_ROCKCHIP=y\n CONFIG_I2C=y\n CONFIG_I2C_BOARDINFO=y\n CONFIG_I2C_CHARDEV=y\n@@ -450,7 +499,7 @@ CONFIG_PLATFORM_MHU=y\n CONFIG_PM=y\n CONFIG_PM_CLK=y\n CONFIG_PM_DEVFREQ=y\n-# CONFIG_PM_DEVFREQ_EVENT is not set\n+CONFIG_PM_DEVFREQ_EVENT=y\n CONFIG_PM_GENERIC_DOMAINS=y\n CONFIG_PM_GENERIC_DOMAINS_OF=y\n CONFIG_PM_OPP=y\ndiff --git a/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch b/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\nnew file mode 100644\nindex 0000000000..085dd392c9\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/006-rockchip-rk3328-add-compatible-to-NanoPi-R2S-ethernet.patch\n@@ -0,0 +1,25 @@\n+From bc6c96d850419e71dbc9b0094ccc9b668ba9be43 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Mon, 28 Sep 2020 22:54:52 +0200\n+Subject: [PATCH] rockchip: rk3328: add compatible to NanoPi R2S ethernet PHY\n+\n+This adds the compatible property to the NanoPi R2S ethernet PHY node.\n+Otherwise, the PHY might not be probed, as the PHY ID reads all 0xff\n+when it is still in reset.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -138,6 +138,8 @@\n+ \t\t#size-cells = <0>;\n+ \n+ \t\trtl8211e: ethernet-phy@1 {\n++\t\t\tcompatible = \"ethernet-phy-id001c.c915\",\n++\t\t\t\t     \"ethernet-phy-ieee802.3-c22\";\n+ \t\t\treg = <1>;\n+ \t\t\tpinctrl-0 = <&eth_phy_reset_pin>;\n+ \t\t\tpinctrl-names = \"default\";\ndiff --git a/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\nnew file mode 100644\nindex 0000000000..028deca248\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n@@ -0,0 +1,22 @@\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -83,6 +83,19 @@\n+ \tmax-link-speed = <1>;\n+ \tnum-lanes = <1>;\n+ \tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\n++\t\tpcie-eth@0,0 {\n++\t\t\tcompatible = \"realtek,r8168\";\n++\t\t\treg = <0x000000 0 0 0 0>;\n++\n++\t\t\trealtek,led-data = <0x870>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &pinctrl {\ndiff --git a/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..2a0f8d9bd0\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1351,6 +1351,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..edf007eefa\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -169,6 +169,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..f589ce2a7b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -192,13 +192,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..c85da5fb07\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tamba: bus {\ndiff --git a/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..0ea189b886\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,182 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,152 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1125000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1225000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1275000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1325000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \tchosen {\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/0006-support-rk33xx-HWRNG.patch",
    "content": "From 20a000fb007a9b79bca43304689bd4813784ae78 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Fri, 11 Jun 2021 22:56:28 +0800\nSubject: [PATCH] support-rk33xx-HWRNG\n\n---\n .../drivers/char/hw_random/rockchip-rng.c     | 340 ++++++++++++++++++\n ...-for-rockchip-hardware-random-number.patch |  45 +++\n ...ip-add-hardware-random-number-genera.patch |  50 +++\n 3 files changed, 435 insertions(+)\n create mode 100644 target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\n create mode 100644 target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n create mode 100644 target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n\ndiff --git a/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c b/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\nnew file mode 100644\nindex 0000000000..bdc3578d4d\n--- /dev/null\n+++ b/target/linux/rockchip/files/drivers/char/hw_random/rockchip-rng.c\n@@ -0,0 +1,340 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * rockchip-rng.c Random Number Generator driver for the Rockchip\n+ *\n+ * Copyright (c) 2018, Fuzhou Rockchip Electronics Co., Ltd.\n+ * Author: Lin Jinhan <troy.lin@rock-chips.com>\n+ *\n+ */\n+#include <linux/clk.h>\n+#include <linux/hw_random.h>\n+#include <linux/iopoll.h>\n+#include <linux/module.h>\n+#include <linux/mod_devicetable.h>\n+#include <linux/of.h>\n+#include <linux/platform_device.h>\n+#include <linux/pm_runtime.h>\n+\n+#define _SBF(s, v)\t((v) << (s))\n+#define HIWORD_UPDATE(val, mask, shift) \\\n+\t\t\t((val) << (shift) | (mask) << ((shift) + 16))\n+\n+#define ROCKCHIP_AUTOSUSPEND_DELAY\t\t100\n+#define ROCKCHIP_POLL_PERIOD_US\t\t\t100\n+#define ROCKCHIP_POLL_TIMEOUT_US\t\t10000\n+#define RK_MAX_RNG_BYTE\t\t\t\t(32)\n+\n+/* start of CRYPTO V1 register define */\n+#define CRYPTO_V1_CTRL\t\t\t\t0x0008\n+#define CRYPTO_V1_RNG_START\t\t\tBIT(8)\n+#define CRYPTO_V1_RNG_FLUSH\t\t\tBIT(9)\n+\n+#define CRYPTO_V1_TRNG_CTRL\t\t\t0x0200\n+#define CRYPTO_V1_OSC_ENABLE\t\t\tBIT(16)\n+#define CRYPTO_V1_TRNG_SAMPLE_PERIOD(x)\t\t(x)\n+\n+#define CRYPTO_V1_TRNG_DOUT_0\t\t\t0x0204\n+/* end of CRYPTO V1 register define */\n+\n+/* start of CRYPTO V2 register define */\n+#define CRYPTO_V2_RNG_CTL\t\t\t0x0400\n+#define CRYPTO_V2_RNG_64_BIT_LEN\t\t_SBF(4, 0x00)\n+#define CRYPTO_V2_RNG_128_BIT_LEN\t\t_SBF(4, 0x01)\n+#define CRYPTO_V2_RNG_192_BIT_LEN\t\t_SBF(4, 0x02)\n+#define CRYPTO_V2_RNG_256_BIT_LEN\t\t_SBF(4, 0x03)\n+#define CRYPTO_V2_RNG_FATESY_SOC_RING\t\t_SBF(2, 0x00)\n+#define CRYPTO_V2_RNG_SLOWER_SOC_RING_0\t\t_SBF(2, 0x01)\n+#define CRYPTO_V2_RNG_SLOWER_SOC_RING_1\t\t_SBF(2, 0x02)\n+#define CRYPTO_V2_RNG_SLOWEST_SOC_RING\t\t_SBF(2, 0x03)\n+#define CRYPTO_V2_RNG_ENABLE\t\t\tBIT(1)\n+#define CRYPTO_V2_RNG_START\t\t\tBIT(0)\n+#define CRYPTO_V2_RNG_SAMPLE_CNT\t\t0x0404\n+#define CRYPTO_V2_RNG_DOUT_0\t\t\t0x0410\n+/* end of CRYPTO V2 register define */\n+\n+struct rk_rng_soc_data {\n+\tconst char * const *clks;\n+\tint clks_num;\n+\tint (*rk_rng_read)(struct hwrng *rng, void *buf, size_t max, bool wait);\n+};\n+\n+struct rk_rng {\n+\tstruct device\t\t*dev;\n+\tstruct hwrng\t\trng;\n+\tvoid __iomem\t\t*mem;\n+\tstruct rk_rng_soc_data\t*soc_data;\n+\tu32\t\t\tclk_num;\n+\tstruct clk_bulk_data\t*clk_bulks;\n+};\n+\n+static const char * const rk_rng_v1_clks[] = {\n+\t\"hclk_crypto\",\n+\t\"clk_crypto\",\n+};\n+\n+static const char * const rk_rng_v2_clks[] = {\n+\t\"hclk_crypto\",\n+\t\"aclk_crypto\",\n+\t\"clk_crypto\",\n+\t\"clk_crypto_apk\",\n+};\n+\n+static void rk_rng_writel(struct rk_rng *rng, u32 val, u32 offset)\n+{\n+\t__raw_writel(val, rng->mem + offset);\n+}\n+\n+static u32 rk_rng_readl(struct rk_rng *rng, u32 offset)\n+{\n+\treturn __raw_readl(rng->mem + offset);\n+}\n+\n+static int rk_rng_init(struct hwrng *rng)\n+{\n+\tint ret;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tdev_dbg(rk_rng->dev, \"clk_bulk_prepare_enable.\\n\");\n+\n+\tret = clk_bulk_prepare_enable(rk_rng->clk_num, rk_rng->clk_bulks);\n+\tif (ret < 0) {\n+\t\tdev_err(rk_rng->dev, \"failed to enable clks %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void rk_rng_cleanup(struct hwrng *rng)\n+{\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tdev_dbg(rk_rng->dev, \"clk_bulk_disable_unprepare.\\n\");\n+\tclk_bulk_disable_unprepare(rk_rng->clk_num, rk_rng->clk_bulks);\n+}\n+\n+static void rk_rng_read_regs(struct rk_rng *rng, u32 offset, void *buf,\n+\t\t\t     size_t size)\n+{\n+\tu32 i;\n+\n+\tfor (i = 0; i < size; i += 4)\n+\t\t*(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));\n+}\n+\n+static int rk_rng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n+{\n+\tint ret = 0;\n+\tu32 reg_ctrl = 0;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tret = pm_runtime_get_sync(rk_rng->dev);\n+\tif (ret < 0) {\n+\t\tpm_runtime_put_noidle(rk_rng->dev);\n+\t\treturn ret;\n+\t}\n+\n+\t/* enable osc_ring to get entropy, sample period is set as 100 */\n+\treg_ctrl = CRYPTO_V1_OSC_ENABLE | CRYPTO_V1_TRNG_SAMPLE_PERIOD(100);\n+\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_TRNG_CTRL);\n+\n+\treg_ctrl = HIWORD_UPDATE(CRYPTO_V1_RNG_START, CRYPTO_V1_RNG_START, 0);\n+\n+\trk_rng_writel(rk_rng, reg_ctrl, CRYPTO_V1_CTRL);\n+\n+\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V1_CTRL, reg_ctrl,\n+\t\t\t\t !(reg_ctrl & CRYPTO_V1_RNG_START),\n+\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n+\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n+\tif (ret < 0)\n+\t\tgoto out;\n+\n+\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n+\n+\trk_rng_read_regs(rk_rng, CRYPTO_V1_TRNG_DOUT_0, buf, ret);\n+\n+out:\n+\t/* close TRNG */\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, CRYPTO_V1_RNG_START, 0),\n+\t\t      CRYPTO_V1_CTRL);\n+\n+\tpm_runtime_mark_last_busy(rk_rng->dev);\n+\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n+\n+\treturn ret;\n+}\n+\n+static int rk_rng_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)\n+{\n+\tint ret = 0;\n+\tu32 reg_ctrl = 0;\n+\tstruct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);\n+\n+\tret = pm_runtime_get_sync(rk_rng->dev);\n+\tif (ret < 0) {\n+\t\tpm_runtime_put_noidle(rk_rng->dev);\n+\t\treturn ret;\n+\t}\n+\n+\t/* enable osc_ring to get entropy, sample period is set as 100 */\n+\trk_rng_writel(rk_rng, 100, CRYPTO_V2_RNG_SAMPLE_CNT);\n+\n+\treg_ctrl |= CRYPTO_V2_RNG_256_BIT_LEN;\n+\treg_ctrl |= CRYPTO_V2_RNG_SLOWER_SOC_RING_0;\n+\treg_ctrl |= CRYPTO_V2_RNG_ENABLE;\n+\treg_ctrl |= CRYPTO_V2_RNG_START;\n+\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0),\n+\t\t\tCRYPTO_V2_RNG_CTL);\n+\n+\tret = readl_poll_timeout(rk_rng->mem + CRYPTO_V2_RNG_CTL, reg_ctrl,\n+\t\t\t\t !(reg_ctrl & CRYPTO_V2_RNG_START),\n+\t\t\t\t ROCKCHIP_POLL_PERIOD_US,\n+\t\t\t\t ROCKCHIP_POLL_TIMEOUT_US);\n+\tif (ret < 0)\n+\t\tgoto out;\n+\n+\tret = min_t(size_t, max, RK_MAX_RNG_BYTE);\n+\n+\trk_rng_read_regs(rk_rng, CRYPTO_V2_RNG_DOUT_0, buf, ret);\n+\n+out:\n+\t/* close TRNG */\n+\trk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), CRYPTO_V2_RNG_CTL);\n+\n+\tpm_runtime_mark_last_busy(rk_rng->dev);\n+\tpm_runtime_put_sync_autosuspend(rk_rng->dev);\n+\n+\treturn ret;\n+}\n+\n+static const struct rk_rng_soc_data rk_rng_v1_soc_data = {\n+\t.clks_num = ARRAY_SIZE(rk_rng_v1_clks),\n+\t.clks = rk_rng_v1_clks,\n+\t.rk_rng_read = rk_rng_v1_read,\n+};\n+\n+static const struct rk_rng_soc_data rk_rng_v2_soc_data = {\n+\t.clks_num = ARRAY_SIZE(rk_rng_v2_clks),\n+\t.clks = rk_rng_v2_clks,\n+\t.rk_rng_read = rk_rng_v2_read,\n+};\n+\n+static const struct of_device_id rk_rng_dt_match[] = {\n+\t{\n+\t\t.compatible = \"rockchip,cryptov1-rng\",\n+\t\t.data = (void *)&rk_rng_v1_soc_data,\n+\t},\n+\t{\n+\t\t.compatible = \"rockchip,cryptov2-rng\",\n+\t\t.data = (void *)&rk_rng_v2_soc_data,\n+\t},\n+\t{ },\n+};\n+\n+MODULE_DEVICE_TABLE(of, rk_rng_dt_match);\n+\n+static int rk_rng_probe(struct platform_device *pdev)\n+{\n+\tint i;\n+\tint ret;\n+\tstruct rk_rng *rk_rng;\n+\tstruct device_node *np = pdev->dev.of_node;\n+\tconst struct of_device_id *match;\n+\n+\tdev_dbg(&pdev->dev, \"probing...\\n\");\n+\trk_rng = devm_kzalloc(&pdev->dev, sizeof(struct rk_rng), GFP_KERNEL);\n+\tif (!rk_rng)\n+\t\treturn -ENOMEM;\n+\n+\tmatch = of_match_node(rk_rng_dt_match, np);\n+\trk_rng->soc_data = (struct rk_rng_soc_data *)match->data;\n+\n+\trk_rng->dev = &pdev->dev;\n+\trk_rng->rng.name    = \"rockchip\";\n+#ifndef CONFIG_PM\n+\trk_rng->rng.init    = rk_rng_init;\n+\trk_rng->rng.cleanup = rk_rng_cleanup,\n+#endif\n+\trk_rng->rng.read    = rk_rng->soc_data->rk_rng_read;\n+\trk_rng->rng.quality = 1000;\n+\n+\trk_rng->clk_bulks =\n+\t\tdevm_kzalloc(&pdev->dev, sizeof(*rk_rng->clk_bulks) *\n+\t\t\t     rk_rng->soc_data->clks_num, GFP_KERNEL);\n+\n+\trk_rng->clk_num = rk_rng->soc_data->clks_num;\n+\n+\tfor (i = 0; i < rk_rng->soc_data->clks_num; i++)\n+\t\trk_rng->clk_bulks[i].id = rk_rng->soc_data->clks[i];\n+\n+\trk_rng->mem = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL);\n+\tif (IS_ERR(rk_rng->mem))\n+\t\treturn PTR_ERR(rk_rng->mem);\n+\n+\tret = devm_clk_bulk_get(&pdev->dev, rk_rng->clk_num,\n+\t\t\t\trk_rng->clk_bulks);\n+\tif (ret) {\n+\t\tdev_err(&pdev->dev, \"failed to get clks property\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tplatform_set_drvdata(pdev, rk_rng);\n+\n+\tpm_runtime_set_autosuspend_delay(&pdev->dev,\n+\t\t\t\t\tROCKCHIP_AUTOSUSPEND_DELAY);\n+\tpm_runtime_use_autosuspend(&pdev->dev);\n+\tpm_runtime_enable(&pdev->dev);\n+\n+\tret = devm_hwrng_register(&pdev->dev, &rk_rng->rng);\n+\tif (ret) {\n+\t\tpm_runtime_dont_use_autosuspend(&pdev->dev);\n+\t\tpm_runtime_disable(&pdev->dev);\n+\t}\n+\n+\treturn ret;\n+}\n+\n+#ifdef CONFIG_PM\n+static int rk_rng_runtime_suspend(struct device *dev)\n+{\n+\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n+\n+\trk_rng_cleanup(&rk_rng->rng);\n+\n+\treturn 0;\n+}\n+\n+static int rk_rng_runtime_resume(struct device *dev)\n+{\n+\tstruct rk_rng *rk_rng = dev_get_drvdata(dev);\n+\n+\treturn rk_rng_init(&rk_rng->rng);\n+}\n+\n+static const struct dev_pm_ops rk_rng_pm_ops = {\n+\tSET_RUNTIME_PM_OPS(rk_rng_runtime_suspend,\n+\t\t\t\trk_rng_runtime_resume, NULL)\n+\tSET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,\n+\t\t\t\tpm_runtime_force_resume)\n+};\n+\n+#endif\n+\n+static struct platform_driver rk_rng_driver = {\n+\t.driver\t= {\n+\t\t.name\t= \"rockchip-rng\",\n+#ifdef CONFIG_PM\n+\t\t.pm\t= &rk_rng_pm_ops,\n+#endif\n+\t\t.of_match_table = rk_rng_dt_match,\n+\t},\n+\t.probe\t= rk_rng_probe,\n+};\n+\n+module_platform_driver(rk_rng_driver);\n+\n+MODULE_DESCRIPTION(\"ROCKCHIP H/W Random Number Generator driver\");\n+MODULE_AUTHOR(\"Lin Jinhan <troy.lin@rock-chips.com>\");\n+MODULE_LICENSE(\"GPL v2\");\n+\ndiff --git a/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..16ca6279e7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -398,6 +398,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -36,6 +36,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..4f18b5c8d5\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -297,6 +297,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1905,6 +1905,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/0007-optimize_for_rk3399.patch",
    "content": "diff --git a/include/target.mk b/include/target.mk\nindex edc6a146de..e7217c6181 100644\n--- a/include/target.mk\n+++ b/include/target.mk\n@@ -191,7 +191,7 @@ LINUX_RECONF_DIFF = $(SCRIPT_DIR)/kconfig.pl - '>' $(call __linux_confcmd,$(filt\n ifeq ($(DUMP),1)\n   BuildTarget=$(BuildTargets/DumpCurrent)\n \n-  CPU_CFLAGS = -Os -pipe\n+  CPU_CFLAGS = -O3 -pipe\n   ifneq ($(findstring mips,$(ARCH)),)\n     ifneq ($(findstring mips64,$(ARCH)),)\n       CPU_TYPE ?= mips64\n@@ -232,7 +232,7 @@ ifeq ($(DUMP),1)\n   endif\n   ifeq ($(ARCH),aarch64)\n     CPU_TYPE ?= generic\n-    CPU_CFLAGS_generic = -mcpu=generic\n+    CPU_CFLAGS_generic = -march=armv8-a+crypto+crc -mcpu=cortex-a72.cortex-a53+crypto+crc -mtune=cortex-a72.cortex-a53\n     CPU_CFLAGS_cortex-a53 = -mcpu=cortex-a53\n   endif\n   ifeq ($(ARCH),arc)\n"
  },
  {
    "path": "patches/0008-mbedtls-Implements-AES-and-GCM-with-ARMv8-Crypto-Ext.patch",
    "content": "From 9fcf01be4e89e72887b58253ba5d2b2601bad7dc Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Tue, 9 Mar 2021 10:21:17 +0800\nSubject: [PATCH] mbedtls: Implements AES and GCM with ARMv8 Crypto Extensions\n A compact patch that provides AES and GCM implementations that utilize the\n ARMv8 Crypto Extensions. The config flag is MBEDTLS_ARMV8CE_AES_C, which is\n disabled by default as we don't do runtime checking for the feature. The new\n implementation lives in armv8ce_aes.c.\n\nProvides similar functionality to https://github.com/ARMmbed/mbedtls/pull/432\nThanks to Barry O'Rourke and others for that contribtion.\n\nTested on a Cortex A53 device and QEMU. On a midrange phone the real AES-GCM\nthroughput increases about 4x, while raw AES speed is up to 10x faster.\n\n[updated Makefile to enable this function, adjusted commit message]\nSigned-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n\tmodified:   package/libs/mbedtls/Makefile\n\tnew file:   package/libs/mbedtls/patches/100-Implements-AES-and-GCM-with-ARMv8-Crypto-Extensions.patch\n---\n package/libs/mbedtls/Makefile                 |  19 +\n ...and-GCM-with-ARMv8-Crypto-Extensions.patch | 401 ++++++++++++++++++\n 2 files changed, 420 insertions(+)\n create mode 100644 package/libs/mbedtls/patches/100-Implements-AES-and-GCM-with-ARMv8-Crypto-Extensions.patch\n\ndiff --git a/package/libs/mbedtls/Makefile b/package/libs/mbedtls/Makefile\nindex 43cc8b05b7..8a72f3d012 100644\n--- a/package/libs/mbedtls/Makefile\n+++ b/package/libs/mbedtls/Makefile\n@@ -23,6 +23,7 @@ PKG_CPE_ID:=cpe:/a:arm:mbed_tls\n \n PKG_CONFIG_DEPENDS := \\\n \tCONFIG_LIBMBEDTLS_DEBUG_C \\\n+\tCONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES \\\n \tCONFIG_LIBMBEDTLS_HKDF_C\n \n include $(INCLUDE_DIR)/package.mk\n@@ -60,6 +61,20 @@ config LIBMBEDTLS_DEBUG_C\n \n \t Usually, you don't need this, so don't select this if you're unsure.\n \n+config LIBMBEDTLS_HAVE_ARMV8CE_AES\n+\tdepends on PACKAGE_libmbedtls\n+\tbool\n+\tdefault y\n+\tprompt \"Enable use of the ARMv8 Crypto Extensions\"\n+\tdepends on aarch64 && !TARGET_bcm27xx && !TARGET_bcm4908\n+\thelp\n+\t Use of the ARMv8 Crypto Extensions greatly increase performance\n+\t (up to 4x faster on AES-GCM while 10x faster on raw AES).\n+\n+\t Related instructions should be included in all modern Aarch64\n+\t devices, except some wastes like Broadcom.\n+\t If you don't sure, say Y here.\n+\n config LIBMBEDTLS_HKDF_C\n \tdepends on PACKAGE_libmbedtls\n \tbool \"Enable the HKDF algorithm (RFC 5869)\"\n@@ -92,6 +107,9 @@ PKG_INSTALL:=1\n \n TARGET_CFLAGS += -ffunction-sections -fdata-sections\n TARGET_CFLAGS := $(filter-out -O%,$(TARGET_CFLAGS))\n+ifneq ($(CONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES),)\n+  TARGET_CFLAGS := $(filter-out -march=%,$(TARGET_CFLAGS)) -march=armv8-a+crypto\n+endif\n \n CMAKE_OPTIONS += \\\n \t-DUSE_SHARED_MBEDTLS_LIBRARY:Bool=ON \\\n@@ -103,6 +121,7 @@ define Build/Configure\n \n \tawk 'BEGIN { rc = 1 } \\\n \t     /#define MBEDTLS_DEBUG_C/ { $$$$0 = \"$(if $(CONFIG_LIBMBEDTLS_DEBUG_C),,// )#define MBEDTLS_DEBUG_C\"; rc = 0 } \\\n+\t     /#define MBEDTLS_ARMV8CE_AES_C/ { $$$$0 = \"$(if $(CONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES),,// )#define MBEDTLS_ARMV8CE_AES_C\"; rc = 0 } \\\n \t     { print } \\\n \t     END { exit(rc) }' $(PKG_BUILD_DIR)/include/mbedtls/config.h \\\n \t     >$(PKG_BUILD_DIR)/include/mbedtls/config.h.new && \\\ndiff --git a/package/libs/mbedtls/patches/100-Implements-AES-and-GCM-with-ARMv8-Crypto-Extensions.patch b/package/libs/mbedtls/patches/100-Implements-AES-and-GCM-with-ARMv8-Crypto-Extensions.patch\nnew file mode 100644\nindex 0000000000..b6531181f0\n--- /dev/null\n+++ b/package/libs/mbedtls/patches/100-Implements-AES-and-GCM-with-ARMv8-Crypto-Extensions.patch\n@@ -0,0 +1,401 @@\n+From dfb6015ca79a9fee28f7fcb0af7e350a83574b83 Mon Sep 17 00:00:00 2001\n+From: \"Markku-Juhani O. Saarinen\" <mjos@mjos.fi>\n+Date: Mon, 20 Nov 2017 14:58:41 +0000\n+Subject: Implements AES and GCM with ARMv8 Crypto Extensions\n+\n+A compact patch that provides AES and GCM implementations that utilize the\n+ARMv8 Crypto Extensions. The config flag is MBEDTLS_ARMV8CE_AES_C, which\n+is disabled by default as we don't do runtime checking for the feature.\n+The new implementation lives in armv8ce_aes.c.\n+\n+Provides similar functionality to https://github.com/ARMmbed/mbedtls/pull/432\n+Thanks to Barry O'Rourke and others for that contribtion.\n+\n+Tested on a Cortex A53 device and QEMU. On a midrange phone the real AES-GCM\n+throughput increases about 4x, while raw AES speed is up to 10x faster.\n+\n+When cross-compiling, you want to set something like:\n+\n+  export CC='aarch64-linux-gnu-gcc'\n+  export CFLAGS='-Ofast -march=armv8-a+crypto'\n+  scripts/config.pl set MBEDTLS_ARMV8CE_AES_C\n+\n+QEMU seems to also need\n+\n+  export LDFLAGS='-static'\n+\n+Then run normal make or cmake etc.\n+---\n+\n+diff -ruNa --binary a/ChangeLog.d/armv8_crypto_extensions.txt b/ChangeLog.d/armv8_crypto_extensions.txt\n+--- a/ChangeLog.d/armv8_crypto_extensions.txt\t1970-01-01 08:00:00.000000000 +0800\n++++ b/ChangeLog.d/armv8_crypto_extensions.txt\t2021-03-07 15:07:17.781911791 +0800\n+@@ -0,0 +1,2 @@\n++Features\n++    * Support ARMv8 Cryptography Extensions for AES and GCM.\n+diff -ruNa --binary a/include/mbedtls/armv8ce_aes.h b/include/mbedtls/armv8ce_aes.h\n+--- a/include/mbedtls/armv8ce_aes.h\t1970-01-01 08:00:00.000000000 +0800\n++++ b/include/mbedtls/armv8ce_aes.h\t2021-03-07 15:07:17.781911791 +0800\n+@@ -0,0 +1,63 @@\n++/**\n++ * \\file armv8ce_aes.h\n++ *\n++ * \\brief ARMv8 Cryptography Extensions -- Optimized code for AES and GCM\n++ */\n++\n++/*\n++ *\n++ *  Copyright (C) 2006-2017, ARM Limited, All Rights Reserved\n++ *  SPDX-License-Identifier: Apache-2.0\n++ *\n++ *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n++ *  not use this file except in compliance with the License.\n++ *  You may obtain a copy of the License at\n++ *\n++ *  http://www.apache.org/licenses/LICENSE-2.0\n++ *\n++ *  Unless required by applicable law or agreed to in writing, software\n++ *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n++ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n++ *  See the License for the specific language governing permissions and\n++ *  limitations under the License.\n++ *\n++ *  This file is part of mbed TLS (https://tls.mbed.org)\n++ */\n++\n++#ifndef MBEDTLS_ARMV8CE_AES_H\n++#define MBEDTLS_ARMV8CE_AES_H\n++\n++#include \"aes.h\"\n++\n++/**\n++ * \\brief          [ARMv8 Crypto Extensions] AES-ECB block en(de)cryption\n++ *\n++ * \\param ctx      AES context\n++ * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n++ * \\param input    16-byte input block\n++ * \\param output   16-byte output block\n++ *\n++ * \\return         0 on success (cannot fail)\n++ */\n++\n++int mbedtls_armv8ce_aes_crypt_ecb( mbedtls_aes_context *ctx,\n++                                   int mode,\n++                                   const unsigned char input[16],\n++                                   unsigned char output[16] );\n++\n++/**\n++ * \\brief          [ARMv8 Crypto Extensions]  Multiply in GF(2^128) for GCM\n++ *\n++ * \\param c        Result\n++ * \\param a        First operand\n++ * \\param b        Second operand\n++ *\n++ * \\note           Both operands and result are bit strings interpreted as\n++ *                 elements of GF(2^128) as per the GCM spec.\n++ */\n++\n++void mbedtls_armv8ce_gcm_mult( unsigned char c[16],\n++                               const unsigned char a[16],\n++                               const unsigned char b[16] );\n++\n++#endif /* MBEDTLS_ARMV8CE_AES_H */\n+diff -ruNa --binary a/include/mbedtls/check_config.h b/include/mbedtls/check_config.h\n+--- a/include/mbedtls/check_config.h\t2020-12-10 20:54:15.000000000 +0800\n++++ b/include/mbedtls/check_config.h\t2021-03-07 15:06:45.625543309 +0800\n+@@ -95,6 +95,10 @@\n+ #error \"MBEDTLS_AESNI_C defined, but not all prerequisites\"\n+ #endif\n+ \n++#if defined(MBEDTLS_ARMV8CE_AES_C) && !defined(MBEDTLS_HAVE_ASM)\n++#error \"MBEDTLS_ARMV8CE_AES_C defined, but not all prerequisites\"\n++#endif\n++\n+ #if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C)\n+ #error \"MBEDTLS_CTR_DRBG_C defined, but not all prerequisites\"\n+ #endif\n+@@ -772,3 +776,4 @@\n+ typedef int mbedtls_iso_c_forbids_empty_translation_units;\n+ \n+ #endif /* MBEDTLS_CHECK_CONFIG_H */\n++\n+diff -ruNa --binary a/include/mbedtls/config.h b/include/mbedtls/config.h\n+--- a/include/mbedtls/config.h\t2020-12-10 20:54:15.000000000 +0800\n++++ b/include/mbedtls/config.h\t2021-03-07 15:14:27.957855484 +0800\n+@@ -73,6 +73,7 @@\n+  * Requires support for asm() in compiler.\n+  *\n+  * Used in:\n++ *      library/armv8ce_aes.c\n+  *      library/aria.c\n+  *      library/timing.c\n+  *      include/mbedtls/bn_mul.h\n+@@ -1888,6 +1889,21 @@\n+ #define MBEDTLS_AESNI_C\n+ \n+ /**\n++ * \\def MBEDTLS_ARMV8CE_AES_C\n++ *\n++ * Enable ARMv8 Crypto Extensions for AES and GCM\n++ *\n++ * Module:  library/armv8ce_aes.c\n++ * Caller:  library/aes.c\n++ *          library/gcm.c\n++ *\n++ * Requires: MBEDTLS_HAVE_ASM\n++ *\n++ * This module adds support for Armv8 Cryptography Extensions for AES and GCM.\n++ */\n++//#define MBEDTLS_ARMV8CE_AES_C\n++\n++/**\n+  * \\def MBEDTLS_AES_C\n+  *\n+  * Enable the AES block cipher.\n+diff -ruNa --binary a/library/aes.c b/library/aes.c\n+--- a/library/aes.c\t2020-12-10 20:54:15.000000000 +0800\n++++ b/library/aes.c\t2021-03-07 15:06:45.625543309 +0800\n+@@ -69,7 +69,9 @@\n+ #if defined(MBEDTLS_AESNI_C)\n+ #include \"mbedtls/aesni.h\"\n+ #endif\n+-\n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++#include \"mbedtls/armv8ce_aes.h\"\n++#endif\n+ #if defined(MBEDTLS_SELF_TEST)\n+ #if defined(MBEDTLS_PLATFORM_C)\n+ #include \"mbedtls/platform.h\"\n+@@ -1052,6 +1054,11 @@\n+         return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );\n+ #endif\n+ \n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++\t// We don't do runtime checking for ARMv8 Crypto Extensions\n++\treturn mbedtls_armv8ce_aes_crypt_ecb( ctx, mode, input, output );\n++#endif\n++\n+ #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)\n+     if( aes_padlock_ace )\n+     {\n+diff -ruNa --binary a/library/armv8ce_aes.c b/library/armv8ce_aes.c\n+--- a/library/armv8ce_aes.c\t1970-01-01 08:00:00.000000000 +0800\n++++ b/library/armv8ce_aes.c\t2021-03-07 15:07:17.781911791 +0800\n+@@ -0,0 +1,142 @@\n++/*\n++ *  ARMv8 Cryptography Extensions -- Optimized code for AES and GCM\n++ *\n++ *  Copyright (C) 2006-2017, ARM Limited, All Rights Reserved\n++ *  SPDX-License-Identifier: Apache-2.0\n++ *\n++ *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n++ *  not use this file except in compliance with the License.\n++ *  You may obtain a copy of the License at\n++ *\n++ *  http://www.apache.org/licenses/LICENSE-2.0\n++ *\n++ *  Unless required by applicable law or agreed to in writing, software\n++ *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n++ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n++ *  See the License for the specific language governing permissions and\n++ *  limitations under the License.\n++ *\n++ *  This file is part of mbed TLS (https://tls.mbed.org)\n++ */\n++\n++#if !defined(MBEDTLS_CONFIG_FILE)\n++#include \"mbedtls/config.h\"\n++#else\n++#include MBEDTLS_CONFIG_FILE\n++#endif\n++\n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++\n++#include <arm_neon.h>\n++#include \"mbedtls/armv8ce_aes.h\"\n++\n++#ifndef asm\n++#define asm __asm\n++#endif\n++\n++/*\n++ *  [Armv8 Cryptography Extensions]  AES-ECB block en(de)cryption\n++ */\n++\n++#if defined(MBEDTLS_AES_C)\n++\n++int mbedtls_armv8ce_aes_crypt_ecb( mbedtls_aes_context *ctx,\n++                                   int mode,\n++                                   const unsigned char input[16],\n++                                   unsigned char output[16] )\n++{\n++    unsigned int i;\n++    const uint8_t *rk;\n++    uint8x16_t x, k;\n++\n++    x = vld1q_u8( input );                          /* input block */\n++    rk = (const uint8_t *) ctx->rk;                 /* round keys  */\n++\n++    if( mode == MBEDTLS_AES_ENCRYPT )\n++    {\n++        for( i = ctx->nr - 1; i != 0; i-- )         /* encryption loop */\n++        {\n++            k = vld1q_u8( rk );\n++            rk += 16;\n++            x = vaeseq_u8( x, k );\n++            x = vaesmcq_u8( x );\n++        }\n++        k = vld1q_u8( rk );\n++        rk += 16;\n++        x = vaeseq_u8( x, k );\n++    }\n++    else\n++    {\n++        for( i = ctx->nr - 1; i != 0 ; i-- )         /* decryption loop */\n++        {\n++            k = vld1q_u8( rk );\n++            rk += 16;\n++            x = vaesdq_u8( x, k );\n++            x = vaesimcq_u8( x );\n++        }\n++        k = vld1q_u8( rk );\n++        rk += 16;\n++        x = vaesdq_u8( x, k );\n++    }\n++\n++    k = vld1q_u8( rk );                             /* final key just XORed */\n++    x = veorq_u8( x, k );\n++    vst1q_u8( output, x );                          /* write out */\n++\n++    return ( 0 );\n++}\n++\n++#endif /* MBEDTLS_AES_C */\n++\n++\n++/*\n++ *  [Armv8 Cryptography Extensions]  Multiply in GF(2^128) for GCM\n++ */\n++\n++#if defined(MBEDTLS_GCM_C)\n++\n++void mbedtls_armv8ce_gcm_mult( unsigned char c[16],\n++                               const unsigned char a[16],\n++                               const unsigned char b[16] )\n++{\n++    /* GCM's GF(2^128) polynomial basis is x^128 + x^7 + x^2 + x + 1 */\n++    const uint64x2_t base = { 0, 0x86 };            /* note missing LS bit */\n++\n++    register uint8x16_t vc asm( \"v0\" );             /* named registers */\n++    register uint8x16_t va asm( \"v1\" );             /* (to avoid conflict) */\n++    register uint8x16_t vb asm( \"v2\" );\n++    register uint64x2_t vp asm( \"v3\" );\n++\n++    va = vld1q_u8( a );                             /* load inputs */\n++    vb = vld1q_u8( b );\n++    vp = base;\n++\n++    asm (\n++        \"rbit    %1.16b, %1.16b             \\n\\t\"   /* reverse bit order */\n++        \"rbit    %2.16b, %2.16b             \\n\\t\"\n++        \"pmull2  %0.1q,  %1.2d,  %2.2d      \\n\\t\"   /* v0 = a.hi * b.hi */\n++        \"pmull2  v4.1q,  %0.2d,  %3.2d      \\n\\t\"   /* mul v0 by x^64, reduce */\n++        \"ext     %0.16b, %0.16b, %0.16b, #8 \\n\\t\"\n++        \"eor     %0.16b, %0.16b, v4.16b     \\n\\t\"\n++        \"ext     v5.16b, %2.16b, %2.16b, #8 \\n\\t\"   /* (swap hi and lo in b) */\n++        \"pmull   v4.1q,  %1.1d,  v5.1d      \\n\\t\"   /* v0 ^= a.lo * b.hi */\n++        \"eor     %0.16b, %0.16b, v4.16b     \\n\\t\"\n++        \"pmull2  v4.1q,  %1.2d,  v5.2d      \\n\\t\"   /* v0 ^= a.hi * b.lo */\n++        \"eor     %0.16b, %0.16b, v4.16b     \\n\\t\"\n++        \"pmull2  v4.1q,  %0.2d,  %3.2d      \\n\\t\"   /* mul v0 by x^64, reduce */\n++        \"ext     %0.16b, %0.16b, %0.16b, #8 \\n\\t\"\n++        \"eor     %0.16b, %0.16b, v4.16b     \\n\\t\"\n++        \"pmull   v4.1q,  %1.1d,  %2.1d      \\n\\t\"   /* v0 ^= a.lo * b.lo */\n++        \"eor     %0.16b, %0.16b, v4.16b     \\n\\t\"\n++        \"rbit    %0.16b, %0.16b             \\n\\t\"   /* reverse bits for output */\n++        : \"=w\" (vc)                                 /* q0:      output */\n++        : \"w\" (va), \"w\" (vb), \"w\" (vp)              /* q1, q2:  input */\n++        : \"v4\", \"v5\"                                /* q4, q5:  clobbered */\n++    );\n++\n++    vst1q_u8( c, vc );                              /* write out */\n++}\n++\n++#endif /* MBEDTLS_GCM_C */\n++\n++#endif /* MBEDTLS_ARMV8CE_AES_C */\n+diff -ruNa --binary a/library/CMakeLists.txt b/library/CMakeLists.txt\n+--- a/library/CMakeLists.txt\t2020-12-10 20:54:15.000000000 +0800\n++++ b/library/CMakeLists.txt\t2021-03-07 15:06:45.625543309 +0800\n+@@ -7,6 +7,7 @@\n+     aesni.c\n+     arc4.c\n+     aria.c\n++    armv8ce_aes.c\n+     asn1parse.c\n+     asn1write.c\n+     base64.c\n+diff -ruNa --binary a/library/gcm.c b/library/gcm.c\n+--- a/library/gcm.c\t2020-12-10 20:54:15.000000000 +0800\n++++ b/library/gcm.c\t2021-03-07 15:06:45.625543309 +0800\n+@@ -71,6 +71,10 @@\n+ #include \"mbedtls/aesni.h\"\n+ #endif\n+ \n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++#include \"mbedtls/armv8ce_aes.h\"\n++#endif\n++\n+ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n+ #include \"mbedtls/aes.h\"\n+ #include \"mbedtls/platform.h\"\n+@@ -140,6 +144,12 @@\n+     if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, h, 16, h, &olen ) ) != 0 )\n+         return( ret );\n+ \n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++\t// we don't do feature testing with ARMv8 cryptography extensions\n++    memcpy( ctx ->HL, h, 16 );          // put H at the beginning of buffer\n++    return( 0 );                        // that's all we need\n++#endif\n++\n+     /* pack h as two 64-bits ints, big-endian */\n+     GET_UINT32_BE( hi, h,  0  );\n+     GET_UINT32_BE( lo, h,  4  );\n+@@ -248,6 +258,11 @@\n+     unsigned char lo, hi, rem;\n+     uint64_t zh, zl;\n+ \n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++\tmbedtls_armv8ce_gcm_mult( output, x, (const unsigned char *) ctx->HL );\n++\treturn;\n++#endif\n++\n+ #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n+     if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) {\n+         unsigned char h[16];\n+diff -ruNa --binary a/library/Makefile b/library/Makefile\n+--- a/library/Makefile\t2020-12-10 20:54:15.000000000 +0800\n++++ b/library/Makefile\t2021-03-07 15:12:49.277078224 +0800\n+@@ -65,6 +65,7 @@\n+ \n+ OBJS_CRYPTO=\taes.o\t\taesni.o\t\tarc4.o\t\t\\\n+ \t\taria.o\t\tasn1parse.o\tasn1write.o\t\\\n++\t\tarmv8ce_aes.o\t\t\t\t\t\\\n+ \t\tbase64.o\tbignum.o\tblowfish.o\t\\\n+ \t\tcamellia.o\tccm.o\t\tchacha20.o\t\\\n+ \t\tchachapoly.o\tcipher.o\tcipher_wrap.o\t\\\n+diff -ruNa --binary a/library/version_features.c b/library/version_features.c\n+--- a/library/version_features.c\t2020-12-10 20:54:15.000000000 +0800\n++++ b/library/version_features.c\t2021-03-07 15:06:45.625543309 +0800\n+@@ -583,6 +583,9 @@\n+ #if defined(MBEDTLS_AESNI_C)\n+     \"MBEDTLS_AESNI_C\",\n+ #endif /* MBEDTLS_AESNI_C */\n++#if defined(MBEDTLS_ARMV8CE_AES_C)\n++    \"MBEDTLS_ARMV8CE_AES_C\",\n++#endif /* MBEDTLS_ARMV8CE_AES_C */\n+ #if defined(MBEDTLS_AES_C)\n+     \"MBEDTLS_AES_C\",\n+ #endif /* MBEDTLS_AES_C */\n+\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/0009-rockchip-add-support-for-OrangePi-R1-Plus.patch",
    "content": "From b677e175936397ffcc3592d4ef5af20343bd7b8f Mon Sep 17 00:00:00 2001\nFrom: Quintus Chu <ardanzhu@gmail.com>\nDate: Mon, 16 Aug 2021 00:04:23 +0800\nSubject: [PATCH] 0009\n\n---\n package/boot/uboot-rockchip/Makefile          |  15 +-\n ...328-Add-support-for-Orangepi-R1-Plus.patch | 172 ++++++++++++++++++\n .../orangepi-r1-plus-rk3328/dt-decl.h         |  23 +++\n .../orangepi-r1-plus-rk3328/dt-plat.c         | 155 ++++++++++++++++\n .../orangepi-r1-plus-rk3328/dt-structs-gen.h  |  51 ++++++\n .../armv8/base-files/etc/board.d/01_leds      |   3 +-\n .../armv8/base-files/etc/board.d/02_network   |   7 +-\n .../etc/hotplug.d/net/40-net-smp-affinity     |   3 +-\n target/linux/rockchip/image/armv8.mk          |  10 +\n ...328-Add-support-for-OrangePi-R1-Plus.patch |  52 ++++++\n ...328-Add-support-for-OrangePi-R1-Plus.patch |  52 ++++++\n 11 files changed, 539 insertions(+), 4 deletions(-)\n create mode 100644 package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\n create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h\n create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\n create mode 100644 package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\n create mode 100644 target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n create mode 100644 target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n\ndiff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile\nindex 2d34dd8d3f..669054920a 100644\n--- a/package/boot/uboot-rockchip/Makefile\n+++ b/package/boot/uboot-rockchip/Makefile\n@@ -36,6 +36,18 @@ define U-Boot/nanopi-r2s-rk3328\n   OF_PLATDATA:=$(1)\n endef\n \n+define U-Boot/orangepi-r1-plus-rk3328\n+  BUILD_SUBTARGET:=armv8\n+  NAME:=Orange Pi R1 Plus\n+  BUILD_DEVICES:= \\\n+    xunlong_orangepi-r1-plus\n+  DEPENDS:=+PACKAGE_u-boot-orangepi-r1-plus-rk3328:arm-trusted-firmware-rk3328\n+  PKG_BUILD_DEPENDS:=arm-trusted-firmware-rk3328\n+  ATF:=rk322xh_bl31_v1.46.elf\n+  USE_RKBIN:=1\n+  OF_PLATDATA:=$(1)\n+endef\n+\n \n # RK3399 boards\n \n@@ -73,7 +85,8 @@ UBOOT_TARGETS := \\\n   nanopi-r4s-rk3399 \\\n   rock-pi-4-rk3399 \\\n   rockpro64-rk3399 \\\n-  nanopi-r2s-rk3328\n+  nanopi-r2s-rk3328 \\\n+  orangepi-r1-plus-rk3328\n \n UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes\n \ndiff --git a/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..46a3b11594\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/patches/103-rockchip-rk3328-Add-support-for-Orangepi-R1-Plus.patch\n@@ -0,0 +1,172 @@\n+--- a/arch/arm/dts/Makefile\n++++ b/arch/arm/dts/Makefile\n+@@ -109,6 +109,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3308) += \\\n+ dtb-$(CONFIG_ROCKCHIP_RK3328) += \\\n+ \trk3328-evb.dtb \\\n+ \trk3328-nanopi-r2s.dtb \\\n++\trk3328-orangepi-r1-plus.dtb \\\n+ \trk3328-roc-cc.dtb \\\n+ \trk3328-rock64.dtb \\\n+ \trk3328-rock-pi-e.dtb\n+--- /dev/null\n++++ b/arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi\n+@@ -0,0 +1,1 @@\n++#include \"rk3328-nanopi-r2s-u-boot.dtsi\"\n+--- /dev/null\n++++ b/arch/arm/dts/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,38 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 Plus\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\n+--- a/board/rockchip/evb_rk3328/MAINTAINERS\n++++ b/board/rockchip/evb_rk3328/MAINTAINERS\n+@@ -12,6 +12,13 @@ F:      configs/nanopi-r2s-rk3328_defconfig\n+ F:      arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi\n+ F:      arch/arm/dts/rk3328-nanopi-r2s.dts\n+ \n++ORANGEPI-R1-PLUS-RK3328\n++M:      Shenzhen Xunlong Software CO.,Limited <zhao_steven@263.net>\n++S:      Maintained\n++F:      configs/orangepi-r1-plus-rk3328_defconfig\n++F:      arch/arm/dts/rk3328-orangepi-r1-plus-u-boot.dtsi\n++F:      arch/arm/dts/rk3328-orangepi-r1-plus.dts\n++\n+ ROC-RK3328-CC\n+ M:      Loic Devulder <ldevulder@suse.com>\n+ M:      Chen-Yu Tsai <wens@csie.org>\n+--- /dev/null\n++++ b/configs/orangepi-r1-plus-rk3328_defconfig\n+@@ -0,0 +1,98 @@\n++CONFIG_ARM=y\n++CONFIG_ARCH_ROCKCHIP=y\n++CONFIG_SYS_TEXT_BASE=0x00200000\n++CONFIG_SPL_GPIO_SUPPORT=y\n++CONFIG_ENV_OFFSET=0x3F8000\n++CONFIG_ROCKCHIP_RK3328=y\n++CONFIG_TPL_ROCKCHIP_COMMON_BOARD=y\n++CONFIG_TPL_LIBCOMMON_SUPPORT=y\n++CONFIG_TPL_LIBGENERIC_SUPPORT=y\n++CONFIG_SPL_DRIVERS_MISC_SUPPORT=y\n++CONFIG_SPL_STACK_R_ADDR=0x600000\n++CONFIG_NR_DRAM_BANKS=1\n++CONFIG_DEBUG_UART_BASE=0xFF130000\n++CONFIG_DEBUG_UART_CLOCK=24000000\n++CONFIG_SYSINFO=y\n++CONFIG_DEBUG_UART=y\n++CONFIG_TPL_SYS_MALLOC_F_LEN=0x800\n++# CONFIG_ANDROID_BOOT_IMAGE is not set\n++CONFIG_FIT=y\n++CONFIG_FIT_VERBOSE=y\n++CONFIG_SPL_LOAD_FIT=y\n++CONFIG_DEFAULT_FDT_FILE=\"rockchip/rk3328-orangepi-r1-plus.dtb\"\n++CONFIG_MISC_INIT_R=y\n++# CONFIG_DISPLAY_CPUINFO is not set\n++CONFIG_DISPLAY_BOARDINFO_LATE=y\n++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set\n++CONFIG_TPL_SYS_MALLOC_SIMPLE=y\n++CONFIG_SPL_STACK_R=y\n++CONFIG_SPL_I2C_SUPPORT=y\n++CONFIG_SPL_POWER_SUPPORT=y\n++CONFIG_SPL_ATF=y\n++CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y\n++CONFIG_CMD_BOOTZ=y\n++CONFIG_CMD_GPT=y\n++CONFIG_CMD_MMC=y\n++CONFIG_CMD_USB=y\n++# CONFIG_CMD_SETEXPR is not set\n++CONFIG_CMD_TIME=y\n++CONFIG_SPL_OF_CONTROL=y\n++CONFIG_TPL_OF_CONTROL=y\n++CONFIG_DEFAULT_DEVICE_TREE=\"rk3328-orangepi-r1-plus\"\n++CONFIG_OF_SPL_REMOVE_PROPS=\"clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents\"\n++CONFIG_TPL_OF_PLATDATA=y\n++CONFIG_ENV_IS_IN_MMC=y\n++CONFIG_SYS_RELOC_GD_ENV_ADDR=y\n++CONFIG_NET_RANDOM_ETHADDR=y\n++CONFIG_TPL_DM=y\n++CONFIG_REGMAP=y\n++CONFIG_SPL_REGMAP=y\n++CONFIG_TPL_REGMAP=y\n++CONFIG_SYSCON=y\n++CONFIG_SPL_SYSCON=y\n++CONFIG_TPL_SYSCON=y\n++CONFIG_CLK=y\n++CONFIG_SPL_CLK=y\n++CONFIG_FASTBOOT_BUF_ADDR=0x800800\n++CONFIG_FASTBOOT_CMD_OEM_FORMAT=y\n++CONFIG_ROCKCHIP_GPIO=y\n++CONFIG_SYS_I2C_ROCKCHIP=y\n++CONFIG_MMC_DW=y\n++CONFIG_MMC_DW_ROCKCHIP=y\n++CONFIG_SF_DEFAULT_SPEED=20000000\n++CONFIG_DM_ETH=y\n++CONFIG_ETH_DESIGNWARE=y\n++CONFIG_GMAC_ROCKCHIP=y\n++CONFIG_PINCTRL=y\n++CONFIG_SPL_PINCTRL=y\n++CONFIG_DM_PMIC=y\n++CONFIG_PMIC_RK8XX=y\n++CONFIG_SPL_DM_REGULATOR=y\n++CONFIG_REGULATOR_PWM=y\n++CONFIG_DM_REGULATOR_FIXED=y\n++CONFIG_SPL_DM_REGULATOR_FIXED=y\n++CONFIG_REGULATOR_RK8XX=y\n++CONFIG_PWM_ROCKCHIP=y\n++CONFIG_RAM=y\n++CONFIG_SPL_RAM=y\n++CONFIG_TPL_RAM=y\n++CONFIG_DM_RESET=y\n++CONFIG_BAUDRATE=1500000\n++CONFIG_DEBUG_UART_SHIFT=2\n++CONFIG_SYSRESET=y\n++# CONFIG_TPL_SYSRESET is not set\n++CONFIG_USB=y\n++CONFIG_USB_XHCI_HCD=y\n++CONFIG_USB_XHCI_DWC3=y\n++CONFIG_USB_EHCI_HCD=y\n++CONFIG_USB_EHCI_GENERIC=y\n++CONFIG_USB_OHCI_HCD=y\n++CONFIG_USB_OHCI_GENERIC=y\n++CONFIG_USB_DWC2=y\n++CONFIG_USB_DWC3=y\n++# CONFIG_USB_DWC3_GADGET is not set\n++CONFIG_USB_GADGET=y\n++CONFIG_USB_GADGET_DWC2_OTG=y\n++CONFIG_SPL_TINY_MEMSET=y\n++CONFIG_TPL_TINY_MEMSET=y\n++CONFIG_ERRNO_STR=y\ndiff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h\nnew file mode 100644\nindex 0000000000..0919e4ed53\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-decl.h\n@@ -0,0 +1,23 @@\n+/*\n+ * DO NOT MODIFY\n+ *\n+ * Declares externs for all device/uclass instances.\n+ * This was generated by dtoc from a .dtb (device tree binary) file.\n+ */\n+\n+#include <dm/device-internal.h>\n+#include <dm/uclass-internal.h>\n+\n+/* driver declarations - these allow DM_DRIVER_GET() to be used */\n+extern U_BOOT_DRIVER(rockchip_rk3328_cru);\n+extern U_BOOT_DRIVER(rockchip_rk3328_dmc);\n+extern U_BOOT_DRIVER(rockchip_rk3288_dw_mshc);\n+extern U_BOOT_DRIVER(ns16550_serial);\n+extern U_BOOT_DRIVER(rockchip_rk3328_grf);\n+\n+/* uclass driver declarations - needed for DM_UCLASS_DRIVER_REF() */\n+extern UCLASS_DRIVER(clk);\n+extern UCLASS_DRIVER(mmc);\n+extern UCLASS_DRIVER(ram);\n+extern UCLASS_DRIVER(serial);\n+extern UCLASS_DRIVER(syscon);\ndiff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\nnew file mode 100644\nindex 0000000000..e5b330c9d9\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-plat.c\n@@ -0,0 +1,155 @@\n+/*\n+ * DO NOT MODIFY\n+ *\n+ * Declares the U_BOOT_DRIVER() records and platform data.\n+ * This was generated by dtoc from a .dtb (device tree binary) file.\n+ */\n+\n+/* Allow use of U_BOOT_DRVINFO() in this file */\n+#define DT_PLAT_C\n+\n+#include <common.h>\n+#include <dm.h>\n+#include <dt-structs.h>\n+\n+/*\n+ * driver_info declarations, ordered by 'struct driver_info' linker_list idx:\n+ *\n+ * idx  driver_info          driver\n+ * ---  -------------------- --------------------\n+ *   0: clock_controller_at_ff440000 rockchip_rk3328_cru\n+ *   1: dmc                  rockchip_rk3328_dmc\n+ *   2: mmc_at_ff500000      rockchip_rk3288_dw_mshc\n+ *   3: serial_at_ff130000   ns16550_serial\n+ *   4: syscon_at_ff100000   rockchip_rk3328_grf\n+ * ---  -------------------- --------------------\n+ */\n+\n+/*\n+ * Node /clock-controller@ff440000 index 0\n+ * driver rockchip_rk3328_cru parent None\n+ */\n+static struct dtd_rockchip_rk3328_cru dtv_clock_controller_at_ff440000 = {\n+\t.reg\t\t\t= {0xff440000, 0x1000},\n+\t.rockchip_grf\t\t= 0x3a,\n+};\n+U_BOOT_DRVINFO(clock_controller_at_ff440000) = {\n+\t.name\t\t= \"rockchip_rk3328_cru\",\n+\t.plat\t\t= &dtv_clock_controller_at_ff440000,\n+\t.plat_size\t= sizeof(dtv_clock_controller_at_ff440000),\n+\t.parent_idx\t= -1,\n+};\n+\n+/*\n+ * Node /dmc index 1\n+ * driver rockchip_rk3328_dmc parent None\n+ */\n+static struct dtd_rockchip_rk3328_dmc dtv_dmc = {\n+\t.reg\t\t\t= {0xff400000, 0x1000, 0xff780000, 0x3000, 0xff100000, 0x1000, 0xff440000, 0x1000,\n+\t\t0xff720000, 0x1000, 0xff798000, 0x1000},\n+\t.rockchip_sdram_params\t= {0x1, 0xa, 0x2, 0x1, 0x0, 0x0, 0x11, 0x0,\n+\t\t0x11, 0x0, 0x0, 0x94291288, 0x0, 0x27, 0x462, 0x15,\n+\t\t0x242, 0xff, 0x14d, 0x0, 0x1, 0x0, 0x0, 0x0,\n+\t\t0x43049010, 0x64, 0x28003b, 0xd0, 0x20053, 0xd4, 0x220000, 0xd8,\n+\t\t0x100, 0xdc, 0x40000, 0xe0, 0x0, 0xe4, 0x110000, 0xe8,\n+\t\t0x420, 0xec, 0x400, 0xf4, 0xf011f, 0x100, 0x9060b06, 0x104,\n+\t\t0x20209, 0x108, 0x505040a, 0x10c, 0x40400c, 0x110, 0x5030206, 0x114,\n+\t\t0x3030202, 0x120, 0x3030b03, 0x124, 0x20208, 0x180, 0x1000040, 0x184,\n+\t\t0x0, 0x190, 0x7030003, 0x198, 0x5001100, 0x1a0, 0xc0400003, 0x240,\n+\t\t0x6000604, 0x244, 0x201, 0x250, 0xf00, 0x490, 0x1, 0xffffffff,\n+\t\t0xffffffff, 0xffffffff, 0xffffffff, 0x4, 0xc, 0x28, 0xa, 0x2c,\n+\t\t0x0, 0x30, 0x9, 0xffffffff, 0xffffffff, 0x77, 0x88, 0x79,\n+\t\t0x79, 0x87, 0x97, 0x87, 0x78, 0x77, 0x78, 0x87,\n+\t\t0x88, 0x87, 0x87, 0x77, 0x78, 0x78, 0x78, 0x78,\n+\t\t0x78, 0x78, 0x78, 0x78, 0x78, 0x69, 0x9, 0x77,\n+\t\t0x78, 0x77, 0x78, 0x77, 0x78, 0x77, 0x78, 0x77,\n+\t\t0x79, 0x9, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,\n+\t\t0x78, 0x78, 0x78, 0x69, 0x9, 0x77, 0x78, 0x77,\n+\t\t0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x79, 0x9,\n+\t\t0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,\n+\t\t0x78, 0x69, 0x9, 0x77, 0x78, 0x77, 0x78, 0x77,\n+\t\t0x78, 0x77, 0x78, 0x77, 0x79, 0x9, 0x78, 0x78,\n+\t\t0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x69,\n+\t\t0x9, 0x77, 0x78, 0x77, 0x77, 0x77, 0x77, 0x77,\n+\t\t0x77, 0x77, 0x79, 0x9},\n+};\n+U_BOOT_DRVINFO(dmc) = {\n+\t.name\t\t= \"rockchip_rk3328_dmc\",\n+\t.plat\t\t= &dtv_dmc,\n+\t.plat_size\t= sizeof(dtv_dmc),\n+\t.parent_idx\t= -1,\n+};\n+\n+/*\n+ * Node /mmc@ff500000 index 2\n+ * driver rockchip_rk3288_dw_mshc parent None\n+ */\n+static struct dtd_rockchip_rk3288_dw_mshc dtv_mmc_at_ff500000 = {\n+\t.bus_width\t\t= 0x4,\n+\t.cap_sd_highspeed\t= true,\n+\t.clocks\t\t\t= {\n+\t\t\t{0, {317}},\n+\t\t\t{0, {33}},\n+\t\t\t{0, {74}},\n+\t\t\t{0, {78}},},\n+\t.disable_wp\t\t= true,\n+\t.fifo_depth\t\t= 0x100,\n+\t.interrupts\t\t= {0x0, 0xc, 0x4},\n+\t.max_frequency\t\t= 0x8f0d180,\n+\t.pinctrl_0\t\t= {0x47, 0x48, 0x49, 0x4a},\n+\t.pinctrl_names\t\t= \"default\",\n+\t.reg\t\t\t= {0xff500000, 0x4000},\n+\t.sd_uhs_sdr104\t\t= true,\n+\t.sd_uhs_sdr12\t\t= true,\n+\t.sd_uhs_sdr25\t\t= true,\n+\t.sd_uhs_sdr50\t\t= true,\n+\t.u_boot_spl_fifo_mode\t= true,\n+\t.vmmc_supply\t\t= 0x4b,\n+\t.vqmmc_supply\t\t= 0x1e,\n+};\n+U_BOOT_DRVINFO(mmc_at_ff500000) = {\n+\t.name\t\t= \"rockchip_rk3288_dw_mshc\",\n+\t.plat\t\t= &dtv_mmc_at_ff500000,\n+\t.plat_size\t= sizeof(dtv_mmc_at_ff500000),\n+\t.parent_idx\t= -1,\n+};\n+\n+/*\n+ * Node /serial@ff130000 index 3\n+ * driver ns16550_serial parent None\n+ */\n+static struct dtd_ns16550_serial dtv_serial_at_ff130000 = {\n+\t.clock_frequency\t= 0x16e3600,\n+\t.clocks\t\t\t= {\n+\t\t\t{0, {40}},\n+\t\t\t{0, {212}},},\n+\t.dma_names\t\t= {\"tx\", \"rx\"},\n+\t.dmas\t\t\t= {0x10, 0x6, 0x10, 0x7},\n+\t.interrupts\t\t= {0x0, 0x39, 0x4},\n+\t.pinctrl_0\t\t= 0x26,\n+\t.pinctrl_names\t\t= \"default\",\n+\t.reg\t\t\t= {0xff130000, 0x100},\n+\t.reg_io_width\t\t= 0x4,\n+\t.reg_shift\t\t= 0x2,\n+};\n+U_BOOT_DRVINFO(serial_at_ff130000) = {\n+\t.name\t\t= \"ns16550_serial\",\n+\t.plat\t\t= &dtv_serial_at_ff130000,\n+\t.plat_size\t= sizeof(dtv_serial_at_ff130000),\n+\t.parent_idx\t= -1,\n+};\n+\n+/*\n+ * Node /syscon@ff100000 index 4\n+ * driver rockchip_rk3328_grf parent None\n+ */\n+static struct dtd_rockchip_rk3328_grf dtv_syscon_at_ff100000 = {\n+\t.reg\t\t\t= {0xff100000, 0x1000},\n+};\n+U_BOOT_DRVINFO(syscon_at_ff100000) = {\n+\t.name\t\t= \"rockchip_rk3328_grf\",\n+\t.plat\t\t= &dtv_syscon_at_ff100000,\n+\t.plat_size\t= sizeof(dtv_syscon_at_ff100000),\n+\t.parent_idx\t= -1,\n+};\n+\ndiff --git a/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\nnew file mode 100644\nindex 0000000000..b1ff08a927\n--- /dev/null\n+++ b/package/boot/uboot-rockchip/src/of-platdata/orangepi-r1-plus-rk3328/dt-structs-gen.h\n@@ -0,0 +1,51 @@\n+/*\n+ * DO NOT MODIFY\n+ *\n+ * Defines the structs used to hold devicetree data.\n+ * This was generated by dtoc from a .dtb (device tree binary) file.\n+ */\n+\n+#include <stdbool.h>\n+#include <linux/libfdt.h>\n+struct dtd_ns16550_serial {\n+\tfdt32_t\t\tclock_frequency;\n+\tstruct phandle_1_arg clocks[2];\n+\tconst char *\tdma_names[2];\n+\tfdt32_t\t\tdmas[4];\n+\tfdt32_t\t\tinterrupts[3];\n+\tfdt32_t\t\tpinctrl_0;\n+\tconst char *\tpinctrl_names;\n+\tfdt64_t\t\treg[2];\n+\tfdt32_t\t\treg_io_width;\n+\tfdt32_t\t\treg_shift;\n+};\n+struct dtd_rockchip_rk3288_dw_mshc {\n+\tfdt32_t\t\tbus_width;\n+\tbool\t\tcap_sd_highspeed;\n+\tstruct phandle_1_arg clocks[4];\n+\tbool\t\tdisable_wp;\n+\tfdt32_t\t\tfifo_depth;\n+\tfdt32_t\t\tinterrupts[3];\n+\tfdt32_t\t\tmax_frequency;\n+\tfdt32_t\t\tpinctrl_0[4];\n+\tconst char *\tpinctrl_names;\n+\tfdt64_t\t\treg[2];\n+\tbool\t\tsd_uhs_sdr104;\n+\tbool\t\tsd_uhs_sdr12;\n+\tbool\t\tsd_uhs_sdr25;\n+\tbool\t\tsd_uhs_sdr50;\n+\tbool\t\tu_boot_spl_fifo_mode;\n+\tfdt32_t\t\tvmmc_supply;\n+\tfdt32_t\t\tvqmmc_supply;\n+};\n+struct dtd_rockchip_rk3328_cru {\n+\tfdt64_t\t\treg[2];\n+\tfdt32_t\t\trockchip_grf;\n+};\n+struct dtd_rockchip_rk3328_dmc {\n+\tfdt64_t\t\treg[12];\n+\tfdt32_t\t\trockchip_sdram_params[196];\n+};\n+struct dtd_rockchip_rk3328_grf {\n+\tfdt64_t\t\treg[2];\n+};\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\nindex b10c43ba60..53ae6d023a 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/01_leds\n@@ -8,7 +8,8 @@ boardname=\"${board##*,}\"\n board_config_update\n \n case $board in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+xunlong,orangepi-r1-plus)\n \tucidef_set_led_netdev \"wan\" \"WAN\" \"$boardname:green:wan\" \"eth0\"\n \tucidef_set_led_netdev \"lan\" \"LAN\" \"$boardname:green:lan\" \"eth1\"\n \t;;\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\nindex 91bdb760d5..543de54a67 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n+++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network\n@@ -8,7 +8,8 @@ rockchip_setup_interfaces()\n \n \tcase \"$board\" in\n \tfriendlyarm,nanopi-r2s|\\\n-\tfriendlyarm,nanopi-r4s)\n+\tfriendlyarm,nanopi-r4s|\\\n+\txunlong,orangepi-r1-plus)\n \t\tucidef_set_interfaces_lan_wan 'eth1' 'eth0'\n \t\t;;\n \t*)\n@@ -40,6 +41,10 @@ rockchip_setup_macs()\n \t\twan_mac=$(get_mac_binary \"/sys/bus/i2c/devices/2-0051/eeprom\" 0xfa)\n \t\tlan_mac=$(macaddr_setbit_la \"$wan_mac\")\n \t\t;;\n+\txunlong,orangepi-r1-plus)\n+\t\tlan_mac=$(cat /sys/class/net/eth1/address)\n+\t\twan_mac=$(macaddr_add \"$lan_mac\" -1)\n+\t\t;;\n \tesac\n \n \t[ -n \"$lan_mac\" ] && ucidef_set_interface_macaddr \"lan\" $lan_mac\ndiff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\nindex 9e4a4cf4fc..d8e513f560 100644\n--- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n+++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity\n@@ -22,7 +22,8 @@ set_interface_core() {\n }\n \n case \"$(board_name)\" in\n-friendlyarm,nanopi-r2s)\n+friendlyarm,nanopi-r2s|\\\n+xunlong,orangepi-r1-plus)\n \tset_interface_core 2 \"eth0\"\n \tset_interface_core 4 \"eth1\" \"xhci-hcd:usb3\"\n \t;;\ndiff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk\nindex e255970f28..1934b8d7d2 100644\n--- a/target/linux/rockchip/image/armv8.mk\n+++ b/target/linux/rockchip/image/armv8.mk\n@@ -41,3 +41,13 @@ define Device/radxa_rock-pi-4\n   IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata\n endef\n TARGET_DEVICES += radxa_rock-pi-4\n+\n+define Device/xunlong_orangepi-r1-plus\n+  DEVICE_VENDOR := Xunlong\n+  DEVICE_MODEL := Orange Pi R1 Plus\n+  SOC := rk3328\n+  UBOOT_DEVICE_NAME := orangepi-r1-plus-rk3328\n+  IMAGE/sysupgrade.img.gz := boot-common | boot-script nanopi-r2s | pine64-bin | gzip | append-metadata\n+  DEVICE_PACKAGES := kmod-usb-net-rtl8152\n+endef\n+TARGET_DEVICES += xunlong_orangepi-r1-plus\ndiff --git a/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..981c9692e8\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.10/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n@@ -0,0 +1,52 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -7,6 +7,7 @@\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,39 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 Plus\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  max-freq = <48000000>;\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\ndiff --git a/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..af8b555c5e\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.4/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n@@ -0,0 +1,52 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -2,6 +2,7 @@\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-evb-act8846.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,39 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++  model = \"Xunlong Orange Pi R1 PLUS\";\n++  compatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++  label = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++  max-freq = <48000000>;\n++  status = \"okay\";\n++\n++  flash@0 {\n++    compatible = \"jedec,spi-nor\";\n++    reg = <0>;\n++    spi-max-frequency = <10000000>;\n++  };\n++};\n++\n++&sys_led {\n++  gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++  label = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++  rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++  status = \"okay\";\n++};\n++\n++&wan_led {\n++  label = \"orangepi-r1-plus:green:wan\";\n++};\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/1001-dnsmasq_add_filter_aaaa_option.patch",
    "content": "From 2b6c77d13d06d2b316041af74b99c602a4e8256d Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Mon, 5 Jul 2021 05:19:48 +0800\nSubject: [PATCH] 1001\n\n---\n .../htdocs/luci-static/resources/view/network/dhcp.js        | 5 +++++\n package/base-files/files/etc/init.d/boot                     | 1 +\n package/network/services/dnsmasq/files/dhcp.conf             | 1 +\n package/network/services/dnsmasq/files/dnsmasq.init          | 2 ++\n 4 files changed, 9 insertions(+)\n\ndiff --git a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\nindex b49040b6a0..2b04277607 100644\n--- a/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\n+++ b/feeds/luci/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js\n@@ -366,6 +366,11 @@ return view.extend({\n \t\to.optional = true;\n \t\to.placeholder = '/etc/dnsmasq.hosts';\n\n+\t\to = s.taboption('advanced', form.Flag, 'filteraaaa',\n+\t\t\t_('Filter IPv6 Records'),\n+\t\t\t_('Filter IPv6(AAAA) Records during DNS resolution'));\n+\t\to.optional = true;\n+\n \t\to = s.taboption('advanced', form.Flag, 'quietdhcp',\n \t\t\t_('Suppress logging'),\n \t\t\t_('Suppress logging of the routine operation for the DHCP protocol.'));\ndiff --git a/package/base-files/files/etc/init.d/boot b/package/base-files/files/etc/init.d/boot\nindex a1e8e828dd..974b68860f 100755\n--- a/package/base-files/files/etc/init.d/boot\n+++ b/package/base-files/files/etc/init.d/boot\n@@ -33,6 +33,7 @@ boot() {\n \tmkdir -p /tmp/resolv.conf.d\n \ttouch /tmp/resolv.conf.d/resolv.conf.auto\n \tln -sf /tmp/resolv.conf.d/resolv.conf.auto /tmp/resolv.conf\n+\tln -sf /tmp/resolv.conf.d/resolv.conf.auto /tmp/resolv.conf.auto\n \tgrep -q debugfs /proc/filesystems && /bin/mount -o noatime -t debugfs debugfs /sys/kernel/debug\n \tgrep -q bpf /proc/filesystems && /bin/mount -o nosuid,nodev,noexec,noatime,mode=0700 -t bpf bpffs /sys/fs/bpf\n \tgrep -q pstore /proc/filesystems && /bin/mount -o noatime -t pstore pstore /sys/fs/pstore\ndiff --git a/package/network/services/dnsmasq/files/dhcp.conf b/package/network/services/dnsmasq/files/dhcp.conf\nindex 8c42ef782e..5ff9bf8bfd 100644\n--- a/package/network/services/dnsmasq/files/dhcp.conf\n+++ b/package/network/services/dnsmasq/files/dhcp.conf\n@@ -20,6 +20,7 @@ config dnsmasq\n \t#list notinterface\tlo\n \t#list bogusnxdomain     '64.94.110.11'\n \toption localservice\t1  # disable to allow DNS requests from non-local subnets\n+\toption filteraaaa\t1\n \toption ednspacket_max\t1232\n \n config dhcp lan\ndiff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init\nindex c4c262ad69..ba9638b794 100644\n--- a/package/network/services/dnsmasq/files/dnsmasq.init\n+++ b/package/network/services/dnsmasq/files/dnsmasq.init\n@@ -922,6 +922,8 @@ dnsmasq_start()\n \tappend_bool \"$cfg\" sequential_ip \"--dhcp-sequential-ip\"\n \tappend_bool \"$cfg\" allservers \"--all-servers\"\n \tappend_bool \"$cfg\" noping \"--no-ping\"\n+\tappend_bool \"$cfg\" filteraaaa \"--filter-aaaa\"\n+\tappend_parm \"$cfg\" mini_ttl \"--min-ttl\"\n \tappend_bool \"$cfg\" rapidcommit \"--dhcp-rapid-commit\"\n \tappend_bool \"$cfg\" scriptarp \"--script-arp\"\n \n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/1002-fw3_fullconenat.patch",
    "content": "From b8be603976ff0ff22d60c873f6cb1b25db558250 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Mon, 8 Mar 2021 03:32:04 +0800\nSubject: [PATCH] FW3_support_fullconenat\n\n---\n .../config/firewall/patches/fullconenat.patch | 63 +++++++++++++++++++\n 1 file changed, 63 insertions(+)\n create mode 100644 package/network/config/firewall/patches/fullconenat.patch\n\ndiff --git a/package/network/config/firewall/patches/fullconenat.patch b/package/network/config/firewall/patches/fullconenat.patch\nnew file mode 100644\nindex 0000000000..d69e7129ec\n--- /dev/null\n+++ b/package/network/config/firewall/patches/fullconenat.patch\n@@ -0,0 +1,63 @@\n+index 85a3750..9fac9b1 100644\n+--- a/defaults.c\n++++ b/defaults.c\n+@@ -46,7 +46,9 @@ const struct fw3_option fw3_flag_opts[] = {\n+ \tFW3_OPT(\"synflood_protect\",    bool,     defaults, syn_flood),\n+ \tFW3_OPT(\"synflood_rate\",       limit,    defaults, syn_flood_rate),\n+ \tFW3_OPT(\"synflood_burst\",      int,      defaults, syn_flood_rate.burst),\n+-\n++\t\n++\tFW3_OPT(\"fullcone\",           bool,     defaults, fullcone),\n++\t\n+ \tFW3_OPT(\"tcp_syncookies\",      bool,     defaults, tcp_syncookies),\n+ \tFW3_OPT(\"tcp_ecn\",             int,      defaults, tcp_ecn),\n+ \tFW3_OPT(\"tcp_window_scaling\",  bool,     defaults, tcp_window_scaling),\n+diff --git a/options.h b/options.h\n+index 6edd174..c02eb97 100644\n+--- a/options.h\n++++ b/options.h\n+@@ -267,6 +267,7 @@ struct fw3_defaults\n+ \tbool drop_invalid;\n+ \n+ \tbool syn_flood;\n++\tbool fullcone;\n+ \tstruct fw3_limit syn_flood_rate;\n+ \n+ \tbool tcp_syncookies;\n+diff --git a/zones.c b/zones.c\n+index 2aa7473..57eead0 100644\n+--- a/zones.c\n++++ b/zones.c\n+@@ -627,6 +627,7 @@ print_zone_rule(struct fw3_ipt_handle *h\n+ \tstruct fw3_address *msrc;\n+ \tstruct fw3_address *mdest;\n+ \tstruct fw3_ipt_rule *r;\n++\tstruct fw3_defaults *defs = &state->defaults;\n+ \n+ \tif (!fw3_is_family(zone, handle->family))\n+ \t\treturn;\n+@@ -712,8 +713,22 @@ print_zone_rule(struct fw3_ipt_handle *h\n+ \t\t\t\t{\n+ \t\t\t\t\tr = fw3_ipt_rule_new(handle);\n+ \t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n+-\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n+-\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t/*FIXME: Workaround for FULLCONE-NAT*/\n++\t\t\t\t\tif(defs->fullcone)\n++\t\t\t\t\t{\n++\t\t\t\t\t\twarn(\"%s will enable FULLCONE-NAT\", zone->name);\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t\tr = fw3_ipt_rule_new(handle);\n++\t\t\t\t\t\tfw3_ipt_rule_src_dest(r, msrc, mdest);\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"FULLCONENAT\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_prerouting\", zone->name);\n++\t\t\t\t\t}\n++\t\t\t\t\telse\n++\t\t\t\t\t{\n++\t\t\t\t\t\tfw3_ipt_rule_target(r, \"MASQUERADE\");\n++\t\t\t\t\t\tfw3_ipt_rule_append(r, \"zone_%s_postrouting\", zone->name);\n++\t\t\t\t\t}\n+ \t\t\t\t}\n+ \t\t\t}\n+ \t\t}\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/1003-luci-app-firewall_add_fullcone.patch",
    "content": "From: QiuSimons\ndiff --git a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n--- a/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n+++ b/feeds/luci/applications/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js\n@@ -57,6 +57,8 @@ return view.extend({\n\n \t\to = s.option(form.Flag, 'drop_invalid', _('Drop invalid packets'));\n\n+\t\to = s.option(form.Flag, 'fullcone', _('Enable FullCone NAT'));\n+\n \t\tvar p = [\n \t\t\ts.option(form.ListValue, 'input', _('Input')),\n \t\t\ts.option(form.ListValue, 'output', _('Output')),\n"
  },
  {
    "path": "patches/2001-add-5.14-support.patch",
    "content": "From 4dc54e1d98c74d1e7b770e3296edc7d8cd75a5d9 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Wed, 20 Oct 2021 22:15:45 +0800\nSubject: [PATCH] add support linux 5.14\n\n---\n include/kernel-version.mk                     |    4 +-\n include/netfilter.mk                          |    5 -\n .../011-kbuild-export-SUBARCH.patch           |   21 +\n ...ow_offload-handle-netdevice-events-f.patch |  106 +\n target/linux/generic/config-5.14              | 7138 +++++++++++++++++\n .../generic/hack-5.14/204-module_strip.patch  |  196 +\n .../210-darwin_scripts_include.patch          | 3053 +++++++\n .../211-darwin-uuid-typedef-clash.patch       |   22 +\n .../hack-5.14/212-tools_portability.patch     |  114 +\n .../hack-5.14/214-spidev_h_portability.patch  |   24 +\n .../generic/hack-5.14/220-gc_sections.patch   |  120 +\n .../hack-5.14/221-module_exports.patch        |  102 +\n .../hack-5.14/230-openwrt_lzma_options.patch  |   34 +\n .../hack-5.14/249-udp-tunnel-selection.patch  |   11 +\n .../hack-5.14/250-netfilter_depends.patch     |   27 +\n .../linux/generic/hack-5.14/251-kconfig.patch |  199 +\n .../260-crypto_test_dependencies.patch        |   52 +\n .../hack-5.14/261-lib-arc4-unhide.patch       |   15 +\n .../generic/hack-5.14/280-rfkill-stubs.patch  |   84 +\n ...cache-use-more-efficient-cache-blast.patch |   64 +\n .../301-mips_image_cmdline_hack.patch         |   38 +\n ...el-name-in-proc-cpuinfo-for-64bit-ta.patch |   38 +\n .../321-powerpc_crtsavres_prereq.patch        |   38 +\n .../generic/hack-5.14/531-debloat_lzma.patch  | 1040 +++\n .../640-bridge-only-accept-EAP-locally.patch  |   41 +\n ...lter-connmark-introduce-set-dscpmark.patch |  212 +\n ...-netfilter-add-xt_FLOWOFFLOAD-target.patch |  820 ++\n .../hack-5.14/651-wireless_mesh_header.patch  |   24 +\n .../hack-5.14/660-fq_codel_defaults.patch     |   27 +\n .../661-use_fq_codel_by_default.patch         |  100 +\n .../700-swconfig_switch_drivers.patch         |  129 +\n .../710-net-dsa-mv88e6xxx-default-VID-1.patch |   18 +\n ...-dsa-mv88e6xxx-disable-ATU-violation.patch |   12 +\n .../hack-5.14/773-bgmac-add-srab-switch.patch |   98 +\n .../hack-5.14/901-debloat_sock_diag.patch     |  162 +\n .../generic/hack-5.14/902-debloat_proc.patch  |  408 +\n .../hack-5.14/904-debloat_dma_buf.patch       |   82 +\n .../hack-5.14/910-kobject_uevent.patch        |   32 +\n .../911-kobject_add_broadcast_uevent.patch    |   76 +\n ...k-events-support-multiple-registrant.patch |  312 +\n .../hack-5.14/992-add-ndo-do-ioctl.patch      |   12 +\n .../993-usb-serial-option-add-u9300.patch     |   46 +\n .../hack-5.14/999-make-phylink-tristate.patch |   11 +\n ...include-asm-rwonce.h-for-kernel-code.patch |   29 +\n ...-Use-stddefs.h-instead-of-compiler.h.patch |   11 +\n ...s-negative-stack-offsets-on-stack-tr.patch |   57 +\n ...e_mem_map-with-ARCH_PFN_OFFSET-calcu.patch |   82 +\n ...0-add-linux-spidev-compatible-si3210.patch |   18 +\n ...ge_allow_receiption_on_disabled_port.patch |   45 +\n ...-rs5c372-support_alarms_up_to_1_week.patch |   94 +\n ...he_alarm_to_be_used_as_wakeup_source.patch |   70 +\n .../pending-5.14/201-extra_optimization.patch |   31 +\n .../203-kallsyms_uncompressed.patch           |  119 +\n .../205-backtrace_module_info.patch           |   41 +\n ...e-filenames-from-deps_initramfs-list.patch |   30 +\n ...able_wilink_platform_without_drivers.patch |   20 +\n .../270-platform-mikrotik-build-bits.patch    |   35 +\n .../300-mips_expose_boot_raw.patch            |   40 +\n .../302-mips_no_branch_likely.patch           |   22 +\n .../pending-5.14/305-mips_module_reloc.patch  |  370 +\n .../307-mips_highmem_offset.patch             |   19 +\n .../pending-5.14/308-mips32r2_tune.patch      |   22 +\n ...CPU-option-reporting-to-proc-cpuinfo.patch |  140 +\n .../310-arm_module_unresolved_weak_sym.patch  |   22 +\n ...t-command-line-parameters-from-users.patch |  284 +\n .../332-arc-add-OWRTDTB-section.patch         |   84 +\n ...able-unaligned-access-in-kernel-mode.patch |   24 +\n ...ernel-XZ-compression-option-on-PPC_8.patch |   25 +\n .../400-mtd-mtdsplit-support.patch            |  313 +\n ...t-add-of_match_table-with-DT-binding.patch |   22 +\n ...30-mtd-add-myloader-partition-parser.patch |  229 +\n ...check-for-bad-blocks-when-calculatin.patch |   68 +\n ...bcm47xxpart-detect-T_Meter-partition.patch |   37 +\n ...mtd-add-routerbootpart-parser-config.patch |   42 +\n ...mtd-cfi_cmdset_0002-no-erase_suspend.patch |   25 +\n ...et_0002-add-buffer-write-cmd-timeout.patch |   17 +\n ...25p80-mx-disable-software-protection.patch |   18 +\n ...ort-limiting-4K-sectors-support-base.patch |   71 +\n .../476-mtd-spi-nor-add-eon-en25q128.patch    |   18 +\n .../479-mtd-spi-nor-add-xtx-xt25f128b.patch   |   79 +\n ...r-add-support-for-Gigadevice-GD25D05.patch |   22 +\n .../483-mtd-spi-nor-add-gd25q512.patch        |   12 +\n ...mtd-device-named-ubi-or-data-on-boot.patch |   97 +\n ...to-create-ubiblock-device-for-rootfs.patch |   69 +\n ...ting-ubi0-rootfs-in-init-do_mounts.c.patch |   51 +\n ...ROOT_DEV-to-ubiblock-rootfs-if-unset.patch |   34 +\n .../494-mtd-ubi-add-EOF-marker-support.patch  |   60 +\n ...-mtd-core-add-get_mtd_device_by_node.patch |   75 +\n ...-add-bindings-for-mtd-concat-devices.patch |   52 +\n ...cat-add-dt-driver-for-concat-devices.patch |  216 +\n ...-mtdconcat-select-readwrite-function.patch |   14 +\n .../500-fs_cdrom_dependencies.patch           |   40 +\n .../530-jffs2_make_lzma_available.patch       | 5180 ++++++++++++\n .../pending-5.14/532-jffs2_eofdetect.patch    |   65 +\n .../600-netfilter_conntrack_flush.patch       |   88 +\n ...etfilter_match_bypass_default_checks.patch |  110 +\n ...netfilter_match_bypass_default_table.patch |  106 +\n ...netfilter_match_reduce_memory_access.patch |   22 +\n ...-netfilter_optional_tcp_window_check.patch |   73 +\n ...del-do-not-defer-queue-length-update.patch |   86 +\n .../pending-5.14/630-packet_socket_type.patch |  138 +\n .../pending-5.14/655-increase_skb_pad.patch   |   20 +\n ...Add-support-for-MAP-E-FMRs-mesh-mode.patch |  511 ++\n ...ng-with-source-address-failed-policy.patch |  263 +\n ...nes-for-_POLICY_FAILED-until-all-cod.patch |   50 +\n ...T-skip-GRO-for-foreign-MAC-addresses.patch |  149 +\n ..._eth_soc-avoid-creating-duplicate-of.patch |   26 +\n ...detach-callback-to-struct-phy_driver.patch |   38 +\n ...net-phy-at803x-fix-at8033-sgmii-mode.patch |   51 +\n ...-net-dsa-mt7530-Support-EEE-features.patch |  103 +\n ...ice-struct-copy-its-DMA-params-to-th.patch |   71 +\n .../810-pci_disable_common_quirks.patch       |   62 +\n .../811-pci_disable_usb_common_quirks.patch   |  115 +\n ...problem-with-platfom-data-in-w1-gpio.patch |   26 +\n .../pending-5.14/834-ledtrig-libata.patch     |  149 +\n ...40-hwrng-bcm2835-set-quality-to-1000.patch |   26 +\n .../pending-5.14/920-mangle_bootargs.patch    |   71 +\n 117 files changed, 26174 insertions(+), 7 deletions(-)\n create mode 100644 target/linux/generic/backport-5.14/011-kbuild-export-SUBARCH.patch\n create mode 100644 target/linux/generic/backport-5.14/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch\n create mode 100644 target/linux/generic/config-5.14\n create mode 100644 target/linux/generic/hack-5.14/204-module_strip.patch\n create mode 100644 target/linux/generic/hack-5.14/210-darwin_scripts_include.patch\n create mode 100644 target/linux/generic/hack-5.14/211-darwin-uuid-typedef-clash.patch\n create mode 100644 target/linux/generic/hack-5.14/212-tools_portability.patch\n create mode 100644 target/linux/generic/hack-5.14/214-spidev_h_portability.patch\n create mode 100644 target/linux/generic/hack-5.14/220-gc_sections.patch\n create mode 100644 target/linux/generic/hack-5.14/221-module_exports.patch\n create mode 100644 target/linux/generic/hack-5.14/230-openwrt_lzma_options.patch\n create mode 100644 target/linux/generic/hack-5.14/249-udp-tunnel-selection.patch\n create mode 100644 target/linux/generic/hack-5.14/250-netfilter_depends.patch\n create mode 100644 target/linux/generic/hack-5.14/251-kconfig.patch\n create mode 100644 target/linux/generic/hack-5.14/260-crypto_test_dependencies.patch\n create mode 100644 target/linux/generic/hack-5.14/261-lib-arc4-unhide.patch\n create mode 100644 target/linux/generic/hack-5.14/280-rfkill-stubs.patch\n create mode 100644 target/linux/generic/hack-5.14/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch\n create mode 100644 target/linux/generic/hack-5.14/301-mips_image_cmdline_hack.patch\n create mode 100644 target/linux/generic/hack-5.14/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n create mode 100644 target/linux/generic/hack-5.14/321-powerpc_crtsavres_prereq.patch\n create mode 100644 target/linux/generic/hack-5.14/531-debloat_lzma.patch\n create mode 100644 target/linux/generic/hack-5.14/640-bridge-only-accept-EAP-locally.patch\n create mode 100644 target/linux/generic/hack-5.14/645-netfilter-connmark-introduce-set-dscpmark.patch\n create mode 100644 target/linux/generic/hack-5.14/650-netfilter-add-xt_FLOWOFFLOAD-target.patch\n create mode 100644 target/linux/generic/hack-5.14/651-wireless_mesh_header.patch\n create mode 100644 target/linux/generic/hack-5.14/660-fq_codel_defaults.patch\n create mode 100644 target/linux/generic/hack-5.14/661-use_fq_codel_by_default.patch\n create mode 100644 target/linux/generic/hack-5.14/700-swconfig_switch_drivers.patch\n create mode 100644 target/linux/generic/hack-5.14/710-net-dsa-mv88e6xxx-default-VID-1.patch\n create mode 100644 target/linux/generic/hack-5.14/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch\n create mode 100644 target/linux/generic/hack-5.14/773-bgmac-add-srab-switch.patch\n create mode 100644 target/linux/generic/hack-5.14/901-debloat_sock_diag.patch\n create mode 100644 target/linux/generic/hack-5.14/902-debloat_proc.patch\n create mode 100644 target/linux/generic/hack-5.14/904-debloat_dma_buf.patch\n create mode 100644 target/linux/generic/hack-5.14/910-kobject_uevent.patch\n create mode 100644 target/linux/generic/hack-5.14/911-kobject_add_broadcast_uevent.patch\n create mode 100644 target/linux/generic/hack-5.14/952-net-conntrack-events-support-multiple-registrant.patch\n create mode 100644 target/linux/generic/hack-5.14/992-add-ndo-do-ioctl.patch\n create mode 100644 target/linux/generic/hack-5.14/993-usb-serial-option-add-u9300.patch\n create mode 100644 target/linux/generic/hack-5.14/999-make-phylink-tristate.patch\n create mode 100644 target/linux/generic/pending-5.14/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch\n create mode 100644 target/linux/generic/pending-5.14/101-Use-stddefs.h-instead-of-compiler.h.patch\n create mode 100644 target/linux/generic/pending-5.14/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch\n create mode 100644 target/linux/generic/pending-5.14/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch\n create mode 100644 target/linux/generic/pending-5.14/130-add-linux-spidev-compatible-si3210.patch\n create mode 100644 target/linux/generic/pending-5.14/150-bridge_allow_receiption_on_disabled_port.patch\n create mode 100644 target/linux/generic/pending-5.14/190-rtc-rs5c372-support_alarms_up_to_1_week.patch\n create mode 100644 target/linux/generic/pending-5.14/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch\n create mode 100644 target/linux/generic/pending-5.14/201-extra_optimization.patch\n create mode 100644 target/linux/generic/pending-5.14/203-kallsyms_uncompressed.patch\n create mode 100644 target/linux/generic/pending-5.14/205-backtrace_module_info.patch\n create mode 100644 target/linux/generic/pending-5.14/240-remove-unsane-filenames-from-deps_initramfs-list.patch\n create mode 100644 target/linux/generic/pending-5.14/261-enable_wilink_platform_without_drivers.patch\n create mode 100644 target/linux/generic/pending-5.14/270-platform-mikrotik-build-bits.patch\n create mode 100644 target/linux/generic/pending-5.14/300-mips_expose_boot_raw.patch\n create mode 100644 target/linux/generic/pending-5.14/302-mips_no_branch_likely.patch\n create mode 100644 target/linux/generic/pending-5.14/305-mips_module_reloc.patch\n create mode 100644 target/linux/generic/pending-5.14/307-mips_highmem_offset.patch\n create mode 100644 target/linux/generic/pending-5.14/308-mips32r2_tune.patch\n create mode 100644 target/linux/generic/pending-5.14/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch\n create mode 100644 target/linux/generic/pending-5.14/310-arm_module_unresolved_weak_sym.patch\n create mode 100644 target/linux/generic/pending-5.14/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch\n create mode 100644 target/linux/generic/pending-5.14/332-arc-add-OWRTDTB-section.patch\n create mode 100644 target/linux/generic/pending-5.14/333-arc-enable-unaligned-access-in-kernel-mode.patch\n create mode 100644 target/linux/generic/pending-5.14/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch\n create mode 100644 target/linux/generic/pending-5.14/400-mtd-mtdsplit-support.patch\n create mode 100644 target/linux/generic/pending-5.14/419-mtd-redboot-add-of_match_table-with-DT-binding.patch\n create mode 100644 target/linux/generic/pending-5.14/430-mtd-add-myloader-partition-parser.patch\n create mode 100644 target/linux/generic/pending-5.14/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch\n create mode 100644 target/linux/generic/pending-5.14/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch\n create mode 100644 target/linux/generic/pending-5.14/435-mtd-add-routerbootpart-parser-config.patch\n create mode 100644 target/linux/generic/pending-5.14/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch\n create mode 100644 target/linux/generic/pending-5.14/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch\n create mode 100644 target/linux/generic/pending-5.14/465-m25p80-mx-disable-software-protection.patch\n create mode 100644 target/linux/generic/pending-5.14/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch\n create mode 100644 target/linux/generic/pending-5.14/476-mtd-spi-nor-add-eon-en25q128.patch\n create mode 100644 target/linux/generic/pending-5.14/479-mtd-spi-nor-add-xtx-xt25f128b.patch\n create mode 100644 target/linux/generic/pending-5.14/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch\n create mode 100644 target/linux/generic/pending-5.14/483-mtd-spi-nor-add-gd25q512.patch\n create mode 100644 target/linux/generic/pending-5.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch\n create mode 100644 target/linux/generic/pending-5.14/491-ubi-auto-create-ubiblock-device-for-rootfs.patch\n create mode 100644 target/linux/generic/pending-5.14/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch\n create mode 100644 target/linux/generic/pending-5.14/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch\n create mode 100644 target/linux/generic/pending-5.14/494-mtd-ubi-add-EOF-marker-support.patch\n create mode 100644 target/linux/generic/pending-5.14/495-mtd-core-add-get_mtd_device_by_node.patch\n create mode 100644 target/linux/generic/pending-5.14/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch\n create mode 100644 target/linux/generic/pending-5.14/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch\n create mode 100644 target/linux/generic/pending-5.14/498-mtd-mtdconcat-select-readwrite-function.patch\n create mode 100644 target/linux/generic/pending-5.14/500-fs_cdrom_dependencies.patch\n create mode 100644 target/linux/generic/pending-5.14/530-jffs2_make_lzma_available.patch\n create mode 100644 target/linux/generic/pending-5.14/532-jffs2_eofdetect.patch\n create mode 100644 target/linux/generic/pending-5.14/600-netfilter_conntrack_flush.patch\n create mode 100644 target/linux/generic/pending-5.14/610-netfilter_match_bypass_default_checks.patch\n create mode 100644 target/linux/generic/pending-5.14/611-netfilter_match_bypass_default_table.patch\n create mode 100644 target/linux/generic/pending-5.14/612-netfilter_match_reduce_memory_access.patch\n create mode 100644 target/linux/generic/pending-5.14/613-netfilter_optional_tcp_window_check.patch\n create mode 100644 target/linux/generic/pending-5.14/620-net_sched-codel-do-not-defer-queue-length-update.patch\n create mode 100644 target/linux/generic/pending-5.14/630-packet_socket_type.patch\n create mode 100644 target/linux/generic/pending-5.14/655-increase_skb_pad.patch\n create mode 100644 target/linux/generic/pending-5.14/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch\n create mode 100644 target/linux/generic/pending-5.14/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch\n create mode 100644 target/linux/generic/pending-5.14/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch\n create mode 100644 target/linux/generic/pending-5.14/680-NET-skip-GRO-for-foreign-MAC-addresses.patch\n create mode 100644 target/linux/generic/pending-5.14/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch\n create mode 100644 target/linux/generic/pending-5.14/703-phy-add-detach-callback-to-struct-phy_driver.patch\n create mode 100644 target/linux/generic/pending-5.14/735-net-phy-at803x-fix-at8033-sgmii-mode.patch\n create mode 100644 target/linux/generic/pending-5.14/761-net-dsa-mt7530-Support-EEE-features.patch\n create mode 100644 target/linux/generic/pending-5.14/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch\n create mode 100644 target/linux/generic/pending-5.14/810-pci_disable_common_quirks.patch\n create mode 100644 target/linux/generic/pending-5.14/811-pci_disable_usb_common_quirks.patch\n create mode 100644 target/linux/generic/pending-5.14/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch\n create mode 100644 target/linux/generic/pending-5.14/834-ledtrig-libata.patch\n create mode 100644 target/linux/generic/pending-5.14/840-hwrng-bcm2835-set-quality-to-1000.patch\n create mode 100644 target/linux/generic/pending-5.14/920-mangle_bootargs.patch\n\ndiff --git a/include/kernel-version.mk b/include/kernel-version.mk\nindex 734dbeda92..74d873e2ab 100644\n--- a/include/kernel-version.mk\n+++ b/include/kernel-version.mk\n@@ -7,10 +7,10 @@ ifdef CONFIG_TESTING_KERNEL\n endif\n \n LINUX_VERSION-5.4 = .162\n-LINUX_VERSION-5.10 = .83\n+LINUX_VERSION-5.14 = .21\n \n LINUX_KERNEL_HASH-5.4.162 = c12d72ddaac78189305a5e98825295ecb02282970033b052276035e83189e25b\n-LINUX_KERNEL_HASH-5.10.83 = ef259a43f33ddb56001283f4f4e50af29b8a48fa066aed7371a90ebf38c29b70\n+LINUX_KERNEL_HASH-5.14.21 = f41a259cb2002dd2e3286524b2bb4e803f4f982992d092706ecea613584023b3 \n remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))\n sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))\ndiff --git a/include/netfilter.mk b/include/netfilter.mk\nindex 803749d931..a0218c9324 100644\n--- a/include/netfilter.mk\n+++ b/include/netfilter.mk\n@@ -48,8 +48,6 @@ $(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_COMMENT, $(P_XT)xt_comme\n $(eval $(call nf_add,IPT_CLUSTER,CONFIG_NETFILTER_XT_MATCH_CLUSTER, $(P_XT)xt_cluster))\n \n $(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_LOG, $(P_XT)xt_LOG))\n-$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_LOG, $(P_XT)nf_log_common))\n-$(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_LOG, $(P_V4)nf_log_ipv4))\n $(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_TARGET_TCPMSS, $(P_XT)xt_TCPMSS))\n $(eval $(call nf_add,IPT_CORE,CONFIG_IP_NF_TARGET_REJECT, $(P_V4)ipt_REJECT))\n $(eval $(call nf_add,IPT_CORE,CONFIG_NETFILTER_XT_MATCH_TIME, $(P_XT)xt_time))\n@@ -156,7 +154,6 @@ $(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_DEFRAG_IPV6, $(P_V6)\n \n $(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_FILTER, $(P_V6)ip6table_filter),))\n $(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_MANGLE, $(P_V6)ip6table_mangle),))\n-$(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_NF_LOG_IPV6, $(P_V6)nf_log_ipv6),))\n \n $(eval $(if $(NF_KMOD),,$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_IPTABLES, ip6t_icmp6)))\n \n@@ -272,8 +269,6 @@ $(eval $(call nf_add,NFNETLINK,CONFIG_NETFILTER_NETLINK, $(P_XT)nfnetlink))\n \n # nflog\n \n-$(eval $(call nf_add,NFNETLINK_LOG,CONFIG_NETFILTER_NETLINK_LOG, $(P_XT)nfnetlink_log))\n-\n # nfqueue\n \n $(eval $(call nf_add,NFNETLINK_QUEUE,CONFIG_NETFILTER_NETLINK_QUEUE, $(P_XT)nfnetlink_queue))\ndiff --git a/target/linux/generic/backport-5.14/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-5.14/011-kbuild-export-SUBARCH.patch\nnew file mode 100644\nindex 0000000000..1c7754da48\n--- /dev/null\n+++ b/target/linux/generic/backport-5.14/011-kbuild-export-SUBARCH.patch\n@@ -0,0 +1,21 @@\n+From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sun, 9 Jul 2017 00:26:53 +0200\n+Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ Makefile | 4 ++--\n+ 1 file changed, 2 insertions(+), 2 deletions(-)\n+\n+--- a/Makefile\n++++ b/Makefile\n+@@ -519,7 +519,7 @@ KBUILD_LDFLAGS_MODULE :=\n+ KBUILD_LDFLAGS :=\n+ CLANG_FLAGS :=\n+ \n+-export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC\n++export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC\n+ export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL\n+ export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX\n+ export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD\ndiff --git a/target/linux/generic/backport-5.14/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch b/target/linux/generic/backport-5.14/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch\nnew file mode 100644\nindex 0000000000..c708169a9e\n--- /dev/null\n+++ b/target/linux/generic/backport-5.14/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch\n@@ -0,0 +1,106 @@\n+From: Pablo Neira Ayuso <pablo@netfilter.org>\n+Date: Thu, 25 Jan 2018 12:58:55 +0100\n+Subject: [PATCH] netfilter: nft_flow_offload: handle netdevice events from\n+ nf_flow_table\n+\n+Move the code that deals with device events to the core.\n+\n+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>\n+---\n+\n+--- a/net/netfilter/nf_flow_table_core.c\n++++ b/net/netfilter/nf_flow_table_core.c\n+@@ -647,13 +647,41 @@ void nf_flow_table_free(struct nf_flowta\n+ }\n+ EXPORT_SYMBOL_GPL(nf_flow_table_free);\n+ \n++static int nf_flow_table_netdev_event(struct notifier_block *this,\n++\t\t\t\t      unsigned long event, void *ptr)\n++{\n++\tstruct net_device *dev = netdev_notifier_info_to_dev(ptr);\n++\n++\tif (event != NETDEV_DOWN)\n++\t\treturn NOTIFY_DONE;\n++\n++\tnf_flow_table_cleanup(dev);\n++\n++\treturn NOTIFY_DONE;\n++}\n++\n++static struct notifier_block flow_offload_netdev_notifier = {\n++\t.notifier_call\t= nf_flow_table_netdev_event,\n++};\n++\n+ static int __init nf_flow_table_module_init(void)\n+ {\n+-\treturn nf_flow_table_offload_init();\n++\tint ret;\n++\n++\tret = nf_flow_table_offload_init();\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = register_netdevice_notifier(&flow_offload_netdev_notifier);\n++\tif (ret)\n++\t\tnf_flow_table_offload_exit();\n++\n++\treturn ret;\n+ }\n+ \n+ static void __exit nf_flow_table_module_exit(void)\n+ {\n++\tunregister_netdevice_notifier(&flow_offload_netdev_notifier);\n+ \tnf_flow_table_offload_exit();\n+ }\n+ \n+--- a/net/netfilter/nft_flow_offload.c\n++++ b/net/netfilter/nft_flow_offload.c\n+@@ -438,47 +438,14 @@ static struct nft_expr_type nft_flow_off\n+ \t.owner\t\t= THIS_MODULE,\n+ };\n+ \n+-static int flow_offload_netdev_event(struct notifier_block *this,\n+-\t\t\t\t     unsigned long event, void *ptr)\n+-{\n+-\tstruct net_device *dev = netdev_notifier_info_to_dev(ptr);\n+-\n+-\tif (event != NETDEV_DOWN)\n+-\t\treturn NOTIFY_DONE;\n+-\n+-\tnf_flow_table_cleanup(dev);\n+-\n+-\treturn NOTIFY_DONE;\n+-}\n+-\n+-static struct notifier_block flow_offload_netdev_notifier = {\n+-\t.notifier_call\t= flow_offload_netdev_event,\n+-};\n+-\n+ static int __init nft_flow_offload_module_init(void)\n+ {\n+-\tint err;\n+-\n+-\terr = register_netdevice_notifier(&flow_offload_netdev_notifier);\n+-\tif (err)\n+-\t\tgoto err;\n+-\n+-\terr = nft_register_expr(&nft_flow_offload_type);\n+-\tif (err < 0)\n+-\t\tgoto register_expr;\n+-\n+-\treturn 0;\n+-\n+-register_expr:\n+-\tunregister_netdevice_notifier(&flow_offload_netdev_notifier);\n+-err:\n+-\treturn err;\n++\treturn nft_register_expr(&nft_flow_offload_type);\n+ }\n+ \n+ static void __exit nft_flow_offload_module_exit(void)\n+ {\n+ \tnft_unregister_expr(&nft_flow_offload_type);\n+-\tunregister_netdevice_notifier(&flow_offload_netdev_notifier);\n+ }\n+ \n+ module_init(nft_flow_offload_module_init);\ndiff --git a/target/linux/generic/config-5.14 b/target/linux/generic/config-5.14\nnew file mode 100644\nindex 0000000000..ee74833fc8\n--- /dev/null\n+++ b/target/linux/generic/config-5.14\n@@ -0,0 +1,7138 @@\n+# CONFIG_104_QUAD_8 is not set\n+CONFIG_32BIT=y\n+CONFIG_64BIT_TIME=y\n+# CONFIG_6LOWPAN is not set\n+# CONFIG_6LOWPAN_DEBUGFS is not set\n+# CONFIG_6PACK is not set\n+# CONFIG_8139CP is not set\n+# CONFIG_8139TOO is not set\n+# CONFIG_9P_FS is not set\n+# CONFIG_AB3100_CORE is not set\n+# CONFIG_AB8500_CORE is not set\n+# CONFIG_ABP060MG is not set\n+# CONFIG_ABX500_CORE is not set\n+# CONFIG_ACCESSIBILITY is not set\n+# CONFIG_ACENIC is not set\n+# CONFIG_ACERHDF is not set\n+# CONFIG_ACER_WIRELESS is not set\n+# CONFIG_ACORN_PARTITION is not set\n+# CONFIG_ACPI_ALS is not set\n+# CONFIG_ACPI_APEI is not set\n+# CONFIG_ACPI_BUTTON is not set\n+# CONFIG_ACPI_CONFIGFS is not set\n+# CONFIG_ACPI_CUSTOM_METHOD is not set\n+# CONFIG_ACPI_EXTLOG is not set\n+# CONFIG_ACPI_HED is not set\n+# CONFIG_ACPI_NFIT is not set\n+# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set\n+# CONFIG_ACPI_TABLE_UPGRADE is not set\n+# CONFIG_ACPI_VIDEO is not set\n+# CONFIG_AD2S1200 is not set\n+# CONFIG_AD2S1210 is not set\n+# CONFIG_AD2S90 is not set\n+# CONFIG_AD5064 is not set\n+# CONFIG_AD525X_DPOT is not set\n+# CONFIG_AD5272 is not set\n+# CONFIG_AD5360 is not set\n+# CONFIG_AD5380 is not set\n+# CONFIG_AD5421 is not set\n+# CONFIG_AD5446 is not set\n+# CONFIG_AD5449 is not set\n+# CONFIG_AD5504 is not set\n+# CONFIG_AD5592R is not set\n+# CONFIG_AD5593R is not set\n+# CONFIG_AD5624R_SPI is not set\n+# CONFIG_AD5686 is not set\n+# CONFIG_AD5686_SPI is not set\n+# CONFIG_AD5696_I2C is not set\n+# CONFIG_AD5755 is not set\n+# CONFIG_AD5758 is not set\n+# CONFIG_AD5761 is not set\n+# CONFIG_AD5764 is not set\n+# CONFIG_AD5770R is not set\n+# CONFIG_AD5791 is not set\n+# CONFIG_AD5933 is not set\n+# CONFIG_AD7091R5 is not set\n+# CONFIG_AD7124 is not set\n+# CONFIG_AD7150 is not set\n+# CONFIG_AD7152 is not set\n+# CONFIG_AD7192 is not set\n+# CONFIG_AD7266 is not set\n+# CONFIG_AD7280 is not set\n+# CONFIG_AD7291 is not set\n+# CONFIG_AD7292 is not set\n+# CONFIG_AD7298 is not set\n+# CONFIG_AD7303 is not set\n+# CONFIG_AD7476 is not set\n+# CONFIG_AD7606 is not set\n+# CONFIG_AD7606_IFACE_PARALLEL is not set\n+# CONFIG_AD7606_IFACE_SPI is not set\n+# CONFIG_AD7746 is not set\n+# CONFIG_AD7766 is not set\n+# CONFIG_AD7768_1 is not set\n+# CONFIG_AD7780 is not set\n+# CONFIG_AD7791 is not set\n+# CONFIG_AD7793 is not set\n+# CONFIG_AD7816 is not set\n+# CONFIG_AD7887 is not set\n+# CONFIG_AD7923 is not set\n+# CONFIG_AD7949 is not set\n+# CONFIG_AD799X is not set\n+# CONFIG_AD8366 is not set\n+# CONFIG_AD8801 is not set\n+# CONFIG_AD9467 is not set\n+# CONFIG_AD9523 is not set\n+# CONFIG_AD9832 is not set\n+# CONFIG_AD9834 is not set\n+# CONFIG_ADAPTEC_STARFIRE is not set\n+# CONFIG_ADE7854 is not set\n+# CONFIG_ADF4350 is not set\n+# CONFIG_ADF4371 is not set\n+# CONFIG_ADFS_FS is not set\n+# CONFIG_ADIN_PHY is not set\n+# CONFIG_ADIS16080 is not set\n+# CONFIG_ADIS16130 is not set\n+# CONFIG_ADIS16136 is not set\n+# CONFIG_ADIS16201 is not set\n+# CONFIG_ADIS16203 is not set\n+# CONFIG_ADIS16209 is not set\n+# CONFIG_ADIS16240 is not set\n+# CONFIG_ADIS16260 is not set\n+# CONFIG_ADIS16400 is not set\n+# CONFIG_ADIS16460 is not set\n+# CONFIG_ADIS16475 is not set\n+# CONFIG_ADIS16480 is not set\n+# CONFIG_ADI_AXI_ADC is not set\n+# CONFIG_ADJD_S311 is not set\n+# CONFIG_ADM6996_PHY is not set\n+# CONFIG_ADM8211 is not set\n+# CONFIG_ADT7316 is not set\n+# CONFIG_ADUX1020 is not set\n+# CONFIG_ADV_SWBUTTON is not set\n+CONFIG_ADVISE_SYSCALLS=y\n+# CONFIG_ADXL345_I2C is not set\n+# CONFIG_ADXL345_SPI is not set\n+# CONFIG_ADXL372_I2C is not set\n+# CONFIG_ADXL372_SPI is not set\n+# CONFIG_ADXRS290 is not set\n+# CONFIG_ADXRS450 is not set\n+CONFIG_AEABI=y\n+# CONFIG_AFE4403 is not set\n+# CONFIG_AFE4404 is not set\n+# CONFIG_AFFS_FS is not set\n+# CONFIG_AFS_DEBUG_CURSOR is not set\n+# CONFIG_AFS_FS is not set\n+# CONFIG_AF_KCM is not set\n+# CONFIG_AF_RXRPC is not set\n+# CONFIG_AF_RXRPC_INJECT_LOSS is not set\n+# CONFIG_AF_RXRPC_IPV6 is not set\n+# CONFIG_AGP is not set\n+# CONFIG_AHCI_CEVA is not set\n+# CONFIG_AHCI_IMX is not set\n+# CONFIG_AHCI_MVEBU is not set\n+# CONFIG_AHCI_QORIQ is not set\n+CONFIG_AIO=y\n+# CONFIG_AIRO is not set\n+# CONFIG_AIRO_CS is not set\n+# CONFIG_AIX_PARTITION is not set\n+# CONFIG_AK09911 is not set\n+# CONFIG_AK8974 is not set\n+# CONFIG_AK8975 is not set\n+# CONFIG_AL3010 is not set\n+# CONFIG_AL3320A is not set\n+# CONFIG_ALIM7101_WDT is not set\n+CONFIG_ALLOW_DEV_COREDUMP=y\n+# CONFIG_ALTERA_MBOX is not set\n+# CONFIG_ALTERA_MSGDMA is not set\n+# CONFIG_ALTERA_STAPL is not set\n+# CONFIG_ALTERA_TSE is not set\n+# CONFIG_ALX is not set\n+# CONFIG_AL_FIC is not set\n+# CONFIG_AM2315 is not set\n+# CONFIG_AM335X_PHY_USB is not set\n+# CONFIG_AMBA_PL08X is not set\n+# CONFIG_AMD8111_ETH is not set\n+# CONFIG_AMD_MEM_ENCRYPT is not set\n+# CONFIG_AMD_PHY is not set\n+# CONFIG_AMD_XGBE is not set\n+# CONFIG_AMD_XGBE_HAVE_ECC is not set\n+# CONFIG_AMIGA_PARTITION is not set\n+# CONFIG_AMILO_RFKILL is not set\n+# CONFIG_ANDROID is not set\n+CONFIG_ANON_INODES=y\n+# CONFIG_APDS9300 is not set\n+# CONFIG_APDS9802ALS is not set\n+# CONFIG_APDS9960 is not set\n+# CONFIG_APM8018X is not set\n+# CONFIG_APM_EMULATION is not set\n+# CONFIG_APPLE_AIC is not set\n+# CONFIG_APPLE_GMUX is not set\n+# CONFIG_APPLE_MFI_FASTCHARGE is not set\n+# CONFIG_APPLE_PROPERTIES is not set\n+# CONFIG_APPLICOM is not set\n+# CONFIG_AQTION is not set\n+# CONFIG_AQUANTIA_PHY is not set\n+# CONFIG_AR5523 is not set\n+# CONFIG_AR7 is not set\n+# CONFIG_AR8216_PHY is not set\n+# CONFIG_AR8216_PHY_LEDS is not set\n+# CONFIG_ARCH_ACTIONS is not set\n+# CONFIG_ARCH_AGILEX is not set\n+# CONFIG_ARCH_ALPINE is not set\n+# CONFIG_ARCH_APPLE is not set\n+# CONFIG_ARCH_ARTPEC is not set\n+# CONFIG_ARCH_ASPEED is not set\n+# CONFIG_ARCH_AT91 is not set\n+# CONFIG_ARCH_AXXIA is not set\n+# CONFIG_ARCH_BCM is not set\n+# CONFIG_ARCH_BCM2835 is not set\n+# CONFIG_ARCH_BCM_21664 is not set\n+# CONFIG_ARCH_BCM_23550 is not set\n+# CONFIG_ARCH_BCM_281XX is not set\n+# CONFIG_ARCH_BCM_5301X is not set\n+# CONFIG_ARCH_BCM_53573 is not set\n+# CONFIG_ARCH_BCM_63XX is not set\n+# CONFIG_ARCH_BCM_CYGNUS is not set\n+# CONFIG_ARCH_BCM_IPROC is not set\n+# CONFIG_ARCH_BCM_NSP is not set\n+# CONFIG_ARCH_BERLIN is not set\n+CONFIG_ARCH_BINFMT_ELF_STATE=y\n+# CONFIG_ARCH_BITMAIN is not set\n+# CONFIG_ARCH_BRCMSTB is not set\n+# CONFIG_ARCH_CLPS711X is not set\n+# CONFIG_ARCH_CNS3XXX is not set\n+# CONFIG_ARCH_DAVINCI is not set\n+# CONFIG_ARCH_DIGICOLOR is not set\n+# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set\n+# CONFIG_ARCH_DOVE is not set\n+# CONFIG_ARCH_EBSA110 is not set\n+# CONFIG_ARCH_EP93XX is not set\n+# CONFIG_ARCH_EXYNOS is not set\n+CONFIG_ARCH_FLATMEM_ENABLE=y\n+# CONFIG_ARCH_FOOTBRIDGE is not set\n+# CONFIG_ARCH_GEMINI is not set\n+# CONFIG_ARCH_HI3xxx is not set\n+# CONFIG_ARCH_HIGHBANK is not set\n+# CONFIG_ARCH_HISI is not set\n+# CONFIG_ARCH_INTEGRATOR is not set\n+# CONFIG_ARCH_IOP13XX is not set\n+# CONFIG_ARCH_IOP32X is not set\n+# CONFIG_ARCH_IOP33X is not set\n+# CONFIG_ARCH_IXP4XX is not set\n+# CONFIG_ARCH_K3 is not set\n+# CONFIG_ARCH_KEEMBAY is not set\n+# CONFIG_ARCH_KEYSTONE is not set\n+# CONFIG_ARCH_KS8695 is not set\n+# CONFIG_ARCH_LAYERSCAPE is not set\n+# CONFIG_ARCH_LG1K is not set\n+# CONFIG_ARCH_LPC32XX is not set\n+# CONFIG_ARCH_MEDIATEK is not set\n+# CONFIG_ARCH_MESON is not set\n+# CONFIG_ARCH_MILBEAUT is not set\n+CONFIG_ARCH_MMAP_RND_BITS=8\n+CONFIG_ARCH_MMAP_RND_BITS_MAX=16\n+CONFIG_ARCH_MMAP_RND_BITS_MIN=8\n+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16\n+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8\n+# CONFIG_ARCH_MMP is not set\n+# CONFIG_ARCH_MSTARV7 is not set\n+# CONFIG_ARCH_MULTIPLATFORM is not set\n+# CONFIG_ARCH_MULTI_V6 is not set\n+# CONFIG_ARCH_MULTI_V7 is not set\n+# CONFIG_ARCH_MV78XX0 is not set\n+# CONFIG_ARCH_MVEBU is not set\n+# CONFIG_ARCH_MXC is not set\n+# CONFIG_ARCH_MXS is not set\n+# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set\n+# CONFIG_ARCH_NETX is not set\n+# CONFIG_ARCH_NOMADIK is not set\n+# CONFIG_ARCH_NPCM is not set\n+# CONFIG_ARCH_NSPIRE is not set\n+# CONFIG_ARCH_OMAP is not set\n+# CONFIG_ARCH_OMAP1 is not set\n+# CONFIG_ARCH_OMAP2 is not set\n+# CONFIG_ARCH_OMAP2PLUS is not set\n+# CONFIG_ARCH_OMAP3 is not set\n+# CONFIG_ARCH_OMAP4 is not set\n+# CONFIG_ARCH_ORION5X is not set\n+# CONFIG_ARCH_OXNAS is not set\n+# CONFIG_ARCH_PICOXCELL is not set\n+# CONFIG_ARCH_PRIMA2 is not set\n+# CONFIG_ARCH_PXA is not set\n+# CONFIG_ARCH_QCOM is not set\n+# CONFIG_ARCH_RANDOM is not set\n+# CONFIG_ARCH_RDA is not set\n+# CONFIG_ARCH_REALTEK is not set\n+# CONFIG_ARCH_REALVIEW is not set\n+# CONFIG_ARCH_RENESAS is not set\n+# CONFIG_ARCH_ROCKCHIP is not set\n+# CONFIG_ARCH_RPC is not set\n+# CONFIG_ARCH_S32 is not set\n+# CONFIG_ARCH_S3C24XX is not set\n+# CONFIG_ARCH_S3C64XX is not set\n+# CONFIG_ARCH_S5PV210 is not set\n+# CONFIG_ARCH_SA1100 is not set\n+# CONFIG_ARCH_SEATTLE is not set\n+# CONFIG_ARCH_INTEL_SOCFPGA is not set\n+# CONFIG_ARCH_SHMOBILE is not set\n+# CONFIG_ARCH_SIRF is not set\n+# CONFIG_ARCH_SOCFPGA is not set\n+# CONFIG_ARCH_SPARX5 is not set\n+# CONFIG_ARCH_SPRD is not set\n+# CONFIG_ARCH_STI is not set\n+# CONFIG_ARCH_STM32 is not set\n+# CONFIG_ARCH_STRATIX10 is not set\n+# CONFIG_ARCH_SUNXI is not set\n+# CONFIG_ARCH_SYNQUACER is not set\n+# CONFIG_ARCH_TANGO is not set\n+# CONFIG_ARCH_TEGRA is not set\n+# CONFIG_ARCH_THUNDER is not set\n+# CONFIG_ARCH_THUNDER2 is not set\n+# CONFIG_ARCH_U300 is not set\n+# CONFIG_ARCH_U8500 is not set\n+# CONFIG_ARCH_UNIPHIER is not set\n+# CONFIG_ARCH_VERSATILE is not set\n+# CONFIG_ARCH_VEXPRESS is not set\n+# CONFIG_ARCH_VIRT is not set\n+# CONFIG_ARCH_VISCONTI is not set\n+# CONFIG_ARCH_VT8500 is not set\n+# CONFIG_ARCH_VULCAN is not set\n+# CONFIG_ARCH_W90X900 is not set\n+# CONFIG_ARCH_WANTS_THP_SWAP is not set\n+# CONFIG_ARCH_WM8505 is not set\n+# CONFIG_ARCH_WM8750 is not set\n+# CONFIG_ARCH_WM8850 is not set\n+# CONFIG_ARCH_XGENE is not set\n+# CONFIG_ARCH_ZX is not set\n+# CONFIG_ARCH_ZYNQ is not set\n+# CONFIG_ARCH_ZYNQMP is not set\n+# CONFIG_ARCNET is not set\n+# CONFIG_ARC_EMAC is not set\n+# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set\n+# CONFIG_ARM64_16K_PAGES is not set\n+# CONFIG_ARM64_64K_PAGES is not set\n+# CONFIG_ARM64_AMU_EXTN is not set\n+# CONFIG_ARM64_BTI is not set\n+# CONFIG_ARM64_CRYPTO is not set\n+# CONFIG_ARM64_E0PD is not set\n+# CONFIG_ARM64_EPAN is not set\n+# CONFIG_ARM64_ERRATUM_1024718 is not set\n+# CONFIG_ARM64_ERRATUM_1319367 is not set\n+# CONFIG_ARM64_ERRATUM_1463225 is not set\n+# CONFIG_ARM64_ERRATUM_1508412 is not set\n+# CONFIG_ARM64_ERRATUM_1530923 is not set\n+# CONFIG_ARM64_ERRATUM_1542419 is not set\n+# CONFIG_ARM64_ERRATUM_819472 is not set\n+# CONFIG_ARM64_ERRATUM_824069 is not set\n+# CONFIG_ARM64_ERRATUM_826319 is not set\n+# CONFIG_ARM64_ERRATUM_827319 is not set\n+# CONFIG_ARM64_ERRATUM_832075 is not set\n+# CONFIG_ARM64_ERRATUM_834220 is not set\n+# CONFIG_ARM64_ERRATUM_843419 is not set\n+# CONFIG_ARM64_ERRATUM_845719 is not set\n+# CONFIG_ARM64_ERRATUM_858921 is not set\n+# CONFIG_ARM64_HW_AFDBM is not set\n+# CONFIG_ARM64_LSE_ATOMICS is not set\n+# CONFIG_ARM64_MODULE_PLTS is not set\n+# CONFIG_ARM64_MTE is not set\n+# CONFIG_ARM64_PAN is not set\n+# CONFIG_ARM64_PMEM is not set\n+# CONFIG_ARM64_PSEUDO_NMI is not set\n+# CONFIG_ARM64_PTDUMP_DEBUGFS is not set\n+# CONFIG_ARM64_PTR_AUTH_KERNEL is not set\n+# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set\n+# CONFIG_ARM64_RAS_EXTN is not set\n+# CONFIG_ARM64_RELOC_TEST is not set\n+CONFIG_ARM64_SW_TTBR0_PAN=y\n+# CONFIG_ARM64_TLB_RANGE is not set\n+# CONFIG_ARM64_UAO is not set\n+# CONFIG_ARM64_USE_LSE_ATOMICS is not set\n+# CONFIG_ARM64_VA_BITS_48 is not set\n+# CONFIG_ARM64_VHE is not set\n+# CONFIG_ARM_APPENDED_DTB is not set\n+# CONFIG_ARM_ARCH_TIMER is not set\n+# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set\n+# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set\n+# CONFIG_ARM_CCI is not set\n+# CONFIG_ARM_CCI400_PMU is not set\n+# CONFIG_ARM_CCI5xx_PMU is not set\n+# CONFIG_ARM_CCI_PMU is not set\n+# CONFIG_ARM_CCN is not set\n+# CONFIG_ARM_CMN is not set\n+# CONFIG_ARM_CPUIDLE is not set\n+CONFIG_ARM_CPU_TOPOLOGY=y\n+# CONFIG_ARM_CRYPTO is not set\n+CONFIG_ARM_DMA_MEM_BUFFERABLE=y\n+# CONFIG_ARM_DSU_PMU is not set\n+# CONFIG_ARM_ERRATA_326103 is not set\n+# CONFIG_ARM_ERRATA_364296 is not set\n+# CONFIG_ARM_ERRATA_411920 is not set\n+# CONFIG_ARM_ERRATA_430973 is not set\n+# CONFIG_ARM_ERRATA_458693 is not set\n+# CONFIG_ARM_ERRATA_460075 is not set\n+# CONFIG_ARM_ERRATA_643719 is not set\n+# CONFIG_ARM_ERRATA_720789 is not set\n+# CONFIG_ARM_ERRATA_742230 is not set\n+# CONFIG_ARM_ERRATA_742231 is not set\n+# CONFIG_ARM_ERRATA_743622 is not set\n+# CONFIG_ARM_ERRATA_751472 is not set\n+# CONFIG_ARM_ERRATA_754322 is not set\n+# CONFIG_ARM_ERRATA_754327 is not set\n+# CONFIG_ARM_ERRATA_764369 is not set\n+# CONFIG_ARM_ERRATA_773022 is not set\n+# CONFIG_ARM_ERRATA_775420 is not set\n+# CONFIG_ARM_ERRATA_798181 is not set\n+# CONFIG_ARM_ERRATA_814220 is not set\n+# CONFIG_ARM_ERRATA_818325_852422 is not set\n+# CONFIG_ARM_ERRATA_821420 is not set\n+# CONFIG_ARM_ERRATA_825619 is not set\n+# CONFIG_ARM_ERRATA_852421 is not set\n+# CONFIG_ARM_ERRATA_852423 is not set\n+# CONFIG_ARM_ERRATA_857271 is not set\n+# CONFIG_ARM_ERRATA_857272 is not set\n+# CONFIG_ARM_FFA_TRANSPORT is not set\n+CONFIG_ARM_GIC_MAX_NR=1\n+# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set\n+# CONFIG_ARM_KPROBES_TEST is not set\n+# CONFIG_ARM_LPAE is not set\n+# CONFIG_ARM_MHU is not set\n+# CONFIG_ARM_MODULE_PLTS is not set\n+# CONFIG_ARM_PATCH_PHYS_VIRT is not set\n+# CONFIG_ARM_PSCI is not set\n+# CONFIG_ARM_PSCI_CHECKER is not set\n+# CONFIG_ARM_PSCI_CPUIDLE is not set\n+# CONFIG_ARM_PTDUMP_DEBUGFS is not set\n+# CONFIG_ARM_SBSA_WATCHDOG is not set\n+# CONFIG_ARM_SCPI_PROTOCOL is not set\n+# CONFIG_ARM_SDE_INTERFACE is not set\n+# CONFIG_ARM_SMCCC_SOC_ID is not set\n+# CONFIG_ARM_SMC_WATCHDOG is not set\n+# CONFIG_ARM_SP805_WATCHDOG is not set\n+# CONFIG_ARM_SPE_PMU is not set\n+# CONFIG_ARM_THUMBEE is not set\n+# CONFIG_ARM_TIMER_SP804 is not set\n+# CONFIG_ARM_UNWIND is not set\n+# CONFIG_ARM_VIRT_EXT is not set\n+# CONFIG_AS3935 is not set\n+# CONFIG_AS73211 is not set\n+# CONFIG_ASM9260_TIMER is not set\n+# CONFIG_ASUS_LAPTOP is not set\n+# CONFIG_ASUS_WIRELESS is not set\n+# CONFIG_ASYMMETRIC_KEY_TYPE is not set\n+# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set\n+# CONFIG_ASYNC_RAID6_TEST is not set\n+# CONFIG_ASYNC_TX_DMA is not set\n+# CONFIG_AT76C50X_USB is not set\n+# CONFIG_AT803X_PHY is not set\n+# CONFIG_AT91_SAMA5D2_ADC is not set\n+# CONFIG_ATA is not set\n+# CONFIG_ATAGS is not set\n+CONFIG_ATAGS_PROC=y\n+# CONFIG_ATALK is not set\n+# CONFIG_ATARI_PARTITION is not set\n+# CONFIG_ATA_ACPI is not set\n+CONFIG_ATA_BMDMA=y\n+# CONFIG_ATA_FORCE is not set\n+# CONFIG_ATA_GENERIC is not set\n+# CONFIG_ATA_LEDS is not set\n+# CONFIG_ATA_NONSTANDARD is not set\n+# CONFIG_ATA_OVER_ETH is not set\n+# CONFIG_ATA_PIIX is not set\n+CONFIG_ATA_SFF=y\n+# CONFIG_ATA_VERBOSE_ERROR is not set\n+# CONFIG_ATH10K is not set\n+# CONFIG_ATH25 is not set\n+# CONFIG_ATH5K is not set\n+# CONFIG_ATH6KL is not set\n+# CONFIG_ATH79 is not set\n+# CONFIG_ATH9K is not set\n+# CONFIG_ATH9K_HTC is not set\n+# CONFIG_ATH_DEBUG is not set\n+# CONFIG_ATL1 is not set\n+# CONFIG_ATL1C is not set\n+# CONFIG_ATL1E is not set\n+# CONFIG_ATL2 is not set\n+# CONFIG_ATLAS_EZO_SENSOR is not set\n+# CONFIG_ATLAS_PH_SENSOR is not set\n+# CONFIG_ATM is not set\n+# CONFIG_ATMEL is not set\n+# CONFIG_ATMEL_PIT is not set\n+# CONFIG_ATMEL_SSC is not set\n+# CONFIG_ATM_AMBASSADOR is not set\n+# CONFIG_ATM_BR2684 is not set\n+CONFIG_ATM_BR2684_IPFILTER=y\n+# CONFIG_ATM_CLIP is not set\n+CONFIG_ATM_CLIP_NO_ICMP=y\n+# CONFIG_ATM_DRIVERS is not set\n+# CONFIG_ATM_DUMMY is not set\n+# CONFIG_ATM_ENI is not set\n+# CONFIG_ATM_FIRESTREAM is not set\n+# CONFIG_ATM_FORE200E is not set\n+# CONFIG_ATM_HE is not set\n+# CONFIG_ATM_HORIZON is not set\n+# CONFIG_ATM_IA is not set\n+# CONFIG_ATM_IDT77252 is not set\n+# CONFIG_ATM_LANAI is not set\n+# CONFIG_ATM_LANE is not set\n+# CONFIG_ATM_MPOA is not set\n+# CONFIG_ATM_NICSTAR is not set\n+# CONFIG_ATM_SOLOS is not set\n+# CONFIG_ATM_TCP is not set\n+# CONFIG_ATM_ZATM is not set\n+# CONFIG_ATOMIC64_SELFTEST is not set\n+# CONFIG_ATP is not set\n+# CONFIG_AUDIT is not set\n+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set\n+# CONFIG_AURORA_NB8800 is not set\n+# CONFIG_AUTOFS4_FS is not set\n+# CONFIG_AUTOFS_FS is not set\n+# CONFIG_AUTO_ZRELADDR is not set\n+# CONFIG_AUXDISPLAY is not set\n+# CONFIG_AX25 is not set\n+# CONFIG_AX25_DAMA_SLAVE is not set\n+# CONFIG_AX88796 is not set\n+# CONFIG_AX88796B_PHY is not set\n+# CONFIG_AXP20X_ADC is not set\n+# CONFIG_AXP20X_POWER is not set\n+# CONFIG_AXP288_ADC is not set\n+# CONFIG_AXP288_FUEL_GAUGE is not set\n+# CONFIG_B43 is not set\n+# CONFIG_B43LEGACY is not set\n+# CONFIG_B44 is not set\n+# CONFIG_B53 is not set\n+# CONFIG_BACKLIGHT_ADP8860 is not set\n+# CONFIG_BACKLIGHT_ADP8870 is not set\n+# CONFIG_BACKLIGHT_APPLE is not set\n+# CONFIG_BACKLIGHT_ARCXCNN is not set\n+# CONFIG_BACKLIGHT_BD6107 is not set\n+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set\n+# CONFIG_BACKLIGHT_GENERIC is not set\n+# CONFIG_BACKLIGHT_GPIO is not set\n+# CONFIG_BACKLIGHT_KTD253 is not set\n+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set\n+# CONFIG_BACKLIGHT_LED is not set\n+# CONFIG_BACKLIGHT_LM3630A is not set\n+# CONFIG_BACKLIGHT_LM3639 is not set\n+# CONFIG_BACKLIGHT_LP855X is not set\n+# CONFIG_BACKLIGHT_LV5207LP is not set\n+# CONFIG_BACKLIGHT_PANDORA is not set\n+# CONFIG_BACKLIGHT_PM8941_WLED is not set\n+# CONFIG_BACKLIGHT_PWM is not set\n+# CONFIG_BACKLIGHT_QCOM_WLED is not set\n+# CONFIG_BACKLIGHT_RPI is not set\n+# CONFIG_BACKLIGHT_SAHARA is not set\n+# CONFIG_BACKTRACE_SELF_TEST is not set\n+# CONFIG_BAREUDP is not set\n+CONFIG_BASE_FULL=y\n+CONFIG_BASE_SMALL=0\n+# CONFIG_BATMAN_ADV is not set\n+# CONFIG_BATTERY_BQ27XXX is not set\n+# CONFIG_BATTERY_BQ27XXX_HDQ is not set\n+# CONFIG_BATTERY_CW2015 is not set\n+# CONFIG_BATTERY_DS2760 is not set\n+# CONFIG_BATTERY_DS2780 is not set\n+# CONFIG_BATTERY_DS2781 is not set\n+# CONFIG_BATTERY_DS2782 is not set\n+# CONFIG_BATTERY_GAUGE_LTC2941 is not set\n+# CONFIG_BATTERY_GOLDFISH is not set\n+# CONFIG_BATTERY_LEGO_EV3 is not set\n+# CONFIG_BATTERY_MAX17040 is not set\n+# CONFIG_BATTERY_MAX17042 is not set\n+# CONFIG_BATTERY_MAX1721X is not set\n+# CONFIG_BATTERY_RT5033 is not set\n+# CONFIG_BATTERY_SBS is not set\n+# CONFIG_BAYCOM_EPP is not set\n+# CONFIG_BAYCOM_PAR is not set\n+# CONFIG_BAYCOM_SER_FDX is not set\n+# CONFIG_BAYCOM_SER_HDX is not set\n+# CONFIG_BCACHE is not set\n+# CONFIG_BCM47XX is not set\n+# CONFIG_BCM54140_PHY is not set\n+# CONFIG_BCM63XX is not set\n+# CONFIG_BCM63XX_PHY is not set\n+# CONFIG_BCM7038_WDT is not set\n+# CONFIG_BCM7XXX_PHY is not set\n+# CONFIG_BCM84881_PHY is not set\n+# CONFIG_BCM87XX_PHY is not set\n+# CONFIG_BCMA is not set\n+# CONFIG_BCMA_DRIVER_GPIO is not set\n+CONFIG_BCMA_POSSIBLE=y\n+# CONFIG_BCMGENET is not set\n+# CONFIG_BCM_IPROC_ADC is not set\n+# CONFIG_BCM_KONA_USB2_PHY is not set\n+# CONFIG_BCM_SBA_RAID is not set\n+# CONFIG_BDI_SWITCH is not set\n+# CONFIG_BE2ISCSI is not set\n+# CONFIG_BE2NET is not set\n+# CONFIG_BEFS_FS is not set\n+# CONFIG_BFS_FS is not set\n+# CONFIG_BGMAC is not set\n+# CONFIG_BH1750 is not set\n+# CONFIG_BH1780 is not set\n+# CONFIG_BIG_KEYS is not set\n+# CONFIG_BIG_LITTLE is not set\n+# CONFIG_BINARY_PRINTF is not set\n+# CONFIG_BINFMT_AOUT is not set\n+CONFIG_BINFMT_ELF=y\n+# CONFIG_BINFMT_ELF_FDPIC is not set\n+# CONFIG_BINFMT_FLAT is not set\n+# CONFIG_BINFMT_MISC is not set\n+CONFIG_BINFMT_SCRIPT=y\n+CONFIG_BITREVERSE=y\n+# CONFIG_BLK_CGROUP_IOCOST is not set\n+# CONFIG_BLK_CGROUP_IOPRIO is not set\n+# CONFIG_BLK_CGROUP_IOLATENCY is not set\n+# CONFIG_BLK_CMDLINE_PARSER is not set\n+# CONFIG_BLK_DEBUG_FS is not set\n+CONFIG_BLK_DEV=y\n+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set\n+# CONFIG_BLK_DEV_4DRIVES is not set\n+# CONFIG_BLK_DEV_AEC62XX is not set\n+# CONFIG_BLK_DEV_ALI14XX is not set\n+# CONFIG_BLK_DEV_ALI15X3 is not set\n+# CONFIG_BLK_DEV_AMD74XX is not set\n+# CONFIG_BLK_DEV_ATIIXP is not set\n+# CONFIG_BLK_DEV_BSG is not set\n+# CONFIG_BLK_DEV_BSGLIB is not set\n+# CONFIG_BLK_DEV_CMD640 is not set\n+# CONFIG_BLK_DEV_CMD64X is not set\n+# CONFIG_BLK_DEV_COW_COMMON is not set\n+# CONFIG_BLK_DEV_CRYPTOLOOP is not set\n+# CONFIG_BLK_DEV_CS5520 is not set\n+# CONFIG_BLK_DEV_CS5530 is not set\n+# CONFIG_BLK_DEV_CS5535 is not set\n+# CONFIG_BLK_DEV_CS5536 is not set\n+# CONFIG_BLK_DEV_CY82C693 is not set\n+# CONFIG_BLK_DEV_DAC960 is not set\n+# CONFIG_BLK_DEV_DELKIN is not set\n+# CONFIG_BLK_DEV_DRBD is not set\n+# CONFIG_BLK_DEV_DTC2278 is not set\n+# CONFIG_BLK_DEV_FD is not set\n+# CONFIG_BLK_DEV_GENERIC is not set\n+# CONFIG_BLK_DEV_HPT366 is not set\n+# CONFIG_BLK_DEV_HT6560B is not set\n+# CONFIG_BLK_DEV_IDEACPI is not set\n+# CONFIG_BLK_DEV_IDECD is not set\n+# CONFIG_BLK_DEV_IDECS is not set\n+# CONFIG_BLK_DEV_IDEPCI is not set\n+# CONFIG_BLK_DEV_IDEPNP is not set\n+# CONFIG_BLK_DEV_IDETAPE is not set\n+# CONFIG_BLK_DEV_IDE_AU1XXX is not set\n+# CONFIG_BLK_DEV_IDE_SATA is not set\n+CONFIG_BLK_DEV_INITRD=y\n+# CONFIG_BLK_DEV_INTEGRITY is not set\n+# CONFIG_BLK_DEV_IO_TRACE is not set\n+# CONFIG_BLK_DEV_IT8172 is not set\n+# CONFIG_BLK_DEV_IT8213 is not set\n+# CONFIG_BLK_DEV_IT821X is not set\n+# CONFIG_BLK_DEV_JMICRON is not set\n+# CONFIG_BLK_DEV_LOOP is not set\n+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8\n+# CONFIG_BLK_DEV_NBD is not set\n+# CONFIG_BLK_DEV_NS87415 is not set\n+# CONFIG_BLK_DEV_NULL_BLK is not set\n+# CONFIG_BLK_DEV_NVME is not set\n+# CONFIG_BLK_DEV_OFFBOARD is not set\n+# CONFIG_BLK_DEV_OPTI621 is not set\n+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set\n+# CONFIG_BLK_DEV_PDC202XX_NEW is not set\n+# CONFIG_BLK_DEV_PDC202XX_OLD is not set\n+# CONFIG_BLK_DEV_PIIX is not set\n+# CONFIG_BLK_DEV_PLATFORM is not set\n+# CONFIG_BLK_DEV_PMEM is not set\n+# CONFIG_BLK_DEV_QD65XX is not set\n+# CONFIG_BLK_DEV_RAM is not set\n+# CONFIG_BLK_DEV_RBD is not set\n+# CONFIG_BLK_DEV_RSXX is not set\n+# CONFIG_BLK_DEV_RZ1000 is not set\n+# CONFIG_BLK_DEV_SC1200 is not set\n+# CONFIG_BLK_DEV_SD is not set\n+# CONFIG_BLK_DEV_SIIMAGE is not set\n+# CONFIG_BLK_DEV_SIS5513 is not set\n+# CONFIG_BLK_DEV_SKD is not set\n+# CONFIG_BLK_DEV_SL82C105 is not set\n+# CONFIG_BLK_DEV_SLC90E66 is not set\n+# CONFIG_BLK_DEV_SR is not set\n+# CONFIG_BLK_DEV_SVWKS is not set\n+# CONFIG_BLK_DEV_SX8 is not set\n+# CONFIG_BLK_DEV_TC86C001 is not set\n+# CONFIG_BLK_DEV_THROTTLING is not set\n+# CONFIG_BLK_DEV_TRIFLEX is not set\n+# CONFIG_BLK_DEV_TRM290 is not set\n+# CONFIG_BLK_DEV_UMC8672 is not set\n+# CONFIG_BLK_DEV_UMEM is not set\n+# CONFIG_BLK_DEV_VIA82CXXX is not set\n+# CONFIG_BLK_DEV_ZONED is not set\n+# CONFIG_BLK_INLINE_ENCRYPTION is not set\n+# CONFIG_BLK_SED_OPAL is not set\n+# CONFIG_BLK_WBT is not set\n+CONFIG_BLOCK=y\n+# CONFIG_BMA180 is not set\n+# CONFIG_BMA220 is not set\n+# CONFIG_BMA400 is not set\n+# CONFIG_BMC150_ACCEL is not set\n+# CONFIG_BMC150_MAGN is not set\n+# CONFIG_BMC150_MAGN_I2C is not set\n+# CONFIG_BMC150_MAGN_SPI is not set\n+# CONFIG_BME680 is not set\n+# CONFIG_BMG160 is not set\n+# CONFIG_BMI160_I2C is not set\n+# CONFIG_BMI160_SPI is not set\n+# CONFIG_BMIPS_GENERIC is not set\n+# CONFIG_BMP280 is not set\n+# CONFIG_BNA is not set\n+# CONFIG_BNX2 is not set\n+# CONFIG_BNX2X is not set\n+# CONFIG_BNX2X_SRIOV is not set\n+# CONFIG_BNXT is not set\n+# CONFIG_BONDING is not set\n+# CONFIG_BOOKE_WDT is not set\n+CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3\n+# CONFIG_BOOTTIME_TRACING is not set\n+# CONFIG_BOOT_CONFIG is not set\n+# CONFIG_BOOT_PRINTK_DELAY is not set\n+CONFIG_BOOT_RAW=y\n+# CONFIG_BOUNCE is not set\n+CONFIG_BPF=y\n+# CONFIG_BPFILTER is not set\n+CONFIG_BPF_JIT=y\n+# CONFIG_BPF_JIT_ALWAYS_ON is not set\n+CONFIG_BPF_JIT_DEFAULT_ON=y\n+# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set\n+# CONFIG_BPF_PRELOAD is not set\n+# CONFIG_BPF_STREAM_PARSER is not set\n+CONFIG_BPF_SYSCALL=y\n+# CONFIG_BPQETHER is not set\n+CONFIG_BQL=y\n+CONFIG_BRANCH_PROFILE_NONE=y\n+# CONFIG_BRCMFMAC is not set\n+# CONFIG_BRCMSMAC is not set\n+# CONFIG_BRCMSTB_GISB_ARB is not set\n+CONFIG_BRIDGE=y\n+# CONFIG_BRIDGE_EBT_802_3 is not set\n+# CONFIG_BRIDGE_EBT_AMONG is not set\n+# CONFIG_BRIDGE_EBT_ARP is not set\n+# CONFIG_BRIDGE_EBT_ARPREPLY is not set\n+# CONFIG_BRIDGE_EBT_BROUTE is not set\n+# CONFIG_BRIDGE_EBT_DNAT is not set\n+# CONFIG_BRIDGE_EBT_IP is not set\n+# CONFIG_BRIDGE_EBT_IP6 is not set\n+# CONFIG_BRIDGE_EBT_LIMIT is not set\n+# CONFIG_BRIDGE_EBT_LOG is not set\n+# CONFIG_BRIDGE_EBT_MARK is not set\n+# CONFIG_BRIDGE_EBT_MARK_T is not set\n+# CONFIG_BRIDGE_EBT_NFLOG is not set\n+# CONFIG_BRIDGE_EBT_PKTTYPE is not set\n+# CONFIG_BRIDGE_EBT_REDIRECT is not set\n+# CONFIG_BRIDGE_EBT_SNAT is not set\n+# CONFIG_BRIDGE_EBT_STP is not set\n+# CONFIG_BRIDGE_EBT_T_FILTER is not set\n+# CONFIG_BRIDGE_EBT_T_NAT is not set\n+# CONFIG_BRIDGE_EBT_VLAN is not set\n+CONFIG_BRIDGE_IGMP_SNOOPING=y\n+# CONFIG_BRIDGE_MRP is not set\n+# CONFIG_BRIDGE_NETFILTER is not set\n+# CONFIG_BRIDGE_NF_EBTABLES is not set\n+CONFIG_BRIDGE_VLAN_FILTERING=y\n+# CONFIG_BROADCOM_PHY is not set\n+CONFIG_BROKEN_ON_SMP=y\n+# CONFIG_BSD_DISKLABEL is not set\n+# CONFIG_BSD_PROCESS_ACCT is not set\n+# CONFIG_BSD_PROCESS_ACCT_V3 is not set\n+# CONFIG_BT is not set\n+# CONFIG_BTRFS_ASSERT is not set\n+# CONFIG_BTRFS_DEBUG is not set\n+# CONFIG_BTRFS_FS is not set\n+# CONFIG_BTRFS_FS_POSIX_ACL is not set\n+# CONFIG_BTRFS_FS_REF_VERIFY is not set\n+# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set\n+# CONFIG_BT_ATH3K is not set\n+# CONFIG_BT_BNEP is not set\n+CONFIG_BT_BNEP_MC_FILTER=y\n+CONFIG_BT_BNEP_PROTO_FILTER=y\n+# CONFIG_BT_BREDR is not set\n+# CONFIG_BT_CMTP is not set\n+# CONFIG_BT_FEATURE_DEBUG is not set\n+# CONFIG_BT_HCIBCM203X is not set\n+# CONFIG_BT_HCIBFUSB is not set\n+# CONFIG_BT_HCIBLUECARD is not set\n+# CONFIG_BT_HCIBPA10X is not set\n+# CONFIG_BT_HCIBT3C is not set\n+# CONFIG_BT_HCIBTSDIO is not set\n+# CONFIG_BT_HCIBTUSB is not set\n+# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set\n+# CONFIG_BT_HCIBTUSB_MTK is not set\n+# CONFIG_BT_HCIBTUSB_RTL is not set\n+# CONFIG_BT_HCIDTL1 is not set\n+# CONFIG_BT_HCIUART is not set\n+# CONFIG_BT_HCIUART_3WIRE is not set\n+# CONFIG_BT_HCIUART_AG6XX is not set\n+# CONFIG_BT_HCIUART_ATH3K is not set\n+CONFIG_BT_HCIUART_BCSP=y\n+CONFIG_BT_HCIUART_H4=y\n+# CONFIG_BT_HCIUART_LL is not set\n+# CONFIG_BT_HCIUART_MRVL is not set\n+# CONFIG_BT_HCIUART_QCA is not set\n+# CONFIG_BT_HCIUART_RTL is not set\n+# CONFIG_BT_HCIVHCI is not set\n+# CONFIG_BT_HIDP is not set\n+# CONFIG_BT_HS is not set\n+# CONFIG_BT_LE is not set\n+# CONFIG_BT_LEDS is not set\n+# CONFIG_BT_MRVL is not set\n+# CONFIG_BT_MSFTEXT is not set\n+# CONFIG_BT_MTKSDIO is not set\n+# CONFIG_BT_MTKUART is not set\n+# CONFIG_BT_RFCOMM is not set\n+CONFIG_BT_RFCOMM_TTY=y\n+# CONFIG_BT_SELFTEST is not set\n+CONFIG_BUG=y\n+# CONFIG_BUG_ON_DATA_CORRUPTION is not set\n+CONFIG_BUILDTIME_EXTABLE_SORT=y\n+CONFIG_BUILDTIME_TABLE_SORT=y\n+# CONFIG_BUILD_BIN2C is not set\n+CONFIG_BUILD_SALT=\"\"\n+# CONFIG_C2PORT is not set\n+CONFIG_CACHE_L2X0_PMU=y\n+# CONFIG_CADENCE_WATCHDOG is not set\n+# CONFIG_CAIF is not set\n+# CONFIG_CAN is not set\n+# CONFIG_CAN_BCM is not set\n+# CONFIG_CAN_DEBUG_DEVICES is not set\n+# CONFIG_CAN_DEV is not set\n+# CONFIG_CAN_GS_USB is not set\n+# CONFIG_CAN_GW is not set\n+# CONFIG_CAN_HI311X is not set\n+# CONFIG_CAN_IFI_CANFD is not set\n+# CONFIG_CAN_ISOTP is not set\n+# CONFIG_CAN_J1939 is not set\n+# CONFIG_CAN_KVASER_PCIEFD is not set\n+# CONFIG_CAN_MCBA_USB is not set\n+# CONFIG_CAN_MCP251XFD is not set\n+# CONFIG_CAN_M_CAN is not set\n+# CONFIG_CAN_PEAK_PCIEFD is not set\n+# CONFIG_CAN_RAW is not set\n+# CONFIG_CAN_RCAR is not set\n+# CONFIG_CAN_RCAR_CANFD is not set\n+# CONFIG_CAN_SLCAN is not set\n+# CONFIG_CAN_SUN4I is not set\n+# CONFIG_CAN_UCAN is not set\n+# CONFIG_CAN_VCAN is not set\n+# CONFIG_CAN_VXCAN is not set\n+# CONFIG_CAPI_AVM is not set\n+# CONFIG_CAPI_EICON is not set\n+# CONFIG_CAPI_TRACE is not set\n+CONFIG_CARDBUS=y\n+# CONFIG_CARDMAN_4000 is not set\n+# CONFIG_CARDMAN_4040 is not set\n+# CONFIG_CARL9170 is not set\n+# CONFIG_CASSINI is not set\n+# CONFIG_CAVIUM_CPT is not set\n+# CONFIG_CAVIUM_ERRATUM_22375 is not set\n+# CONFIG_CAVIUM_ERRATUM_23144 is not set\n+# CONFIG_CAVIUM_ERRATUM_23154 is not set\n+# CONFIG_CAVIUM_ERRATUM_27456 is not set\n+# CONFIG_CAVIUM_ERRATUM_30115 is not set\n+# CONFIG_CAVIUM_OCTEON_SOC is not set\n+# CONFIG_CAVIUM_PTP is not set\n+# CONFIG_CB710_CORE is not set\n+# CONFIG_CC10001_ADC is not set\n+# CONFIG_CCS811 is not set\n+CONFIG_CC_CAN_LINK=y\n+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y\n+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set\n+# CONFIG_CDROM_PKTCDVD is not set\n+# CONFIG_CEPH_FS is not set\n+# CONFIG_CEPH_LIB is not set\n+# CONFIG_CFG80211 is not set\n+# CONFIG_CFG80211_CERTIFICATION_ONUS is not set\n+# CONFIG_CGROUPS is not set\n+# CONFIG_CGROUP_MISC is not set\n+# CONFIG_CHARGER_ADP5061 is not set\n+# CONFIG_CHARGER_BD99954 is not set\n+# CONFIG_CHARGER_BQ2415X is not set\n+# CONFIG_CHARGER_BQ24190 is not set\n+# CONFIG_CHARGER_BQ24257 is not set\n+# CONFIG_CHARGER_BQ24735 is not set\n+# CONFIG_CHARGER_BQ2515X is not set\n+# CONFIG_CHARGER_BQ25890 is not set\n+# CONFIG_CHARGER_BQ25980 is not set\n+# CONFIG_CHARGER_DETECTOR_MAX14656 is not set\n+# CONFIG_CHARGER_GPIO is not set\n+# CONFIG_CHARGER_ISP1704 is not set\n+# CONFIG_CHARGER_LP8727 is not set\n+# CONFIG_CHARGER_LT3651 is not set\n+# CONFIG_CHARGER_LTC3651 is not set\n+# CONFIG_CHARGER_MANAGER is not set\n+# CONFIG_CHARGER_MAX8903 is not set\n+# CONFIG_CHARGER_RT9455 is not set\n+# CONFIG_CHARGER_SBS is not set\n+# CONFIG_CHARGER_SMB347 is not set\n+# CONFIG_CHARGER_TWL4030 is not set\n+# CONFIG_CHARGER_UCS1002 is not set\n+# CONFIG_CHASH_SELFTEST is not set\n+# CONFIG_CHASH_STATS is not set\n+# CONFIG_CHECKPOINT_RESTORE is not set\n+# CONFIG_CHELSIO_T1 is not set\n+# CONFIG_CHELSIO_T3 is not set\n+# CONFIG_CHELSIO_T4 is not set\n+# CONFIG_CHELSIO_T4VF is not set\n+# CONFIG_CHROME_PLATFORMS is not set\n+# CONFIG_CHR_DEV_OSST is not set\n+# CONFIG_CHR_DEV_SCH is not set\n+# CONFIG_CHR_DEV_SG is not set\n+# CONFIG_CHR_DEV_ST is not set\n+# CONFIG_CICADA_PHY is not set\n+# CONFIG_CIFS is not set\n+# CONFIG_CIFS_ACL is not set\n+CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y\n+# CONFIG_CIFS_DEBUG is not set\n+# CONFIG_CIFS_DEBUG2 is not set\n+# CONFIG_CIFS_FSCACHE is not set\n+# CONFIG_CIFS_NFSD_EXPORT is not set\n+CONFIG_CIFS_POSIX=y\n+# CONFIG_CIFS_SMB2 is not set\n+# CONFIG_CIFS_STATS is not set\n+# CONFIG_CIFS_STATS2 is not set\n+# CONFIG_CIFS_WEAK_PW_HASH is not set\n+CONFIG_CIFS_XATTR=y\n+# CONFIG_CIO_DAC is not set\n+CONFIG_CLANG_VERSION=0\n+# CONFIG_CLEANCACHE is not set\n+# CONFIG_CLKSRC_VERSATILE is not set\n+# CONFIG_CLK_HSDK is not set\n+# CONFIG_CLK_QORIQ is not set\n+# CONFIG_CLK_SP810 is not set\n+# CONFIG_CLOCK_THERMAL is not set\n+CONFIG_CLS_U32_MARK=y\n+# CONFIG_CLS_U32_PERF is not set\n+# CONFIG_CM32181 is not set\n+# CONFIG_CM3232 is not set\n+# CONFIG_CM3323 is not set\n+# CONFIG_CM3605 is not set\n+# CONFIG_CM36651 is not set\n+# CONFIG_CMA is not set\n+CONFIG_CMDLINE=\"\"\n+# CONFIG_CMDLINE_BOOL is not set\n+# CONFIG_CMDLINE_EXTEND is not set\n+# CONFIG_CMDLINE_FORCE is not set\n+# CONFIG_CMDLINE_FROM_BOOTLOADER is not set\n+# CONFIG_CMDLINE_PARTITION is not set\n+# CONFIG_CNIC is not set\n+# CONFIG_CODA_FS is not set\n+# CONFIG_CODE_PATCHING_SELFTEST is not set\n+# CONFIG_COMEDI is not set\n+# CONFIG_COMMON_CLK_CDCE706 is not set\n+# CONFIG_COMMON_CLK_CDCE925 is not set\n+# CONFIG_COMMON_CLK_CS2000_CP is not set\n+# CONFIG_COMMON_CLK_FIXED_MMIO is not set\n+# CONFIG_COMMON_CLK_IPROC is not set\n+# CONFIG_COMMON_CLK_MAX9485 is not set\n+# CONFIG_COMMON_CLK_MT6765 is not set\n+# CONFIG_COMMON_CLK_MT8167 is not set\n+# CONFIG_COMMON_CLK_MT8167_AUDSYS is not set\n+# CONFIG_COMMON_CLK_MT8167_IMGSYS is not set\n+# CONFIG_COMMON_CLK_MT8167_MFGCFG is not set\n+# CONFIG_COMMON_CLK_MT8167_MMSYS is not set\n+# CONFIG_COMMON_CLK_MT8167_VDECSYS is not set\n+# CONFIG_COMMON_CLK_NXP is not set\n+# CONFIG_COMMON_CLK_PIC32 is not set\n+# CONFIG_COMMON_CLK_PWM is not set\n+# CONFIG_COMMON_CLK_PXA is not set\n+# CONFIG_COMMON_CLK_QCOM is not set\n+# CONFIG_COMMON_CLK_SI514 is not set\n+# CONFIG_COMMON_CLK_SI5341 is not set\n+# CONFIG_COMMON_CLK_SI5351 is not set\n+# CONFIG_COMMON_CLK_SI544 is not set\n+# CONFIG_COMMON_CLK_SI570 is not set\n+# CONFIG_COMMON_CLK_VC5 is not set\n+# CONFIG_COMMON_CLK_XGENE is not set\n+# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set\n+CONFIG_COMPACTION=y\n+# CONFIG_COMPAL_LAPTOP is not set\n+# CONFIG_COMPAT is not set\n+# CONFIG_COMPAT_BRK is not set\n+# CONFIG_COMPILE_TEST is not set\n+# CONFIG_CONFIGFS_FS is not set\n+# CONFIG_CONFIG_KVM_AMD_SEV is not set\n+# CONFIG_CONNECTOR is not set\n+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7\n+CONFIG_CONSOLE_LOGLEVEL_QUIET=4\n+CONFIG_CONSTRUCTORS=y\n+# CONFIG_CONTEXT_SWITCH_TRACER is not set\n+# CONFIG_COPS is not set\n+# CONFIG_CORDIC is not set\n+# CONFIG_COREDUMP is not set\n+# CONFIG_CORESIGHT is not set\n+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set\n+# CONFIG_CORTINA_PHY is not set\n+# CONFIG_COUNTER is not set\n+# CONFIG_CPA_DEBUG is not set\n+# CONFIG_CPU_BIG_ENDIAN is not set\n+# CONFIG_CPU_BPREDICT_DISABLE is not set\n+# CONFIG_CPU_DCACHE_DISABLE is not set\n+# CONFIG_CPU_FREQ is not set\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set\n+# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set\n+# CONFIG_CPU_FREQ_STAT_DETAILS is not set\n+# CONFIG_CPU_FREQ_THERMAL is not set\n+# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set\n+# CONFIG_CPU_ICACHE_DISABLE is not set\n+# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set\n+# CONFIG_CPU_IDLE is not set\n+# CONFIG_CPU_IDLE_GOV_LADDER is not set\n+# CONFIG_CPU_IDLE_GOV_MENU is not set\n+# CONFIG_CPU_IDLE_GOV_TEO is not set\n+# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set\n+# CONFIG_CPU_ISOLATION is not set\n+CONFIG_CPU_LITTLE_ENDIAN=y\n+# CONFIG_CPU_NO_EFFICIENT_FFS is not set\n+CONFIG_CPU_SW_DOMAIN_PAN=y\n+# CONFIG_CRAMFS is not set\n+CONFIG_CRAMFS_BLOCKDEV=y\n+# CONFIG_CRAMFS_MTD is not set\n+CONFIG_CRASHLOG=y\n+# CONFIG_CRASH_DUMP is not set\n+# CONFIG_CRC16 is not set\n+CONFIG_CRC32=y\n+# CONFIG_CRC32_BIT is not set\n+CONFIG_CRC32_SARWATE=y\n+# CONFIG_CRC32_SELFTEST is not set\n+# CONFIG_CRC32_SLICEBY4 is not set\n+# CONFIG_CRC32_SLICEBY8 is not set\n+# CONFIG_CRC4 is not set\n+# CONFIG_CRC64 is not set\n+# CONFIG_CRC7 is not set\n+# CONFIG_CRC8 is not set\n+# CONFIG_CRC_CCITT is not set\n+# CONFIG_CRC_ITU_T is not set\n+# CONFIG_CRC_T10DIF is not set\n+CONFIG_CROSS_COMPILE=\"\"\n+# CONFIG_CROSS_MEMORY_ATTACH is not set\n+CONFIG_CRYPTO=y\n+# CONFIG_CRYPTO_842 is not set\n+# CONFIG_CRYPTO_ADIANTUM is not set\n+CONFIG_CRYPTO_ACOMP2=y\n+CONFIG_CRYPTO_AEAD=y\n+CONFIG_CRYPTO_AEAD2=y\n+# CONFIG_CRYPTO_AEGIS128 is not set\n+# CONFIG_CRYPTO_AEGIS128L is not set\n+# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set\n+# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set\n+# CONFIG_CRYPTO_AEGIS256 is not set\n+# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set\n+CONFIG_CRYPTO_AES=y\n+# CONFIG_CRYPTO_AES_586 is not set\n+# CONFIG_CRYPTO_AES_ARM is not set\n+# CONFIG_CRYPTO_AES_ARM64 is not set\n+# CONFIG_CRYPTO_AES_ARM64_BS is not set\n+# CONFIG_CRYPTO_AES_ARM64_CE is not set\n+# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set\n+# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set\n+# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set\n+# CONFIG_CRYPTO_AES_ARM_BS is not set\n+# CONFIG_CRYPTO_AES_ARM_CE is not set\n+# CONFIG_CRYPTO_AES_NI_INTEL is not set\n+# CONFIG_CRYPTO_AES_TI is not set\n+CONFIG_CRYPTO_AKCIPHER=y\n+CONFIG_CRYPTO_AKCIPHER2=y\n+CONFIG_CRYPTO_ALGAPI=y\n+CONFIG_CRYPTO_ALGAPI2=y\n+# CONFIG_CRYPTO_ANSI_CPRNG is not set\n+# CONFIG_CRYPTO_ANUBIS is not set\n+# CONFIG_CRYPTO_ARC4 is not set\n+# CONFIG_CRYPTO_AUTHENC is not set\n+# CONFIG_CRYPTO_BLAKE2B is not set\n+# CONFIG_CRYPTO_BLAKE2S is not set\n+# CONFIG_CRYPTO_BLAKE2S_X86 is not set\n+# CONFIG_CRYPTO_BLOWFISH is not set\n+# CONFIG_CRYPTO_CAMELLIA is not set\n+# CONFIG_CRYPTO_CAST5 is not set\n+# CONFIG_CRYPTO_CAST6 is not set\n+# CONFIG_CRYPTO_CBC is not set\n+CONFIG_CRYPTO_CCM=y\n+# CONFIG_CRYPTO_CFB is not set\n+# CONFIG_CRYPTO_CHACHA20 is not set\n+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set\n+# CONFIG_CRYPTO_CHACHA20_NEON is not set\n+# CONFIG_CRYPTO_CHACHA20_X86_64 is not set\n+# CONFIG_CRYPTO_CHACHA_MIPS is not set\n+# CONFIG_CRYPTO_CMAC is not set\n+# CONFIG_CRYPTO_CRC32 is not set\n+# CONFIG_CRYPTO_CRC32C is not set\n+# CONFIG_CRYPTO_CRC32C_INTEL is not set\n+# CONFIG_CRYPTO_CRC32_ARM_CE is not set\n+# CONFIG_CRYPTO_CRCT10DIF is not set\n+# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set\n+# CONFIG_CRYPTO_CRYPTD is not set\n+CONFIG_CRYPTO_CTR=y\n+# CONFIG_CRYPTO_CTS is not set\n+# CONFIG_CRYPTO_CURVE25519 is not set\n+# CONFIG_CRYPTO_CURVE25519_NEON is not set\n+# CONFIG_CRYPTO_CURVE25519_X86 is not set\n+# CONFIG_CRYPTO_DEFLATE is not set\n+# CONFIG_CRYPTO_DES is not set\n+# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_AES is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set\n+# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set\n+# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set\n+# CONFIG_CRYPTO_DEV_CCP is not set\n+# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set\n+# CONFIG_CRYPTO_DEV_CCREE is not set\n+# CONFIG_CRYPTO_DEV_FSL_CAAM is not set\n+# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set\n+# CONFIG_CRYPTO_DEV_HIFN_795X is not set\n+# CONFIG_CRYPTO_DEV_HISI_SEC is not set\n+# CONFIG_CRYPTO_DEV_HISI_ZIP is not set\n+# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set\n+# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set\n+# CONFIG_CRYPTO_DEV_MV_CESA is not set\n+# CONFIG_CRYPTO_DEV_MXC_SCC is not set\n+# CONFIG_CRYPTO_DEV_MXS_DCP is not set\n+# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set\n+# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set\n+# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set\n+# CONFIG_CRYPTO_DEV_QAT_C62X is not set\n+# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set\n+# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set\n+# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set\n+# CONFIG_CRYPTO_DEV_QCE is not set\n+# CONFIG_CRYPTO_DEV_S5P is not set\n+# CONFIG_CRYPTO_DEV_SAFEXCEL is not set\n+# CONFIG_CRYPTO_DEV_SAHARA is not set\n+# CONFIG_CRYPTO_DEV_SP_PSP is not set\n+# CONFIG_CRYPTO_DEV_TALITOS is not set\n+# CONFIG_CRYPTO_DEV_VIRTIO is not set\n+# CONFIG_CRYPTO_DH is not set\n+# CONFIG_CRYPTO_DRBG_CTR is not set\n+# CONFIG_CRYPTO_DRBG_HASH is not set\n+# CONFIG_CRYPTO_DRBG_MENU is not set\n+# CONFIG_CRYPTO_ECB is not set\n+# CONFIG_CRYPTO_ECDH is not set\n+# CONFIG_CRYPTO_ECDSA is not set\n+# CONFIG_CRYPTO_ECHAINIV is not set\n+# CONFIG_CRYPTO_ECRDSA is not set\n+# CONFIG_CRYPTO_ESSIV is not set\n+# CONFIG_CRYPTO_FCRYPT is not set\n+# CONFIG_CRYPTO_FIPS is not set\n+CONFIG_CRYPTO_GCM=y\n+# CONFIG_CRYPTO_GF128MUL is not set\n+CONFIG_CRYPTO_GHASH=y\n+# CONFIG_CRYPTO_GHASH_ARM64_CE is not set\n+# CONFIG_CRYPTO_GHASH_ARM_CE is not set\n+# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set\n+CONFIG_CRYPTO_HASH=y\n+CONFIG_CRYPTO_HASH2=y\n+# CONFIG_CRYPTO_HMAC is not set\n+# CONFIG_CRYPTO_HW is not set\n+# CONFIG_CRYPTO_JITTERENTROPY is not set\n+# CONFIG_CRYPTO_KEYWRAP is not set\n+CONFIG_CRYPTO_KPP=y\n+CONFIG_CRYPTO_KPP2=y\n+# CONFIG_CRYPTO_KHAZAD is not set\n+CONFIG_CRYPTO_LIB_AES=y\n+CONFIG_CRYPTO_LIB_ARC4=y\n+# CONFIG_CRYPTO_LIB_BLAKE2S is not set\n+# CONFIG_CRYPTO_LIB_CHACHA is not set\n+# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set\n+# CONFIG_CRYPTO_LIB_CURVE25519 is not set\n+# CONFIG_CRYPTO_LIB_POLY1305 is not set\n+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9\n+# CONFIG_CRYPTO_LRW is not set\n+# CONFIG_CRYPTO_LZ4 is not set\n+# CONFIG_CRYPTO_LZ4HC is not set\n+# CONFIG_CRYPTO_LZO is not set\n+CONFIG_CRYPTO_MANAGER=y\n+CONFIG_CRYPTO_MANAGER2=y\n+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y\n+# CONFIG_CRYPTO_MCRYPTD is not set\n+# CONFIG_CRYPTO_MD4 is not set\n+# CONFIG_CRYPTO_MD5 is not set\n+# CONFIG_CRYPTO_MICHAEL_MIC is not set\n+# CONFIG_CRYPTO_MORUS1280 is not set\n+# CONFIG_CRYPTO_MORUS1280_AVX2 is not set\n+# CONFIG_CRYPTO_MORUS1280_SSE2 is not set\n+# CONFIG_CRYPTO_MORUS640 is not set\n+# CONFIG_CRYPTO_MORUS640_SSE2 is not set\n+# CONFIG_CRYPTO_NHPOLY1305_NEON is not set\n+CONFIG_CRYPTO_NULL=y\n+# CONFIG_CRYPTO_OFB is not set\n+# CONFIG_CRYPTO_PCBC is not set\n+# CONFIG_CRYPTO_PCOMP is not set\n+# CONFIG_CRYPTO_PCOMP2 is not set\n+CONFIG_CRYPTO_PCRYPT=y\n+# CONFIG_CRYPTO_POLY1305 is not set\n+# CONFIG_CRYPTO_POLY1305_ARM is not set\n+# CONFIG_CRYPTO_POLY1305_MIPS is not set\n+# CONFIG_CRYPTO_POLY1305_NEON is not set\n+# CONFIG_CRYPTO_POLY1305_X86_64 is not set\n+# CONFIG_CRYPTO_RMD128 is not set\n+# CONFIG_CRYPTO_RMD160 is not set\n+# CONFIG_CRYPTO_RMD256 is not set\n+# CONFIG_CRYPTO_RMD320 is not set\n+# CONFIG_CRYPTO_RNG is not set\n+# CONFIG_CRYPTO_RSA is not set\n+# CONFIG_CRYPTO_SALSA20 is not set\n+# CONFIG_CRYPTO_SALSA20_586 is not set\n+# CONFIG_CRYPTO_SEED is not set\n+# CONFIG_CRYPTO_SEQIV is not set\n+# CONFIG_CRYPTO_SERPENT is not set\n+# CONFIG_CRYPTO_SHA1 is not set\n+# CONFIG_CRYPTO_SHA1_ARM is not set\n+# CONFIG_CRYPTO_SHA1_ARM64_CE is not set\n+# CONFIG_CRYPTO_SHA1_ARM_CE is not set\n+# CONFIG_CRYPTO_SHA1_ARM_NEON is not set\n+# CONFIG_CRYPTO_SHA256 is not set\n+# CONFIG_CRYPTO_SHA256_ARM is not set\n+# CONFIG_CRYPTO_SHA256_ARM64 is not set\n+# CONFIG_CRYPTO_SHA2_ARM64_CE is not set\n+# CONFIG_CRYPTO_SHA2_ARM_CE is not set\n+# CONFIG_CRYPTO_SHA3 is not set\n+# CONFIG_CRYPTO_SHA3_ARM64 is not set\n+# CONFIG_CRYPTO_SHA512 is not set\n+# CONFIG_CRYPTO_SHA512_ARM is not set\n+# CONFIG_CRYPTO_SHA512_ARM64 is not set\n+# CONFIG_CRYPTO_SHA512_ARM64_CE is not set\n+# CONFIG_CRYPTO_SIMD is not set\n+CONFIG_CRYPTO_SKCIPHER=y\n+CONFIG_CRYPTO_SKCIPHER2=y\n+# CONFIG_CRYPTO_SM2 is not set\n+# CONFIG_CRYPTO_SM3 is not set\n+# CONFIG_CRYPTO_SM3_ARM64_CE is not set\n+# CONFIG_CRYPTO_SM4 is not set\n+# CONFIG_CRYPTO_SM4_ARM64_CE is not set\n+# CONFIG_CRYPTO_SPECK is not set\n+# CONFIG_CRYPTO_STATS is not set\n+# CONFIG_CRYPTO_STREEBOG is not set\n+# CONFIG_CRYPTO_TEA is not set\n+# CONFIG_CRYPTO_TEST is not set\n+# CONFIG_CRYPTO_TGR192 is not set\n+# CONFIG_CRYPTO_TWOFISH is not set\n+# CONFIG_CRYPTO_TWOFISH_586 is not set\n+# CONFIG_CRYPTO_TWOFISH_COMMON is not set\n+# CONFIG_CRYPTO_USER is not set\n+# CONFIG_CRYPTO_USER_API_AEAD is not set\n+# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set\n+# CONFIG_CRYPTO_USER_API_HASH is not set\n+# CONFIG_CRYPTO_USER_API_RNG is not set\n+# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set\n+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set\n+# CONFIG_CRYPTO_VMAC is not set\n+# CONFIG_CRYPTO_WP512 is not set\n+# CONFIG_CRYPTO_XCBC is not set\n+# CONFIG_CRYPTO_XTS is not set\n+# CONFIG_CRYPTO_XXHASH is not set\n+# CONFIG_CRYPTO_ZLIB is not set\n+# CONFIG_CRYPTO_ZSTD is not set\n+# CONFIG_CS5535_MFGPT is not set\n+# CONFIG_CS89x0 is not set\n+# CONFIG_CSD_LOCK_WAIT_DEBUG is not set\n+# CONFIG_CUSE is not set\n+# CONFIG_CW1200 is not set\n+# CONFIG_CXD2880_SPI_DRV is not set\n+# CONFIG_CXL_AFU_DRIVER_OPS is not set\n+# CONFIG_CXL_BASE is not set\n+# CONFIG_CXL_EEH is not set\n+# CONFIG_CXL_KERNEL_API is not set\n+# CONFIG_CXL_LIB is not set\n+# CONFIG_CYPRESS_FIRMWARE is not set\n+# CONFIG_DA280 is not set\n+# CONFIG_DA311 is not set\n+# CONFIG_DAVICOM_PHY is not set\n+# CONFIG_DAX is not set\n+# CONFIG_DCB is not set\n+# CONFIG_DDR is not set\n+# CONFIG_DEBUG_ALIGN_RODATA is not set\n+# CONFIG_DEBUG_ATOMIC_SLEEP is not set\n+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set\n+# CONFIG_DEBUG_BUGVERBOSE is not set\n+# CONFIG_DEBUG_CREDENTIALS is not set\n+# CONFIG_DEBUG_DEVRES is not set\n+# CONFIG_DEBUG_DRIVER is not set\n+# CONFIG_DEBUG_EFI is not set\n+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set\n+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set\n+CONFIG_DEBUG_FS=y\n+CONFIG_DEBUG_FS_ALLOW_ALL=y\n+# CONFIG_DEBUG_FS_ALLOW_NONE is not set\n+# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set\n+# CONFIG_DEBUG_GPIO is not set\n+# CONFIG_DEBUG_HIGHMEM is not set\n+# CONFIG_DEBUG_ICEDCC is not set\n+# CONFIG_DEBUG_INFO is not set\n+# CONFIG_DEBUG_INFO_BTF is not set\n+# CONFIG_DEBUG_INFO_COMPRESSED is not set\n+# CONFIG_DEBUG_INFO_DWARF4 is not set\n+CONFIG_DEBUG_INFO_DWARF5=y\n+# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set\n+CONFIG_DEBUG_INFO_REDUCED=y\n+# CONFIG_DEBUG_INFO_SPLIT is not set\n+CONFIG_DEBUG_KERNEL=y\n+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set\n+# CONFIG_DEBUG_KMEMLEAK is not set\n+# CONFIG_DEBUG_KOBJECT is not set\n+# CONFIG_DEBUG_KOBJECT_RELEASE is not set\n+# CONFIG_DEBUG_LIST is not set\n+# CONFIG_DEBUG_LL is not set\n+# CONFIG_DEBUG_LL_UART_8250 is not set\n+# CONFIG_DEBUG_LL_UART_PL01X is not set\n+# CONFIG_DEBUG_LOCKDEP is not set\n+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set\n+# CONFIG_DEBUG_LOCK_ALLOC is not set\n+# CONFIG_DEBUG_MEMORY_INIT is not set\n+# CONFIG_DEBUG_MISC is not set\n+# CONFIG_DEBUG_MUTEXES is not set\n+# CONFIG_DEBUG_NOTIFIERS is not set\n+# CONFIG_DEBUG_NX_TEST is not set\n+# CONFIG_DEBUG_OBJECTS is not set\n+# CONFIG_DEBUG_PAGEALLOC is not set\n+# CONFIG_DEBUG_PAGE_REF is not set\n+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set\n+# CONFIG_DEBUG_PER_CPU_MAPS is not set\n+# CONFIG_DEBUG_PINCTRL is not set\n+# CONFIG_DEBUG_PI_LIST is not set\n+# CONFIG_DEBUG_PLIST is not set\n+# CONFIG_DEBUG_PREEMPT is not set\n+# CONFIG_DEBUG_RODATA_TEST is not set\n+# CONFIG_DEBUG_RSEQ is not set\n+# CONFIG_DEBUG_RT_MUTEXES is not set\n+# CONFIG_DEBUG_RWSEMS is not set\n+# CONFIG_DEBUG_SECTION_MISMATCH is not set\n+# CONFIG_DEBUG_SEMIHOSTING is not set\n+# CONFIG_DEBUG_SG is not set\n+# CONFIG_DEBUG_SHIRQ is not set\n+# CONFIG_DEBUG_SLAB is not set\n+# CONFIG_DEBUG_SPINLOCK is not set\n+# CONFIG_DEBUG_STACKOVERFLOW is not set\n+# CONFIG_DEBUG_STACK_USAGE is not set\n+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set\n+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set\n+# CONFIG_DEBUG_TIMEKEEPING is not set\n+# CONFIG_DEBUG_UART_8250_PALMCHIP is not set\n+# CONFIG_DEBUG_UART_8250_WORD is not set\n+# CONFIG_DEBUG_UART_BCM63XX is not set\n+# CONFIG_DEBUG_UART_FLOW_CONTROL is not set\n+# CONFIG_DEBUG_USER is not set\n+# CONFIG_DEBUG_VIRTUAL is not set\n+# CONFIG_DEBUG_VM is not set\n+# CONFIG_DEBUG_VM_PGTABLE is not set\n+# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set\n+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set\n+# CONFIG_DEBUG_WX is not set\n+# CONFIG_DEBUG_ZBOOT is not set\n+# CONFIG_DECNET is not set\n+CONFIG_DEFAULT_CUBIC=y\n+CONFIG_DEFAULT_DEADLINE=y\n+CONFIG_DEFAULT_HOSTNAME=\"(none)\"\n+CONFIG_DEFAULT_INIT=\"\"\n+CONFIG_DEFAULT_IOSCHED=\"deadline\"\n+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096\n+# CONFIG_DEFAULT_NOOP is not set\n+# CONFIG_DEFAULT_RENO is not set\n+CONFIG_DEFAULT_SECURITY=\"\"\n+CONFIG_DEFAULT_SECURITY_DAC=y\n+# CONFIG_DEFAULT_SECURITY_SELINUX is not set\n+CONFIG_DEFAULT_TCP_CONG=\"cubic\"\n+CONFIG_DEFCONFIG_LIST=\"/lib/modules/$UNAME_RELEASE/.config\"\n+# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set\n+# CONFIG_DELL_LAPTOP is not set\n+# CONFIG_DELL_RBTN is not set\n+# CONFIG_DELL_SMBIOS is not set\n+# CONFIG_DELL_SMO8800 is not set\n+# CONFIG_DEPRECATED_PARAM_STRUCT is not set\n+# CONFIG_DETECT_HUNG_TASK is not set\n+# CONFIG_DEVKMEM is not set\n+# CONFIG_DEVMEM is not set\n+CONFIG_DEVPORT=y\n+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set\n+# CONFIG_DEVTMPFS is not set\n+# CONFIG_DEVTMPFS_MOUNT is not set\n+# CONFIG_DEV_DAX is not set\n+# CONFIG_DGAP is not set\n+# CONFIG_DGNC is not set\n+# CONFIG_DHT11 is not set\n+# CONFIG_DISCONTIGMEM_MANUAL is not set\n+# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set\n+# CONFIG_DISPLAY_CONNECTOR_DVI is not set\n+# CONFIG_DISPLAY_CONNECTOR_HDMI is not set\n+# CONFIG_DISPLAY_ENCODER_TFP410 is not set\n+# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set\n+# CONFIG_DISPLAY_PANEL_DPI is not set\n+# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set\n+# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set\n+# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set\n+# CONFIG_DL2K is not set\n+# CONFIG_DLHL60D is not set\n+# CONFIG_DLM is not set\n+# CONFIG_DM9000 is not set\n+# CONFIG_DMABUF_HEAPS is not set\n+# CONFIG_DMABUF_MOVE_NOTIFY is not set\n+# CONFIG_DMABUF_SELFTESTS is not set\n+# CONFIG_DMADEVICES is not set\n+# CONFIG_DMADEVICES_DEBUG is not set\n+# CONFIG_DMARD06 is not set\n+# CONFIG_DMARD09 is not set\n+# CONFIG_DMARD10 is not set\n+# CONFIG_DMASCC is not set\n+# CONFIG_DMATEST is not set\n+# CONFIG_DMA_API_DEBUG is not set\n+CONFIG_DMA_COHERENT_POOL=y\n+CONFIG_DMA_DECLARE_COHERENT=y\n+# CONFIG_DMA_ENGINE is not set\n+# CONFIG_DMA_FENCE_TRACE is not set\n+# CONFIG_DMA_JZ4780 is not set\n+CONFIG_DMA_NONCOHERENT_MMAP=y\n+# CONFIG_DMA_NOOP_OPS is not set\n+# CONFIG_DMA_SHARED_BUFFER is not set\n+# CONFIG_DMA_VIRT_OPS is not set\n+# CONFIG_DM_CACHE is not set\n+# CONFIG_DM_CLONE is not set\n+# CONFIG_DM_DEBUG is not set\n+# CONFIG_DM_DELAY is not set\n+# CONFIG_DM_DUST is not set\n+# CONFIG_DM_EBS is not set\n+# CONFIG_DM_ERA is not set\n+# CONFIG_DM_FLAKEY is not set\n+# CONFIG_DM_INTEGRITY is not set\n+# CONFIG_DM_LOG_USERSPACE is not set\n+# CONFIG_DM_LOG_WRITES is not set\n+# CONFIG_DM_MQ_DEFAULT is not set\n+# CONFIG_DM_MULTIPATH is not set\n+# CONFIG_DM_RAID is not set\n+# CONFIG_DM_SWITCH is not set\n+# CONFIG_DM_THIN_PROVISIONING is not set\n+# CONFIG_DM_UEVENT is not set\n+# CONFIG_DM_UNSTRIPED is not set\n+# CONFIG_DM_VERITY is not set\n+# CONFIG_DM_WRITECACHE is not set\n+# CONFIG_DM_ZERO is not set\n+# CONFIG_DNET is not set\n+# CONFIG_DNOTIFY is not set\n+# CONFIG_DNS_RESOLVER is not set\n+CONFIG_DOUBLEFAULT=y\n+# CONFIG_DP83822_PHY is not set\n+# CONFIG_DP83848_PHY is not set\n+# CONFIG_DP83867_PHY is not set\n+# CONFIG_DP83869_PHY is not set\n+# CONFIG_DP83TC811_PHY is not set\n+# CONFIG_DPOT_DAC is not set\n+# CONFIG_DPS310 is not set\n+CONFIG_DQL=y\n+# CONFIG_DRAGONRISE_FF is not set\n+# CONFIG_DRM is not set\n+# CONFIG_DRM_AMDGPU is not set\n+# CONFIG_DRM_AMDGPU_CIK is not set\n+# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set\n+# CONFIG_DRM_AMDGPU_SI is not set\n+# CONFIG_DRM_AMDGPU_USERPTR is not set\n+# CONFIG_DRM_AMD_ACP is not set\n+# CONFIG_DRM_AMD_DC_DCN2_0 is not set\n+# CONFIG_DRM_ANALOGIX_ANX6345 is not set\n+# CONFIG_DRM_ANALOGIX_ANX78XX is not set\n+# CONFIG_DRM_ARCPGU is not set\n+# CONFIG_DRM_ARMADA is not set\n+# CONFIG_DRM_AST is not set\n+# CONFIG_DRM_BOCHS is not set\n+# CONFIG_DRM_CDNS_DSI is not set\n+# CONFIG_DRM_CDNS_MHDP8546 is not set\n+# CONFIG_DRM_CHRONTEL_CH7033 is not set\n+# CONFIG_DRM_CIRRUS_QEMU is not set\n+# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set\n+# CONFIG_DRM_DEBUG_MM is not set\n+# CONFIG_DRM_DEBUG_SELFTEST is not set\n+# CONFIG_DRM_DISPLAY_CONNECTOR is not set\n+# CONFIG_DRM_DP_AUX_CHARDEV is not set\n+# CONFIG_DRM_DP_CEC is not set\n+# CONFIG_DRM_DUMB_VGA_DAC is not set\n+# CONFIG_DRM_DW_HDMI_CEC is not set\n+# CONFIG_DRM_ETNAVIV is not set\n+# CONFIG_DRM_EXYNOS is not set\n+# CONFIG_DRM_FBDEV_EMULATION is not set\n+# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set\n+# CONFIG_DRM_FSL_DCU is not set\n+# CONFIG_DRM_GM12U320 is not set\n+# CONFIG_DRM_GMA500 is not set\n+# CONFIG_DRM_GUD is not set\n+# CONFIG_DRM_HDLCD is not set\n+# CONFIG_DRM_HISI_HIBMC is not set\n+# CONFIG_DRM_HISI_KIRIN is not set\n+# CONFIG_DRM_I2C_ADV7511 is not set\n+# CONFIG_DRM_I2C_CH7006 is not set\n+# CONFIG_DRM_I2C_NXP_TDA9950 is not set\n+# CONFIG_DRM_I2C_NXP_TDA998X is not set\n+# CONFIG_DRM_I2C_SIL164 is not set\n+# CONFIG_DRM_I915 is not set\n+CONFIG_DRM_I915_REQUEST_TIMEOUT=20000\n+# CONFIG_DRM_KOMEDA is not set\n+# CONFIG_DRM_LEGACY is not set\n+# CONFIG_DRM_LIB_RANDOM is not set\n+# CONFIG_DRM_LIMA is not set\n+# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set\n+# CONFIG_DRM_LONTIUM_LT9611 is not set\n+# CONFIG_DRM_LVDS_CODEC is not set\n+# CONFIG_DRM_LVDS_ENCODER is not set\n+# CONFIG_DRM_MALI_DISPLAY is not set\n+# CONFIG_DRM_MCDE is not set\n+# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set\n+# CONFIG_DRM_MGAG200 is not set\n+# CONFIG_DRM_MXSFB is not set\n+# CONFIG_DRM_NOUVEAU is not set\n+# CONFIG_DRM_NWL_MIPI_DSI is not set\n+# CONFIG_DRM_NXP_PTN3460 is not set\n+# CONFIG_DRM_OMAP is not set\n+# CONFIG_DRM_PANEL_ARM_VERSATILE is not set\n+# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set\n+# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set\n+# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set\n+# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set\n+# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set\n+# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set\n+# CONFIG_DRM_PANEL_LG_LB035Q02 is not set\n+# CONFIG_DRM_PANEL_LG_LG4573 is not set\n+# CONFIG_DRM_PANEL_LVDS is not set\n+# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set\n+# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set\n+# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set\n+# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set\n+# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set\n+# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set\n+# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set\n+# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set\n+# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set\n+# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set\n+# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set\n+# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set\n+# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set\n+# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set\n+# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set\n+# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set\n+# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set\n+# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set\n+# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set\n+# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set\n+# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set\n+# CONFIG_DRM_PANEL_TPO_TPG110 is not set\n+# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set\n+# CONFIG_DRM_PANFROST is not set\n+# CONFIG_DRM_PARADE_PS8622 is not set\n+# CONFIG_DRM_PARADE_PS8640 is not set\n+# CONFIG_DRM_PL111 is not set\n+# CONFIG_DRM_QXL is not set\n+# CONFIG_DRM_RADEON is not set\n+# CONFIG_DRM_RADEON_USERPTR is not set\n+# CONFIG_DRM_RCAR_DW_HDMI is not set\n+# CONFIG_DRM_RCAR_LVDS is not set\n+# CONFIG_DRM_SII902X is not set\n+# CONFIG_DRM_SII9234 is not set\n+# CONFIG_DRM_SIL_SII8620 is not set\n+# CONFIG_DRM_SIMPLE_BRIDGE is not set\n+# CONFIG_DRM_STI is not set\n+# CONFIG_DRM_STM is not set\n+# CONFIG_DRM_SUN4I is not set\n+# CONFIG_DRM_THINE_THC63LVD1024 is not set\n+# CONFIG_DRM_TIDSS is not set\n+# CONFIG_DRM_TILCDC is not set\n+# CONFIG_DRM_TINYDRM is not set\n+# CONFIG_DRM_TI_SN65DSI86 is not set\n+# CONFIG_DRM_TI_TFP410 is not set\n+# CONFIG_DRM_TI_TPD12S015 is not set\n+# CONFIG_DRM_TOSHIBA_TC358762 is not set\n+# CONFIG_DRM_TOSHIBA_TC358764 is not set\n+# CONFIG_DRM_TOSHIBA_TC358767 is not set\n+# CONFIG_DRM_TOSHIBA_TC358768 is not set\n+# CONFIG_DRM_TOSHIBA_TC358775 is not set\n+# CONFIG_DRM_UDL is not set\n+# CONFIG_DRM_VBOXVIDEO is not set\n+# CONFIG_DRM_VC4_HDMI_CEC is not set\n+# CONFIG_DRM_VGEM is not set\n+# CONFIG_DRM_VIRTIO_GPU is not set\n+# CONFIG_DRM_VKMS is not set\n+# CONFIG_DRM_VMWGFX is not set\n+# CONFIG_DRM_XEN is not set\n+# CONFIG_DRM_XEN_FRONTEND is not set\n+# CONFIG_DS1682 is not set\n+# CONFIG_DS1803 is not set\n+# CONFIG_DS4424 is not set\n+# CONFIG_DST_CACHE is not set\n+# CONFIG_DTLK is not set\n+# CONFIG_DUMMY is not set\n+CONFIG_DUMMY_CONSOLE_COLUMNS=80\n+CONFIG_DUMMY_CONSOLE_ROWS=25\n+# CONFIG_DUMMY_IRQ is not set\n+# CONFIG_DVB_A8293 is not set\n+# CONFIG_DVB_AF9013 is not set\n+# CONFIG_DVB_AF9033 is not set\n+# CONFIG_DVB_AS102 is not set\n+# CONFIG_DVB_ASCOT2E is not set\n+# CONFIG_DVB_ATBM8830 is not set\n+# CONFIG_DVB_AU8522_DTV is not set\n+# CONFIG_DVB_AU8522_V4L is not set\n+# CONFIG_DVB_B2C2_FLEXCOP_USB is not set\n+# CONFIG_DVB_BCM3510 is not set\n+# CONFIG_DVB_CORE is not set\n+# CONFIG_DVB_CX22700 is not set\n+# CONFIG_DVB_CX22702 is not set\n+# CONFIG_DVB_CX24110 is not set\n+# CONFIG_DVB_CX24116 is not set\n+# CONFIG_DVB_CX24117 is not set\n+# CONFIG_DVB_CX24120 is not set\n+# CONFIG_DVB_CX24123 is not set\n+# CONFIG_DVB_CXD2099 is not set\n+# CONFIG_DVB_CXD2820R is not set\n+# CONFIG_DVB_CXD2841ER is not set\n+# CONFIG_DVB_CXD2880 is not set\n+# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set\n+# CONFIG_DVB_DIB3000MB is not set\n+# CONFIG_DVB_DIB3000MC is not set\n+# CONFIG_DVB_DIB7000M is not set\n+# CONFIG_DVB_DIB7000P is not set\n+# CONFIG_DVB_DIB8000 is not set\n+# CONFIG_DVB_DIB9000 is not set\n+# CONFIG_DVB_DRX39XYJ is not set\n+# CONFIG_DVB_DRXD is not set\n+# CONFIG_DVB_DRXK is not set\n+# CONFIG_DVB_DS3000 is not set\n+# CONFIG_DVB_DUMMY_FE is not set\n+# CONFIG_DVB_DYNAMIC_MINORS is not set\n+# CONFIG_DVB_EC100 is not set\n+# CONFIG_DVB_FIREDTV is not set\n+# CONFIG_DVB_HELENE is not set\n+# CONFIG_DVB_HORUS3A is not set\n+# CONFIG_DVB_ISL6405 is not set\n+# CONFIG_DVB_ISL6421 is not set\n+# CONFIG_DVB_ISL6423 is not set\n+# CONFIG_DVB_IX2505V is not set\n+# CONFIG_DVB_L64781 is not set\n+# CONFIG_DVB_LG2160 is not set\n+# CONFIG_DVB_LGDT3305 is not set\n+# CONFIG_DVB_LGDT3306A is not set\n+# CONFIG_DVB_LGDT330X is not set\n+# CONFIG_DVB_LGS8GL5 is not set\n+# CONFIG_DVB_LGS8GXX is not set\n+# CONFIG_DVB_LNBH25 is not set\n+# CONFIG_DVB_LNBH29 is not set\n+# CONFIG_DVB_LNBP21 is not set\n+# CONFIG_DVB_LNBP22 is not set\n+# CONFIG_DVB_M88DS3103 is not set\n+# CONFIG_DVB_M88RS2000 is not set\n+CONFIG_DVB_MAX_ADAPTERS=16\n+# CONFIG_DVB_MB86A16 is not set\n+# CONFIG_DVB_MB86A20S is not set\n+# CONFIG_DVB_MMAP is not set\n+# CONFIG_DVB_MN88443X is not set\n+# CONFIG_DVB_MN88472 is not set\n+# CONFIG_DVB_MN88473 is not set\n+# CONFIG_DVB_MT312 is not set\n+# CONFIG_DVB_MT352 is not set\n+# CONFIG_DVB_MXL5XX is not set\n+# CONFIG_DVB_NET is not set\n+# CONFIG_DVB_NXT200X is not set\n+# CONFIG_DVB_NXT6000 is not set\n+# CONFIG_DVB_OR51132 is not set\n+# CONFIG_DVB_OR51211 is not set\n+# CONFIG_DVB_PLATFORM_DRIVERS is not set\n+# CONFIG_DVB_PLL is not set\n+# CONFIG_DVB_RTL2830 is not set\n+# CONFIG_DVB_RTL2832 is not set\n+# CONFIG_DVB_RTL2832_SDR is not set\n+# CONFIG_DVB_S5H1409 is not set\n+# CONFIG_DVB_S5H1411 is not set\n+# CONFIG_DVB_S5H1420 is not set\n+# CONFIG_DVB_S5H1432 is not set\n+# CONFIG_DVB_S921 is not set\n+# CONFIG_DVB_SI2165 is not set\n+# CONFIG_DVB_SI2168 is not set\n+# CONFIG_DVB_SI21XX is not set\n+# CONFIG_DVB_SP2 is not set\n+# CONFIG_DVB_SP8870 is not set\n+# CONFIG_DVB_SP887X is not set\n+# CONFIG_DVB_STB0899 is not set\n+# CONFIG_DVB_STB6000 is not set\n+# CONFIG_DVB_STB6100 is not set\n+# CONFIG_DVB_STV0288 is not set\n+# CONFIG_DVB_STV0297 is not set\n+# CONFIG_DVB_STV0299 is not set\n+# CONFIG_DVB_STV0367 is not set\n+# CONFIG_DVB_STV0900 is not set\n+# CONFIG_DVB_STV090x is not set\n+# CONFIG_DVB_STV0910 is not set\n+# CONFIG_DVB_STV6110 is not set\n+# CONFIG_DVB_STV6110x is not set\n+# CONFIG_DVB_STV6111 is not set\n+# CONFIG_DVB_TC90522 is not set\n+# CONFIG_DVB_TDA10021 is not set\n+# CONFIG_DVB_TDA10023 is not set\n+# CONFIG_DVB_TDA10048 is not set\n+# CONFIG_DVB_TDA1004X is not set\n+# CONFIG_DVB_TDA10071 is not set\n+# CONFIG_DVB_TDA10086 is not set\n+# CONFIG_DVB_TDA18271C2DD is not set\n+# CONFIG_DVB_TDA665x is not set\n+# CONFIG_DVB_TDA8083 is not set\n+# CONFIG_DVB_TDA8261 is not set\n+# CONFIG_DVB_TDA826X is not set\n+# CONFIG_DVB_TEST_DRIVERS is not set\n+# CONFIG_DVB_TS2020 is not set\n+# CONFIG_DVB_TTUSB_BUDGET is not set\n+# CONFIG_DVB_TTUSB_DEC is not set\n+# CONFIG_DVB_TUA6100 is not set\n+# CONFIG_DVB_TUNER_CX24113 is not set\n+# CONFIG_DVB_TUNER_DIB0070 is not set\n+# CONFIG_DVB_TUNER_DIB0090 is not set\n+# CONFIG_DVB_TUNER_ITD1000 is not set\n+# CONFIG_DVB_ULE_DEBUG is not set\n+# CONFIG_DVB_USB_V2 is not set\n+# CONFIG_DVB_VES1820 is not set\n+# CONFIG_DVB_VES1X93 is not set\n+# CONFIG_DVB_ZD1301_DEMOD is not set\n+# CONFIG_DVB_ZL10036 is not set\n+# CONFIG_DVB_ZL10039 is not set\n+# CONFIG_DVB_ZL10353 is not set\n+# CONFIG_DWC_XLGMAC is not set\n+# CONFIG_DWMAC_DWC_QOS_ETH is not set\n+# CONFIG_DWMAC_INTEL_PLAT is not set\n+# CONFIG_DWMAC_LOONGSON is not set\n+# CONFIG_DWMAC_IPQ806X is not set\n+# CONFIG_DWMAC_LPC18XX is not set\n+# CONFIG_DWMAC_MESON is not set\n+# CONFIG_DWMAC_ROCKCHIP is not set\n+# CONFIG_DWMAC_SOCFPGA is not set\n+# CONFIG_DWMAC_STI is not set\n+# CONFIG_DW_AXI_DMAC is not set\n+# CONFIG_DW_XDATA_PCIE is not set\n+# CONFIG_DW_DMAC is not set\n+# CONFIG_DW_DMAC_PCI is not set\n+# CONFIG_DW_EDMA is not set\n+# CONFIG_DW_EDMA_PCIE is not set\n+# CONFIG_DW_WATCHDOG is not set\n+# CONFIG_DYNAMIC_DEBUG is not set\n+CONFIG_DYNAMIC_DEBUG_CORE=y\n+# CONFIG_E100 is not set\n+# CONFIG_E1000 is not set\n+# CONFIG_E1000E is not set\n+# CONFIG_E1000E_HWTS is not set\n+# CONFIG_EARLY_PRINTK_8250 is not set\n+# CONFIG_EARLY_PRINTK_USB_XDBC is not set\n+# CONFIG_EBC_C384_WDT is not set\n+# CONFIG_ECHO is not set\n+# CONFIG_ECRYPT_FS is not set\n+# CONFIG_EDAC is not set\n+# CONFIG_EEEPC_LAPTOP is not set\n+# CONFIG_EEPROM_93CX6 is not set\n+# CONFIG_EEPROM_93XX46 is not set\n+# CONFIG_EEPROM_AT24 is not set\n+# CONFIG_EEPROM_AT25 is not set\n+# CONFIG_EEPROM_DIGSY_MTC_CFG is not set\n+# CONFIG_EEPROM_EE1004 is not set\n+# CONFIG_EEPROM_IDT_89HPESX is not set\n+# CONFIG_EEPROM_LEGACY is not set\n+# CONFIG_EEPROM_MAX6875 is not set\n+# CONFIG_EFI is not set\n+CONFIG_EFI_PARTITION=y\n+# CONFIG_EFS_FS is not set\n+CONFIG_ELFCORE=y\n+# CONFIG_ELF_CORE is not set\n+# CONFIG_EMAC_ROCKCHIP is not set\n+CONFIG_EMBEDDED=y\n+# CONFIG_EM_TIMER_STI is not set\n+# CONFIG_ENABLE_MUST_CHECK is not set\n+CONFIG_ENABLE_WARN_DEPRECATED=y\n+# CONFIG_ENA_ETHERNET is not set\n+# CONFIG_ENC28J60 is not set\n+# CONFIG_ENCLOSURE_SERVICES is not set\n+# CONFIG_ENCRYPTED_KEYS is not set\n+# CONFIG_ENCX24J600 is not set\n+# CONFIG_ENERGY_MODEL is not set\n+# CONFIG_ENIC is not set\n+# CONFIG_ENVELOPE_DETECTOR is not set\n+# CONFIG_EPAPR_PARAVIRT is not set\n+# CONFIG_EPIC100 is not set\n+CONFIG_EPOLL=y\n+# CONFIG_EQUALIZER is not set\n+# CONFIG_EROFS_FS is not set\n+# CONFIG_ET131X is not set\n+CONFIG_ETHERNET=y\n+# CONFIG_ETHOC is not set\n+# CONFIG_ETHTOOL_NETLINK is not set\n+CONFIG_EVENTFD=y\n+# CONFIG_EVM is not set\n+# CONFIG_EXFAT_FS is not set\n+CONFIG_EXPERT=y\n+CONFIG_EXPORTFS=y\n+# CONFIG_EXPORTFS_BLOCK_OPS is not set\n+# CONFIG_EXT2_FS is not set\n+CONFIG_EXT2_FS_XATTR=y\n+# CONFIG_EXT3_FS is not set\n+# CONFIG_EXT4_DEBUG is not set\n+# CONFIG_EXT4_ENCRYPTION is not set\n+# CONFIG_EXT4_FS is not set\n+# CONFIG_EXT4_FS_POSIX_ACL is not set\n+# CONFIG_EXT4_FS_SECURITY is not set\n+CONFIG_EXT4_USE_FOR_EXT2=y\n+# CONFIG_EXTCON is not set\n+# CONFIG_EXTCON_ADC_JACK is not set\n+# CONFIG_EXTCON_ARIZONA is not set\n+# CONFIG_EXTCON_AXP288 is not set\n+# CONFIG_EXTCON_FSA9480 is not set\n+# CONFIG_EXTCON_GPIO is not set\n+# CONFIG_EXTCON_INTEL_INT3496 is not set\n+# CONFIG_EXTCON_MAX3355 is not set\n+# CONFIG_EXTCON_PTN5150 is not set\n+# CONFIG_EXTCON_QCOM_SPMI_MISC is not set\n+# CONFIG_EXTCON_RT8973A is not set\n+# CONFIG_EXTCON_SM5502 is not set\n+# CONFIG_EXTCON_USB_GPIO is not set\n+CONFIG_EXTRA_FIRMWARE=\"\"\n+CONFIG_EXTRA_TARGETS=\"\"\n+# CONFIG_EXYNOS_ADC is not set\n+# CONFIG_EXYNOS_VIDEO is not set\n+# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set\n+# CONFIG_EZX_PCAP is not set\n+# CONFIG_F2FS_CHECK_FS is not set\n+# CONFIG_F2FS_FAULT_INJECTION is not set\n+# CONFIG_F2FS_FS is not set\n+# CONFIG_F2FS_FS_COMPRESSION is not set\n+# CONFIG_F2FS_FS_ENCRYPTION is not set\n+# CONFIG_F2FS_FS_POSIX_ACL is not set\n+# CONFIG_F2FS_FS_SECURITY is not set\n+CONFIG_F2FS_FS_XATTR=y\n+# CONFIG_F2FS_IO_TRACE is not set\n+CONFIG_F2FS_STAT_FS=y\n+# CONFIG_FAILOVER is not set\n+# CONFIG_FAIR_GROUP_SCHED is not set\n+# CONFIG_FANOTIFY is not set\n+# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set\n+CONFIG_FAT_DEFAULT_CODEPAGE=437\n+CONFIG_FAT_DEFAULT_IOCHARSET=\"iso8859-1\"\n+# CONFIG_FAT_DEFAULT_UTF8 is not set\n+# CONFIG_FAT_FS is not set\n+# CONFIG_FAULT_INJECTION is not set\n+# CONFIG_FB is not set\n+# CONFIG_FB_3DFX is not set\n+# CONFIG_FB_ARC is not set\n+# CONFIG_FB_ARK is not set\n+# CONFIG_FB_ARMCLCD is not set\n+# CONFIG_FB_ASILIANT is not set\n+# CONFIG_FB_ATY is not set\n+# CONFIG_FB_ATY128 is not set\n+# CONFIG_FB_AUO_K190X is not set\n+# CONFIG_FB_BACKLIGHT is not set\n+# CONFIG_FB_BIG_ENDIAN is not set\n+# CONFIG_FB_BOOT_VESA_SUPPORT is not set\n+# CONFIG_FB_BOTH_ENDIAN is not set\n+# CONFIG_FB_BROADSHEET is not set\n+# CONFIG_FB_CARMINE is not set\n+# CONFIG_FB_CFB_COPYAREA is not set\n+# CONFIG_FB_CFB_FILLRECT is not set\n+# CONFIG_FB_CFB_IMAGEBLIT is not set\n+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set\n+# CONFIG_FB_CIRRUS is not set\n+# CONFIG_FB_CYBER2000 is not set\n+# CONFIG_FB_DA8XX is not set\n+# CONFIG_FB_DDC is not set\n+# CONFIG_FB_FLEX is not set\n+# CONFIG_FB_FOREIGN_ENDIAN is not set\n+# CONFIG_FB_GEODE is not set\n+# CONFIG_FB_GOLDFISH is not set\n+# CONFIG_FB_HGA is not set\n+# CONFIG_FB_I740 is not set\n+# CONFIG_FB_IBM_GXT4500 is not set\n+# CONFIG_FB_IMSTT is not set\n+# CONFIG_FB_IMX is not set\n+# CONFIG_FB_KYRO is not set\n+# CONFIG_FB_LE80578 is not set\n+# CONFIG_FB_LITTLE_ENDIAN is not set\n+# CONFIG_FB_MACMODES is not set\n+# CONFIG_FB_MATROX is not set\n+# CONFIG_FB_MB862XX is not set\n+# CONFIG_FB_METRONOME is not set\n+# CONFIG_FB_MODE_HELPERS is not set\n+# CONFIG_FB_MXS is not set\n+# CONFIG_FB_N411 is not set\n+# CONFIG_FB_NEOMAGIC is not set\n+CONFIG_FB_NOTIFY=y\n+# CONFIG_FB_NVIDIA is not set\n+# CONFIG_FB_OF is not set\n+# CONFIG_FB_OMAP2 is not set\n+# CONFIG_FB_OPENCORES is not set\n+# CONFIG_FB_PM2 is not set\n+# CONFIG_FB_PM3 is not set\n+# CONFIG_FB_PS3 is not set\n+# CONFIG_FB_PXA is not set\n+# CONFIG_FB_RADEON is not set\n+# CONFIG_FB_RIVA is not set\n+# CONFIG_FB_S1D13XXX is not set\n+# CONFIG_FB_S3 is not set\n+# CONFIG_FB_SAVAGE is not set\n+# CONFIG_FB_SIMPLE is not set\n+# CONFIG_FB_SIS is not set\n+# CONFIG_FB_SM712 is not set\n+# CONFIG_FB_SM750 is not set\n+# CONFIG_FB_SMSCUFX is not set\n+# CONFIG_FB_SSD1307 is not set\n+# CONFIG_FB_SVGALIB is not set\n+# CONFIG_FB_SYS_COPYAREA is not set\n+# CONFIG_FB_SYS_FILLRECT is not set\n+# CONFIG_FB_SYS_FOPS is not set\n+# CONFIG_FB_SYS_IMAGEBLIT is not set\n+# CONFIG_FB_TFT is not set\n+# CONFIG_FB_TFT_AGM1264K_FL is not set\n+# CONFIG_FB_TFT_BD663474 is not set\n+# CONFIG_FB_TFT_FBTFT_DEVICE is not set\n+# CONFIG_FB_TFT_HX8340BN is not set\n+# CONFIG_FB_TFT_HX8347D is not set\n+# CONFIG_FB_TFT_HX8353D is not set\n+# CONFIG_FB_TFT_HX8357D is not set\n+# CONFIG_FB_TFT_ILI9163 is not set\n+# CONFIG_FB_TFT_ILI9320 is not set\n+# CONFIG_FB_TFT_ILI9325 is not set\n+# CONFIG_FB_TFT_ILI9340 is not set\n+# CONFIG_FB_TFT_ILI9341 is not set\n+# CONFIG_FB_TFT_ILI9481 is not set\n+# CONFIG_FB_TFT_ILI9486 is not set\n+# CONFIG_FB_TFT_PCD8544 is not set\n+# CONFIG_FB_TFT_RA8875 is not set\n+# CONFIG_FB_TFT_S6D02A1 is not set\n+# CONFIG_FB_TFT_S6D1121 is not set\n+# CONFIG_FB_TFT_SEPS525 is not set\n+# CONFIG_FB_TFT_SH1106 is not set\n+# CONFIG_FB_TFT_SSD1289 is not set\n+# CONFIG_FB_TFT_SSD1305 is not set\n+# CONFIG_FB_TFT_SSD1306 is not set\n+# CONFIG_FB_TFT_SSD1325 is not set\n+# CONFIG_FB_TFT_SSD1331 is not set\n+# CONFIG_FB_TFT_SSD1351 is not set\n+# CONFIG_FB_TFT_ST7735R is not set\n+# CONFIG_FB_TFT_ST7789V is not set\n+# CONFIG_FB_TFT_TINYLCD is not set\n+# CONFIG_FB_TFT_TLS8204 is not set\n+# CONFIG_FB_TFT_UC1611 is not set\n+# CONFIG_FB_TFT_UC1701 is not set\n+# CONFIG_FB_TFT_UPD161704 is not set\n+# CONFIG_FB_TFT_WATTEROTT is not set\n+# CONFIG_FB_TILEBLITTING is not set\n+# CONFIG_FB_TMIO is not set\n+# CONFIG_FB_TRIDENT is not set\n+# CONFIG_FB_UDL is not set\n+# CONFIG_FB_UVESA is not set\n+# CONFIG_FB_VGA16 is not set\n+# CONFIG_FB_VIA is not set\n+# CONFIG_FB_VIRTUAL is not set\n+# CONFIG_FB_VOODOO1 is not set\n+# CONFIG_FB_VT8623 is not set\n+# CONFIG_FB_XGI is not set\n+# CONFIG_FCOE is not set\n+# CONFIG_FCOE_FNIC is not set\n+# CONFIG_FDDI is not set\n+# CONFIG_FEALNX is not set\n+# CONFIG_FENCE_TRACE is not set\n+# CONFIG_FHANDLE is not set\n+CONFIG_FIB_RULES=y\n+# CONFIG_FIELDBUS_DEV is not set\n+CONFIG_FILE_LOCKING=y\n+# CONFIG_FIND_BIT_BENCHMARK is not set\n+# CONFIG_FIREWIRE is not set\n+# CONFIG_FIREWIRE_NOSY is not set\n+# CONFIG_FIREWIRE_SERIAL is not set\n+# CONFIG_FIRMWARE_EDID is not set\n+# CONFIG_FIRMWARE_IN_KERNEL is not set\n+# CONFIG_FIRMWARE_MEMMAP is not set\n+# CONFIG_FIT_PARTITION is not set\n+# CONFIG_FIXED_PHY is not set\n+CONFIG_FLATMEM=y\n+CONFIG_FLATMEM_MANUAL=y\n+CONFIG_FLAT_NODE_MEM_MAP=y\n+# CONFIG_FM10K is not set\n+# CONFIG_FMC is not set\n+# CONFIG_FONTS is not set\n+# CONFIG_FONT_6x8 is not set\n+# CONFIG_FONT_TER16x32 is not set\n+# CONFIG_FORCEDETH is not set\n+CONFIG_FORCE_MAX_ZONEORDER=11\n+CONFIG_FORTIFY_SOURCE=y\n+# CONFIG_FPGA is not set\n+# CONFIG_FRAMEBUFFER_CONSOLE is not set\n+# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set\n+# CONFIG_FRAME_POINTER is not set\n+CONFIG_FRAME_WARN=1024\n+# CONFIG_FREEZER is not set\n+# CONFIG_FRONTSWAP is not set\n+# CONFIG_FSCACHE is not set\n+# CONFIG_FSI is not set\n+# CONFIG_FSL_EDMA is not set\n+# CONFIG_FSL_ERRATUM_A008585 is not set\n+# CONFIG_FSL_MC_BUS is not set\n+# CONFIG_FSL_PQ_MDIO is not set\n+# CONFIG_FSL_QDMA is not set\n+# CONFIG_FSL_RCPM is not set\n+# CONFIG_FSL_XGMAC_MDIO is not set\n+CONFIG_FSNOTIFY=y\n+# CONFIG_FS_DAX is not set\n+# CONFIG_FS_ENCRYPTION is not set\n+# CONFIG_FS_POSIX_ACL is not set\n+# CONFIG_FS_VERITY is not set\n+# CONFIG_FTGMAC100 is not set\n+# CONFIG_FTL is not set\n+# CONFIG_FTMAC100 is not set\n+# CONFIG_FTRACE is not set\n+# CONFIG_FTRACE_STARTUP_TEST is not set\n+# CONFIG_FTR_FIXUP_SELFTEST is not set\n+# CONFIG_FTWDT010_WATCHDOG is not set\n+# CONFIG_FUJITSU_ES is not set\n+# CONFIG_FUJITSU_LAPTOP is not set\n+# CONFIG_FUJITSU_TABLET is not set\n+# CONFIG_FUNCTION_TRACER is not set\n+# CONFIG_FUSE_FS is not set\n+# CONFIG_FUSION is not set\n+# CONFIG_FUSION_FC is not set\n+# CONFIG_FUSION_SAS is not set\n+# CONFIG_FUSION_SPI is not set\n+CONFIG_FUTEX=y\n+CONFIG_FUTEX_PI=y\n+# CONFIG_FW_CFG_SYSFS is not set\n+CONFIG_FW_LOADER=y\n+# CONFIG_FW_LOADER_COMPRESS is not set\n+CONFIG_FW_LOADER_USER_HELPER=y\n+CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y\n+# CONFIG_FXAS21002C is not set\n+# CONFIG_FXOS8700_I2C is not set\n+# CONFIG_FXOS8700_SPI is not set\n+CONFIG_GACT_PROB=y\n+# CONFIG_GADGET_UAC1 is not set\n+# CONFIG_GAMEPORT is not set\n+# CONFIG_GATEWORKS_GW16083 is not set\n+# CONFIG_GCC_PLUGINS is not set\n+# CONFIG_GCOV is not set\n+# CONFIG_GCOV_KERNEL is not set\n+# CONFIG_GDB_SCRIPTS is not set\n+# CONFIG_GEMINI_ETHERNET is not set\n+# CONFIG_GENERIC_ADC_BATTERY is not set\n+# CONFIG_GENERIC_ADC_THERMAL is not set\n+CONFIG_GENERIC_CALIBRATE_DELAY=y\n+# CONFIG_GENERIC_CPU_DEVICES is not set\n+CONFIG_GENERIC_HWEIGHT=y\n+# CONFIG_GENERIC_IRQ_DEBUGFS is not set\n+CONFIG_GENERIC_IRQ_IPI=y\n+CONFIG_GENERIC_IRQ_PROBE=y\n+CONFIG_GENERIC_NET_UTILS=y\n+# CONFIG_GENERIC_PHY is not set\n+CONFIG_GENERIC_PTDUMP=y\n+CONFIG_GENERIC_VDSO_TIME_NS=y\n+# CONFIG_GENEVE is not set\n+# CONFIG_GENWQE is not set\n+# CONFIG_GFS2_FS is not set\n+# CONFIG_GIGASET_CAPI is not set\n+# CONFIG_GIGASET_DEBUG is not set\n+# CONFIG_GIGASET_DUMMYLL is not set\n+# CONFIG_GLOB_SELFTEST is not set\n+# CONFIG_GNSS is not set\n+# CONFIG_GOLDFISH is not set\n+# CONFIG_GOOGLE_FIRMWARE is not set\n+# CONFIG_GP2AP002 is not set\n+# CONFIG_GP2AP020A00F is not set\n+# CONFIG_GPD_POCKET_FAN is not set\n+# CONFIG_GPIOLIB is not set\n+CONFIG_GPIOLIB_FASTPATH_LIMIT=512\n+# CONFIG_GPIO_104_DIO_48E is not set\n+# CONFIG_GPIO_104_IDIO_16 is not set\n+# CONFIG_GPIO_104_IDI_48 is not set\n+# CONFIG_GPIO_74X164 is not set\n+# CONFIG_GPIO_74XX_MMIO is not set\n+# CONFIG_GPIO_ADNP is not set\n+# CONFIG_GPIO_ADP5588 is not set\n+# CONFIG_GPIO_AGGREGATOR is not set\n+# CONFIG_GPIO_ALTERA is not set\n+# CONFIG_GPIO_AMD8111 is not set\n+# CONFIG_GPIO_AMDPT is not set\n+# CONFIG_GPIO_AMD_FCH is not set\n+# CONFIG_GPIO_BCM_KONA is not set\n+# CONFIG_GPIO_BT8XX is not set\n+# CONFIG_GPIO_CADENCE is not set\n+# CONFIG_GPIO_CDEV is not set\n+# CONFIG_GPIO_CS5535 is not set\n+# CONFIG_GPIO_DWAPB is not set\n+# CONFIG_GPIO_EM is not set\n+# CONFIG_GPIO_EXAR is not set\n+# CONFIG_GPIO_F7188X is not set\n+# CONFIG_GPIO_FTGPIO010 is not set\n+# CONFIG_GPIO_GENERIC_PLATFORM is not set\n+# CONFIG_GPIO_GPIO_MM is not set\n+# CONFIG_GPIO_GRGPIO is not set\n+# CONFIG_GPIO_GW_PLD is not set\n+# CONFIG_GPIO_HLWD is not set\n+# CONFIG_GPIO_ICH is not set\n+# CONFIG_GPIO_IT87 is not set\n+# CONFIG_GPIO_LOGICVC is not set\n+# CONFIG_GPIO_LYNXPOINT is not set\n+# CONFIG_GPIO_MAX3191X is not set\n+# CONFIG_GPIO_MAX7300 is not set\n+# CONFIG_GPIO_MAX7301 is not set\n+# CONFIG_GPIO_MAX732X is not set\n+# CONFIG_GPIO_MB86S7X is not set\n+# CONFIG_GPIO_MC33880 is not set\n+# CONFIG_GPIO_MCP23S08 is not set\n+# CONFIG_GPIO_ML_IOH is not set\n+# CONFIG_GPIO_MOCKUP is not set\n+# CONFIG_GPIO_MPC8XXX is not set\n+# CONFIG_GPIO_PCA953X is not set\n+# CONFIG_GPIO_PCA953X_IRQ is not set\n+# CONFIG_GPIO_PCA9570 is not set\n+# CONFIG_GPIO_PCF857X is not set\n+# CONFIG_GPIO_PCH is not set\n+# CONFIG_GPIO_PCIE_IDIO_24 is not set\n+# CONFIG_GPIO_PCI_IDIO_16 is not set\n+# CONFIG_GPIO_PISOSR is not set\n+# CONFIG_GPIO_PL061 is not set\n+# CONFIG_GPIO_RCAR is not set\n+# CONFIG_GPIO_RDC321X is not set\n+# CONFIG_GPIO_SAMA5D2_PIOBU is not set\n+# CONFIG_GPIO_SCH is not set\n+# CONFIG_GPIO_SCH311X is not set\n+# CONFIG_GPIO_SIFIVE is not set\n+# CONFIG_GPIO_SX150X is not set\n+# CONFIG_GPIO_SYSCON is not set\n+CONFIG_GPIO_SYSFS=y\n+# CONFIG_GPIO_TPIC2810 is not set\n+# CONFIG_GPIO_TS4900 is not set\n+# CONFIG_GPIO_TS5500 is not set\n+# CONFIG_GPIO_VX855 is not set\n+# CONFIG_GPIO_WATCHDOG is not set\n+# CONFIG_GPIO_WINBOND is not set\n+# CONFIG_GPIO_WS16C48 is not set\n+# CONFIG_GPIO_XGENE is not set\n+# CONFIG_GPIO_XILINX is not set\n+# CONFIG_GPIO_XRA1403 is not set\n+# CONFIG_GPIO_ZEVIO is not set\n+# CONFIG_GPIO_ZX is not set\n+# CONFIG_GREENASIA_FF is not set\n+# CONFIG_GREYBUS is not set\n+# CONFIG_GS_FPGABOOT is not set\n+# CONFIG_GTP is not set\n+# CONFIG_GUP_BENCHMARK is not set\n+# CONFIG_GVE is not set\n+# CONFIG_HABANA_AI is not set\n+# CONFIG_HAMACHI is not set\n+# CONFIG_HAMRADIO is not set\n+# CONFIG_HAPPYMEAL is not set\n+CONFIG_HARDENED_USERCOPY=y\n+# CONFIG_HARDENED_USERCOPY_FALLBACK is not set\n+# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set\n+CONFIG_HARDEN_EL2_VECTORS=y\n+# CONFIG_HARDLOCKUP_DETECTOR is not set\n+# CONFIG_HCALL_STATS is not set\n+# CONFIG_HDC100X is not set\n+# CONFIG_HDC2010 is not set\n+# CONFIG_HDLC is not set\n+# CONFIG_HDLC_CISCO is not set\n+# CONFIG_HDLC_FR is not set\n+# CONFIG_HDLC_PPP is not set\n+# CONFIG_HDLC_RAW is not set\n+# CONFIG_HDLC_RAW_ETH is not set\n+# CONFIG_HDMI_LPE_AUDIO is not set\n+# CONFIG_HDQ_MASTER_OMAP is not set\n+# CONFIG_HEADERS_CHECK is not set\n+# CONFIG_HEADERS_INSTALL is not set\n+# CONFIG_HEADER_TEST is not set\n+# CONFIG_HERMES is not set\n+# CONFIG_HFSPLUS_FS is not set\n+# CONFIG_HFSPLUS_FS_POSIX_ACL is not set\n+# CONFIG_HFS_FS is not set\n+# CONFIG_HFS_FS_POSIX_ACL is not set\n+# CONFIG_HI8435 is not set\n+# CONFIG_HIBERNATION is not set\n+# CONFIG_HID is not set\n+# CONFIG_HIDRAW is not set\n+# CONFIG_HID_A4TECH is not set\n+# CONFIG_HID_ACCUTOUCH is not set\n+# CONFIG_HID_ACRUX is not set\n+# CONFIG_HID_ACRUX_FF is not set\n+# CONFIG_HID_ALPS is not set\n+# CONFIG_HID_APPLE is not set\n+# CONFIG_HID_APPLEIR is not set\n+# CONFIG_HID_ASUS is not set\n+# CONFIG_HID_AUREAL is not set\n+# CONFIG_HID_BATTERY_STRENGTH is not set\n+# CONFIG_HID_BELKIN is not set\n+# CONFIG_HID_BETOP_FF is not set\n+# CONFIG_HID_BIGBEN_FF is not set\n+# CONFIG_HID_CHERRY is not set\n+# CONFIG_HID_CHICONY is not set\n+# CONFIG_HID_CMEDIA is not set\n+# CONFIG_HID_CORSAIR is not set\n+# CONFIG_HID_COUGAR is not set\n+# CONFIG_HID_CP2112 is not set\n+# CONFIG_HID_CREATIVE_SB0540 is not set\n+# CONFIG_HID_CYPRESS is not set\n+# CONFIG_HID_DRAGONRISE is not set\n+# CONFIG_HID_ELAN is not set\n+# CONFIG_HID_ELECOM is not set\n+# CONFIG_HID_ELO is not set\n+# CONFIG_HID_EMS_FF is not set\n+# CONFIG_HID_EZKEY is not set\n+# CONFIG_HID_GEMBIRD is not set\n+# CONFIG_HID_GENERIC is not set\n+# CONFIG_HID_GFRM is not set\n+# CONFIG_HID_GLORIOUS is not set\n+# CONFIG_HID_GOOGLE_HAMMER is not set\n+# CONFIG_HID_GREENASIA is not set\n+# CONFIG_HID_GT683R is not set\n+# CONFIG_HID_GYRATION is not set\n+# CONFIG_HID_HOLTEK is not set\n+# CONFIG_HID_ICADE is not set\n+# CONFIG_HID_ITE is not set\n+# CONFIG_HID_JABRA is not set\n+# CONFIG_HID_KENSINGTON is not set\n+# CONFIG_HID_KEYTOUCH is not set\n+# CONFIG_HID_KYE is not set\n+# CONFIG_HID_LCPOWER is not set\n+# CONFIG_HID_LED is not set\n+# CONFIG_HID_LENOVO is not set\n+# CONFIG_HID_LOGITECH is not set\n+# CONFIG_HID_LOGITECH_DJ is not set\n+# CONFIG_HID_LOGITECH_HIDPP is not set\n+# CONFIG_HID_MACALLY is not set\n+# CONFIG_HID_MAGICMOUSE is not set\n+# CONFIG_HID_MALTRON is not set\n+# CONFIG_HID_MAYFLASH is not set\n+# CONFIG_HID_MCP2221 is not set\n+# CONFIG_HID_MICROSOFT is not set\n+# CONFIG_HID_MONTEREY is not set\n+# CONFIG_HID_MULTITOUCH is not set\n+# CONFIG_HID_NTI is not set\n+# CONFIG_HID_NTRIG is not set\n+# CONFIG_HID_ORTEK is not set\n+# CONFIG_HID_PANTHERLORD is not set\n+# CONFIG_HID_PENMOUNT is not set\n+# CONFIG_HID_PETALYNX is not set\n+# CONFIG_HID_PICOLCD is not set\n+# CONFIG_HID_PID is not set\n+# CONFIG_HID_PLANTRONICS is not set\n+# CONFIG_HID_PRIMAX is not set\n+# CONFIG_HID_PRODIKEYS is not set\n+# CONFIG_HID_REDRAGON is not set\n+# CONFIG_HID_RETRODE is not set\n+# CONFIG_HID_RMI is not set\n+# CONFIG_HID_ROCCAT is not set\n+# CONFIG_HID_SAITEK is not set\n+# CONFIG_HID_SAMSUNG is not set\n+# CONFIG_HID_SEMITEK is not set\n+# CONFIG_HID_SENSOR_HUB is not set\n+# CONFIG_HID_SMARTJOYPLUS is not set\n+# CONFIG_HID_SONY is not set\n+# CONFIG_HID_SPEEDLINK is not set\n+# CONFIG_HID_STEAM is not set\n+# CONFIG_HID_STEELSERIES is not set\n+# CONFIG_HID_SUNPLUS is not set\n+# CONFIG_HID_THINGM is not set\n+# CONFIG_HID_THRUSTMASTER is not set\n+# CONFIG_HID_TIVO is not set\n+# CONFIG_HID_TOPSEED is not set\n+# CONFIG_HID_TWINHAN is not set\n+# CONFIG_HID_U2FZERO is not set\n+# CONFIG_HID_UCLOGIC is not set\n+# CONFIG_HID_UDRAW_PS3 is not set\n+# CONFIG_HID_VIEWSONIC is not set\n+# CONFIG_HID_VIVALDI is not set\n+# CONFIG_HID_WACOM is not set\n+# CONFIG_HID_WALTOP is not set\n+# CONFIG_HID_WIIMOTE is not set\n+# CONFIG_HID_XINMO is not set\n+# CONFIG_HID_ZEROPLUS is not set\n+# CONFIG_HID_ZYDACRON is not set\n+# CONFIG_HIGHMEM is not set\n+CONFIG_HIGH_RES_TIMERS=y\n+# CONFIG_HINIC is not set\n+# CONFIG_HIP04_ETH is not set\n+# CONFIG_HIPPI is not set\n+# CONFIG_HISILICON_ERRATUM_161010101 is not set\n+# CONFIG_HISILICON_ERRATUM_161600802 is not set\n+# CONFIG_HISI_DMA is not set\n+# CONFIG_HISI_FEMAC is not set\n+# CONFIG_HISI_HIKEY_USB is not set\n+# CONFIG_HIX5HD2_GMAC is not set\n+# CONFIG_HMC425 is not set\n+# CONFIG_HMC6352 is not set\n+# CONFIG_HNS is not set\n+# CONFIG_HNS3 is not set\n+# CONFIG_HNS_DSAF is not set\n+# CONFIG_HNS_ENET is not set\n+# CONFIG_HOSTAP is not set\n+# CONFIG_HOSTAP_CS is not set\n+# CONFIG_HOSTAP_PCI is not set\n+# CONFIG_HOSTAP_PLX is not set\n+# CONFIG_HOTPLUG_CPU is not set\n+# CONFIG_HOTPLUG_PCI is not set\n+# CONFIG_HP03 is not set\n+# CONFIG_HP100 is not set\n+# CONFIG_HP206C is not set\n+CONFIG_HPET_MMAP_DEFAULT=y\n+# CONFIG_HPFS_FS is not set\n+# CONFIG_HP_ILO is not set\n+# CONFIG_HP_WIRELESS is not set\n+# CONFIG_HSA_AMD is not set\n+# CONFIG_HSI is not set\n+# CONFIG_HSR is not set\n+# CONFIG_HTC_EGPIO is not set\n+# CONFIG_HTC_I2CPLD is not set\n+# CONFIG_HTC_PASIC3 is not set\n+# CONFIG_HTS221 is not set\n+# CONFIG_HTU21 is not set\n+# CONFIG_HUGETLBFS is not set\n+# CONFIG_HUGETLB_PAGE is not set\n+# CONFIG_HVC_DCC is not set\n+# CONFIG_HVC_UDBG is not set\n+# CONFIG_HWLAT_TRACER is not set\n+# CONFIG_HWMON is not set\n+# CONFIG_HWMON_DEBUG_CHIP is not set\n+# CONFIG_HWMON_VID is not set\n+# CONFIG_HWSPINLOCK is not set\n+# CONFIG_HWSPINLOCK_OMAP is not set\n+CONFIG_HW_PERF_EVENTS=y\n+# CONFIG_HW_RANDOM is not set\n+# CONFIG_HW_RANDOM_AMD is not set\n+# CONFIG_HW_RANDOM_ATMEL is not set\n+# CONFIG_HW_RANDOM_BA431 is not set\n+# CONFIG_HW_RANDOM_CAVIUM is not set\n+# CONFIG_HW_RANDOM_CCTRNG is not set\n+# CONFIG_HW_RANDOM_EXYNOS is not set\n+# CONFIG_HW_RANDOM_GEODE is not set\n+# CONFIG_HW_RANDOM_INTEL is not set\n+# CONFIG_HW_RANDOM_IPROC_RNG200 is not set\n+# CONFIG_HW_RANDOM_MTK is not set\n+# CONFIG_HW_RANDOM_OMAP is not set\n+# CONFIG_HW_RANDOM_OMAP3_ROM is not set\n+# CONFIG_HW_RANDOM_PPC4XX is not set\n+# CONFIG_HW_RANDOM_TIMERIOMEM is not set\n+CONFIG_HW_RANDOM_TPM=y\n+# CONFIG_HW_RANDOM_VIA is not set\n+# CONFIG_HW_RANDOM_VIRTIO is not set\n+# CONFIG_HW_RANDOM_XIPHERA is not set\n+# CONFIG_HX711 is not set\n+# CONFIG_HYPERV is not set\n+# CONFIG_HYPERV_TSCPAGE is not set\n+# CONFIG_HYSDN is not set\n+# CONFIG_HZ is not set\n+# CONFIG_HZ_100 is not set\n+# CONFIG_HZ_1000 is not set\n+# CONFIG_HZ_1024 is not set\n+# CONFIG_HZ_128 is not set\n+# CONFIG_HZ_200 is not set\n+# CONFIG_HZ_24 is not set\n+# CONFIG_HZ_250 is not set\n+# CONFIG_HZ_256 is not set\n+# CONFIG_HZ_300 is not set\n+# CONFIG_HZ_48 is not set\n+# CONFIG_HZ_500 is not set\n+# CONFIG_HZ_PERIODIC is not set\n+# CONFIG_I2C is not set\n+# CONFIG_I2C_ALGOBIT is not set\n+# CONFIG_I2C_ALGOPCA is not set\n+# CONFIG_I2C_ALGOPCF is not set\n+# CONFIG_I2C_ALI1535 is not set\n+# CONFIG_I2C_ALI1563 is not set\n+# CONFIG_I2C_ALI15X3 is not set\n+# CONFIG_I2C_AMD756 is not set\n+# CONFIG_I2C_AMD8111 is not set\n+# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set\n+# CONFIG_I2C_AU1550 is not set\n+# CONFIG_I2C_BCM2835 is not set\n+# CONFIG_I2C_BCM_IPROC is not set\n+# CONFIG_I2C_CADENCE is not set\n+# CONFIG_I2C_CBUS_GPIO is not set\n+# CONFIG_I2C_CHARDEV is not set\n+# CONFIG_I2C_COMPAT is not set\n+# CONFIG_I2C_CP2615 is not set\n+# CONFIG_I2C_DEBUG_ALGO is not set\n+# CONFIG_I2C_DEBUG_BUS is not set\n+# CONFIG_I2C_DEBUG_CORE is not set\n+# CONFIG_I2C_DEMUX_PINCTRL is not set\n+# CONFIG_I2C_DESIGNWARE_PCI is not set\n+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set\n+# CONFIG_I2C_DIOLAN_U2C is not set\n+# CONFIG_I2C_EG20T is not set\n+# CONFIG_I2C_ELEKTOR is not set\n+# CONFIG_I2C_EMEV2 is not set\n+# CONFIG_I2C_GPIO is not set\n+# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set\n+# CONFIG_I2C_HELPER_AUTO is not set\n+# CONFIG_I2C_HID is not set\n+# CONFIG_I2C_HISI is not set\n+# CONFIG_I2C_I801 is not set\n+# CONFIG_I2C_IBM_IIC is not set\n+# CONFIG_I2C_IMG is not set\n+# CONFIG_I2C_ISCH is not set\n+# CONFIG_I2C_ISMT is not set\n+# CONFIG_I2C_JZ4780 is not set\n+# CONFIG_I2C_MLXCPLD is not set\n+# CONFIG_I2C_MPC is not set\n+# CONFIG_I2C_MT65XX is not set\n+# CONFIG_I2C_MUX is not set\n+# CONFIG_I2C_MUX_GPIO is not set\n+# CONFIG_I2C_MUX_GPMUX is not set\n+# CONFIG_I2C_MUX_LTC4306 is not set\n+# CONFIG_I2C_MUX_MLXCPLD is not set\n+# CONFIG_I2C_MUX_PCA9541 is not set\n+# CONFIG_I2C_MUX_PCA954x is not set\n+# CONFIG_I2C_MUX_PINCTRL is not set\n+# CONFIG_I2C_MUX_REG is not set\n+# CONFIG_I2C_MV64XXX is not set\n+# CONFIG_I2C_NFORCE2 is not set\n+# CONFIG_I2C_NOMADIK is not set\n+# CONFIG_I2C_NVIDIA_GPU is not set\n+# CONFIG_I2C_OCORES is not set\n+# CONFIG_I2C_OCTEON is not set\n+# CONFIG_I2C_PARPORT is not set\n+# CONFIG_I2C_PARPORT_LIGHT is not set\n+# CONFIG_I2C_PCA_ISA is not set\n+# CONFIG_I2C_PCA_PLATFORM is not set\n+# CONFIG_I2C_PIIX4 is not set\n+# CONFIG_I2C_PXA_PCI is not set\n+# CONFIG_I2C_PXA_SLAVE is not set\n+# CONFIG_I2C_RCAR is not set\n+# CONFIG_I2C_RK3X is not set\n+# CONFIG_I2C_ROBOTFUZZ_OSIF is not set\n+# CONFIG_I2C_S3C2410 is not set\n+# CONFIG_I2C_SCMI is not set\n+# CONFIG_I2C_SH_MOBILE is not set\n+# CONFIG_I2C_SIMTEC is not set\n+# CONFIG_I2C_SIS5595 is not set\n+# CONFIG_I2C_SIS630 is not set\n+# CONFIG_I2C_SIS96X is not set\n+# CONFIG_I2C_SLAVE is not set\n+# CONFIG_I2C_SLAVE_EEPROM is not set\n+# CONFIG_I2C_SMBUS is not set\n+# CONFIG_I2C_STUB is not set\n+# CONFIG_I2C_TAOS_EVM is not set\n+# CONFIG_I2C_THUNDERX is not set\n+# CONFIG_I2C_TINY_USB is not set\n+# CONFIG_I2C_VERSATILE is not set\n+# CONFIG_I2C_VIA is not set\n+# CONFIG_I2C_VIAPRO is not set\n+# CONFIG_I2C_XILINX is not set\n+# CONFIG_I3C is not set\n+# CONFIG_I40E is not set\n+# CONFIG_I40EVF is not set\n+# CONFIG_I6300ESB_WDT is not set\n+# CONFIG_I82092 is not set\n+# CONFIG_I82365 is not set\n+# CONFIG_IAQCORE is not set\n+# CONFIG_IBM_ASM is not set\n+# CONFIG_IBM_EMAC_DEBUG is not set\n+# CONFIG_IBM_EMAC_EMAC4 is not set\n+# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set\n+# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set\n+# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set\n+# CONFIG_IBM_EMAC_RGMII is not set\n+# CONFIG_IBM_EMAC_TAH is not set\n+# CONFIG_IBM_EMAC_ZMII is not set\n+# CONFIG_ICE is not set\n+# CONFIG_ICP10100 is not set\n+# CONFIG_ICPLUS_PHY is not set\n+# CONFIG_ICS932S401 is not set\n+# CONFIG_ICST is not set\n+# CONFIG_IDE is not set\n+# CONFIG_IDEAPAD_LAPTOP is not set\n+# CONFIG_IDE_GD is not set\n+# CONFIG_IDE_PROC_FS is not set\n+# CONFIG_IDE_TASK_IOCTL is not set\n+# CONFIG_IDLE_PAGE_TRACKING is not set\n+# CONFIG_IEEE802154 is not set\n+# CONFIG_IEEE802154_ADF7242 is not set\n+# CONFIG_IEEE802154_ATUSB is not set\n+# CONFIG_IEEE802154_CA8210 is not set\n+# CONFIG_IEEE802154_HWSIM is not set\n+# CONFIG_IEEE802154_MCR20A is not set\n+# CONFIG_IFB is not set\n+# CONFIG_IGB is not set\n+# CONFIG_IGBVF is not set\n+# CONFIG_IGC is not set\n+# CONFIG_IIO is not set\n+# CONFIG_IIO_BUFFER is not set\n+# CONFIG_IIO_BUFFER_CB is not set\n+# CONFIG_IIO_BUFFER_DMA is not set\n+# CONFIG_IIO_BUFFER_DMAENGINE is not set\n+# CONFIG_IIO_BUFFER_HDC2010 is not set\n+# CONFIG_IIO_BUFFER_HW_CONSUMER is not set\n+# CONFIG_IIO_CONFIGFS is not set\n+CONFIG_IIO_CONSUMERS_PER_TRIGGER=2\n+# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set\n+# CONFIG_IIO_INTERRUPT_TRIGGER is not set\n+# CONFIG_IIO_MUX is not set\n+# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set\n+# CONFIG_IIO_RESCALE is not set\n+# CONFIG_IIO_SIMPLE_DUMMY is not set\n+# CONFIG_IIO_SSP_SENSORHUB is not set\n+# CONFIG_IIO_ST_ACCEL_3AXIS is not set\n+# CONFIG_IIO_ST_GYRO_3AXIS is not set\n+# CONFIG_IIO_ST_LSM6DSX is not set\n+# CONFIG_IIO_ST_MAGN_3AXIS is not set\n+# CONFIG_IIO_ST_PRESS is not set\n+# CONFIG_IIO_SW_DEVICE is not set\n+# CONFIG_IIO_SW_TRIGGER is not set\n+# CONFIG_IIO_SYSFS_TRIGGER is not set\n+# CONFIG_IIO_TRIGGER is not set\n+# CONFIG_IIO_TRIGGERED_EVENT is not set\n+# CONFIG_IKCONFIG is not set\n+# CONFIG_IKCONFIG_PROC is not set\n+# CONFIG_IKHEADERS is not set\n+# CONFIG_IMA is not set\n+# CONFIG_IMAGE_CMDLINE_HACK is not set\n+# CONFIG_IMGPDC_WDT is not set\n+# CONFIG_IMG_MDC_DMA is not set\n+# CONFIG_IMX7D_ADC is not set\n+# CONFIG_IMX_IPUV3_CORE is not set\n+# CONFIG_IMX_THERMAL is not set\n+# CONFIG_INA2XX_ADC is not set\n+# CONFIG_INDIRECT_PIO is not set\n+CONFIG_INET=y\n+# CONFIG_INET6_AH is not set\n+# CONFIG_INET6_ESP is not set\n+# CONFIG_INET6_ESPINTCP is not set\n+# CONFIG_INET6_IPCOMP is not set\n+# CONFIG_INET6_TUNNEL is not set\n+# CONFIG_INET6_XFRM_MODE_BEET is not set\n+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set\n+# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set\n+# CONFIG_INET6_XFRM_MODE_TUNNEL is not set\n+# CONFIG_INET6_XFRM_TUNNEL is not set\n+# CONFIG_INET_AH is not set\n+# CONFIG_INET_DIAG is not set\n+# CONFIG_INET_ESP is not set\n+# CONFIG_INET_ESPINTCP is not set\n+# CONFIG_INET_IPCOMP is not set\n+# CONFIG_INET_LRO is not set\n+# CONFIG_INET_TCP_DIAG is not set\n+# CONFIG_INET_TUNNEL is not set\n+# CONFIG_INET_UDP_DIAG is not set\n+# CONFIG_INET_XFRM_MODE_BEET is not set\n+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set\n+# CONFIG_INET_XFRM_MODE_TUNNEL is not set\n+# CONFIG_INET_XFRM_TUNNEL is not set\n+# CONFIG_INFINIBAND is not set\n+# CONFIG_INFTL is not set\n+# CONFIG_INGENIC_ADC is not set\n+# CONFIG_INGENIC_CGU_JZ4725B is not set\n+# CONFIG_INGENIC_CGU_JZ4740 is not set\n+# CONFIG_INGENIC_CGU_JZ4770 is not set\n+# CONFIG_INGENIC_CGU_JZ4780 is not set\n+# CONFIG_INGENIC_CGU_X1000 is not set\n+# CONFIG_INGENIC_CGU_X1830 is not set\n+# CONFIG_INGENIC_OST is not set\n+# CONFIG_INGENIC_SYSOST is not set\n+# CONFIG_INGENIC_TCU_CLK is not set\n+# CONFIG_INGENIC_TCU_IRQ is not set\n+# CONFIG_INGENIC_TIMER is not set\n+CONFIG_INIT_ENV_ARG_LIMIT=32\n+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set\n+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set\n+CONFIG_INIT_STACK_NONE=y\n+CONFIG_INOTIFY_USER=y\n+# CONFIG_INPUT is not set\n+# CONFIG_INPUT_AD714X is not set\n+# CONFIG_INPUT_ADXL34X is not set\n+# CONFIG_INPUT_APANEL is not set\n+# CONFIG_INPUT_ATI_REMOTE2 is not set\n+# CONFIG_INPUT_ATLAS_BTNS is not set\n+# CONFIG_INPUT_ATMEL_CAPTOUCH is not set\n+# CONFIG_INPUT_AXP20X_PEK is not set\n+# CONFIG_INPUT_BMA150 is not set\n+# CONFIG_INPUT_CM109 is not set\n+# CONFIG_INPUT_CMA3000 is not set\n+# CONFIG_INPUT_DRV260X_HAPTICS is not set\n+# CONFIG_INPUT_DRV2665_HAPTICS is not set\n+# CONFIG_INPUT_DRV2667_HAPTICS is not set\n+# CONFIG_INPUT_E3X0_BUTTON is not set\n+# CONFIG_INPUT_EVBUG is not set\n+# CONFIG_INPUT_EVDEV is not set\n+# CONFIG_INPUT_FF_MEMLESS is not set\n+# CONFIG_INPUT_GP2A is not set\n+# CONFIG_INPUT_GPIO_BEEPER is not set\n+# CONFIG_INPUT_GPIO_DECODER is not set\n+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set\n+# CONFIG_INPUT_GPIO_TILT_POLLED is not set\n+# CONFIG_INPUT_GPIO_VIBRA is not set\n+# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set\n+# CONFIG_INPUT_IMS_PCU is not set\n+# CONFIG_INPUT_IQS269A is not set\n+# CONFIG_INPUT_IQS626A is not set\n+# CONFIG_INPUT_JOYDEV is not set\n+# CONFIG_INPUT_JOYSTICK is not set\n+# CONFIG_INPUT_KEYBOARD is not set\n+# CONFIG_INPUT_KEYSPAN_REMOTE is not set\n+# CONFIG_INPUT_KXTJ9 is not set\n+# CONFIG_INPUT_LEDS is not set\n+# CONFIG_INPUT_MATRIXKMAP is not set\n+# CONFIG_INPUT_MAX8997_HAPTIC is not set\n+CONFIG_INPUT_MISC=y\n+# CONFIG_INPUT_MMA8450 is not set\n+# CONFIG_INPUT_MOUSE is not set\n+# CONFIG_INPUT_MOUSEDEV is not set\n+# CONFIG_INPUT_MPU3050 is not set\n+# CONFIG_INPUT_MSM_VIBRATOR is not set\n+# CONFIG_INPUT_PALMAS_PWRBUTTON is not set\n+# CONFIG_INPUT_PCF8574 is not set\n+# CONFIG_INPUT_PCSPKR is not set\n+# CONFIG_INPUT_POLLDEV is not set\n+# CONFIG_INPUT_POWERMATE is not set\n+# CONFIG_INPUT_PWM_BEEPER is not set\n+# CONFIG_INPUT_PWM_VIBRA is not set\n+# CONFIG_INPUT_REGULATOR_HAPTIC is not set\n+# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set\n+# CONFIG_INPUT_SPARSEKMAP is not set\n+# CONFIG_INPUT_TABLET is not set\n+# CONFIG_INPUT_TOUCHSCREEN is not set\n+# CONFIG_INPUT_TPS65218_PWRBUTTON is not set\n+# CONFIG_INPUT_TWL4030_PWRBUTTON is not set\n+# CONFIG_INPUT_TWL4030_VIBRA is not set\n+# CONFIG_INPUT_TWL6040_VIBRA is not set\n+# CONFIG_INPUT_UINPUT is not set\n+# CONFIG_INPUT_WISTRON_BTNS is not set\n+# CONFIG_INPUT_YEALINK is not set\n+# CONFIG_INT340X_THERMAL is not set\n+# CONFIG_INTEGRITY is not set\n+# CONFIG_INTEGRITY_AUDIT is not set\n+# CONFIG_INTEGRITY_SIGNATURE is not set\n+# CONFIG_INTEL_ATOMISP2_PM is not set\n+# CONFIG_INTEL_CHT_INT33FE is not set\n+# CONFIG_INTEL_HID_EVENT is not set\n+# CONFIG_INTEL_IDLE is not set\n+# CONFIG_INTEL_IDMA64 is not set\n+# CONFIG_INTEL_IOATDMA is not set\n+# CONFIG_INTEL_ISH_HID is not set\n+# CONFIG_INTEL_MEI is not set\n+# CONFIG_INTEL_MEI_ME is not set\n+# CONFIG_INTEL_MEI_TXE is not set\n+# CONFIG_INTEL_MIC_CARD is not set\n+# CONFIG_INTEL_MIC_HOST is not set\n+# CONFIG_INTEL_MID_PTI is not set\n+# CONFIG_INTEL_OAKTRAIL is not set\n+# CONFIG_INTEL_PMC_CORE is not set\n+# CONFIG_INTEL_PUNIT_IPC is not set\n+# CONFIG_INTEL_RST is not set\n+# CONFIG_INTEL_SMARTCONNECT is not set\n+# CONFIG_INTEL_SOC_PMIC is not set\n+# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set\n+# CONFIG_INTEL_SOC_PMIC_CHTWC is not set\n+# CONFIG_INTEL_TCC_COOLING is not set\n+# CONFIG_INTEL_TH is not set\n+# CONFIG_INTEL_VBTN is not set\n+# CONFIG_INTEL_XWAY_PHY is not set\n+# CONFIG_INTERCONNECT is not set\n+# CONFIG_INTERVAL_TREE_TEST is not set\n+# CONFIG_INV_ICM42600_I2C is not set\n+# CONFIG_INV_ICM42600_SPI is not set\n+# CONFIG_INV_MPU6050_I2C is not set\n+# CONFIG_INV_MPU6050_IIO is not set\n+# CONFIG_INV_MPU6050_SPI is not set\n+# CONFIG_IOMMU_SUPPORT is not set\n+# CONFIG_IONIC is not set\n+# CONFIG_IOSCHED_BFQ is not set\n+# CONFIG_IOSCHED_CFQ is not set\n+CONFIG_IOSCHED_DEADLINE=y\n+CONFIG_IOSCHED_NOOP=y\n+CONFIG_IO_STRICT_DEVMEM=y\n+# CONFIG_IO_URING is not set\n+CONFIG_IO_WQ=y\n+# CONFIG_IP17XX_PHY is not set\n+# CONFIG_IP6_NF_FILTER is not set\n+# CONFIG_IP6_NF_IPTABLES is not set\n+# CONFIG_IP6_NF_MANGLE is not set\n+# CONFIG_IP6_NF_MATCH_AH is not set\n+# CONFIG_IP6_NF_MATCH_EUI64 is not set\n+# CONFIG_IP6_NF_MATCH_FRAG is not set\n+# CONFIG_IP6_NF_MATCH_HL is not set\n+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set\n+# CONFIG_IP6_NF_MATCH_MH is not set\n+# CONFIG_IP6_NF_MATCH_OPTS is not set\n+# CONFIG_IP6_NF_MATCH_RPFILTER is not set\n+# CONFIG_IP6_NF_MATCH_RT is not set\n+# CONFIG_IP6_NF_MATCH_SRH is not set\n+# CONFIG_IP6_NF_NAT is not set\n+# CONFIG_IP6_NF_RAW is not set\n+# CONFIG_IP6_NF_SECURITY is not set\n+# CONFIG_IP6_NF_TARGET_HL is not set\n+# CONFIG_IP6_NF_TARGET_MASQUERADE is not set\n+# CONFIG_IP6_NF_TARGET_REJECT is not set\n+# CONFIG_IP6_NF_TARGET_SYNPROXY is not set\n+# CONFIG_IPACK_BUS is not set\n+# CONFIG_IPC_NS is not set\n+# CONFIG_IPMB_DEVICE_INTERFACE is not set\n+# CONFIG_IPMI_HANDLER is not set\n+# CONFIG_IPV6 is not set\n+# CONFIG_IPV6_FOU is not set\n+# CONFIG_IPV6_FOU_TUNNEL is not set\n+# CONFIG_IPV6_ILA is not set\n+# CONFIG_IPV6_MIP6 is not set\n+# CONFIG_IPV6_MROUTE is not set\n+# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set\n+# CONFIG_IPV6_MULTIPLE_TABLES is not set\n+CONFIG_IPV6_NDISC_NODETYPE=y\n+# CONFIG_IPV6_OPTIMISTIC_DAD is not set\n+# CONFIG_IPV6_ROUTER_PREF is not set\n+# CONFIG_IPV6_ROUTE_INFO is not set\n+# CONFIG_IPV6_RPL_LWTUNNEL is not set\n+# CONFIG_IPV6_SEG6_HMAC is not set\n+# CONFIG_IPV6_SEG6_LWTUNNEL is not set\n+# CONFIG_IPV6_SIT is not set\n+# CONFIG_IPV6_SIT_6RD is not set\n+# CONFIG_IPV6_TUNNEL is not set\n+# CONFIG_IPV6_VTI is not set\n+# CONFIG_IPVLAN is not set\n+# CONFIG_IPW2100 is not set\n+# CONFIG_IPW2100_DEBUG is not set\n+CONFIG_IPW2100_MONITOR=y\n+# CONFIG_IPW2200 is not set\n+# CONFIG_IPW2200_DEBUG is not set\n+CONFIG_IPW2200_MONITOR=y\n+# CONFIG_IPW2200_PROMISCUOUS is not set\n+# CONFIG_IPW2200_QOS is not set\n+# CONFIG_IPW2200_RADIOTAP is not set\n+# CONFIG_IPWIRELESS is not set\n+# CONFIG_IPX is not set\n+CONFIG_IP_ADVANCED_ROUTER=y\n+# CONFIG_IP_DCCP is not set\n+# CONFIG_IP_FIB_TRIE_STATS is not set\n+# CONFIG_IP_MROUTE is not set\n+CONFIG_IP_MROUTE_MULTIPLE_TABLES=y\n+CONFIG_IP_MULTICAST=y\n+CONFIG_IP_MULTIPLE_TABLES=y\n+# CONFIG_IP_NF_ARPFILTER is not set\n+# CONFIG_IP_NF_ARPTABLES is not set\n+# CONFIG_IP_NF_ARP_MANGLE is not set\n+# CONFIG_IP_NF_FILTER is not set\n+# CONFIG_IP_NF_IPTABLES is not set\n+# CONFIG_IP_NF_MANGLE is not set\n+# CONFIG_IP_NF_MATCH_AH is not set\n+# CONFIG_IP_NF_MATCH_ECN is not set\n+# CONFIG_IP_NF_MATCH_RPFILTER is not set\n+# CONFIG_IP_NF_MATCH_TTL is not set\n+# CONFIG_IP_NF_RAW is not set\n+# CONFIG_IP_NF_SECURITY is not set\n+# CONFIG_IP_NF_TARGET_CLUSTERIP is not set\n+# CONFIG_IP_NF_TARGET_ECN is not set\n+# CONFIG_IP_NF_TARGET_MASQUERADE is not set\n+# CONFIG_IP_NF_TARGET_NETMAP is not set\n+# CONFIG_IP_NF_TARGET_REDIRECT is not set\n+# CONFIG_IP_NF_TARGET_REJECT is not set\n+# CONFIG_IP_NF_TARGET_SYNPROXY is not set\n+# CONFIG_IP_NF_TARGET_TTL is not set\n+# CONFIG_IP_PIMSM_V1 is not set\n+# CONFIG_IP_PIMSM_V2 is not set\n+# CONFIG_IP_PNP is not set\n+CONFIG_IP_ROUTE_MULTIPATH=y\n+CONFIG_IP_ROUTE_VERBOSE=y\n+# CONFIG_IP_SCTP is not set\n+# CONFIG_IP_SET is not set\n+# CONFIG_IP_SET_HASH_IPMAC is not set\n+# CONFIG_IP_VS is not set\n+# CONFIG_IP_VS_MH is not set\n+CONFIG_IP_VS_MH_TAB_INDEX=10\n+# CONFIG_IRDA is not set\n+# CONFIG_IRQSOFF_TRACER is not set\n+# CONFIG_IRQ_ALL_CPUS is not set\n+# CONFIG_IRQ_DOMAIN_DEBUG is not set\n+# CONFIG_IRQ_POLL is not set\n+# CONFIG_IRQ_TIME_ACCOUNTING is not set\n+# CONFIG_IR_GPIO_CIR is not set\n+# CONFIG_IR_HIX5HD2 is not set\n+# CONFIG_IR_IGORPLUGUSB is not set\n+# CONFIG_IR_IGUANA is not set\n+# CONFIG_IR_IMG is not set\n+# CONFIG_IR_IMON is not set\n+# CONFIG_IR_JVC_DECODER is not set\n+# CONFIG_IR_LIRC_CODEC is not set\n+# CONFIG_IR_MCEUSB is not set\n+# CONFIG_IR_NEC_DECODER is not set\n+# CONFIG_IR_RC5_DECODER is not set\n+# CONFIG_IR_RC6_DECODER is not set\n+# CONFIG_IR_REDRAT3 is not set\n+# CONFIG_IR_SONY_DECODER is not set\n+# CONFIG_IR_STREAMZAP is not set\n+# CONFIG_IR_TTUSBIR is not set\n+# CONFIG_ISA_BUS is not set\n+# CONFIG_ISA_BUS_API is not set\n+# CONFIG_ISCSI_BOOT_SYSFS is not set\n+# CONFIG_ISCSI_TCP is not set\n+CONFIG_ISDN=y\n+# CONFIG_ISDN_AUDIO is not set\n+# CONFIG_ISDN_CAPI is not set\n+# CONFIG_ISDN_CAPI_CAPIDRV is not set\n+# CONFIG_ISDN_DIVERSION is not set\n+# CONFIG_ISDN_DRV_ACT2000 is not set\n+# CONFIG_ISDN_DRV_GIGASET is not set\n+# CONFIG_ISDN_DRV_HISAX is not set\n+# CONFIG_ISDN_DRV_ICN is not set\n+# CONFIG_ISDN_DRV_LOOP is not set\n+# CONFIG_ISDN_DRV_PCBIT is not set\n+# CONFIG_ISDN_DRV_SC is not set\n+# CONFIG_ISDN_I4L is not set\n+# CONFIG_ISL29003 is not set\n+# CONFIG_ISL29020 is not set\n+# CONFIG_ISL29125 is not set\n+# CONFIG_ISL29501 is not set\n+# CONFIG_ISO9660_FS is not set\n+# CONFIG_ISS4xx is not set\n+# CONFIG_ITG3200 is not set\n+# CONFIG_IWL3945 is not set\n+# CONFIG_IWLWIFI is not set\n+# CONFIG_IXGB is not set\n+# CONFIG_IXGBE is not set\n+# CONFIG_IXGBEVF is not set\n+# CONFIG_JAILHOUSE_GUEST is not set\n+# CONFIG_JBD2_DEBUG is not set\n+# CONFIG_JFFS2_CMODE_FAVOURLZO is not set\n+# CONFIG_JFFS2_CMODE_NONE is not set\n+CONFIG_JFFS2_CMODE_PRIORITY=y\n+# CONFIG_JFFS2_CMODE_SIZE is not set\n+CONFIG_JFFS2_COMPRESSION_OPTIONS=y\n+CONFIG_JFFS2_FS=y\n+CONFIG_JFFS2_FS_DEBUG=0\n+# CONFIG_JFFS2_FS_POSIX_ACL is not set\n+# CONFIG_JFFS2_FS_SECURITY is not set\n+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set\n+CONFIG_JFFS2_FS_WRITEBUFFER=y\n+CONFIG_JFFS2_FS_XATTR=y\n+CONFIG_JFFS2_LZMA=y\n+# CONFIG_JFFS2_LZO is not set\n+CONFIG_JFFS2_RTIME=y\n+# CONFIG_JFFS2_RUBIN is not set\n+CONFIG_JFFS2_SUMMARY=y\n+# CONFIG_JFFS2_ZLIB is not set\n+# CONFIG_JFS_DEBUG is not set\n+# CONFIG_JFS_FS is not set\n+# CONFIG_JFS_POSIX_ACL is not set\n+# CONFIG_JFS_SECURITY is not set\n+# CONFIG_JFS_STATISTICS is not set\n+# CONFIG_JME is not set\n+CONFIG_JOLIET=y\n+# CONFIG_JSA1212 is not set\n+# CONFIG_JUMP_LABEL is not set\n+# CONFIG_JZ4740_WDT is not set\n+# CONFIG_JZ4770_PHY is not set\n+# CONFIG_KALLSYMS is not set\n+# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set\n+# CONFIG_KALLSYMS_ALL is not set\n+CONFIG_KALLSYMS_BASE_RELATIVE=y\n+# CONFIG_KALLSYMS_UNCOMPRESSED is not set\n+# CONFIG_KARMA_PARTITION is not set\n+# CONFIG_KASAN is not set\n+CONFIG_KASAN_STACK=1\n+# CONFIG_KCMP is not set\n+# CONFIG_KCOV is not set\n+# CONFIG_KERNEL_BZIP2 is not set\n+# CONFIG_KERNEL_CAT is not set\n+# CONFIG_KERNEL_GZIP is not set\n+# CONFIG_KERNEL_LZ4 is not set\n+# CONFIG_KERNEL_LZMA is not set\n+# CONFIG_KERNEL_LZO is not set\n+CONFIG_KERNEL_MODE_NEON=y\n+CONFIG_KERNEL_XZ=y\n+CONFIG_KERNFS=y\n+# CONFIG_KEXEC is not set\n+# CONFIG_KEXEC_FILE is not set\n+# CONFIG_KEYBOARD_ADC is not set\n+# CONFIG_KEYBOARD_ADP5588 is not set\n+# CONFIG_KEYBOARD_ADP5589 is not set\n+# CONFIG_KEYBOARD_APPLESPI is not set\n+# CONFIG_KEYBOARD_ATKBD is not set\n+# CONFIG_KEYBOARD_BCM is not set\n+# CONFIG_KEYBOARD_CAP11XX is not set\n+# CONFIG_KEYBOARD_DLINK_DIR685 is not set\n+# CONFIG_KEYBOARD_GPIO is not set\n+# CONFIG_KEYBOARD_GPIO_POLLED is not set\n+# CONFIG_KEYBOARD_LKKBD is not set\n+# CONFIG_KEYBOARD_LM8323 is not set\n+# CONFIG_KEYBOARD_LM8333 is not set\n+# CONFIG_KEYBOARD_MATRIX is not set\n+# CONFIG_KEYBOARD_MAX7359 is not set\n+# CONFIG_KEYBOARD_MCS is not set\n+# CONFIG_KEYBOARD_MPR121 is not set\n+# CONFIG_KEYBOARD_NEWTON is not set\n+# CONFIG_KEYBOARD_OMAP4 is not set\n+# CONFIG_KEYBOARD_OPENCORES is not set\n+# CONFIG_KEYBOARD_PXA27x is not set\n+# CONFIG_KEYBOARD_QT1050 is not set\n+# CONFIG_KEYBOARD_QT1070 is not set\n+# CONFIG_KEYBOARD_QT2160 is not set\n+# CONFIG_KEYBOARD_SAMSUNG is not set\n+# CONFIG_KEYBOARD_SH_KEYSC is not set\n+# CONFIG_KEYBOARD_SNVS_PWRKEY is not set\n+# CONFIG_KEYBOARD_STMPE is not set\n+# CONFIG_KEYBOARD_STOWAWAY is not set\n+# CONFIG_KEYBOARD_SUNKBD is not set\n+# CONFIG_KEYBOARD_TCA6416 is not set\n+# CONFIG_KEYBOARD_TCA8418 is not set\n+# CONFIG_KEYBOARD_TEGRA is not set\n+# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set\n+# CONFIG_KEYBOARD_TWL4030 is not set\n+# CONFIG_KEYBOARD_XTKBD is not set\n+# CONFIG_KEYS is not set\n+# CONFIG_KEYS_REQUEST_CACHE is not set\n+# CONFIG_KEY_DH_OPERATIONS is not set\n+# CONFIG_KGDB is not set\n+# CONFIG_KMEMCHECK is not set\n+# CONFIG_KMX61 is not set\n+# CONFIG_KPROBES is not set\n+# CONFIG_KPROBES_SANITY_TEST is not set\n+# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set\n+# CONFIG_KPROBE_EVENT_GEN_TEST is not set\n+# CONFIG_KS7010 is not set\n+# CONFIG_KS8842 is not set\n+# CONFIG_KS8851 is not set\n+# CONFIG_KS8851_MLL is not set\n+# CONFIG_KSM is not set\n+# CONFIG_KSZ884X_PCI is not set\n+# CONFIG_KUNIT is not set\n+CONFIG_KUSER_HELPERS=y\n+# CONFIG_KVM_AMD is not set\n+# CONFIG_KVM_GUEST is not set\n+# CONFIG_KVM_INTEL is not set\n+# CONFIG_KXCJK1013 is not set\n+# CONFIG_KXSD9 is not set\n+# CONFIG_L2TP is not set\n+# CONFIG_L2TP_ETH is not set\n+# CONFIG_L2TP_IP is not set\n+# CONFIG_L2TP_V3 is not set\n+# CONFIG_LAN743X is not set\n+# CONFIG_LANMEDIA is not set\n+# CONFIG_LANTIQ is not set\n+# CONFIG_LAPB is not set\n+# CONFIG_LASAT is not set\n+# CONFIG_LATENCYTOP is not set\n+# CONFIG_LATTICE_ECP3_CONFIG is not set\n+CONFIG_LBDAF=y\n+# CONFIG_LCD_AMS369FG06 is not set\n+# CONFIG_LCD_CLASS_DEVICE is not set\n+# CONFIG_LCD_HX8357 is not set\n+# CONFIG_LCD_ILI922X is not set\n+# CONFIG_LCD_ILI9320 is not set\n+# CONFIG_LCD_L4F00242T03 is not set\n+# CONFIG_LCD_LD9040 is not set\n+# CONFIG_LCD_LMS283GF05 is not set\n+# CONFIG_LCD_LMS501KF03 is not set\n+# CONFIG_LCD_LTV350QV is not set\n+# CONFIG_LCD_OTM3225A is not set\n+# CONFIG_LCD_S6E63M0 is not set\n+# CONFIG_LCD_TDO24M is not set\n+# CONFIG_LCD_VGG2432A4 is not set\n+CONFIG_LDISC_AUTOLOAD=y\n+# CONFIG_LDM_PARTITION is not set\n+CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y\n+# CONFIG_LEDS_AN30259A is not set\n+# CONFIG_LEDS_APU is not set\n+# CONFIG_LEDS_AW2013 is not set\n+# CONFIG_LEDS_BCM6328 is not set\n+# CONFIG_LEDS_BCM6358 is not set\n+# CONFIG_LEDS_BD2802 is not set\n+# CONFIG_LEDS_BLINKM is not set\n+CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y\n+CONFIG_LEDS_CLASS=y\n+# CONFIG_LEDS_CLASS_FLASH is not set\n+CONFIG_LEDS_CLASS_MULTICOLOR=y\n+# CONFIG_LEDS_CR0014114 is not set\n+# CONFIG_LEDS_DAC124S085 is not set\n+# CONFIG_LEDS_EL15203000 is not set\n+# CONFIG_LEDS_GPIO is not set\n+# CONFIG_LEDS_INTEL_SS4200 is not set\n+# CONFIG_LEDS_IS31FL319X is not set\n+# CONFIG_LEDS_IS31FL32XX is not set\n+# CONFIG_LEDS_LM3530 is not set\n+# CONFIG_LEDS_LM3532 is not set\n+# CONFIG_LEDS_LM355x is not set\n+# CONFIG_LEDS_LM3642 is not set\n+# CONFIG_LEDS_LM3692X is not set\n+# CONFIG_LEDS_LP3944 is not set\n+# CONFIG_LEDS_LP3952 is not set\n+# CONFIG_LEDS_LP50XX is not set\n+# CONFIG_LEDS_LP5521 is not set\n+# CONFIG_LEDS_LP5523 is not set\n+# CONFIG_LEDS_LP5562 is not set\n+# CONFIG_LEDS_LP55XX_COMMON is not set\n+# CONFIG_LEDS_LP8501 is not set\n+# CONFIG_LEDS_LP8860 is not set\n+# CONFIG_LEDS_LT3593 is not set\n+# CONFIG_LEDS_MLXCPLD is not set\n+# CONFIG_LEDS_MLXREG is not set\n+# CONFIG_LEDS_NIC78BX is not set\n+# CONFIG_LEDS_NS2 is not set\n+# CONFIG_LEDS_OT200 is not set\n+# CONFIG_LEDS_PCA9532 is not set\n+# CONFIG_LEDS_PCA955X is not set\n+# CONFIG_LEDS_PCA963X is not set\n+# CONFIG_LEDS_PWM is not set\n+# CONFIG_LEDS_REGULATOR is not set\n+# CONFIG_LEDS_SPI_BYTE is not set\n+# CONFIG_LEDS_SYSCON is not set\n+# CONFIG_LEDS_TCA6507 is not set\n+# CONFIG_LEDS_TI_LMU_COMMON is not set\n+# CONFIG_LEDS_TLC591XX is not set\n+CONFIG_LEDS_TRIGGERS=y\n+# CONFIG_LEDS_TRIGGER_ACTIVITY is not set\n+# CONFIG_LEDS_TRIGGER_AUDIO is not set\n+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set\n+# CONFIG_LEDS_TRIGGER_CAMERA is not set\n+# CONFIG_LEDS_TRIGGER_CPU is not set\n+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y\n+# CONFIG_LEDS_TRIGGER_DISK is not set\n+# CONFIG_LEDS_TRIGGER_GPIO is not set\n+CONFIG_LEDS_TRIGGER_HEARTBEAT=y\n+# CONFIG_LEDS_TRIGGER_MTD is not set\n+CONFIG_LEDS_TRIGGER_NETDEV=y\n+# CONFIG_LEDS_TRIGGER_ONESHOT is not set\n+# CONFIG_LEDS_TRIGGER_PANIC is not set\n+# CONFIG_LEDS_TRIGGER_PATTERN is not set\n+CONFIG_LEDS_TRIGGER_TIMER=y\n+# CONFIG_LEDS_TRIGGER_TRANSIENT is not set\n+# CONFIG_LEDS_TURRIS_OMNIA is not set\n+# CONFIG_LEDS_USER is not set\n+# CONFIG_LED_TRIGGER_PHY is not set\n+# CONFIG_LEGACY_PTYS is not set\n+# CONFIG_LGUEST is not set\n+# CONFIG_LIB80211 is not set\n+# CONFIG_LIB80211_CRYPT_CCMP is not set\n+# CONFIG_LIB80211_CRYPT_TKIP is not set\n+# CONFIG_LIB80211_CRYPT_WEP is not set\n+# CONFIG_LIB80211_DEBUG is not set\n+# CONFIG_LIBCRC32C is not set\n+# CONFIG_LIBERTAS is not set\n+# CONFIG_LIBERTAS_THINFIRM is not set\n+# CONFIG_LIBERTAS_USB is not set\n+# CONFIG_LIBFC is not set\n+# CONFIG_LIBFCOE is not set\n+# CONFIG_LIBIPW_DEBUG is not set\n+# CONFIG_LIBNVDIMM is not set\n+# CONFIG_LIDAR_LITE_V2 is not set\n+CONFIG_LINEAR_RANGES=y\n+# CONFIG_LIQUIDIO is not set\n+# CONFIG_LIQUIDIO_VF is not set\n+# CONFIG_LIS3L02DQ is not set\n+# CONFIG_LKDTM is not set\n+CONFIG_LLC=y\n+# CONFIG_LLC2 is not set\n+# CONFIG_LMK04832 is not set\n+# CONFIG_LMP91000 is not set\n+# CONFIG_LNET is not set\n+CONFIG_LOCALVERSION=\"\"\n+# CONFIG_LOCALVERSION_AUTO is not set\n+# CONFIG_LOCKD is not set\n+CONFIG_LOCKDEP_SUPPORT=y\n+CONFIG_LOCKD_V4=y\n+# CONFIG_LOCKUP_DETECTOR is not set\n+# CONFIG_LOCK_EVENT_COUNTS is not set\n+# CONFIG_LOCK_STAT is not set\n+# CONFIG_LOCK_TORTURE_TEST is not set\n+# CONFIG_LOGFS is not set\n+# CONFIG_LOGIG940_FF is not set\n+# CONFIG_LOGIRUMBLEPAD2_FF is not set\n+# CONFIG_LOGITECH_FF is not set\n+# CONFIG_LOGIWHEELS_FF is not set\n+# CONFIG_LOGO is not set\n+CONFIG_LOG_BUF_SHIFT=17\n+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12\n+# CONFIG_LOONGSON_MC146818 is not set\n+# CONFIG_LPC_ICH is not set\n+# CONFIG_LPC_SCH is not set\n+# CONFIG_LP_CONSOLE is not set\n+# CONFIG_LSI_ET1011C_PHY is not set\n+CONFIG_LSM=\"lockdown,yama,loadpin,safesetid,integrity\"\n+CONFIG_LSM_MMAP_MIN_ADDR=65536\n+# CONFIG_LTC1660 is not set\n+# CONFIG_LTC2471 is not set\n+# CONFIG_LTC2485 is not set\n+# CONFIG_LTC2496 is not set\n+# CONFIG_LTC2497 is not set\n+# CONFIG_LTC2632 is not set\n+# CONFIG_LTC2983 is not set\n+# CONFIG_LTE_GDM724X is not set\n+# CONFIG_LTPC is not set\n+# CONFIG_LTR501 is not set\n+# CONFIG_LUSTRE_FS is not set\n+# CONFIG_LV0104CS is not set\n+# CONFIG_LWTUNNEL is not set\n+# CONFIG_LXT_PHY is not set\n+# CONFIG_LZ4HC_COMPRESS is not set\n+# CONFIG_LZ4_COMPRESS is not set\n+# CONFIG_LZ4_DECOMPRESS is not set\n+CONFIG_LZMA_COMPRESS=y\n+CONFIG_LZMA_DECOMPRESS=y\n+# CONFIG_LZO_COMPRESS is not set\n+# CONFIG_LZO_DECOMPRESS is not set\n+# CONFIG_M62332 is not set\n+# CONFIG_MAC80211 is not set\n+# CONFIG_MAC80211_MESSAGE_TRACING is not set\n+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0\n+# CONFIG_MACB is not set\n+# CONFIG_MACH_ASM9260 is not set\n+# CONFIG_MACH_DECSTATION is not set\n+# CONFIG_MACH_INGENIC is not set\n+# CONFIG_MACH_INGENIC_SOC is not set\n+# CONFIG_MACH_JAZZ is not set\n+# CONFIG_MACH_JZ4740 is not set\n+# CONFIG_MACH_LOONGSON2EF is not set\n+# CONFIG_MACH_LOONGSON32 is not set\n+# CONFIG_MACH_LOONGSON64 is not set\n+# CONFIG_MACH_PIC32 is not set\n+# CONFIG_MACH_PISTACHIO is not set\n+# CONFIG_MACH_TX39XX is not set\n+# CONFIG_MACH_TX49XX is not set\n+# CONFIG_MACH_VR41XX is not set\n+# CONFIG_MACH_XILFPGA is not set\n+# CONFIG_MACINTOSH_DRIVERS is not set\n+# CONFIG_MACSEC is not set\n+# CONFIG_MACVLAN is not set\n+# CONFIG_MACVTAP is not set\n+# CONFIG_MAC_EMUMOUSEBTN is not set\n+# CONFIG_MAC_PARTITION is not set\n+# CONFIG_MAG3110 is not set\n+# CONFIG_MAGIC_SYSRQ is not set\n+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1\n+# CONFIG_MAGIC_SYSRQ_SERIAL is not set\n+CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=\"\"\n+# CONFIG_MAILBOX is not set\n+# CONFIG_MANAGER_SBS is not set\n+# CONFIG_MANDATORY_FILE_LOCKING is not set\n+# CONFIG_MANGLE_BOOTARGS is not set\n+# CONFIG_MARVELL_10G_PHY is not set\n+# CONFIG_MARVELL_PHY is not set\n+# CONFIG_MARVELL_88X2222_PHY is not set\n+# CONFIG_MEDIATEK_GE_PHY is not set\n+# CONFIG_MAX1027 is not set\n+# CONFIG_MAX11100 is not set\n+# CONFIG_MAX1118 is not set\n+# CONFIG_MAX1241 is not set\n+# CONFIG_MAX1363 is not set\n+# CONFIG_MAX30100 is not set\n+# CONFIG_MAX30102 is not set\n+# CONFIG_MAX31856 is not set\n+# CONFIG_MAX44000 is not set\n+# CONFIG_MAX44009 is not set\n+# CONFIG_MAX517 is not set\n+# CONFIG_MAX5432 is not set\n+# CONFIG_MAX5481 is not set\n+# CONFIG_MAX5487 is not set\n+# CONFIG_MAX5821 is not set\n+# CONFIG_MAX63XX_WATCHDOG is not set\n+# CONFIG_MAX9611 is not set\n+# CONFIG_MAXIM_THERMOCOUPLE is not set\n+CONFIG_MAY_USE_DEVLINK=y\n+# CONFIG_MB1232 is not set\n+# CONFIG_MC3230 is not set\n+# CONFIG_MCB is not set\n+# CONFIG_MCP320X is not set\n+# CONFIG_MCP3422 is not set\n+# CONFIG_MCP3911 is not set\n+# CONFIG_MCP4018 is not set\n+# CONFIG_MCP41010 is not set\n+# CONFIG_MCP4131 is not set\n+# CONFIG_MCP4531 is not set\n+# CONFIG_MCP4725 is not set\n+# CONFIG_MCP4922 is not set\n+# CONFIG_MCPM is not set\n+# CONFIG_MD is not set\n+# CONFIG_MDIO_BCM_UNIMAC is not set\n+# CONFIG_MDIO_BITBANG is not set\n+# CONFIG_MDIO_BUS_MUX_GPIO is not set\n+# CONFIG_MDIO_BUS_MUX_MMIOREG is not set\n+# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set\n+# CONFIG_MDIO_DEVICE is not set\n+# CONFIG_MDIO_DEVRES is not set\n+# CONFIG_MDIO_HISI_FEMAC is not set\n+# CONFIG_MDIO_IPQ4019 is not set\n+# CONFIG_MDIO_IPQ8064 is not set\n+# CONFIG_MDIO_MSCC_MIIM is not set\n+# CONFIG_MDIO_MVUSB is not set\n+# CONFIG_MDIO_OCTEON is not set\n+# CONFIG_MDIO_THUNDER is not set\n+# CONFIG_MDIO_XPCS is not set\n+# CONFIG_MD_FAULTY is not set\n+# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set\n+# CONFIG_MEDIA_ATTACH is not set\n+# CONFIG_MEDIA_CAMERA_SUPPORT is not set\n+# CONFIG_MEDIA_CEC_SUPPORT is not set\n+# CONFIG_MEDIA_CONTROLLER is not set\n+# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set\n+# CONFIG_MEDIA_PCI_SUPPORT is not set\n+# CONFIG_MEDIA_PLATFORM_SUPPORT is not set\n+# CONFIG_MEDIA_RADIO_SUPPORT is not set\n+# CONFIG_MEDIA_RC_SUPPORT is not set\n+# CONFIG_MEDIA_SDR_SUPPORT is not set\n+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set\n+# CONFIG_MEDIA_SUPPORT is not set\n+# CONFIG_MEDIA_SUPPORT_FILTER is not set\n+# CONFIG_MEDIA_TEST_SUPPORT is not set\n+# CONFIG_MEDIA_TUNER_E4000 is not set\n+# CONFIG_MEDIA_TUNER_FC0011 is not set\n+# CONFIG_MEDIA_TUNER_FC0012 is not set\n+# CONFIG_MEDIA_TUNER_FC0013 is not set\n+# CONFIG_MEDIA_TUNER_FC2580 is not set\n+# CONFIG_MEDIA_TUNER_IT913X is not set\n+# CONFIG_MEDIA_TUNER_M88RS6000T is not set\n+# CONFIG_MEDIA_TUNER_MAX2165 is not set\n+# CONFIG_MEDIA_TUNER_MC44S803 is not set\n+# CONFIG_MEDIA_TUNER_MSI001 is not set\n+# CONFIG_MEDIA_TUNER_MT2060 is not set\n+# CONFIG_MEDIA_TUNER_MT2063 is not set\n+# CONFIG_MEDIA_TUNER_MT20XX is not set\n+# CONFIG_MEDIA_TUNER_MT2131 is not set\n+# CONFIG_MEDIA_TUNER_MT2266 is not set\n+# CONFIG_MEDIA_TUNER_MXL301RF is not set\n+# CONFIG_MEDIA_TUNER_MXL5005S is not set\n+# CONFIG_MEDIA_TUNER_MXL5007T is not set\n+# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set\n+# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set\n+# CONFIG_MEDIA_TUNER_QT1010 is not set\n+# CONFIG_MEDIA_TUNER_R820T is not set\n+# CONFIG_MEDIA_TUNER_SI2157 is not set\n+# CONFIG_MEDIA_TUNER_SIMPLE is not set\n+# CONFIG_MEDIA_TUNER_TDA18212 is not set\n+# CONFIG_MEDIA_TUNER_TDA18218 is not set\n+# CONFIG_MEDIA_TUNER_TDA18250 is not set\n+# CONFIG_MEDIA_TUNER_TDA18271 is not set\n+# CONFIG_MEDIA_TUNER_TDA827X is not set\n+# CONFIG_MEDIA_TUNER_TDA8290 is not set\n+# CONFIG_MEDIA_TUNER_TDA9887 is not set\n+# CONFIG_MEDIA_TUNER_TEA5761 is not set\n+# CONFIG_MEDIA_TUNER_TEA5767 is not set\n+# CONFIG_MEDIA_TUNER_TUA9001 is not set\n+# CONFIG_MEDIA_TUNER_XC2028 is not set\n+# CONFIG_MEDIA_TUNER_XC4000 is not set\n+# CONFIG_MEDIA_TUNER_XC5000 is not set\n+# CONFIG_MEDIA_USB_SUPPORT is not set\n+# CONFIG_MEGARAID_LEGACY is not set\n+# CONFIG_MEGARAID_NEWGEN is not set\n+# CONFIG_MEGARAID_SAS is not set\n+# CONFIG_MELLANOX_PLATFORM is not set\n+CONFIG_MEMBARRIER=y\n+# CONFIG_MEMORY is not set\n+# CONFIG_MEMORY_FAILURE is not set\n+# CONFIG_MEMORY_HOTPLUG is not set\n+# CONFIG_MEMSTICK is not set\n+# CONFIG_MEMTEST is not set\n+# CONFIG_MEN_A21_WDT is not set\n+# CONFIG_MESON_SM is not set\n+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4\n+# CONFIG_MFD_88PM800 is not set\n+# CONFIG_MFD_88PM805 is not set\n+# CONFIG_MFD_88PM860X is not set\n+# CONFIG_MFD_AAT2870_CORE is not set\n+# CONFIG_MFD_AC100 is not set\n+# CONFIG_MFD_ACT8945A is not set\n+# CONFIG_MFD_ARIZONA_I2C is not set\n+# CONFIG_MFD_ARIZONA_SPI is not set\n+# CONFIG_MFD_AS3711 is not set\n+# CONFIG_MFD_AS3722 is not set\n+# CONFIG_MFD_ASIC3 is not set\n+# CONFIG_MFD_ATC260X_I2C is not set\n+# CONFIG_MFD_ATMEL_FLEXCOM is not set\n+# CONFIG_MFD_ATMEL_HLCDC is not set\n+# CONFIG_MFD_AXP20X is not set\n+# CONFIG_MFD_AXP20X_I2C is not set\n+# CONFIG_MFD_BCM590XX is not set\n+# CONFIG_MFD_BD9571MWV is not set\n+# CONFIG_MFD_CORE is not set\n+# CONFIG_MFD_CPCAP is not set\n+# CONFIG_MFD_CROS_EC is not set\n+# CONFIG_MFD_CS5535 is not set\n+# CONFIG_MFD_DA9052_I2C is not set\n+# CONFIG_MFD_DA9052_SPI is not set\n+# CONFIG_MFD_DA9055 is not set\n+# CONFIG_MFD_DA9062 is not set\n+# CONFIG_MFD_DA9063 is not set\n+# CONFIG_MFD_DA9150 is not set\n+# CONFIG_MFD_DLN2 is not set\n+# CONFIG_MFD_EXYNOS_LPASS is not set\n+# CONFIG_MFD_GATEWORKS_GSC is not set\n+# CONFIG_MFD_HI6421_PMIC is not set\n+# CONFIG_MFD_INTEL_M10_BMC is not set\n+# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set\n+# CONFIG_MFD_IQS62X is not set\n+# CONFIG_MFD_JANZ_CMODIO is not set\n+# CONFIG_MFD_KEMPLD is not set\n+# CONFIG_MFD_LM3533 is not set\n+# CONFIG_MFD_LOCHNAGAR is not set\n+# CONFIG_MFD_LP3943 is not set\n+# CONFIG_MFD_LP8788 is not set\n+# CONFIG_MFD_MADERA is not set\n+# CONFIG_MFD_MAX14577 is not set\n+# CONFIG_MFD_MAX77620 is not set\n+# CONFIG_MFD_MAX77650 is not set\n+# CONFIG_MFD_MAX77686 is not set\n+# CONFIG_MFD_MAX77693 is not set\n+# CONFIG_MFD_MAX77843 is not set\n+# CONFIG_MFD_MAX8907 is not set\n+# CONFIG_MFD_MAX8925 is not set\n+# CONFIG_MFD_MAX8997 is not set\n+# CONFIG_MFD_MAX8998 is not set\n+# CONFIG_MFD_MC13XXX is not set\n+# CONFIG_MFD_MC13XXX_I2C is not set\n+# CONFIG_MFD_MC13XXX_SPI is not set\n+# CONFIG_MFD_MENF21BMC is not set\n+# CONFIG_MFD_MP2629 is not set\n+# CONFIG_MFD_MT6360 is not set\n+# CONFIG_MFD_MT6397 is not set\n+# CONFIG_MFD_NTXEC is not set\n+# CONFIG_MFD_OMAP_USB_HOST is not set\n+# CONFIG_MFD_PALMAS is not set\n+# CONFIG_MFD_PCF50633 is not set\n+# CONFIG_MFD_PM8921_CORE is not set\n+# CONFIG_MFD_PM8XXX is not set\n+# CONFIG_MFD_QCOM_PM8008 is not set\n+# CONFIG_MFD_RT4831 is not set\n+# CONFIG_MFD_RC5T583 is not set\n+# CONFIG_MFD_RDC321X is not set\n+# CONFIG_MFD_RETU is not set\n+# CONFIG_MFD_RK808 is not set\n+# CONFIG_MFD_RN5T618 is not set\n+# CONFIG_MFD_ROHM_BD70528 is not set\n+# CONFIG_MFD_ROHM_BD71828 is not set\n+# CONFIG_MFD_ROHM_BD718XX is not set\n+# CONFIG_MFD_ROHM_BD957XMUF is not set\n+# CONFIG_MFD_RT5033 is not set\n+# CONFIG_MFD_RTSX_PCI is not set\n+# CONFIG_MFD_RTSX_USB is not set\n+# CONFIG_MFD_SEC_CORE is not set\n+# CONFIG_MFD_SI476X_CORE is not set\n+# CONFIG_MFD_SKY81452 is not set\n+# CONFIG_MFD_SM501 is not set\n+# CONFIG_MFD_SMSC is not set\n+# CONFIG_MFD_STMFX is not set\n+# CONFIG_MFD_STMPE is not set\n+# CONFIG_MFD_STPMIC1 is not set\n+# CONFIG_MFD_SYSCON is not set\n+# CONFIG_MFD_T7L66XB is not set\n+# CONFIG_MFD_TC3589X is not set\n+# CONFIG_MFD_TC6387XB is not set\n+# CONFIG_MFD_TC6393XB is not set\n+# CONFIG_MFD_TIMBERDALE is not set\n+# CONFIG_MFD_TI_AM335X_TSCADC is not set\n+# CONFIG_MFD_TI_LMU is not set\n+# CONFIG_MFD_TI_LP873X is not set\n+# CONFIG_MFD_TI_LP87565 is not set\n+# CONFIG_MFD_TMIO is not set\n+# CONFIG_MFD_TPS65086 is not set\n+# CONFIG_MFD_TPS65090 is not set\n+# CONFIG_MFD_TPS65217 is not set\n+# CONFIG_MFD_TPS65218 is not set\n+# CONFIG_MFD_TPS6586X is not set\n+# CONFIG_MFD_TPS65910 is not set\n+# CONFIG_MFD_TPS65912 is not set\n+# CONFIG_MFD_TPS65912_I2C is not set\n+# CONFIG_MFD_TPS65912_SPI is not set\n+# CONFIG_MFD_TPS68470 is not set\n+# CONFIG_MFD_TPS80031 is not set\n+# CONFIG_MFD_TQMX86 is not set\n+# CONFIG_MFD_VIPERBOARD is not set\n+# CONFIG_MFD_VX855 is not set\n+# CONFIG_MFD_WL1273_CORE is not set\n+# CONFIG_MFD_WM831X is not set\n+# CONFIG_MFD_WM831X_I2C is not set\n+# CONFIG_MFD_WM831X_SPI is not set\n+# CONFIG_MFD_WM8350_I2C is not set\n+# CONFIG_MFD_WM8400 is not set\n+# CONFIG_MFD_WM8994 is not set\n+# CONFIG_MG_DISK is not set\n+# CONFIG_MHI_BUS is not set\n+# CONFIG_MICREL_KS8995MA is not set\n+# CONFIG_MICREL_PHY is not set\n+# CONFIG_MICROCHIP_KSZ is not set\n+# CONFIG_MICROCHIP_PHY is not set\n+# CONFIG_MICROCHIP_PIT64B is not set\n+# CONFIG_MICROCHIP_T1_PHY is not set\n+# CONFIG_MICROSEMI_PHY is not set\n+# CONFIG_MOTORCOMM_PHY is not set\n+# CONFIG_MICROSOFT_MANA is not set\n+# CONFIG_MIGRATION is not set\n+CONFIG_MII=y\n+# CONFIG_MIKROTIK is not set\n+# CONFIG_MIKROTIK_RB532 is not set\n+# CONFIG_MINIX_FS is not set\n+# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set\n+# CONFIG_MINIX_SUBPARTITION is not set\n+# CONFIG_MIPS_ALCHEMY is not set\n+# CONFIG_MIPS_CDMM is not set\n+# CONFIG_MIPS_COBALT is not set\n+# CONFIG_MIPS_FPU_EMULATOR is not set\n+# CONFIG_MIPS_FP_SUPPORT is not set\n+# CONFIG_MIPS_GENERIC is not set\n+# CONFIG_MIPS_GENERIC_KERNEL is not set\n+# CONFIG_MIPS_MALTA is not set\n+# CONFIG_MIPS_O32_FP64_SUPPORT is not set\n+# CONFIG_MIPS_PARAVIRT is not set\n+# CONFIG_MIPS_PLATFORM_DEVICES is not set\n+# CONFIG_MIPS_SEAD3 is not set\n+# CONFIG_MISC_ALCOR_PCI is not set\n+CONFIG_MISC_FILESYSTEMS=y\n+# CONFIG_MISC_RTSX_PCI is not set\n+# CONFIG_MISC_RTSX_USB is not set\n+# CONFIG_MISDN is not set\n+# CONFIG_MISDN_AVMFRITZ is not set\n+# CONFIG_MISDN_HFCPCI is not set\n+# CONFIG_MISDN_HFCUSB is not set\n+# CONFIG_MISDN_INFINEON is not set\n+# CONFIG_MISDN_NETJET is not set\n+# CONFIG_MISDN_SPEEDFAX is not set\n+# CONFIG_MISDN_W6692 is not set\n+# CONFIG_MKISS is not set\n+# CONFIG_MLX4_CORE is not set\n+# CONFIG_MLX4_EN is not set\n+# CONFIG_MLX5_CORE is not set\n+# CONFIG_MLX90614 is not set\n+# CONFIG_MLX90632 is not set\n+# CONFIG_MLXFW is not set\n+# CONFIG_MLXSW_CORE is not set\n+# CONFIG_MLX_CPLD_PLATFORM is not set\n+# CONFIG_MLX_PLATFORM is not set\n+# CONFIG_MMA7455_I2C is not set\n+# CONFIG_MMA7455_SPI is not set\n+# CONFIG_MMA7660 is not set\n+# CONFIG_MMA8452 is not set\n+# CONFIG_MMA9551 is not set\n+# CONFIG_MMA9553 is not set\n+# CONFIG_MMC is not set\n+# CONFIG_MMC35240 is not set\n+# CONFIG_MMC_ARMMMCI is not set\n+# CONFIG_MMC_AU1X is not set\n+# CONFIG_MMC_BLOCK is not set\n+CONFIG_MMC_BLOCK_BOUNCE=y\n+CONFIG_MMC_BLOCK_MINORS=8\n+# CONFIG_MMC_CAVIUM_THUNDERX is not set\n+# CONFIG_MMC_CB710 is not set\n+# CONFIG_MMC_CQHCI is not set\n+# CONFIG_MMC_DEBUG is not set\n+# CONFIG_MMC_DW is not set\n+# CONFIG_MMC_HSQ is not set\n+# CONFIG_MMC_JZ4740 is not set\n+# CONFIG_MMC_MTK is not set\n+# CONFIG_MMC_MVSDIO is not set\n+# CONFIG_MMC_S3C is not set\n+# CONFIG_MMC_SDHCI is not set\n+# CONFIG_MMC_SDHCI_ACPI is not set\n+# CONFIG_MMC_SDHCI_AM654 is not set\n+# CONFIG_MMC_SDHCI_BCM_KONA is not set\n+# CONFIG_MMC_SDHCI_CADENCE is not set\n+# CONFIG_MMC_SDHCI_F_SDH30 is not set\n+# CONFIG_MMC_SDHCI_IPROC is not set\n+# CONFIG_MMC_SDHCI_MILBEAUT is not set\n+# CONFIG_MMC_SDHCI_MSM is not set\n+# CONFIG_MMC_SDHCI_OF_ARASAN is not set\n+# CONFIG_MMC_SDHCI_OF_ASPEED is not set\n+# CONFIG_MMC_SDHCI_OF_AT91 is not set\n+# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set\n+# CONFIG_MMC_SDHCI_OF_ESDHC is not set\n+# CONFIG_MMC_SDHCI_OF_HLWD is not set\n+# CONFIG_MMC_SDHCI_OMAP is not set\n+# CONFIG_MMC_SDHCI_PXAV2 is not set\n+# CONFIG_MMC_SDHCI_PXAV3 is not set\n+# CONFIG_MMC_SDHCI_S3C is not set\n+# CONFIG_MMC_SDHCI_XENON is not set\n+# CONFIG_MMC_SDRICOH_CS is not set\n+# CONFIG_MMC_SPI is not set\n+# CONFIG_MMC_STM32_SDMMC is not set\n+# CONFIG_MMC_TEST is not set\n+# CONFIG_MMC_TOSHIBA_PCI is not set\n+# CONFIG_MMC_USDHI6ROL0 is not set\n+# CONFIG_MMC_USHC is not set\n+# CONFIG_MMC_VIA_SDMMC is not set\n+# CONFIG_MMC_VUB300 is not set\n+# CONFIG_MMIOTRACE is not set\n+CONFIG_MMU=y\n+CONFIG_MMU_GATHER_RCU_TABLE_FREE=y\n+CONFIG_MMU_GATHER_TABLE_FREE=y\n+CONFIG_MODPROBE_PATH=\"sbin/modprobe\"\n+CONFIG_MODULES=y\n+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set\n+CONFIG_MODULE_COMPRESS=y\n+CONFIG_MODULE_COMPRESS_NONE=y\n+# CONFIG_MODULE_COMPRESS_GZIP is not set\n+# CONFIG_MODULE_COMPRESS_XZ is not set\n+# CONFIG_MODULE_COMPRESS_ZSTD is not set\n+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set\n+# CONFIG_MODULE_FORCE_LOAD is not set\n+# CONFIG_MODULE_FORCE_UNLOAD is not set\n+# CONFIG_MODULE_SIG is not set\n+# CONFIG_MODULE_SRCVERSION_ALL is not set\n+CONFIG_MODULE_STRIPPED=y\n+CONFIG_MODULE_UNLOAD=y\n+# CONFIG_MODVERSIONS is not set\n+# CONFIG_MOST is not set\n+# CONFIG_MOUSE_APPLETOUCH is not set\n+# CONFIG_MOUSE_ELAN_I2C is not set\n+# CONFIG_MOUSE_GPIO is not set\n+# CONFIG_MOUSE_INPORT is not set\n+# CONFIG_MOUSE_LOGIBM is not set\n+# CONFIG_MOUSE_PC110PAD is not set\n+# CONFIG_MOUSE_PS2_FOCALTECH is not set\n+# CONFIG_MOUSE_PS2_SENTELIC is not set\n+# CONFIG_MOUSE_SYNAPTICS_I2C is not set\n+# CONFIG_MOUSE_SYNAPTICS_USB is not set\n+# CONFIG_MOXTET is not set\n+# CONFIG_MPL115 is not set\n+# CONFIG_MPL115_I2C is not set\n+# CONFIG_MPL115_SPI is not set\n+# CONFIG_MPL3115 is not set\n+# CONFIG_MPLS is not set\n+# CONFIG_MPTCP is not set\n+# CONFIG_MPU3050_I2C is not set\n+# CONFIG_MQ_IOSCHED_DEADLINE is not set\n+# CONFIG_MQ_IOSCHED_KYBER is not set\n+# CONFIG_MS5611 is not set\n+# CONFIG_MS5637 is not set\n+# CONFIG_MSCC_OCELOT_SWITCH is not set\n+# CONFIG_MSDOS_FS is not set\n+CONFIG_MSDOS_PARTITION=y\n+# CONFIG_MSI_BITMAP_SELFTEST is not set\n+# CONFIG_MSI_LAPTOP is not set\n+# CONFIG_MST_IRQ is not set\n+CONFIG_MTD=y\n+# CONFIG_MTD_ABSENT is not set\n+# CONFIG_MTD_AFS_PARTS is not set\n+# CONFIG_MTD_AR7_PARTS is not set\n+CONFIG_MTD_BLKDEVS=y\n+CONFIG_MTD_BLOCK=y\n+# CONFIG_MTD_BLOCK2MTD is not set\n+CONFIG_MTD_CFI=y\n+# CONFIG_MTD_CFI_ADV_OPTIONS is not set\n+CONFIG_MTD_CFI_AMDSTD=y\n+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set\n+CONFIG_MTD_CFI_I1=y\n+CONFIG_MTD_CFI_I2=y\n+# CONFIG_MTD_CFI_I4 is not set\n+# CONFIG_MTD_CFI_I8 is not set\n+CONFIG_MTD_CFI_INTELEXT=y\n+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set\n+CONFIG_MTD_CFI_NOSWAP=y\n+# CONFIG_MTD_CFI_STAA is not set\n+CONFIG_MTD_CFI_UTIL=y\n+# CONFIG_MTD_CMDLINE_PARTS is not set\n+CONFIG_MTD_COMPLEX_MAPPINGS=y\n+# CONFIG_MTD_DATAFLASH is not set\n+# CONFIG_MTD_DOCG3 is not set\n+CONFIG_MTD_GEN_PROBE=y\n+# CONFIG_MTD_GPIO_ADDR is not set\n+# CONFIG_MTD_HYPERBUS is not set\n+# CONFIG_MTD_IMPA7 is not set\n+# CONFIG_MTD_INTEL_VR_NOR is not set\n+# CONFIG_MTD_JEDECPROBE is not set\n+# CONFIG_MTD_LATCH_ADDR is not set\n+# CONFIG_MTD_LPDDR is not set\n+# CONFIG_MTD_LPDDR2_NVM is not set\n+# CONFIG_MTD_M25P80 is not set\n+CONFIG_MTD_MAP_BANK_WIDTH_1=y\n+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set\n+CONFIG_MTD_MAP_BANK_WIDTH_2=y\n+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set\n+CONFIG_MTD_MAP_BANK_WIDTH_4=y\n+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set\n+# CONFIG_MTD_MCHP23K256 is not set\n+# CONFIG_MTD_MCHP48L640 is not set\n+# CONFIG_MTD_MT81xx_NOR is not set\n+# CONFIG_MTD_MTDRAM is not set\n+# CONFIG_MTD_MYLOADER_PARTS is not set\n+# CONFIG_MTD_NAND is not set\n+# CONFIG_MTD_NAND_AMS_DELTA is not set\n+# CONFIG_MTD_NAND_AR934X is not set\n+# CONFIG_MTD_NAND_AR934X_HW_ECC is not set\n+# CONFIG_MTD_NAND_ARASAN is not set\n+# CONFIG_MTD_NAND_ATMEL is not set\n+# CONFIG_MTD_NAND_AU1550 is not set\n+# CONFIG_MTD_NAND_BCH is not set\n+# CONFIG_MTD_NAND_BF5XX is not set\n+# CONFIG_MTD_NAND_BRCMNAND is not set\n+# CONFIG_MTD_NAND_CADENCE is not set\n+# CONFIG_MTD_NAND_CAFE is not set\n+# CONFIG_MTD_NAND_CM_X270 is not set\n+# CONFIG_MTD_NAND_CS553X is not set\n+# CONFIG_MTD_NAND_DAVINCI is not set\n+# CONFIG_MTD_NAND_DENALI is not set\n+# CONFIG_MTD_NAND_DENALI_DT is not set\n+# CONFIG_MTD_NAND_DENALI_PCI is not set\n+CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018\n+# CONFIG_MTD_NAND_DISKONCHIP is not set\n+# CONFIG_MTD_NAND_DOCG4 is not set\n+# CONFIG_MTD_NAND_ECC is not set\n+# CONFIG_MTD_NAND_ECC_BCH is not set\n+# CONFIG_MTD_NAND_ECC_SMC is not set\n+# CONFIG_MTD_NAND_ECC_SW_BCH is not set\n+# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set\n+# CONFIG_MTD_NAND_FSL_ELBC is not set\n+# CONFIG_MTD_NAND_FSL_IFC is not set\n+# CONFIG_MTD_NAND_FSL_UPM is not set\n+# CONFIG_MTD_NAND_FSMC is not set\n+# CONFIG_MTD_NAND_GPIO is not set\n+# CONFIG_MTD_NAND_GPMI_NAND is not set\n+# CONFIG_MTD_NAND_HISI504 is not set\n+CONFIG_MTD_NAND_IDS=y\n+# CONFIG_MTD_NAND_JZ4740 is not set\n+# CONFIG_MTD_NAND_MPC5121_NFC is not set\n+# CONFIG_MTD_NAND_MTK is not set\n+# CONFIG_MTD_NAND_MXC is not set\n+# CONFIG_MTD_NAND_MXIC is not set\n+# CONFIG_MTD_NAND_NANDSIM is not set\n+# CONFIG_MTD_NAND_NDFC is not set\n+# CONFIG_MTD_NAND_NUC900 is not set\n+# CONFIG_MTD_NAND_OMAP2 is not set\n+# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set\n+# CONFIG_MTD_NAND_ORION is not set\n+# CONFIG_MTD_NAND_PASEMI is not set\n+# CONFIG_MTD_NAND_PLATFORM is not set\n+# CONFIG_MTD_NAND_PXA3xx is not set\n+# CONFIG_MTD_NAND_RB4XX is not set\n+# CONFIG_MTD_NAND_RB750 is not set\n+# CONFIG_MTD_NAND_RICOH is not set\n+# CONFIG_MTD_NAND_S3C2410 is not set\n+# CONFIG_MTD_NAND_SHARPSL is not set\n+# CONFIG_MTD_NAND_SH_FLCTL is not set\n+# CONFIG_MTD_NAND_SOCRATES is not set\n+# CONFIG_MTD_NAND_TMIO is not set\n+# CONFIG_MTD_NAND_TXX9NDFMC is not set\n+CONFIG_MTD_OF_PARTS=y\n+# CONFIG_MTD_ONENAND is not set\n+# CONFIG_MTD_OOPS is not set\n+# CONFIG_MTD_OTP is not set\n+# CONFIG_MTD_PARTITIONED_MASTER is not set\n+# CONFIG_MTD_PCI is not set\n+# CONFIG_MTD_PCMCIA is not set\n+# CONFIG_MTD_PHRAM is not set\n+# CONFIG_MTD_PHYSMAP is not set\n+# CONFIG_MTD_PHYSMAP_COMPAT is not set\n+# CONFIG_MTD_PHYSMAP_GEMINI is not set\n+# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set\n+CONFIG_MTD_PHYSMAP_OF=y\n+# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set\n+# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set\n+# CONFIG_MTD_PHYSMAP_VERSATILE is not set\n+# CONFIG_MTD_PLATRAM is not set\n+# CONFIG_MTD_PMC551 is not set\n+# CONFIG_MTD_RAM is not set\n+# CONFIG_MTD_RAW_NAND is not set\n+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1\n+# CONFIG_MTD_REDBOOT_PARTS is not set\n+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set\n+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set\n+# CONFIG_MTD_ROM is not set\n+CONFIG_MTD_ROOTFS_ROOT_DEV=y\n+# CONFIG_MTD_ROUTERBOOT_PARTS is not set\n+# CONFIG_MTD_SLRAM is not set\n+# CONFIG_MTD_SM_COMMON is not set\n+# CONFIG_MTD_SPINAND_MT29F is not set\n+# CONFIG_MTD_SPI_NAND is not set\n+# CONFIG_MTD_SPI_NOR is not set\n+# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set\n+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096\n+CONFIG_MTD_SPLIT=y\n+# CONFIG_MTD_SPLIT_BCM63XX_FW is not set\n+# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set\n+# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set\n+# CONFIG_MTD_SPLIT_ELF_FW is not set\n+# CONFIG_MTD_SPLIT_EVA_FW is not set\n+# CONFIG_MTD_SPLIT_FIRMWARE is not set\n+CONFIG_MTD_SPLIT_FIRMWARE_NAME=\"firmware\"\n+# CONFIG_MTD_SPLIT_FIT_FW is not set\n+# CONFIG_MTD_SPLIT_JIMAGE_FW is not set\n+# CONFIG_MTD_SPLIT_LZMA_FW is not set\n+# CONFIG_MTD_SPLIT_MINOR_FW is not set\n+# CONFIG_MTD_SPLIT_SEAMA_FW is not set\n+CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y\n+CONFIG_MTD_SPLIT_SUPPORT=y\n+# CONFIG_MTD_SPLIT_TPLINK_FW is not set\n+# CONFIG_MTD_SPLIT_TRX_FW is not set\n+# CONFIG_MTD_SPLIT_UIMAGE_FW is not set\n+# CONFIG_MTD_SPLIT_WRGG_FW is not set\n+# CONFIG_MTD_SST25L is not set\n+# CONFIG_MTD_SWAP is not set\n+# CONFIG_MTD_TESTS is not set\n+# CONFIG_MTD_UBI is not set\n+# CONFIG_MTD_UBI_FASTMAP is not set\n+# CONFIG_MTD_UBI_GLUEBI is not set\n+# CONFIG_MTD_UIMAGE_SPLIT is not set\n+# CONFIG_MTD_VIRT_CONCAT is not set\n+# CONFIG_MTK_MMC is not set\n+# CONFIG_MTK_MMSYS is not set\n+CONFIG_MULTIUSER=y\n+# CONFIG_MUTEX_SPIN_ON_OWNER is not set\n+# CONFIG_MV643XX_ETH is not set\n+# CONFIG_MVMDIO is not set\n+# CONFIG_MVNETA_BM is not set\n+# CONFIG_MVSW61XX_PHY is not set\n+# CONFIG_MVSWITCH_PHY is not set\n+# CONFIG_MV_XOR_V2 is not set\n+# CONFIG_MWAVE is not set\n+# CONFIG_MWL8K is not set\n+# CONFIG_MXC4005 is not set\n+# CONFIG_MXC6255 is not set\n+# CONFIG_MYRI10GE is not set\n+# CONFIG_NAMESPACES is not set\n+# CONFIG_NATIONAL_PHY is not set\n+# CONFIG_NATSEMI is not set\n+# CONFIG_NAU7802 is not set\n+# CONFIG_NBPFAXI_DMA is not set\n+# CONFIG_NCP_FS is not set\n+# CONFIG_ND_BLK is not set\n+# CONFIG_NE2000 is not set\n+# CONFIG_NE2K_PCI is not set\n+# CONFIG_NEC_MARKEINS is not set\n+CONFIG_NET=y\n+# CONFIG_NETCONSOLE is not set\n+CONFIG_NETDEVICES=y\n+# CONFIG_NETFS_SUPPORT is not set\n+# CONFIG_NETDEVSIM is not set\n+# CONFIG_NETFILTER is not set\n+# CONFIG_NETFILTER_ADVANCED is not set\n+# CONFIG_NETFILTER_DEBUG is not set\n+# CONFIG_NETFILTER_INGRESS is not set\n+# CONFIG_NETFILTER_NETLINK is not set\n+# CONFIG_NETFILTER_NETLINK_HOOK is not set\n+# CONFIG_NETFILTER_NETLINK_ACCT is not set\n+# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set\n+# CONFIG_NETFILTER_NETLINK_LOG is not set\n+# CONFIG_NETFILTER_NETLINK_OSF is not set\n+# CONFIG_NETFILTER_NETLINK_QUEUE is not set\n+# CONFIG_NETFILTER_XTABLES is not set\n+# CONFIG_NETFILTER_XTABLES_COMPAT is not set\n+# CONFIG_NETFILTER_XT_CONNMARK is not set\n+# CONFIG_NETFILTER_XT_MARK is not set\n+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set\n+# CONFIG_NETFILTER_XT_MATCH_BPF is not set\n+# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set\n+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set\n+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set\n+# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set\n+# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set\n+# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set\n+# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set\n+# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set\n+# CONFIG_NETFILTER_XT_MATCH_CPU is not set\n+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set\n+# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set\n+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set\n+# CONFIG_NETFILTER_XT_MATCH_ECN is not set\n+# CONFIG_NETFILTER_XT_MATCH_ESP is not set\n+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set\n+# CONFIG_NETFILTER_XT_MATCH_HELPER is not set\n+# CONFIG_NETFILTER_XT_MATCH_HL is not set\n+# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set\n+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set\n+# CONFIG_NETFILTER_XT_MATCH_L2TP is not set\n+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set\n+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set\n+# CONFIG_NETFILTER_XT_MATCH_MAC is not set\n+# CONFIG_NETFILTER_XT_MATCH_MARK is not set\n+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set\n+# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set\n+# CONFIG_NETFILTER_XT_MATCH_OSF is not set\n+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set\n+# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set\n+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set\n+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set\n+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set\n+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set\n+# CONFIG_NETFILTER_XT_MATCH_REALM is not set\n+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set\n+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set\n+# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set\n+# CONFIG_NETFILTER_XT_MATCH_STATE is not set\n+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set\n+# CONFIG_NETFILTER_XT_MATCH_STRING is not set\n+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set\n+# CONFIG_NETFILTER_XT_MATCH_TIME is not set\n+# CONFIG_NETFILTER_XT_MATCH_U32 is not set\n+# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set\n+# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set\n+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set\n+# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set\n+# CONFIG_NETFILTER_XT_TARGET_CT is not set\n+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set\n+# CONFIG_NETFILTER_XT_TARGET_HL is not set\n+# CONFIG_NETFILTER_XT_TARGET_HMARK is not set\n+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set\n+# CONFIG_NETFILTER_XT_TARGET_LED is not set\n+# CONFIG_NETFILTER_XT_TARGET_LOG is not set\n+# CONFIG_NETFILTER_XT_TARGET_MARK is not set\n+# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set\n+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set\n+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set\n+# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set\n+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set\n+# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set\n+# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set\n+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set\n+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set\n+# CONFIG_NETFILTER_XT_TARGET_TEE is not set\n+# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set\n+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set\n+# CONFIG_NETLABEL is not set\n+# CONFIG_NETLINK_DIAG is not set\n+# CONFIG_NETLINK_MMAP is not set\n+# CONFIG_NETPOLL is not set\n+# CONFIG_NETROM is not set\n+CONFIG_NETWORK_FILESYSTEMS=y\n+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set\n+# CONFIG_NETWORK_SECMARK is not set\n+# CONFIG_NETXEN_NIC is not set\n+# CONFIG_NET_9P is not set\n+# CONFIG_NET_ACT_BPF is not set\n+# CONFIG_NET_ACT_CSUM is not set\n+# CONFIG_NET_ACT_CT is not set\n+# CONFIG_NET_ACT_GACT is not set\n+# CONFIG_NET_ACT_GATE is not set\n+# CONFIG_NET_ACT_IFE is not set\n+# CONFIG_NET_ACT_IPT is not set\n+# CONFIG_NET_ACT_MIRRED is not set\n+# CONFIG_NET_ACT_MPLS is not set\n+# CONFIG_NET_ACT_NAT is not set\n+# CONFIG_NET_ACT_PEDIT is not set\n+# CONFIG_NET_ACT_POLICE is not set\n+# CONFIG_NET_ACT_SAMPLE is not set\n+# CONFIG_NET_ACT_SIMP is not set\n+# CONFIG_NET_ACT_SKBEDIT is not set\n+# CONFIG_NET_ACT_SKBMOD is not set\n+# CONFIG_NET_ACT_TUNNEL_KEY is not set\n+# CONFIG_NET_ACT_VLAN is not set\n+CONFIG_NET_CADENCE=y\n+# CONFIG_NET_CALXEDA_XGMAC is not set\n+CONFIG_NET_CLS=y\n+# CONFIG_NET_CLS_ACT is not set\n+# CONFIG_NET_CLS_BASIC is not set\n+# CONFIG_NET_CLS_BPF is not set\n+# CONFIG_NET_CLS_FLOW is not set\n+# CONFIG_NET_CLS_FLOWER is not set\n+# CONFIG_NET_CLS_FW is not set\n+CONFIG_NET_CLS_IND=y\n+# CONFIG_NET_CLS_MATCHALL is not set\n+# CONFIG_NET_CLS_ROUTE4 is not set\n+# CONFIG_NET_CLS_RSVP is not set\n+# CONFIG_NET_CLS_RSVP6 is not set\n+# CONFIG_NET_CLS_TCINDEX is not set\n+# CONFIG_NET_CLS_U32 is not set\n+CONFIG_NET_CORE=y\n+# CONFIG_NET_DEVLINK is not set\n+# CONFIG_NET_DROP_MONITOR is not set\n+# CONFIG_NET_DSA is not set\n+# CONFIG_NET_DSA_AR9331 is not set\n+# CONFIG_NET_DSA_BCM_SF2 is not set\n+# CONFIG_NET_DSA_LANTIQ_GSWIP is not set\n+# CONFIG_NET_DSA_LEGACY is not set\n+# CONFIG_NET_DSA_LOOP is not set\n+# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set\n+# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set\n+# CONFIG_NET_DSA_MSCC_SEVILLE is not set\n+# CONFIG_NET_DSA_MT7530 is not set\n+# CONFIG_NET_DSA_MV88E6060 is not set\n+# CONFIG_NET_DSA_MV88E6123_61_65 is not set\n+# CONFIG_NET_DSA_MV88E6131 is not set\n+# CONFIG_NET_DSA_MV88E6171 is not set\n+# CONFIG_NET_DSA_MV88E6352 is not set\n+# CONFIG_NET_DSA_MV88E6XXX is not set\n+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set\n+# CONFIG_NET_DSA_MV88E6XXX_PTP is not set\n+# CONFIG_NET_DSA_QCA8K is not set\n+# CONFIG_NET_DSA_REALTEK_SMI is not set\n+# CONFIG_NET_DSA_SJA1105 is not set\n+# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set\n+# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set\n+# CONFIG_NET_DSA_TAG_8021Q is not set\n+# CONFIG_NET_DSA_TAG_AR9331 is not set\n+# CONFIG_NET_DSA_TAG_BRCM is not set\n+# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set\n+# CONFIG_NET_DSA_TAG_DSA is not set\n+# CONFIG_NET_DSA_TAG_EDSA is not set\n+# CONFIG_NET_DSA_TAG_GSWIP is not set\n+# CONFIG_NET_DSA_TAG_KSZ is not set\n+# CONFIG_NET_DSA_TAG_LAN9303 is not set\n+# CONFIG_NET_DSA_TAG_MTK is not set\n+# CONFIG_NET_DSA_TAG_OCELOT is not set\n+# CONFIG_NET_DSA_TAG_QCA is not set\n+# CONFIG_NET_DSA_TAG_RTL4_A is not set\n+# CONFIG_NET_DSA_TAG_SJA1105 is not set\n+# CONFIG_NET_DSA_TAG_TRAILER is not set\n+# CONFIG_NET_DSA_VITESSE_VSC73XX is not set\n+# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set\n+# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set\n+# CONFIG_NET_EMATCH is not set\n+# CONFIG_NET_EMATCH_CANID is not set\n+# CONFIG_NET_EMATCH_CMP is not set\n+# CONFIG_NET_EMATCH_IPT is not set\n+# CONFIG_NET_EMATCH_META is not set\n+# CONFIG_NET_EMATCH_NBYTE is not set\n+CONFIG_NET_EMATCH_STACK=32\n+# CONFIG_NET_EMATCH_TEXT is not set\n+# CONFIG_NET_EMATCH_U32 is not set\n+# CONFIG_NET_FAILOVER is not set\n+# CONFIG_NET_FC is not set\n+# CONFIG_NET_FOU is not set\n+# CONFIG_NET_FOU_IP_TUNNELS is not set\n+# CONFIG_NET_IFE is not set\n+# CONFIG_NET_IPGRE is not set\n+CONFIG_NET_IPGRE_BROADCAST=y\n+# CONFIG_NET_IPGRE_DEMUX is not set\n+# CONFIG_NET_IPIP is not set\n+# CONFIG_NET_IPVTI is not set\n+# CONFIG_NET_IP_TUNNEL is not set\n+# CONFIG_NET_KEY is not set\n+# CONFIG_NET_KEY_MIGRATE is not set\n+# CONFIG_NET_L3_MASTER_DEV is not set\n+# CONFIG_NET_MEDIATEK_STAR_EMAC is not set\n+# CONFIG_NET_MPLS_GSO is not set\n+# CONFIG_NET_NCSI is not set\n+# CONFIG_NET_NSH is not set\n+# CONFIG_NET_PACKET_ENGINE is not set\n+# CONFIG_NET_PKTGEN is not set\n+# CONFIG_NET_POLL_CONTROLLER is not set\n+# CONFIG_NET_PTP_CLASSIFY is not set\n+CONFIG_NET_RX_BUSY_POLL=y\n+# CONFIG_NET_SB1000 is not set\n+CONFIG_NET_SCHED=y\n+# CONFIG_NET_SCH_ATM is not set\n+# CONFIG_NET_SCH_CAKE is not set\n+# CONFIG_NET_SCH_CBQ is not set\n+# CONFIG_NET_SCH_CBS is not set\n+# CONFIG_NET_SCH_CHOKE is not set\n+# CONFIG_NET_SCH_CODEL is not set\n+# CONFIG_NET_SCH_DEFAULT is not set\n+# CONFIG_NET_SCH_DRR is not set\n+# CONFIG_NET_SCH_DSMARK is not set\n+# CONFIG_NET_SCH_ETF is not set\n+# CONFIG_NET_SCH_ETS is not set\n+CONFIG_NET_SCH_FIFO=y\n+# CONFIG_NET_SCH_FQ is not set\n+CONFIG_NET_SCH_FQ_CODEL=y\n+# CONFIG_NET_SCH_FQ_PIE is not set\n+# CONFIG_NET_SCH_GRED is not set\n+# CONFIG_NET_SCH_HFSC is not set\n+# CONFIG_NET_SCH_HHF is not set\n+# CONFIG_NET_SCH_HTB is not set\n+# CONFIG_NET_SCH_INGRESS is not set\n+# CONFIG_NET_SCH_MQPRIO is not set\n+# CONFIG_NET_SCH_MULTIQ is not set\n+# CONFIG_NET_SCH_NETEM is not set\n+# CONFIG_NET_SCH_PIE is not set\n+# CONFIG_NET_SCH_PLUG is not set\n+# CONFIG_NET_SCH_PRIO is not set\n+# CONFIG_NET_SCH_QFQ is not set\n+# CONFIG_NET_SCH_RED is not set\n+# CONFIG_NET_SCH_SFB is not set\n+# CONFIG_NET_SCH_SFQ is not set\n+# CONFIG_NET_SCH_SKBPRIO is not set\n+# CONFIG_NET_SCH_TAPRIO is not set\n+# CONFIG_NET_SCH_TBF is not set\n+# CONFIG_NET_SCH_TEQL is not set\n+# CONFIG_NET_SCTPPROBE is not set\n+# CONFIG_NET_SWITCHDEV is not set\n+# CONFIG_NET_TCPPROBE is not set\n+# CONFIG_NET_TC_SKB_EXT is not set\n+# CONFIG_NET_TEAM is not set\n+# CONFIG_NET_TULIP is not set\n+# CONFIG_NET_UDP_TUNNEL is not set\n+CONFIG_NET_VENDOR_3COM=y\n+CONFIG_NET_VENDOR_8390=y\n+CONFIG_NET_VENDOR_ADAPTEC=y\n+CONFIG_NET_VENDOR_AGERE=y\n+CONFIG_NET_VENDOR_ALACRITECH=y\n+CONFIG_NET_VENDOR_ALTEON=y\n+CONFIG_NET_VENDOR_AMAZON=y\n+CONFIG_NET_VENDOR_AMD=y\n+CONFIG_NET_VENDOR_AQUANTIA=y\n+CONFIG_NET_VENDOR_ARC=y\n+CONFIG_NET_VENDOR_ATHEROS=y\n+CONFIG_NET_VENDOR_AURORA=y\n+CONFIG_NET_VENDOR_BROADCOM=y\n+CONFIG_NET_VENDOR_BROCADE=y\n+CONFIG_NET_VENDOR_CADENCE=y\n+CONFIG_NET_VENDOR_CAVIUM=y\n+CONFIG_NET_VENDOR_CHELSIO=y\n+CONFIG_NET_VENDOR_CIRRUS=y\n+CONFIG_NET_VENDOR_CISCO=y\n+CONFIG_NET_VENDOR_CORTINA=y\n+CONFIG_NET_VENDOR_DEC=y\n+CONFIG_NET_VENDOR_DLINK=y\n+CONFIG_NET_VENDOR_EMULEX=y\n+CONFIG_NET_VENDOR_EXAR=y\n+CONFIG_NET_VENDOR_EZCHIP=y\n+CONFIG_NET_VENDOR_FARADAY=y\n+CONFIG_NET_VENDOR_FREESCALE=y\n+CONFIG_NET_VENDOR_FUJITSU=y\n+CONFIG_NET_VENDOR_GOOGLE=y\n+CONFIG_NET_VENDOR_HISILICON=y\n+CONFIG_NET_VENDOR_HP=y\n+CONFIG_NET_VENDOR_HUAWEI=y\n+CONFIG_NET_VENDOR_I825XX=y\n+CONFIG_NET_VENDOR_IBM=y\n+CONFIG_NET_VENDOR_INTEL=y\n+CONFIG_NET_VENDOR_MARVELL=y\n+CONFIG_NET_VENDOR_MELLANOX=y\n+CONFIG_NET_VENDOR_MICREL=y\n+CONFIG_NET_VENDOR_MICROCHIP=y\n+CONFIG_NET_VENDOR_MICROSEMI=y\n+CONFIG_NET_VENDOR_MICROSOFT=y\n+CONFIG_NET_VENDOR_MYRI=y\n+CONFIG_NET_VENDOR_NATSEMI=y\n+CONFIG_NET_VENDOR_NETERION=y\n+CONFIG_NET_VENDOR_NETRONOME=y\n+CONFIG_NET_VENDOR_NI=y\n+CONFIG_NET_VENDOR_NVIDIA=y\n+CONFIG_NET_VENDOR_OKI=y\n+CONFIG_NET_VENDOR_PACKET_ENGINES=y\n+CONFIG_NET_VENDOR_PENSANDO=y\n+CONFIG_NET_VENDOR_QLOGIC=y\n+CONFIG_NET_VENDOR_QUALCOMM=y\n+CONFIG_NET_VENDOR_RDC=y\n+CONFIG_NET_VENDOR_REALTEK=y\n+CONFIG_NET_VENDOR_RENESAS=y\n+CONFIG_NET_VENDOR_ROCKER=y\n+CONFIG_NET_VENDOR_SAMSUNG=y\n+CONFIG_NET_VENDOR_SEEQ=y\n+CONFIG_NET_VENDOR_SILAN=y\n+CONFIG_NET_VENDOR_SIS=y\n+CONFIG_NET_VENDOR_SMSC=y\n+CONFIG_NET_VENDOR_SOCIONEXT=y\n+CONFIG_NET_VENDOR_SOLARFLARE=y\n+CONFIG_NET_VENDOR_STMICRO=y\n+CONFIG_NET_VENDOR_SUN=y\n+CONFIG_NET_VENDOR_SYNOPSYS=y\n+CONFIG_NET_VENDOR_TEHUTI=y\n+CONFIG_NET_VENDOR_TI=y\n+CONFIG_NET_VENDOR_TOSHIBA=y\n+CONFIG_NET_VENDOR_VIA=y\n+CONFIG_NET_VENDOR_WIZNET=y\n+CONFIG_NET_VENDOR_XILINX=y\n+CONFIG_NET_VENDOR_XIRCOM=y\n+# CONFIG_NET_VRF is not set\n+# CONFIG_NET_XGENE is not set\n+CONFIG_NEW_LEDS=y\n+# CONFIG_NFC is not set\n+# CONFIG_NFP is not set\n+# CONFIG_NFSD is not set\n+# CONFIG_NFSD_V2_ACL is not set\n+CONFIG_NFSD_V3=y\n+# CONFIG_NFSD_V3_ACL is not set\n+# CONFIG_NFSD_V4 is not set\n+# CONFIG_NFS_ACL_SUPPORT is not set\n+CONFIG_NFS_COMMON=y\n+# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set\n+# CONFIG_NFS_FS is not set\n+# CONFIG_NFS_FSCACHE is not set\n+# CONFIG_NFS_SWAP is not set\n+# CONFIG_NFS_V2 is not set\n+CONFIG_NFS_V3=y\n+# CONFIG_NFS_V3_ACL is not set\n+# CONFIG_NFS_V4 is not set\n+# CONFIG_NFS_V4_1 is not set\n+# CONFIG_NFTL is not set\n+# CONFIG_NFT_BRIDGE_META is not set\n+# CONFIG_NFT_BRIDGE_REJECT is not set\n+# CONFIG_NFT_CONNLIMIT is not set\n+# CONFIG_NFT_DUP_IPV4 is not set\n+# CONFIG_NFT_DUP_IPV6 is not set\n+# CONFIG_NFT_FIB_IPV4 is not set\n+# CONFIG_NFT_FIB_IPV6 is not set\n+# CONFIG_NFT_FIB_NETDEV is not set\n+# CONFIG_NFT_FLOW_OFFLOAD is not set\n+# CONFIG_NFT_OBJREF is not set\n+# CONFIG_NFT_OSF is not set\n+# CONFIG_NFT_REJECT_NETDEV is not set\n+# CONFIG_NFT_RT is not set\n+# CONFIG_NFT_SET_BITMAP is not set\n+# CONFIG_NFT_SOCKET is not set\n+# CONFIG_NFT_SYNPROXY is not set\n+# CONFIG_NFT_TPROXY is not set\n+# CONFIG_NFT_TUNNEL is not set\n+# CONFIG_NFT_XFRM is not set\n+# CONFIG_NF_CONNTRACK is not set\n+# CONFIG_NF_CONNTRACK_AMANDA is not set\n+# CONFIG_NF_CONNTRACK_BRIDGE is not set\n+# CONFIG_NF_CONNTRACK_EVENTS is not set\n+# CONFIG_NF_CONNTRACK_FTP is not set\n+# CONFIG_NF_CONNTRACK_H323 is not set\n+# CONFIG_NF_CONNTRACK_IPV4 is not set\n+# CONFIG_NF_CONNTRACK_IPV6 is not set\n+# CONFIG_NF_CONNTRACK_IRC is not set\n+# CONFIG_NF_CONNTRACK_LABELS is not set\n+# CONFIG_NF_CONNTRACK_MARK is not set\n+# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set\n+# CONFIG_NF_CONNTRACK_PPTP is not set\n+CONFIG_NF_CONNTRACK_PROCFS=y\n+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set\n+# CONFIG_NF_CONNTRACK_SANE is not set\n+# CONFIG_NF_CONNTRACK_SECMARK is not set\n+# CONFIG_NF_CONNTRACK_SIP is not set\n+# CONFIG_NF_CONNTRACK_SNMP is not set\n+# CONFIG_NF_CONNTRACK_TFTP is not set\n+# CONFIG_NF_CONNTRACK_TIMEOUT is not set\n+# CONFIG_NF_CONNTRACK_TIMESTAMP is not set\n+# CONFIG_NF_CONNTRACK_ZONES is not set\n+# CONFIG_NF_CT_NETLINK is not set\n+# CONFIG_NF_CT_NETLINK_HELPER is not set\n+# CONFIG_NF_CT_NETLINK_TIMEOUT is not set\n+# CONFIG_NF_CT_PROTO_DCCP is not set\n+# CONFIG_NF_CT_PROTO_GRE is not set\n+# CONFIG_NF_CT_PROTO_SCTP is not set\n+# CONFIG_NF_CT_PROTO_UDPLITE is not set\n+# CONFIG_NF_DEFRAG_IPV4 is not set\n+# CONFIG_NF_DUP_IPV4 is not set\n+# CONFIG_NF_DUP_IPV6 is not set\n+# CONFIG_NF_FLOW_TABLE is not set\n+# CONFIG_NF_LOG_ARP is not set\n+CONFIG_NF_LOG_SYSLOG=y\n+CONFIG_NF_LOG_IPV4=y\n+CONFIG_NF_LOG_IPV6=y\n+# CONFIG_NF_NAT is not set\n+# CONFIG_NF_NAT_AMANDA is not set\n+# CONFIG_NF_NAT_FTP is not set\n+# CONFIG_NF_NAT_H323 is not set\n+# CONFIG_NF_NAT_IPV6 is not set\n+# CONFIG_NF_NAT_IRC is not set\n+CONFIG_NF_NAT_MASQUERADE_IPV4=y\n+CONFIG_NF_NAT_MASQUERADE_IPV6=y\n+# CONFIG_NF_NAT_NEEDED is not set\n+# CONFIG_NF_NAT_PPTP is not set\n+# CONFIG_NF_NAT_PROTO_GRE is not set\n+# CONFIG_NF_NAT_SIP is not set\n+# CONFIG_NF_NAT_SNMP_BASIC is not set\n+# CONFIG_NF_NAT_TFTP is not set\n+# CONFIG_NF_REJECT_IPV4 is not set\n+# CONFIG_NF_REJECT_IPV6 is not set\n+# CONFIG_NF_SOCKET_IPV4 is not set\n+# CONFIG_NF_SOCKET_IPV6 is not set\n+# CONFIG_NF_TABLES is not set\n+CONFIG_NF_TABLES_ARP=y\n+CONFIG_NF_TABLES_BRIDGE=y\n+CONFIG_NF_TABLES_INET=y\n+CONFIG_NF_TABLES_IPV4=y\n+CONFIG_NF_TABLES_IPV6=y\n+CONFIG_NF_TABLES_NETDEV=y\n+# CONFIG_NF_TABLES_SET is not set\n+# CONFIG_NF_TPROXY_IPV4 is not set\n+# CONFIG_NF_TPROXY_IPV6 is not set\n+# CONFIG_NI65 is not set\n+# CONFIG_NI903X_WDT is not set\n+# CONFIG_NIC7018_WDT is not set\n+# CONFIG_NILFS2_FS is not set\n+# CONFIG_NIU is not set\n+# CONFIG_NI_XGE_MANAGEMENT_ENET is not set\n+CONFIG_NLATTR=y\n+# CONFIG_NLMON is not set\n+# CONFIG_NLM_XLP_BOARD is not set\n+# CONFIG_NLM_XLR_BOARD is not set\n+# CONFIG_NLS is not set\n+# CONFIG_NLS_ASCII is not set\n+# CONFIG_NLS_CODEPAGE_1250 is not set\n+# CONFIG_NLS_CODEPAGE_1251 is not set\n+# CONFIG_NLS_CODEPAGE_437 is not set\n+# CONFIG_NLS_CODEPAGE_737 is not set\n+# CONFIG_NLS_CODEPAGE_775 is not set\n+# CONFIG_NLS_CODEPAGE_850 is not set\n+# CONFIG_NLS_CODEPAGE_852 is not set\n+# CONFIG_NLS_CODEPAGE_855 is not set\n+# CONFIG_NLS_CODEPAGE_857 is not set\n+# CONFIG_NLS_CODEPAGE_860 is not set\n+# CONFIG_NLS_CODEPAGE_861 is not set\n+# CONFIG_NLS_CODEPAGE_862 is not set\n+# CONFIG_NLS_CODEPAGE_863 is not set\n+# CONFIG_NLS_CODEPAGE_864 is not set\n+# CONFIG_NLS_CODEPAGE_865 is not set\n+# CONFIG_NLS_CODEPAGE_866 is not set\n+# CONFIG_NLS_CODEPAGE_869 is not set\n+# CONFIG_NLS_CODEPAGE_874 is not set\n+# CONFIG_NLS_CODEPAGE_932 is not set\n+# CONFIG_NLS_CODEPAGE_936 is not set\n+# CONFIG_NLS_CODEPAGE_949 is not set\n+# CONFIG_NLS_CODEPAGE_950 is not set\n+CONFIG_NLS_DEFAULT=\"iso8859-1\"\n+# CONFIG_NLS_ISO8859_1 is not set\n+# CONFIG_NLS_ISO8859_13 is not set\n+# CONFIG_NLS_ISO8859_14 is not set\n+# CONFIG_NLS_ISO8859_15 is not set\n+# CONFIG_NLS_ISO8859_2 is not set\n+# CONFIG_NLS_ISO8859_3 is not set\n+# CONFIG_NLS_ISO8859_4 is not set\n+# CONFIG_NLS_ISO8859_5 is not set\n+# CONFIG_NLS_ISO8859_6 is not set\n+# CONFIG_NLS_ISO8859_7 is not set\n+# CONFIG_NLS_ISO8859_8 is not set\n+# CONFIG_NLS_ISO8859_9 is not set\n+# CONFIG_NLS_KOI8_R is not set\n+# CONFIG_NLS_KOI8_U is not set\n+# CONFIG_NLS_MAC_CELTIC is not set\n+# CONFIG_NLS_MAC_CENTEURO is not set\n+# CONFIG_NLS_MAC_CROATIAN is not set\n+# CONFIG_NLS_MAC_CYRILLIC is not set\n+# CONFIG_NLS_MAC_GAELIC is not set\n+# CONFIG_NLS_MAC_GREEK is not set\n+# CONFIG_NLS_MAC_ICELAND is not set\n+# CONFIG_NLS_MAC_INUIT is not set\n+# CONFIG_NLS_MAC_ROMAN is not set\n+# CONFIG_NLS_MAC_ROMANIAN is not set\n+# CONFIG_NLS_MAC_TURKISH is not set\n+# CONFIG_NLS_UTF8 is not set\n+CONFIG_NMI_LOG_BUF_SHIFT=13\n+# CONFIG_NOA1305 is not set\n+# CONFIG_NOP_USB_XCEIV is not set\n+# CONFIG_NORTEL_HERMES is not set\n+# CONFIG_NOTIFIER_ERROR_INJECTION is not set\n+# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set\n+# CONFIG_NOZOMI is not set\n+# CONFIG_NO_BOOTMEM is not set\n+# CONFIG_NO_HZ is not set\n+# CONFIG_NO_HZ_FULL is not set\n+# CONFIG_NO_HZ_IDLE is not set\n+# CONFIG_NS83820 is not set\n+# CONFIG_NTB is not set\n+# CONFIG_NTFS_DEBUG is not set\n+# CONFIG_NTFS_FS is not set\n+# CONFIG_NTFS_RW is not set\n+# CONFIG_NTP_PPS is not set\n+# CONFIG_NULL_TTY is not set\n+# CONFIG_NUMA is not set\n+# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set\n+# CONFIG_NVM is not set\n+# CONFIG_NVMEM is not set\n+# CONFIG_NVMEM_BCM_OCOTP is not set\n+# CONFIG_NVMEM_IMX_OCOTP is not set\n+# CONFIG_NVMEM_REBOOT_MODE is not set\n+# CONFIG_NVMEM_SYSFS is not set\n+# CONFIG_NVME_FC is not set\n+# CONFIG_NVME_TARGET is not set\n+# CONFIG_NVRAM is not set\n+# CONFIG_NV_TCO is not set\n+# CONFIG_NXP_C45_TJA11XX_PHY is not set\n+# CONFIG_NXP_STB220 is not set\n+# CONFIG_NXP_STB225 is not set\n+# CONFIG_NXP_TJA11XX_PHY is not set\n+# CONFIG_N_GSM is not set\n+# CONFIG_OABI_COMPAT is not set\n+# CONFIG_OBS600 is not set\n+# CONFIG_OCFS2_FS is not set\n+# CONFIG_OCTEONTX2_PF is not set\n+# CONFIG_OF_OVERLAY is not set\n+CONFIG_OF_RESERVED_MEM=y\n+# CONFIG_OF_UNITTEST is not set\n+# CONFIG_OMAP2_DSS_DEBUG is not set\n+# CONFIG_OMAP2_DSS_DEBUGFS is not set\n+# CONFIG_OMAP2_DSS_SDI is not set\n+# CONFIG_OMAP_OCP2SCP is not set\n+# CONFIG_OMAP_USB2 is not set\n+# CONFIG_OMFS_FS is not set\n+# CONFIG_OPENVSWITCH is not set\n+# CONFIG_OPROFILE is not set\n+# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set\n+# CONFIG_OPT3001 is not set\n+CONFIG_OPTIMIZE_INLINING=y\n+# CONFIG_ORANGEFS_FS is not set\n+# CONFIG_ORION_WATCHDOG is not set\n+# CONFIG_OSF_PARTITION is not set\n+CONFIG_OVERLAY_FS=y\n+# CONFIG_OVERLAY_FS_INDEX is not set\n+# CONFIG_OVERLAY_FS_METACOPY is not set\n+CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y\n+# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set\n+CONFIG_OVERLAY_FS_XINO_AUTO=y\n+# CONFIG_OWL_LOADER is not set\n+# CONFIG_P54_COMMON is not set\n+# CONFIG_PA12203001 is not set\n+CONFIG_PACKET=y\n+# CONFIG_PACKET_DIAG is not set\n+# CONFIG_PACKING is not set\n+# CONFIG_PAGE_EXTENSION is not set\n+# CONFIG_PAGE_OWNER is not set\n+# CONFIG_PAGE_POISONING is not set\n+# CONFIG_PAGE_REPORTING is not set\n+# CONFIG_PAGE_SIZE_16KB is not set\n+# CONFIG_PAGE_SIZE_32KB is not set\n+CONFIG_PAGE_SIZE_4KB=y\n+# CONFIG_PAGE_SIZE_64KB is not set\n+# CONFIG_PAGE_SIZE_8KB is not set\n+# CONFIG_PALMAS_GPADC is not set\n+# CONFIG_PANASONIC_LAPTOP is not set\n+# CONFIG_PANEL is not set\n+CONFIG_PANIC_ON_OOPS=y\n+CONFIG_PANIC_ON_OOPS_VALUE=1\n+CONFIG_PANIC_TIMEOUT=1\n+# CONFIG_PANTHERLORD_FF is not set\n+# CONFIG_PARAVIRT is not set\n+# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set\n+# CONFIG_PARPORT is not set\n+# CONFIG_PARPORT_1284 is not set\n+# CONFIG_PARPORT_AX88796 is not set\n+# CONFIG_PARPORT_GSC is not set\n+# CONFIG_PARPORT_PC is not set\n+CONFIG_PARTITION_ADVANCED=y\n+# CONFIG_PATA_ALI is not set\n+# CONFIG_PATA_AMD is not set\n+# CONFIG_PATA_ARASAN_CF is not set\n+# CONFIG_PATA_ARTOP is not set\n+# CONFIG_PATA_ATIIXP is not set\n+# CONFIG_PATA_ATP867X is not set\n+# CONFIG_PATA_CMD640_PCI is not set\n+# CONFIG_PATA_CMD64X is not set\n+# CONFIG_PATA_CS5520 is not set\n+# CONFIG_PATA_CS5530 is not set\n+# CONFIG_PATA_CS5535 is not set\n+# CONFIG_PATA_CS5536 is not set\n+# CONFIG_PATA_CYPRESS is not set\n+# CONFIG_PATA_EFAR is not set\n+# CONFIG_PATA_HPT366 is not set\n+# CONFIG_PATA_HPT37X is not set\n+# CONFIG_PATA_HPT3X2N is not set\n+# CONFIG_PATA_HPT3X3 is not set\n+# CONFIG_PATA_IMX is not set\n+# CONFIG_PATA_ISAPNP is not set\n+# CONFIG_PATA_IT8213 is not set\n+# CONFIG_PATA_IT821X is not set\n+# CONFIG_PATA_JMICRON is not set\n+# CONFIG_PATA_LEGACY is not set\n+# CONFIG_PATA_MARVELL is not set\n+# CONFIG_PATA_MPIIX is not set\n+# CONFIG_PATA_NETCELL is not set\n+# CONFIG_PATA_NINJA32 is not set\n+# CONFIG_PATA_NS87410 is not set\n+# CONFIG_PATA_NS87415 is not set\n+# CONFIG_PATA_OCTEON_CF is not set\n+# CONFIG_PATA_OF_PLATFORM is not set\n+# CONFIG_PATA_OLDPIIX is not set\n+# CONFIG_PATA_OPTI is not set\n+# CONFIG_PATA_OPTIDMA is not set\n+# CONFIG_PATA_PCMCIA is not set\n+# CONFIG_PATA_PDC2027X is not set\n+# CONFIG_PATA_PDC_OLD is not set\n+# CONFIG_PATA_PLATFORM is not set\n+# CONFIG_PATA_QDI is not set\n+# CONFIG_PATA_RADISYS is not set\n+# CONFIG_PATA_RDC is not set\n+# CONFIG_PATA_RZ1000 is not set\n+# CONFIG_PATA_SC1200 is not set\n+# CONFIG_PATA_SCH is not set\n+# CONFIG_PATA_SERVERWORKS is not set\n+# CONFIG_PATA_SIL680 is not set\n+# CONFIG_PATA_SIS is not set\n+# CONFIG_PATA_TOSHIBA is not set\n+# CONFIG_PATA_TRIFLEX is not set\n+# CONFIG_PATA_VIA is not set\n+# CONFIG_PATA_WINBOND is not set\n+# CONFIG_PATA_WINBOND_VLB is not set\n+# CONFIG_PC104 is not set\n+# CONFIG_PC300TOO is not set\n+# CONFIG_PCCARD is not set\n+# CONFIG_PCH_DMA is not set\n+# CONFIG_PCH_GBE is not set\n+# CONFIG_PCH_PHUB is not set\n+# CONFIG_PCI is not set\n+# CONFIG_PCI200SYN is not set\n+# CONFIG_PCIEAER is not set\n+# CONFIG_PCIEAER_INJECT is not set\n+# CONFIG_PCIEASPM is not set\n+# CONFIG_PCIEPORTBUS is not set\n+# CONFIG_PCIE_AL is not set\n+# CONFIG_PCIE_ALTERA is not set\n+# CONFIG_PCIE_ARMADA_8K is not set\n+CONFIG_PCIE_BUS_DEFAULT=y\n+# CONFIG_PCIE_BUS_PEER2PEER is not set\n+# CONFIG_PCIE_BUS_PERFORMANCE is nit set\n+# CONFIG_PCIE_BUS_SAFE is not set\n+# CONFIG_PCIE_BUS_TUNE_OFF is not set\n+# CONFIG_PCIE_BW is not set\n+# CONFIG_PCIE_CADENCE_HOST is not set\n+# CONFIG_PCIE_CADENCE_PLAT_HOST is not set\n+# CONFIG_PCIE_DPC is not set\n+# CONFIG_PCIE_DW_PLAT is not set\n+# CONFIG_PCIE_DW_PLAT_HOST is not set\n+# CONFIG_PCIE_ECRC is not set\n+# CONFIG_PCIE_IPROC is not set\n+# CONFIG_PCIE_KIRIN is not set\n+# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set\n+# CONFIG_PCIE_PTM is not set\n+# CONFIG_PCIE_XILINX is not set\n+# CONFIG_PCIPCWATCHDOG is not set\n+# CONFIG_PCI_ATMEL is not set\n+# CONFIG_PCI_CNB20LE_QUIRK is not set\n+# CONFIG_PCI_DEBUG is not set\n+# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set\n+# CONFIG_PCI_ENDPOINT is not set\n+# CONFIG_PCI_ENDPOINT_TEST is not set\n+# CONFIG_PCI_FTPCI100 is not set\n+# CONFIG_PCI_HERMES is not set\n+# CONFIG_PCI_HISI is not set\n+# CONFIG_PCI_HOST_GENERIC is not set\n+# CONFIG_PCI_HOST_THUNDER_ECAM is not set\n+# CONFIG_PCI_HOST_THUNDER_PEM is not set\n+# CONFIG_PCI_IOV is not set\n+# CONFIG_PCI_J721E_HOST is not set\n+# CONFIG_PCI_LAYERSCAPE is not set\n+# CONFIG_PCI_MESON is not set\n+# CONFIG_PCI_MSI is not set\n+# CONFIG_PCI_PASID is not set\n+# CONFIG_PCI_PF_STUB is not set\n+# CONFIG_PCI_PRI is not set\n+CONFIG_PCI_QUIRKS=y\n+# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set\n+# CONFIG_PCI_STUB is not set\n+# CONFIG_PCI_SW_SWITCHTEC is not set\n+CONFIG_PCI_SYSCALL=y\n+# CONFIG_PCI_V3_SEMI is not set\n+# CONFIG_PCI_XGENE is not set\n+# CONFIG_PCMCIA is not set\n+# CONFIG_PCMCIA_3C574 is not set\n+# CONFIG_PCMCIA_3C589 is not set\n+# CONFIG_PCMCIA_AHA152X is not set\n+# CONFIG_PCMCIA_ATMEL is not set\n+# CONFIG_PCMCIA_AXNET is not set\n+# CONFIG_PCMCIA_DEBUG is not set\n+# CONFIG_PCMCIA_FDOMAIN is not set\n+# CONFIG_PCMCIA_FMVJ18X is not set\n+# CONFIG_PCMCIA_HERMES is not set\n+# CONFIG_PCMCIA_LOAD_CIS is not set\n+# CONFIG_PCMCIA_NINJA_SCSI is not set\n+# CONFIG_PCMCIA_NMCLAN is not set\n+# CONFIG_PCMCIA_PCNET is not set\n+# CONFIG_PCMCIA_QLOGIC is not set\n+# CONFIG_PCMCIA_RAYCS is not set\n+# CONFIG_PCMCIA_SMC91C92 is not set\n+# CONFIG_PCMCIA_SPECTRUM is not set\n+# CONFIG_PCMCIA_SYM53C500 is not set\n+# CONFIG_PCMCIA_WL3501 is not set\n+# CONFIG_PCMCIA_XIRC2PS is not set\n+# CONFIG_PCMCIA_XIRCOM is not set\n+# CONFIG_PCNET32 is not set\n+# CONFIG_PCSPKR_PLATFORM is not set\n+CONFIG_PCPU_DEV_REFCNT=y\n+# CONFIG_PCS_XPCS is not set\n+# CONFIG_PD6729 is not set\n+# CONFIG_PDA_POWER is not set\n+# CONFIG_PDC_ADMA is not set\n+# CONFIG_PERCPU_STATS is not set\n+# CONFIG_PERCPU_TEST is not set\n+# CONFIG_PERF_EVENTS is not set\n+# CONFIG_PERF_EVENTS_AMD_POWER is not set\n+# CONFIG_PERSISTENT_KEYRINGS is not set\n+# CONFIG_PHANTOM is not set\n+# CONFIG_PHONET is not set\n+# CONFIG_PHYLIB is not set\n+# CONFIG_PHYS_ADDR_T_64BIT is not set\n+# CONFIG_PHY_CADENCE_DP is not set\n+# CONFIG_PHY_CADENCE_DPHY is not set\n+# CONFIG_PHY_CADENCE_SALVO is not set\n+# CONFIG_PHY_CADENCE_SIERRA is not set\n+# CONFIG_PHY_CADENCE_TORRENT is not set\n+# CONFIG_PHY_CAN_TRANSCEIVER is not set\n+# CONFIG_PHY_CPCAP_USB is not set\n+# CONFIG_PHY_EXYNOS_DP_VIDEO is not set\n+# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set\n+# CONFIG_PHY_FSL_IMX8MQ_USB is not set\n+# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set\n+# CONFIG_PHY_MAPPHONE_MDM6600 is not set\n+# CONFIG_PHY_MIXEL_MIPI_DPHY is not set\n+# CONFIG_PHY_MTK_HDMI is not set\n+# CONFIG_PHY_OCELOT_SERDES is not set\n+# CONFIG_PHY_PXA_28NM_HSIC is not set\n+# CONFIG_PHY_PXA_28NM_USB2 is not set\n+# CONFIG_PHY_QCOM_DWC3 is not set\n+# CONFIG_PHY_QCOM_USB_HS is not set\n+# CONFIG_PHY_QCOM_USB_HSIC is not set\n+# CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set\n+# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set\n+# CONFIG_PHY_SAMSUNG_USB2 is not set\n+# CONFIG_PHY_TUSB1210 is not set\n+# CONFIG_PHY_XGENE is not set\n+# CONFIG_PI433 is not set\n+# CONFIG_PID_IN_CONTEXTIDR is not set\n+# CONFIG_PID_NS is not set\n+CONFIG_PINCONF=y\n+# CONFIG_PINCTRL is not set\n+# CONFIG_PINCTRL_AMD is not set\n+# CONFIG_PINCTRL_AXP209 is not set\n+# CONFIG_PINCTRL_CEDARFORK is not set\n+# CONFIG_PINCTRL_EXYNOS is not set\n+# CONFIG_PINCTRL_EXYNOS5440 is not set\n+# CONFIG_PINCTRL_ICELAKE is not set\n+# CONFIG_PINCTRL_INGENIC is not set\n+# CONFIG_PINCTRL_MCP23S08 is not set\n+# CONFIG_PINCTRL_MSM8X74 is not set\n+# CONFIG_PINCTRL_MT6779 is not set\n+# CONFIG_PINCTRL_MT8167 is not set\n+# CONFIG_PINCTRL_MT8192 is not set\n+# CONFIG_PINCTRL_MTK_V2 is not set\n+# CONFIG_PINCTRL_OCELOT is not set\n+CONFIG_PINCTRL_SINGLE=y\n+# CONFIG_PINCTRL_STMFX is not set\n+# CONFIG_PINCTRL_SX150X is not set\n+# CONFIG_PING is not set\n+CONFIG_PINMUX=y\n+# CONFIG_PKCS7_MESSAGE_PARSER is not set\n+# CONFIG_PL310_ERRATA_588369 is not set\n+# CONFIG_PL310_ERRATA_727915 is not set\n+# CONFIG_PL310_ERRATA_753970 is not set\n+# CONFIG_PL310_ERRATA_769419 is not set\n+# CONFIG_PL320_MBOX is not set\n+# CONFIG_PL330_DMA is not set\n+# CONFIG_PLATFORM_MHU is not set\n+# CONFIG_PLAT_SPEAR is not set\n+# CONFIG_PLIP is not set\n+# CONFIG_PLX_DMA is not set\n+# CONFIG_PLX_HERMES is not set\n+# CONFIG_PM is not set\n+# CONFIG_PMBUS is not set\n+# CONFIG_PMC_MSP is not set\n+# CONFIG_PMIC_ADP5520 is not set\n+# CONFIG_PMIC_DA903X is not set\n+# CONFIG_PMS7003 is not set\n+# CONFIG_PM_AUTOSLEEP is not set\n+# CONFIG_PM_DEBUG is not set\n+# CONFIG_PM_DEVFREQ is not set\n+# CONFIG_PM_WAKELOCKS is not set\n+# CONFIG_POSIX_MQUEUE is not set\n+CONFIG_POSIX_TIMERS=y\n+# CONFIG_POWERCAP is not set\n+# CONFIG_POWER_AVS is not set\n+# CONFIG_POWER_RESET is not set\n+# CONFIG_POWER_RESET_BRCMKONA is not set\n+# CONFIG_POWER_RESET_BRCMSTB is not set\n+# CONFIG_POWER_RESET_GPIO is not set\n+# CONFIG_POWER_RESET_GPIO_RESTART is not set\n+# CONFIG_POWER_RESET_LINKSTATION is not set\n+# CONFIG_POWER_RESET_LTC2952 is not set\n+# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set\n+# CONFIG_POWER_RESET_RESTART is not set\n+# CONFIG_POWER_RESET_SYSCON is not set\n+# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set\n+# CONFIG_POWER_RESET_VERSATILE is not set\n+# CONFIG_POWER_RESET_XGENE is not set\n+# CONFIG_POWER_SUPPLY is not set\n+# CONFIG_POWER_SUPPLY_DEBUG is not set\n+# CONFIG_POWER_SUPPLY_HWMON is not set\n+# CONFIG_PPC4xx_GPIO is not set\n+# CONFIG_PPC_16K_PAGES is not set\n+# CONFIG_PPC_256K_PAGES is not set\n+CONFIG_PPC_4K_PAGES=y\n+# CONFIG_PPC_64K_PAGES is not set\n+# CONFIG_PPC_DISABLE_WERROR is not set\n+# CONFIG_PPC_EMULATED_STATS is not set\n+# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set\n+# CONFIG_PPP is not set\n+# CONFIG_PPPOATM is not set\n+# CONFIG_PPPOE is not set\n+# CONFIG_PPPOL2TP is not set\n+# CONFIG_PPP_ASYNC is not set\n+# CONFIG_PPP_BSDCOMP is not set\n+# CONFIG_PPP_DEFLATE is not set\n+CONFIG_PPP_FILTER=y\n+# CONFIG_PPP_MPPE is not set\n+CONFIG_PPP_MULTILINK=y\n+# CONFIG_PPP_SYNC_TTY is not set\n+# CONFIG_PPS is not set\n+# CONFIG_PPS_CLIENT_GPIO is not set\n+# CONFIG_PPS_CLIENT_KTIMER is not set\n+# CONFIG_PPS_CLIENT_LDISC is not set\n+# CONFIG_PPS_CLIENT_PARPORT is not set\n+# CONFIG_PPS_DEBUG is not set\n+# CONFIG_PPTP is not set\n+# CONFIG_PREEMPT is not set\n+# CONFIG_PREEMPTIRQ_DELAY_TEST is not set\n+# CONFIG_PREEMPTIRQ_EVENTS is not set\n+CONFIG_PREEMPT_NONE=y\n+# CONFIG_PREEMPT_TRACER is not set\n+# CONFIG_PREEMPT_VOLUNTARY is not set\n+# CONFIG_PRESTERA is not set\n+CONFIG_PREVENT_FIRMWARE_BUILD=y\n+# CONFIG_PRIME_NUMBERS is not set\n+CONFIG_PRINTK=y\n+# CONFIG_PRINTK_CALLER is not set\n+CONFIG_PRINTK_NMI=y\n+CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13\n+# CONFIG_PRINTK_TIME is not set\n+CONFIG_PRINT_STACK_DEPTH=64\n+# CONFIG_PRISM2_USB is not set\n+# CONFIG_PRISM54 is not set\n+# CONFIG_PROC_CHILDREN is not set\n+CONFIG_PROC_FS=y\n+# CONFIG_PROC_KCORE is not set\n+# CONFIG_PROC_PAGE_MONITOR is not set\n+# CONFIG_PROC_STRIPPED is not set\n+CONFIG_PROC_SYSCTL=y\n+# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set\n+# CONFIG_PROFILE_ALL_BRANCHES is not set\n+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set\n+# CONFIG_PROFILING is not set\n+# CONFIG_PROVE_LOCKING is not set\n+# CONFIG_PROVE_RCU is not set\n+# CONFIG_PROVE_RCU_LIST is not set\n+# CONFIG_PROVE_RCU_REPEATEDLY is not set\n+# CONFIG_PSAMPLE is not set\n+# CONFIG_PSB6970_PHY is not set\n+# CONFIG_PSI is not set\n+# CONFIG_PSTORE is not set\n+# CONFIG_PTDUMP_DEBUGFS is not set\n+# CONFIG_PTP_1588_CLOCK is not set\n+# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set\n+# CONFIG_PTP_1588_CLOCK_IDTCM is not set\n+# CONFIG_PTP_1588_CLOCK_IXP46X is not set\n+# CONFIG_PTP_1588_CLOCK_KVM is not set\n+# CONFIG_PTP_1588_CLOCK_OCP is not set\n+# CONFIG_PTP_1588_CLOCK_PCH is not set\n+# CONFIG_PTP_1588_CLOCK_VMW is not set\n+# CONFIG_PUBLIC_KEY_ALGO_RSA is not set\n+# CONFIG_PVPANIC is not set\n+# CONFIG_PWM is not set\n+# CONFIG_PWM_DEBUG is not set\n+# CONFIG_PWM_FSL_FTM is not set\n+# CONFIG_PWM_PCA9685 is not set\n+CONFIG_PWRSEQ_EMMC=y\n+# CONFIG_PWRSEQ_SD8787 is not set\n+CONFIG_PWRSEQ_SIMPLE=y\n+# CONFIG_QCA7000 is not set\n+# CONFIG_QCA7000_SPI is not set\n+# CONFIG_QCA7000_UART is not set\n+# CONFIG_QCOM_EMAC is not set\n+# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set\n+# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set\n+# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set\n+# CONFIG_QCOM_HIDMA is not set\n+# CONFIG_QCOM_HIDMA_MGMT is not set\n+# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set\n+# CONFIG_QCOM_SPMI_ADC5 is not set\n+# CONFIG_QCOM_SPMI_IADC is not set\n+# CONFIG_QCOM_SPMI_TEMP_ALARM is not set\n+# CONFIG_QCOM_SPMI_VADC is not set\n+# CONFIG_QED is not set\n+# CONFIG_QLA3XXX is not set\n+# CONFIG_QLCNIC is not set\n+# CONFIG_QLGE is not set\n+# CONFIG_QNX4FS_FS is not set\n+# CONFIG_QNX6FS_FS is not set\n+# CONFIG_QORIQ_CPUFREQ is not set\n+# CONFIG_QORIQ_THERMAL is not set\n+# CONFIG_QRTR is not set\n+# CONFIG_QSEMI_PHY is not set\n+# CONFIG_QUEUED_LOCK_STAT is not set\n+# CONFIG_QUICC_ENGINE is not set\n+# CONFIG_QUOTA is not set\n+# CONFIG_QUOTACTL is not set\n+# CONFIG_QUOTA_DEBUG is not set\n+# CONFIG_R3964 is not set\n+# CONFIG_R6040 is not set\n+# CONFIG_R8169 is not set\n+# CONFIG_R8188EU is not set\n+# CONFIG_R8712U is not set\n+# CONFIG_R8723AU is not set\n+# CONFIG_RADIO_ADAPTERS is not set\n+# CONFIG_RADIO_AZTECH is not set\n+# CONFIG_RADIO_CADET is not set\n+# CONFIG_RADIO_GEMTEK is not set\n+# CONFIG_RADIO_MAXIRADIO is not set\n+# CONFIG_RADIO_RTRACK is not set\n+# CONFIG_RADIO_RTRACK2 is not set\n+# CONFIG_RADIO_SF16FMI is not set\n+# CONFIG_RADIO_SF16FMR2 is not set\n+# CONFIG_RADIO_TERRATEC is not set\n+# CONFIG_RADIO_TRUST is not set\n+# CONFIG_RADIO_TYPHOON is not set\n+# CONFIG_RADIO_ZOLTRIX is not set\n+# CONFIG_RAID6_PQ_BENCHMARK is not set\n+# CONFIG_RAID_ATTRS is not set\n+# CONFIG_RALINK is not set\n+# CONFIG_RANDOM32_SELFTEST is not set\n+# CONFIG_RANDOMIZE_BASE is not set\n+# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set\n+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set\n+# CONFIG_RANDOM_TRUST_CPU is not set\n+# CONFIG_RAPIDIO is not set\n+# CONFIG_RAS is not set\n+# CONFIG_RAW_DRIVER is not set\n+# CONFIG_RBTREE_TEST is not set\n+# CONFIG_RCU_BOOST is not set\n+CONFIG_RCU_CPU_STALL_TIMEOUT=60\n+# CONFIG_RCU_EQS_DEBUG is not set\n+# CONFIG_RCU_EXPEDITE_BOOT is not set\n+CONFIG_RCU_EXPERT=y\n+CONFIG_RCU_FANOUT=32\n+CONFIG_RCU_FANOUT_LEAF=16\n+# CONFIG_RCU_FAST_NO_HZ is not set\n+CONFIG_RCU_KTHREAD_PRIO=0\n+# CONFIG_RCU_NOCB_CPU is not set\n+# CONFIG_RCU_PERF_TEST is not set\n+# CONFIG_RCU_REF_SCALE_TEST is not set\n+# CONFIG_RCU_SCALE_TEST is not set\n+# CONFIG_RCU_STRICT_GRACE_PERIOD is not set\n+# CONFIG_RCU_TORTURE_TEST is not set\n+CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3\n+# CONFIG_RCU_TRACE is not set\n+# CONFIG_RC_ATI_REMOTE is not set\n+# CONFIG_RC_CORE is not set\n+# CONFIG_RC_DECODERS is not set\n+# CONFIG_RC_LOOPBACK is not set\n+# CONFIG_RC_MAP is not set\n+# CONFIG_RDS is not set\n+# CONFIG_RD_BZIP2 is not set\n+# CONFIG_RD_GZIP is not set\n+# CONFIG_RD_LZ4 is not set\n+# CONFIG_RD_LZMA is not set\n+# CONFIG_RD_LZO is not set\n+# CONFIG_RD_XZ is not set\n+# CONFIG_RD_ZSTD is not set\n+# CONFIG_READABLE_ASM is not set\n+# CONFIG_READ_ONLY_THP_FOR_FS is not set\n+# CONFIG_REALTEK_PHY is not set\n+# CONFIG_REDWOOD is not set\n+# CONFIG_REED_SOLOMON_TEST is not set\n+# CONFIG_REGMAP is not set\n+# CONFIG_REGMAP_I2C is not set\n+# CONFIG_REGMAP_MMIO is not set\n+# CONFIG_REGMAP_SPI is not set\n+# CONFIG_REGULATOR is not set\n+# CONFIG_REGULATOR_88PG86X is not set\n+# CONFIG_REGULATOR_ACT8865 is not set\n+# CONFIG_REGULATOR_AD5398 is not set\n+# CONFIG_REGULATOR_ANATOP is not set\n+# CONFIG_REGULATOR_DA9210 is not set\n+# CONFIG_REGULATOR_DA9211 is not set\n+# CONFIG_REGULATOR_DEBUG is not set\n+# CONFIG_REGULATOR_FAN53555 is not set\n+# CONFIG_REGULATOR_FAN53880 is not set\n+# CONFIG_REGULATOR_FIXED_VOLTAGE is not set\n+# CONFIG_REGULATOR_GPIO is not set\n+# CONFIG_REGULATOR_ISL6271A is not set\n+# CONFIG_REGULATOR_ISL9305 is not set\n+# CONFIG_REGULATOR_LP3971 is not set\n+# CONFIG_REGULATOR_LP3972 is not set\n+# CONFIG_REGULATOR_LP872X is not set\n+# CONFIG_REGULATOR_LP8755 is not set\n+# CONFIG_REGULATOR_LTC3589 is not set\n+# CONFIG_REGULATOR_LTC3676 is not set\n+# CONFIG_REGULATOR_MAX1586 is not set\n+# CONFIG_REGULATOR_MAX77620 is not set\n+# CONFIG_REGULATOR_MAX77826 is not set\n+# CONFIG_REGULATOR_MAX8649 is not set\n+# CONFIG_REGULATOR_MAX8660 is not set\n+# CONFIG_REGULATOR_MAX8893 is not set\n+# CONFIG_REGULATOR_MAX8952 is not set\n+# CONFIG_REGULATOR_MAX8973 is not set\n+# CONFIG_REGULATOR_MCP16502 is not set\n+# CONFIG_REGULATOR_MP5416 is not set\n+# CONFIG_REGULATOR_MP8859 is not set\n+# CONFIG_REGULATOR_MP886X is not set\n+# CONFIG_REGULATOR_MPQ7920 is not set\n+# CONFIG_REGULATOR_MT6311 is not set\n+# CONFIG_REGULATOR_PCA9450 is not set\n+# CONFIG_REGULATOR_PFUZE100 is not set\n+# CONFIG_REGULATOR_PV88060 is not set\n+# CONFIG_REGULATOR_PV88080 is not set\n+# CONFIG_REGULATOR_PV88090 is not set\n+# CONFIG_REGULATOR_PWM is not set\n+# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set\n+# CONFIG_REGULATOR_RT4801 is not set\n+# CONFIG_REGULATOR_RT6160 is not set\n+# CONFIG_REGULATOR_RT6245 is not set\n+# CONFIG_REGULATOR_RTMV20 is not set\n+# CONFIG_REGULATOR_SLG51000 is not set\n+# CONFIG_REGULATOR_SY8106A is not set\n+# CONFIG_REGULATOR_SY8824X is not set\n+# CONFIG_REGULATOR_SY8827N is not set\n+# CONFIG_REGULATOR_TI_ABB is not set\n+# CONFIG_REGULATOR_TPS51632 is not set\n+# CONFIG_REGULATOR_TPS62360 is not set\n+# CONFIG_REGULATOR_TPS65023 is not set\n+# CONFIG_REGULATOR_TPS6507X is not set\n+# CONFIG_REGULATOR_TPS65132 is not set\n+# CONFIG_REGULATOR_TPS6524X is not set\n+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set\n+# CONFIG_REGULATOR_VCTRL is not set\n+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set\n+# CONFIG_REISERFS_CHECK is not set\n+# CONFIG_REISERFS_FS is not set\n+# CONFIG_REISERFS_FS_POSIX_ACL is not set\n+# CONFIG_REISERFS_FS_SECURITY is not set\n+CONFIG_REISERFS_FS_XATTR=y\n+# CONFIG_REISERFS_PROC_INFO is not set\n+# CONFIG_RELAY is not set\n+# CONFIG_RELOCATABLE is not set\n+# CONFIG_REMOTEPROC is not set\n+# CONFIG_RENESAS_PHY is not set\n+# CONFIG_RESET_ATH79 is not set\n+# CONFIG_RESET_BERLIN is not set\n+# CONFIG_RESET_BRCMSTB_RESCAL is not set\n+# CONFIG_RESET_CONTROLLER is not set\n+# CONFIG_RESET_IMX7 is not set\n+# CONFIG_RESET_INTEL_GW is not set\n+# CONFIG_RESET_LANTIQ is not set\n+# CONFIG_RESET_LPC18XX is not set\n+# CONFIG_RESET_MCHP_SPARX5 is not set\n+# CONFIG_RESET_MESON is not set\n+# CONFIG_RESET_PISTACHIO is not set\n+# CONFIG_RESET_SOCFPGA is not set\n+# CONFIG_RESET_STM32 is not set\n+# CONFIG_RESET_SUNXI is not set\n+# CONFIG_RESET_TEGRA_BPMP is not set\n+# CONFIG_RESET_TI_SYSCON is not set\n+# CONFIG_RESET_ZYNQ is not set\n+# CONFIG_RFD77402 is not set\n+# CONFIG_RFD_FTL is not set\n+CONFIG_RFKILL=y\n+# CONFIG_RFKILL_FULL is not set\n+# CONFIG_RFKILL_GPIO is not set\n+# CONFIG_RFKILL_INPUT is not set\n+# CONFIG_RFKILL_LEDS is not set\n+# CONFIG_RFKILL_REGULATOR is not set\n+# CONFIG_RING_BUFFER_BENCHMARK is not set\n+# CONFIG_RING_BUFFER_STARTUP_TEST is not set\n+# CONFIG_RMI4_CORE is not set\n+# CONFIG_RMNET is not set\n+# CONFIG_ROCKCHIP_PHY is not set\n+# CONFIG_ROCKER is not set\n+# CONFIG_ROMFS_FS is not set\n+# CONFIG_ROSE is not set\n+# CONFIG_RPCSEC_GSS_KRB5 is not set\n+# CONFIG_RPMSG_QCOM_GLINK_RPM is not set\n+# CONFIG_RPMSG_VIRTIO is not set\n+# CONFIG_RPR0521 is not set\n+# CONFIG_RSEQ is not set\n+# CONFIG_RT2X00 is not set\n+# CONFIG_RTC_CLASS is not set\n+# CONFIG_RTC_DEBUG is not set\n+# CONFIG_RTC_DRV_ABB5ZES3 is not set\n+# CONFIG_RTC_DRV_ABEOZ9 is not set\n+# CONFIG_RTC_DRV_ABX80X is not set\n+# CONFIG_RTC_DRV_ARMADA38X is not set\n+# CONFIG_RTC_DRV_AU1XXX is not set\n+# CONFIG_RTC_DRV_BQ32K is not set\n+# CONFIG_RTC_DRV_BQ4802 is not set\n+# CONFIG_RTC_DRV_CADENCE is not set\n+CONFIG_RTC_DRV_CMOS=y\n+# CONFIG_RTC_DRV_DS1286 is not set\n+# CONFIG_RTC_DRV_DS1302 is not set\n+# CONFIG_RTC_DRV_DS1305 is not set\n+# CONFIG_RTC_DRV_DS1307 is not set\n+# CONFIG_RTC_DRV_DS1307_CENTURY is not set\n+# CONFIG_RTC_DRV_DS1307_HWMON is not set\n+# CONFIG_RTC_DRV_DS1343 is not set\n+# CONFIG_RTC_DRV_DS1347 is not set\n+# CONFIG_RTC_DRV_DS1374 is not set\n+# CONFIG_RTC_DRV_DS1390 is not set\n+# CONFIG_RTC_DRV_DS1511 is not set\n+# CONFIG_RTC_DRV_DS1553 is not set\n+# CONFIG_RTC_DRV_DS1672 is not set\n+# CONFIG_RTC_DRV_DS1685_FAMILY is not set\n+# CONFIG_RTC_DRV_DS1742 is not set\n+# CONFIG_RTC_DRV_DS2404 is not set\n+# CONFIG_RTC_DRV_DS3232 is not set\n+# CONFIG_RTC_DRV_DS3234 is not set\n+# CONFIG_RTC_DRV_EM3027 is not set\n+# CONFIG_RTC_DRV_EP93XX is not set\n+# CONFIG_RTC_DRV_FM3130 is not set\n+# CONFIG_RTC_DRV_FTRTC010 is not set\n+# CONFIG_RTC_DRV_GENERIC is not set\n+# CONFIG_RTC_DRV_GOLDFISH is not set\n+# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set\n+# CONFIG_RTC_DRV_HYM8563 is not set\n+# CONFIG_RTC_DRV_ISL12022 is not set\n+# CONFIG_RTC_DRV_ISL12026 is not set\n+# CONFIG_RTC_DRV_ISL12057 is not set\n+# CONFIG_RTC_DRV_ISL1208 is not set\n+# CONFIG_RTC_DRV_JZ4740 is not set\n+# CONFIG_RTC_DRV_M41T80 is not set\n+# CONFIG_RTC_DRV_M41T93 is not set\n+# CONFIG_RTC_DRV_M41T94 is not set\n+# CONFIG_RTC_DRV_M48T35 is not set\n+# CONFIG_RTC_DRV_M48T59 is not set\n+# CONFIG_RTC_DRV_M48T86 is not set\n+# CONFIG_RTC_DRV_MAX6900 is not set\n+# CONFIG_RTC_DRV_MAX6902 is not set\n+# CONFIG_RTC_DRV_MAX6916 is not set\n+# CONFIG_RTC_DRV_MCP795 is not set\n+# CONFIG_RTC_DRV_MOXART is not set\n+# CONFIG_RTC_DRV_MPC5121 is not set\n+# CONFIG_RTC_DRV_MSM6242 is not set\n+# CONFIG_RTC_DRV_MT2712 is not set\n+# CONFIG_RTC_DRV_OMAP is not set\n+# CONFIG_RTC_DRV_PCF2123 is not set\n+# CONFIG_RTC_DRV_PCF2127 is not set\n+# CONFIG_RTC_DRV_PCF85063 is not set\n+# CONFIG_RTC_DRV_PCF8523 is not set\n+# CONFIG_RTC_DRV_PCF85363 is not set\n+# CONFIG_RTC_DRV_PCF8563 is not set\n+# CONFIG_RTC_DRV_PCF8583 is not set\n+# CONFIG_RTC_DRV_PL030 is not set\n+# CONFIG_RTC_DRV_PL031 is not set\n+# CONFIG_RTC_DRV_PS3 is not set\n+# CONFIG_RTC_DRV_PT7C4338 is not set\n+# CONFIG_RTC_DRV_R7301 is not set\n+# CONFIG_RTC_DRV_R9701 is not set\n+# CONFIG_RTC_DRV_RP5C01 is not set\n+# CONFIG_RTC_DRV_RS5C348 is not set\n+# CONFIG_RTC_DRV_RS5C372 is not set\n+# CONFIG_RTC_DRV_RTC7301 is not set\n+# CONFIG_RTC_DRV_RV3028 is not set\n+# CONFIG_RTC_DRV_RV3029C2 is not set\n+# CONFIG_RTC_DRV_RV3032 is not set\n+# CONFIG_RTC_DRV_RV8803 is not set\n+# CONFIG_RTC_DRV_RX4581 is not set\n+# CONFIG_RTC_DRV_RX6110 is not set\n+# CONFIG_RTC_DRV_RX8010 is not set\n+# CONFIG_RTC_DRV_RX8025 is not set\n+# CONFIG_RTC_DRV_RX8581 is not set\n+# CONFIG_RTC_DRV_S35390A is not set\n+# CONFIG_RTC_DRV_SD3078 is not set\n+# CONFIG_RTC_DRV_SNVS is not set\n+# CONFIG_RTC_DRV_STK17TA8 is not set\n+# CONFIG_RTC_DRV_SUN6I is not set\n+# CONFIG_RTC_DRV_TEST is not set\n+# CONFIG_RTC_DRV_V3020 is not set\n+# CONFIG_RTC_DRV_X1205 is not set\n+# CONFIG_RTC_DRV_XGENE is not set\n+# CONFIG_RTC_DRV_ZYNQMP is not set\n+CONFIG_RTC_HCTOSYS=y\n+CONFIG_RTC_HCTOSYS_DEVICE=\"rtc0\"\n+CONFIG_RTC_INTF_DEV=y\n+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set\n+CONFIG_RTC_INTF_PROC=y\n+CONFIG_RTC_INTF_SYSFS=y\n+CONFIG_RTC_LIB=y\n+# CONFIG_RTC_NVMEM is not set\n+CONFIG_RTC_SYSTOHC=y\n+CONFIG_RTC_SYSTOHC_DEVICE=\"rtc0\"\n+# CONFIG_RTL8180 is not set\n+# CONFIG_RTL8187 is not set\n+# CONFIG_RTL8192E is not set\n+# CONFIG_RTL8192U is not set\n+# CONFIG_RTL8306_PHY is not set\n+# CONFIG_RTL8366RB_PHY is not set\n+# CONFIG_RTL8366S_PHY is not set\n+# CONFIG_RTL8366_SMI is not set\n+# CONFIG_RTL8366_SMI_DEBUG_FS is not set\n+# CONFIG_RTL8367B_PHY is not set\n+# CONFIG_RTL8367_PHY is not set\n+# CONFIG_RTLLIB is not set\n+# CONFIG_RTL_CARDS is not set\n+# CONFIG_RTS5208 is not set\n+CONFIG_RT_MUTEXES=y\n+# CONFIG_RUNTIME_DEBUG is not set\n+CONFIG_RUNTIME_TESTING_MENU=y\n+CONFIG_RWSEM_GENERIC_SPINLOCK=y\n+CONFIG_RXKAD=y\n+# CONFIG_S2IO is not set\n+# CONFIG_SAMPLES is not set\n+# CONFIG_SAMSUNG_LAPTOP is not set\n+# CONFIG_SATA_ACARD_AHCI is not set\n+# CONFIG_SATA_AHCI is not set\n+# CONFIG_SATA_AHCI_PLATFORM is not set\n+# CONFIG_SATA_DWC is not set\n+# CONFIG_SATA_FSL is not set\n+# CONFIG_SATA_HIGHBANK is not set\n+# CONFIG_SATA_HOST is not set\n+# CONFIG_SATA_INIC162X is not set\n+CONFIG_SATA_MOBILE_LPM_POLICY=0\n+# CONFIG_SATA_MV is not set\n+# CONFIG_SATA_NV is not set\n+# CONFIG_SATA_PMP is not set\n+# CONFIG_SATA_PROMISE is not set\n+# CONFIG_SATA_QSTOR is not set\n+# CONFIG_SATA_RCAR is not set\n+# CONFIG_SATA_SIL is not set\n+# CONFIG_SATA_SIL24 is not set\n+# CONFIG_SATA_SIS is not set\n+# CONFIG_SATA_SVW is not set\n+# CONFIG_SATA_SX4 is not set\n+# CONFIG_SATA_ULI is not set\n+# CONFIG_SATA_VIA is not set\n+# CONFIG_SATA_VITESSE is not set\n+# CONFIG_SBC_FITPC2_WATCHDOG is not set\n+CONFIG_SBITMAP=y\n+# CONFIG_SC92031 is not set\n+# CONFIG_SCA3000 is not set\n+# CONFIG_SCACHE_DEBUGFS is not set\n+# CONFIG_SCC is not set\n+# CONFIG_SCD30_CORE is not set\n+# CONFIG_SCF_TORTURE_TEST is not set\n+# CONFIG_SCHEDSTATS is not set\n+# CONFIG_SCHED_AUTOGROUP is not set\n+# CONFIG_SCHED_DEBUG is not set\n+CONFIG_SCHED_HRTICK=y\n+# CONFIG_SCHED_MC is not set\n+CONFIG_SCHED_OMIT_FRAME_POINTER=y\n+# CONFIG_SCHED_SMT is not set\n+# CONFIG_SCHED_STACK_END_CHECK is not set\n+# CONFIG_SCHED_TRACER is not set\n+# CONFIG_SCR24X is not set\n+# CONFIG_SCSI is not set\n+# CONFIG_SCSI_3W_9XXX is not set\n+# CONFIG_SCSI_3W_SAS is not set\n+# CONFIG_SCSI_7000FASST is not set\n+# CONFIG_SCSI_AACRAID is not set\n+# CONFIG_SCSI_ACARD is not set\n+# CONFIG_SCSI_ADVANSYS is not set\n+# CONFIG_SCSI_AHA152X is not set\n+# CONFIG_SCSI_AHA1542 is not set\n+# CONFIG_SCSI_AIC79XX is not set\n+# CONFIG_SCSI_AIC7XXX is not set\n+# CONFIG_SCSI_AIC94XX is not set\n+# CONFIG_SCSI_AM53C974 is not set\n+# CONFIG_SCSI_ARCMSR is not set\n+# CONFIG_SCSI_BFA_FC is not set\n+# CONFIG_SCSI_BNX2X_FCOE is not set\n+# CONFIG_SCSI_BNX2_ISCSI is not set\n+# CONFIG_SCSI_BUSLOGIC is not set\n+# CONFIG_SCSI_CHELSIO_FCOE is not set\n+# CONFIG_SCSI_CONSTANTS is not set\n+# CONFIG_SCSI_CXGB3_ISCSI is not set\n+# CONFIG_SCSI_CXGB4_ISCSI is not set\n+# CONFIG_SCSI_DC395x is not set\n+# CONFIG_SCSI_DEBUG is not set\n+# CONFIG_SCSI_DH is not set\n+CONFIG_SCSI_DMA=y\n+# CONFIG_SCSI_DMX3191D is not set\n+# CONFIG_SCSI_DPT_I2O is not set\n+# CONFIG_SCSI_DTC3280 is not set\n+# CONFIG_SCSI_EATA is not set\n+# CONFIG_SCSI_ESAS2R is not set\n+# CONFIG_SCSI_FC_ATTRS is not set\n+# CONFIG_SCSI_FDOMAIN_PCI is not set\n+# CONFIG_SCSI_FUTURE_DOMAIN is not set\n+# CONFIG_SCSI_GDTH is not set\n+# CONFIG_SCSI_GENERIC_NCR5380 is not set\n+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set\n+# CONFIG_SCSI_HISI_SAS is not set\n+# CONFIG_SCSI_HPSA is not set\n+# CONFIG_SCSI_HPTIOP is not set\n+# CONFIG_SCSI_IN2000 is not set\n+# CONFIG_SCSI_INIA100 is not set\n+# CONFIG_SCSI_INITIO is not set\n+# CONFIG_SCSI_IPR is not set\n+# CONFIG_SCSI_IPS is not set\n+# CONFIG_SCSI_ISCI is not set\n+# CONFIG_SCSI_ISCSI_ATTRS is not set\n+# CONFIG_SCSI_LOGGING is not set\n+CONFIG_SCSI_LOWLEVEL=y\n+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set\n+# CONFIG_SCSI_LPFC is not set\n+CONFIG_SCSI_MOD=y\n+# CONFIG_SCSI_MPT2SAS is not set\n+# CONFIG_SCSI_MPT3SAS is not set\n+# CONFIG_SCSI_MQ_DEFAULT is not set\n+# CONFIG_SCSI_MVSAS is not set\n+# CONFIG_SCSI_MVSAS_DEBUG is not set\n+# CONFIG_SCSI_MVUMI is not set\n+# CONFIG_SCSI_MYRB is not set\n+# CONFIG_SCSI_MYRS is not set\n+# CONFIG_SCSI_NCR53C406A is not set\n+# CONFIG_SCSI_NETLINK is not set\n+# CONFIG_SCSI_NSP32 is not set\n+# CONFIG_SCSI_OSD_INITIATOR is not set\n+# CONFIG_SCSI_PAS16 is not set\n+# CONFIG_SCSI_PM8001 is not set\n+# CONFIG_SCSI_PMCRAID is not set\n+CONFIG_SCSI_PROC_FS=y\n+# CONFIG_SCSI_QLA_FC is not set\n+# CONFIG_SCSI_QLA_ISCSI is not set\n+# CONFIG_SCSI_QLOGIC_1280 is not set\n+# CONFIG_SCSI_QLOGIC_FAS is not set\n+# CONFIG_SCSI_SAS_ATTRS is not set\n+# CONFIG_SCSI_SAS_LIBSAS is not set\n+# CONFIG_SCSI_SCAN_ASYNC is not set\n+# CONFIG_SCSI_SMARTPQI is not set\n+# CONFIG_SCSI_SNIC is not set\n+# CONFIG_SCSI_SPI_ATTRS is not set\n+# CONFIG_SCSI_SRP_ATTRS is not set\n+# CONFIG_SCSI_STEX is not set\n+# CONFIG_SCSI_SYM53C416 is not set\n+# CONFIG_SCSI_SYM53C8XX_2 is not set\n+# CONFIG_SCSI_T128 is not set\n+# CONFIG_SCSI_U14_34F is not set\n+# CONFIG_SCSI_UFSHCD is not set\n+# CONFIG_SCSI_ULTRASTOR is not set\n+# CONFIG_SCSI_VIRTIO is not set\n+# CONFIG_SCSI_WD719X is not set\n+# CONFIG_SCx200_ACB is not set\n+# CONFIG_SDIO_UART is not set\n+# CONFIG_SDR_MAX2175 is not set\n+# CONFIG_SDR_PLATFORM_DRIVERS is not set\n+# CONFIG_SD_ADC_MODULATOR is not set\n+# CONFIG_SECCOMP is not set\n+# CONFIG_SECCOMP_CACHE_DEBUG is not set\n+CONFIG_SECTION_MISMATCH_WARN_ONLY=y\n+# CONFIG_SECURITY is not set\n+# CONFIG_SECURITYFS is not set\n+# CONFIG_SECURITY_APPARMOR is not set\n+CONFIG_SECURITY_DMESG_RESTRICT=y\n+# CONFIG_SECURITY_LOADPIN is not set\n+# CONFIG_SECURITY_LOCKDOWN_LSM is not set\n+# CONFIG_SECURITY_PATH is not set\n+# CONFIG_SECURITY_SAFESETID is not set\n+# CONFIG_SECURITY_SELINUX_AVC_STATS is not set\n+# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set\n+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0\n+# CONFIG_SECURITY_SELINUX_DEVELOP is not set\n+# CONFIG_SECURITY_SELINUX_DISABLE is not set\n+# CONFIG_SECURITY_SMACK is not set\n+# CONFIG_SECURITY_TOMOYO is not set\n+# CONFIG_SECURITY_YAMA is not set\n+CONFIG_SELECT_MEMORY_MODEL=y\n+# CONFIG_SENSIRION_SGP30 is not set\n+# CONFIG_SENSORS_ABITUGURU is not set\n+# CONFIG_SENSORS_ABITUGURU3 is not set\n+# CONFIG_SENSORS_ACPI_POWER is not set\n+# CONFIG_SENSORS_AD7314 is not set\n+# CONFIG_SENSORS_AD7414 is not set\n+# CONFIG_SENSORS_AD7418 is not set\n+# CONFIG_SENSORS_ADC128D818 is not set\n+# CONFIG_SENSORS_ADCXX is not set\n+# CONFIG_SENSORS_ADM1021 is not set\n+# CONFIG_SENSORS_ADM1025 is not set\n+# CONFIG_SENSORS_ADM1026 is not set\n+# CONFIG_SENSORS_ADM1029 is not set\n+# CONFIG_SENSORS_ADM1031 is not set\n+# CONFIG_SENSORS_ADM1177 is not set\n+# CONFIG_SENSORS_ADM1266 is not set\n+# CONFIG_SENSORS_ADM1275 is not set\n+# CONFIG_SENSORS_ADM9240 is not set\n+# CONFIG_SENSORS_ADS1015 is not set\n+# CONFIG_SENSORS_ADS7828 is not set\n+# CONFIG_SENSORS_ADS7871 is not set\n+# CONFIG_SENSORS_ADT7310 is not set\n+# CONFIG_SENSORS_ADT7410 is not set\n+# CONFIG_SENSORS_ADT7411 is not set\n+# CONFIG_SENSORS_ADT7462 is not set\n+# CONFIG_SENSORS_ADT7470 is not set\n+# CONFIG_SENSORS_ADT7475 is not set\n+# CONFIG_SENSORS_AMC6821 is not set\n+# CONFIG_SENSORS_APDS990X is not set\n+# CONFIG_SENSORS_APPLESMC is not set\n+# CONFIG_SENSORS_AS370 is not set\n+# CONFIG_SENSORS_ASB100 is not set\n+# CONFIG_SENSORS_ASC7621 is not set\n+# CONFIG_SENSORS_ASPEED is not set\n+# CONFIG_SENSORS_ATK0110 is not set\n+# CONFIG_SENSORS_ATXP1 is not set\n+# CONFIG_SENSORS_AXI_FAN_CONTROL is not set\n+# CONFIG_SENSORS_BEL_PFE is not set\n+# CONFIG_SENSORS_BH1770 is not set\n+# CONFIG_SENSORS_BH1780 is not set\n+# CONFIG_SENSORS_CORETEMP is not set\n+# CONFIG_SENSORS_CORSAIR_CPRO is not set\n+# CONFIG_SENSORS_DELL_SMM is not set\n+# CONFIG_SENSORS_DME1737 is not set\n+# CONFIG_SENSORS_DRIVETEMP is not set\n+# CONFIG_SENSORS_DS1621 is not set\n+# CONFIG_SENSORS_DS620 is not set\n+# CONFIG_SENSORS_EMC1403 is not set\n+# CONFIG_SENSORS_EMC2103 is not set\n+# CONFIG_SENSORS_EMC6W201 is not set\n+# CONFIG_SENSORS_F71805F is not set\n+# CONFIG_SENSORS_F71882FG is not set\n+# CONFIG_SENSORS_F75375S is not set\n+# CONFIG_SENSORS_FAM15H_POWER is not set\n+# CONFIG_SENSORS_FSCHMD is not set\n+# CONFIG_SENSORS_FTSTEUTATES is not set\n+# CONFIG_SENSORS_G760A is not set\n+# CONFIG_SENSORS_G762 is not set\n+# CONFIG_SENSORS_GL518SM is not set\n+# CONFIG_SENSORS_GL520SM is not set\n+# CONFIG_SENSORS_GPIO_FAN is not set\n+# CONFIG_SENSORS_GSC is not set\n+# CONFIG_SENSORS_HDAPS is not set\n+# CONFIG_SENSORS_HIH6130 is not set\n+# CONFIG_SENSORS_HMC5843 is not set\n+# CONFIG_SENSORS_HMC5843_I2C is not set\n+# CONFIG_SENSORS_HMC5843_SPI is not set\n+# CONFIG_SENSORS_HTU21 is not set\n+# CONFIG_SENSORS_I5500 is not set\n+# CONFIG_SENSORS_I5K_AMB is not set\n+# CONFIG_SENSORS_IBM_CFFPS is not set\n+# CONFIG_SENSORS_IIO_HWMON is not set\n+# CONFIG_SENSORS_INA209 is not set\n+# CONFIG_SENSORS_INA2XX is not set\n+# CONFIG_SENSORS_INA3221 is not set\n+# CONFIG_SENSORS_INSPUR_IPSPS is not set\n+# CONFIG_SENSORS_IR35221 is not set\n+# CONFIG_SENSORS_IR38064 is not set\n+# CONFIG_SENSORS_IRPS5401 is not set\n+# CONFIG_SENSORS_ISL29018 is not set\n+# CONFIG_SENSORS_ISL29028 is not set\n+# CONFIG_SENSORS_ISL68137 is not set\n+# CONFIG_SENSORS_IT87 is not set\n+# CONFIG_SENSORS_JC42 is not set\n+# CONFIG_SENSORS_K10TEMP is not set\n+# CONFIG_SENSORS_K8TEMP is not set\n+# CONFIG_SENSORS_LINEAGE is not set\n+# CONFIG_SENSORS_LIS3LV02D is not set\n+# CONFIG_SENSORS_LIS3_I2C is not set\n+# CONFIG_SENSORS_LIS3_SPI is not set\n+# CONFIG_SENSORS_LM25066 is not set\n+# CONFIG_SENSORS_LM63 is not set\n+# CONFIG_SENSORS_LM70 is not set\n+# CONFIG_SENSORS_LM73 is not set\n+# CONFIG_SENSORS_LM75 is not set\n+# CONFIG_SENSORS_LM77 is not set\n+# CONFIG_SENSORS_LM78 is not set\n+# CONFIG_SENSORS_LM80 is not set\n+# CONFIG_SENSORS_LM83 is not set\n+# CONFIG_SENSORS_LM85 is not set\n+# CONFIG_SENSORS_LM87 is not set\n+# CONFIG_SENSORS_LM90 is not set\n+# CONFIG_SENSORS_LM92 is not set\n+# CONFIG_SENSORS_LM93 is not set\n+# CONFIG_SENSORS_LM95234 is not set\n+# CONFIG_SENSORS_LM95241 is not set\n+# CONFIG_SENSORS_LM95245 is not set\n+# CONFIG_SENSORS_LTC2945 is not set\n+# CONFIG_SENSORS_LTC2947_I2C is not set\n+# CONFIG_SENSORS_LTC2947_SPI is not set\n+# CONFIG_SENSORS_LTC2978 is not set\n+# CONFIG_SENSORS_LTC2990 is not set\n+# CONFIG_SENSORS_LTC3815 is not set\n+# CONFIG_SENSORS_LTC4151 is not set\n+# CONFIG_SENSORS_LTC4215 is not set\n+# CONFIG_SENSORS_LTC4222 is not set\n+# CONFIG_SENSORS_LTC4245 is not set\n+# CONFIG_SENSORS_LTC4260 is not set\n+# CONFIG_SENSORS_LTC4261 is not set\n+# CONFIG_SENSORS_LTQ_CPUTEMP is not set\n+# CONFIG_SENSORS_MAX1111 is not set\n+# CONFIG_SENSORS_MAX16064 is not set\n+# CONFIG_SENSORS_MAX16065 is not set\n+# CONFIG_SENSORS_MAX1619 is not set\n+# CONFIG_SENSORS_MAX16601 is not set\n+# CONFIG_SENSORS_MAX1668 is not set\n+# CONFIG_SENSORS_MAX197 is not set\n+# CONFIG_SENSORS_MAX20730 is not set\n+# CONFIG_SENSORS_MAX20751 is not set\n+# CONFIG_SENSORS_MAX31722 is not set\n+# CONFIG_SENSORS_MAX31730 is not set\n+# CONFIG_SENSORS_MAX31785 is not set\n+# CONFIG_SENSORS_MAX31790 is not set\n+# CONFIG_SENSORS_MAX34440 is not set\n+# CONFIG_SENSORS_MAX6621 is not set\n+# CONFIG_SENSORS_MAX6639 is not set\n+# CONFIG_SENSORS_MAX6642 is not set\n+# CONFIG_SENSORS_MAX6650 is not set\n+# CONFIG_SENSORS_MAX6697 is not set\n+# CONFIG_SENSORS_MAX8688 is not set\n+# CONFIG_SENSORS_MCP3021 is not set\n+# CONFIG_SENSORS_MP2975 is not set\n+# CONFIG_SENSORS_MR75203 is not set\n+# CONFIG_SENSORS_NCT6683 is not set\n+# CONFIG_SENSORS_NCT6775 is not set\n+# CONFIG_SENSORS_NCT7802 is not set\n+# CONFIG_SENSORS_NCT7904 is not set\n+# CONFIG_SENSORS_NPCM7XX is not set\n+# CONFIG_SENSORS_NSA320 is not set\n+# CONFIG_SENSORS_NTC_THERMISTOR is not set\n+# CONFIG_SENSORS_NZXT_KRAKEN2 is not set\n+# CONFIG_SENSORS_OCC_P8_I2C is not set\n+# CONFIG_SENSORS_PC87360 is not set\n+# CONFIG_SENSORS_PC87427 is not set\n+# CONFIG_SENSORS_PCF8591 is not set\n+# CONFIG_SENSORS_PMBUS is not set\n+# CONFIG_SENSORS_POWR1220 is not set\n+# CONFIG_SENSORS_PWM_FAN is not set\n+# CONFIG_SENSORS_PXE1610 is not set\n+# CONFIG_SENSORS_RM3100_I2C is not set\n+# CONFIG_SENSORS_RM3100_SPI is not set\n+# CONFIG_SENSORS_SCH5627 is not set\n+# CONFIG_SENSORS_SCH5636 is not set\n+# CONFIG_SENSORS_SCH56XX_COMMON is not set\n+# CONFIG_SENSORS_SHT15 is not set\n+# CONFIG_SENSORS_SHT21 is not set\n+# CONFIG_SENSORS_SHT3x is not set\n+# CONFIG_SENSORS_SHT4x is not set\n+# CONFIG_SENSORS_SHTC1 is not set\n+# CONFIG_SENSORS_SIS5595 is not set\n+# CONFIG_SENSORS_SMM665 is not set\n+# CONFIG_SENSORS_SMSC47B397 is not set\n+# CONFIG_SENSORS_SMSC47M1 is not set\n+# CONFIG_SENSORS_SMSC47M192 is not set\n+# CONFIG_SENSORS_STTS751 is not set\n+# CONFIG_SENSORS_TC654 is not set\n+# CONFIG_SENSORS_TC74 is not set\n+# CONFIG_SENSORS_THMC50 is not set\n+# CONFIG_SENSORS_TMP102 is not set\n+# CONFIG_SENSORS_TMP103 is not set\n+# CONFIG_SENSORS_TMP108 is not set\n+# CONFIG_SENSORS_TMP401 is not set\n+# CONFIG_SENSORS_TMP421 is not set\n+# CONFIG_SENSORS_TMP513 is not set\n+# CONFIG_SENSORS_TPS40422 is not set\n+# CONFIG_SENSORS_TPS53679 is not set\n+# CONFIG_SENSORS_TSL2550 is not set\n+# CONFIG_SENSORS_TSL2563 is not set\n+# CONFIG_SENSORS_UCD9000 is not set\n+# CONFIG_SENSORS_UCD9200 is not set\n+# CONFIG_SENSORS_VEXPRESS is not set\n+# CONFIG_SENSORS_VIA686A is not set\n+# CONFIG_SENSORS_VIA_CPUTEMP is not set\n+# CONFIG_SENSORS_VT1211 is not set\n+# CONFIG_SENSORS_VT8231 is not set\n+# CONFIG_SENSORS_W83627EHF is not set\n+# CONFIG_SENSORS_W83627HF is not set\n+# CONFIG_SENSORS_W83773G is not set\n+# CONFIG_SENSORS_W83781D is not set\n+# CONFIG_SENSORS_W83791D is not set\n+# CONFIG_SENSORS_W83792D is not set\n+# CONFIG_SENSORS_W83793 is not set\n+# CONFIG_SENSORS_W83795 is not set\n+# CONFIG_SENSORS_W83L785TS is not set\n+# CONFIG_SENSORS_W83L786NG is not set\n+# CONFIG_SENSORS_XDPE122 is not set\n+# CONFIG_SENSORS_XGENE is not set\n+# CONFIG_SENSORS_ZL6100 is not set\n+CONFIG_SERIAL_8250=y\n+# CONFIG_SERIAL_8250_16550A_VARIANTS is not set\n+# CONFIG_SERIAL_8250_ACCENT is not set\n+# CONFIG_SERIAL_8250_ASPEED_VUART is not set\n+# CONFIG_SERIAL_8250_BOCA is not set\n+CONFIG_SERIAL_8250_CONSOLE=y\n+# CONFIG_SERIAL_8250_CS is not set\n+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set\n+# CONFIG_SERIAL_8250_DETECT_IRQ is not set\n+CONFIG_SERIAL_8250_DMA=y\n+# CONFIG_SERIAL_8250_DW is not set\n+# CONFIG_SERIAL_8250_EM is not set\n+# CONFIG_SERIAL_8250_EXAR is not set\n+# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set\n+# CONFIG_SERIAL_8250_EXTENDED is not set\n+# CONFIG_SERIAL_8250_FINTEK is not set\n+# CONFIG_SERIAL_8250_FOURPORT is not set\n+# CONFIG_SERIAL_8250_HUB6 is not set\n+# CONFIG_SERIAL_8250_INGENIC is not set\n+# CONFIG_SERIAL_8250_LPSS is not set\n+# CONFIG_SERIAL_8250_MANY_PORTS is not set\n+# CONFIG_SERIAL_8250_MID is not set\n+# CONFIG_SERIAL_8250_MOXA is not set\n+CONFIG_SERIAL_8250_NR_UARTS=2\n+# CONFIG_SERIAL_8250_PCI is not set\n+# CONFIG_SERIAL_8250_RSA is not set\n+# CONFIG_SERIAL_8250_RT288X is not set\n+CONFIG_SERIAL_8250_RUNTIME_UARTS=2\n+# CONFIG_SERIAL_ALTERA_JTAGUART is not set\n+# CONFIG_SERIAL_ALTERA_UART is not set\n+# CONFIG_SERIAL_AMBA_PL010 is not set\n+# CONFIG_SERIAL_AMBA_PL011 is not set\n+# CONFIG_SERIAL_ARC is not set\n+# CONFIG_SERIAL_BCM63XX is not set\n+# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set\n+CONFIG_SERIAL_CORE=y\n+CONFIG_SERIAL_CORE_CONSOLE=y\n+# CONFIG_SERIAL_DEV_BUS is not set\n+CONFIG_SERIAL_EARLYCON=y\n+# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set\n+# CONFIG_SERIAL_FSL_LINFLEXUART is not set\n+# CONFIG_SERIAL_FSL_LPUART is not set\n+# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set\n+# CONFIG_SERIAL_IFX6X60 is not set\n+# CONFIG_SERIAL_JSM is not set\n+# CONFIG_SERIAL_MAX3100 is not set\n+# CONFIG_SERIAL_MAX310X is not set\n+# CONFIG_SERIAL_NONSTANDARD is not set\n+# CONFIG_SERIAL_OF_PLATFORM is not set\n+# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set\n+# CONFIG_SERIAL_PCH_UART is not set\n+# CONFIG_SERIAL_RP2 is not set\n+# CONFIG_SERIAL_SC16IS7XX is not set\n+# CONFIG_SERIAL_SCCNXP is not set\n+# CONFIG_SERIAL_SH_SCI is not set\n+# CONFIG_SERIAL_SIFIVE is not set\n+# CONFIG_SERIAL_SPRD is not set\n+# CONFIG_SERIAL_STM32 is not set\n+# CONFIG_SERIAL_ST_ASC is not set\n+# CONFIG_SERIAL_TIMBERDALE is not set\n+# CONFIG_SERIAL_UARTLITE is not set\n+# CONFIG_SERIAL_XILINX_PS_UART is not set\n+# CONFIG_SERIO is not set\n+# CONFIG_SERIO_ALTERA_PS2 is not set\n+# CONFIG_SERIO_AMBAKMI is not set\n+# CONFIG_SERIO_APBPS2 is not set\n+# CONFIG_SERIO_ARC_PS2 is not set\n+# CONFIG_SERIO_CT82C710 is not set\n+# CONFIG_SERIO_GPIO_PS2 is not set\n+# CONFIG_SERIO_I8042 is not set\n+# CONFIG_SERIO_LIBPS2 is not set\n+# CONFIG_SERIO_PARKBD is not set\n+# CONFIG_SERIO_PCIPS2 is not set\n+# CONFIG_SERIO_PS2MULT is not set\n+# CONFIG_SERIO_RAW is not set\n+# CONFIG_SERIO_SERPORT is not set\n+# CONFIG_SERIO_SUN4I_PS2 is not set\n+# CONFIG_SFC is not set\n+# CONFIG_SFC_FALCON is not set\n+# CONFIG_SFI is not set\n+# CONFIG_SFP is not set\n+# CONFIG_SF_PDMA is not set\n+# CONFIG_SGETMASK_SYSCALL is not set\n+# CONFIG_SGI_IOC4 is not set\n+# CONFIG_SGI_IP22 is not set\n+# CONFIG_SGI_IP27 is not set\n+# CONFIG_SGI_IP28 is not set\n+# CONFIG_SGI_IP30 is not set\n+# CONFIG_SGI_IP32 is not set\n+# CONFIG_SGI_PARTITION is not set\n+# CONFIG_SG_POOL is not set\n+# CONFIG_SG_SPLIT is not set\n+CONFIG_SHMEM=y\n+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set\n+# CONFIG_SH_ETH is not set\n+# CONFIG_SH_TIMER_CMT is not set\n+# CONFIG_SH_TIMER_MTU2 is not set\n+# CONFIG_SH_TIMER_TMU is not set\n+# CONFIG_SI1133 is not set\n+# CONFIG_SI1145 is not set\n+# CONFIG_SI7005 is not set\n+# CONFIG_SI7020 is not set\n+# CONFIG_SIBYTE_BIGSUR is not set\n+# CONFIG_SIBYTE_CARMEL is not set\n+# CONFIG_SIBYTE_CRHINE is not set\n+# CONFIG_SIBYTE_CRHONE is not set\n+# CONFIG_SIBYTE_LITTLESUR is not set\n+# CONFIG_SIBYTE_RHONE is not set\n+# CONFIG_SIBYTE_SENTOSA is not set\n+# CONFIG_SIBYTE_SWARM is not set\n+CONFIG_SIGNALFD=y\n+# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set\n+# CONFIG_SIMPLE_GPIO is not set\n+# CONFIG_SIMPLE_PM_BUS is not set\n+# CONFIG_SIOX is not set\n+# CONFIG_SIS190 is not set\n+# CONFIG_SIS900 is not set\n+# CONFIG_SKGE is not set\n+# CONFIG_SKY2 is not set\n+# CONFIG_SKY2_DEBUG is not set\n+# CONFIG_SLAB is not set\n+CONFIG_SLABINFO=y\n+# CONFIG_SLAB_FREELIST_HARDENED is not set\n+# CONFIG_SLAB_FREELIST_RANDOM is not set\n+CONFIG_SLAB_MERGE_DEFAULT=y\n+# CONFIG_SLHC is not set\n+# CONFIG_SLICOSS is not set\n+# CONFIG_SLIMBUS is not set\n+# CONFIG_SLIP is not set\n+# CONFIG_SLOB is not set\n+CONFIG_SLUB=y\n+CONFIG_SLUB_CPU_PARTIAL=y\n+# CONFIG_SLUB_DEBUG is not set\n+# CONFIG_SLUB_DEBUG_ON is not set\n+# CONFIG_SLUB_MEMCG_SYSFS_ON is not set\n+# CONFIG_SLUB_STATS is not set\n+# CONFIG_SMARTJOYPLUS_FF is not set\n+# CONFIG_SMC911X is not set\n+# CONFIG_SMC9194 is not set\n+# CONFIG_SMC91X is not set\n+# CONFIG_SMP is not set\n+# CONFIG_SMSC911X is not set\n+# CONFIG_SMSC9420 is not set\n+# CONFIG_SMSC_PHY is not set\n+# CONFIG_SMS_SDIO_DRV is not set\n+# CONFIG_SMS_USB_DRV is not set\n+# CONFIG_SM_FTL is not set\n+# CONFIG_SND is not set\n+# CONFIG_SND_AC97_POWER_SAVE is not set\n+# CONFIG_SND_AD1816A is not set\n+# CONFIG_SND_AD1848 is not set\n+# CONFIG_SND_AD1889 is not set\n+# CONFIG_SND_ADLIB is not set\n+# CONFIG_SND_ALI5451 is not set\n+# CONFIG_SND_ALOOP is not set\n+# CONFIG_SND_ALS100 is not set\n+# CONFIG_SND_ALS300 is not set\n+# CONFIG_SND_ALS4000 is not set\n+# CONFIG_SND_ARM is not set\n+# CONFIG_SND_ASIHPI is not set\n+# CONFIG_SND_ATIIXP is not set\n+# CONFIG_SND_ATIIXP_MODEM is not set\n+# CONFIG_SND_ATMEL_AC97C is not set\n+# CONFIG_SND_ATMEL_SOC is not set\n+# CONFIG_SND_AU8810 is not set\n+# CONFIG_SND_AU8820 is not set\n+# CONFIG_SND_AU8830 is not set\n+# CONFIG_SND_AUDIO_GRAPH_CARD is not set\n+# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set\n+# CONFIG_SND_AW2 is not set\n+# CONFIG_SND_AZT2320 is not set\n+# CONFIG_SND_AZT3328 is not set\n+# CONFIG_SND_BCD2000 is not set\n+# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set\n+# CONFIG_SND_BT87X is not set\n+# CONFIG_SND_CA0106 is not set\n+# CONFIG_SND_CMI8330 is not set\n+# CONFIG_SND_CMIPCI is not set\n+# CONFIG_SND_CS4231 is not set\n+# CONFIG_SND_CS4236 is not set\n+# CONFIG_SND_CS4281 is not set\n+# CONFIG_SND_CS46XX is not set\n+# CONFIG_SND_CS5530 is not set\n+# CONFIG_SND_CS5535AUDIO is not set\n+# CONFIG_SND_CTXFI is not set\n+# CONFIG_SND_DARLA20 is not set\n+# CONFIG_SND_DARLA24 is not set\n+# CONFIG_SND_DEBUG is not set\n+# CONFIG_SND_DESIGNWARE_I2S is not set\n+CONFIG_SND_DRIVERS=y\n+# CONFIG_SND_DUMMY is not set\n+# CONFIG_SND_DYNAMIC_MINORS is not set\n+# CONFIG_SND_ECHO3G is not set\n+# CONFIG_SND_EDMA_SOC is not set\n+# CONFIG_SND_EMU10K1 is not set\n+# CONFIG_SND_EMU10K1X is not set\n+# CONFIG_SND_EMU10K1_SEQ is not set\n+# CONFIG_SND_ENS1370 is not set\n+# CONFIG_SND_ENS1371 is not set\n+# CONFIG_SND_ES1688 is not set\n+# CONFIG_SND_ES18XX is not set\n+# CONFIG_SND_ES1938 is not set\n+# CONFIG_SND_ES1968 is not set\n+# CONFIG_SND_FIREWIRE is not set\n+# CONFIG_SND_FM801 is not set\n+# CONFIG_SND_GINA20 is not set\n+# CONFIG_SND_GINA24 is not set\n+# CONFIG_SND_GUSCLASSIC is not set\n+# CONFIG_SND_GUSEXTREME is not set\n+# CONFIG_SND_GUSMAX is not set\n+# CONFIG_SND_HDA_INTEL is not set\n+# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set\n+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0\n+CONFIG_SND_HDA_PREALLOC_SIZE=64\n+# CONFIG_SND_HDSP is not set\n+# CONFIG_SND_HDSPM is not set\n+# CONFIG_SND_HRTIMER is not set\n+# CONFIG_SND_HWDEP is not set\n+# CONFIG_SND_I2S_HI6210_I2S is not set\n+# CONFIG_SND_ICE1712 is not set\n+# CONFIG_SND_ICE1724 is not set\n+# CONFIG_SND_INDIGO is not set\n+# CONFIG_SND_INDIGODJ is not set\n+# CONFIG_SND_INDIGODJX is not set\n+# CONFIG_SND_INDIGOIO is not set\n+# CONFIG_SND_INDIGOIOX is not set\n+# CONFIG_SND_INTEL8X0 is not set\n+# CONFIG_SND_INTEL8X0M is not set\n+# CONFIG_SND_INTERWAVE is not set\n+# CONFIG_SND_INTERWAVE_STB is not set\n+# CONFIG_SND_ISA is not set\n+# CONFIG_SND_JZ4740_SOC_I2S is not set\n+# CONFIG_SND_KIRKWOOD_SOC is not set\n+# CONFIG_SND_KORG1212 is not set\n+# CONFIG_SND_LAYLA20 is not set\n+# CONFIG_SND_LAYLA24 is not set\n+# CONFIG_SND_LOLA is not set\n+# CONFIG_SND_LX6464ES is not set\n+# CONFIG_SND_MAESTRO3 is not set\n+CONFIG_SND_MAX_CARDS=16\n+# CONFIG_SND_MIA is not set\n+# CONFIG_SND_MIPS is not set\n+# CONFIG_SND_MIRO is not set\n+# CONFIG_SND_MIXART is not set\n+# CONFIG_SND_MIXER_OSS is not set\n+# CONFIG_SND_MONA is not set\n+# CONFIG_SND_MPC52xx_SOC_EFIKA is not set\n+# CONFIG_SND_MPU401 is not set\n+# CONFIG_SND_MTPAV is not set\n+# CONFIG_SND_MTS64 is not set\n+# CONFIG_SND_MXS_SOC is not set\n+# CONFIG_SND_NM256 is not set\n+# CONFIG_SND_OPL3SA2 is not set\n+# CONFIG_SND_OPL3_LIB_SEQ is not set\n+# CONFIG_SND_OPL4_LIB_SEQ is not set\n+# CONFIG_SND_OPTI92X_AD1848 is not set\n+# CONFIG_SND_OPTI92X_CS4231 is not set\n+# CONFIG_SND_OPTI93X is not set\n+CONFIG_SND_OSSEMUL=y\n+# CONFIG_SND_OXYGEN is not set\n+CONFIG_SND_PCI=y\n+# CONFIG_SND_PCM is not set\n+# CONFIG_SND_PCMCIA is not set\n+# CONFIG_SND_PCM_OSS is not set\n+CONFIG_SND_PCM_OSS_PLUGINS=y\n+# CONFIG_SND_PCM_TIMER is not set\n+# CONFIG_SND_PCM_XRUN_DEBUG is not set\n+# CONFIG_SND_PCXHR is not set\n+# CONFIG_SND_PDAUDIOCF is not set\n+# CONFIG_SND_PORTMAN2X4 is not set\n+# CONFIG_SND_POWERPC_SOC is not set\n+# CONFIG_SND_PPC is not set\n+CONFIG_SND_PROC_FS=y\n+# CONFIG_SND_RAWMIDI is not set\n+# CONFIG_SND_RAWMIDI_SEQ is not set\n+# CONFIG_SND_RIPTIDE is not set\n+# CONFIG_SND_RME32 is not set\n+# CONFIG_SND_RME96 is not set\n+# CONFIG_SND_RME9652 is not set\n+# CONFIG_SND_RTCTIMER is not set\n+# CONFIG_SND_SB16 is not set\n+# CONFIG_SND_SB8 is not set\n+# CONFIG_SND_SBAWE is not set\n+# CONFIG_SND_SBAWE_SEQ is not set\n+# CONFIG_SND_SE6X is not set\n+# CONFIG_SND_SEQUENCER is not set\n+# CONFIG_SND_SERIAL_U16550 is not set\n+# CONFIG_SND_SIMPLE_CARD is not set\n+# CONFIG_SND_SIMPLE_SCU_CARD is not set\n+# CONFIG_SND_SIS7019 is not set\n+# CONFIG_SND_SOC is not set\n+# CONFIG_SND_SOC_AC97_CODEC is not set\n+# CONFIG_SND_SOC_ADAU1701 is not set\n+# CONFIG_SND_SOC_ADAU1761_I2C is not set\n+# CONFIG_SND_SOC_ADAU1761_SPI is not set\n+# CONFIG_SND_SOC_ADAU7002 is not set\n+# CONFIG_SND_SOC_ADAU7118_HW is not set\n+# CONFIG_SND_SOC_ADAU7118_I2C is not set\n+# CONFIG_SND_SOC_AK4104 is not set\n+# CONFIG_SND_SOC_AK4118 is not set\n+# CONFIG_SND_SOC_AK4458 is not set\n+# CONFIG_SND_SOC_AK4554 is not set\n+# CONFIG_SND_SOC_AK4613 is not set\n+# CONFIG_SND_SOC_AK4642 is not set\n+# CONFIG_SND_SOC_AK5386 is not set\n+# CONFIG_SND_SOC_AK5558 is not set\n+# CONFIG_SND_SOC_ALC5623 is not set\n+# CONFIG_SND_SOC_AMD_ACP is not set\n+# CONFIG_SND_SOC_AMD_ACP3x is not set\n+# CONFIG_SND_SOC_AU1XAUDIO is not set\n+# CONFIG_SND_SOC_AU1XPSC is not set\n+# CONFIG_SND_SOC_BD28623 is not set\n+# CONFIG_SND_SOC_BT_SCO is not set\n+# CONFIG_SND_SOC_CS35L32 is not set\n+# CONFIG_SND_SOC_CS35L33 is not set\n+# CONFIG_SND_SOC_CS35L34 is not set\n+# CONFIG_SND_SOC_CS35L35 is not set\n+# CONFIG_SND_SOC_CS35L36 is not set\n+# CONFIG_SND_SOC_CS4234 is not set\n+# CONFIG_SND_SOC_CS4265 is not set\n+# CONFIG_SND_SOC_CS4270 is not set\n+# CONFIG_SND_SOC_CS4271 is not set\n+# CONFIG_SND_SOC_CS4271_I2C is not set\n+# CONFIG_SND_SOC_CS4271_SPI is not set\n+# CONFIG_SND_SOC_CS42L42 is not set\n+# CONFIG_SND_SOC_CS42L51_I2C is not set\n+# CONFIG_SND_SOC_CS42L52 is not set\n+# CONFIG_SND_SOC_CS42L56 is not set\n+# CONFIG_SND_SOC_CS42L73 is not set\n+# CONFIG_SND_SOC_CS42XX8_I2C is not set\n+# CONFIG_SND_SOC_CS43130 is not set\n+# CONFIG_SND_SOC_CS4341 is not set\n+# CONFIG_SND_SOC_CS4349 is not set\n+# CONFIG_SND_SOC_CS53L30 is not set\n+# CONFIG_SND_SOC_CX2072X is not set\n+# CONFIG_SND_SOC_DA7213 is not set\n+# CONFIG_SND_SOC_DIO2125 is not set\n+# CONFIG_SND_SOC_DMIC is not set\n+# CONFIG_SND_SOC_ES7134 is not set\n+# CONFIG_SND_SOC_ES7241 is not set\n+# CONFIG_SND_SOC_ES8316 is not set\n+# CONFIG_SND_SOC_ES8328 is not set\n+# CONFIG_SND_SOC_ES8328_I2C is not set\n+# CONFIG_SND_SOC_ES8328_SPI is not set\n+# CONFIG_SND_SOC_EUKREA_TLV320 is not set\n+# CONFIG_SND_SOC_FSL_ASOC_CARD is not set\n+# CONFIG_SND_SOC_FSL_ASRC is not set\n+# CONFIG_SND_SOC_FSL_AUDMIX is not set\n+# CONFIG_SND_SOC_FSL_ESAI is not set\n+# CONFIG_SND_SOC_FSL_MICFIL is not set\n+# CONFIG_SND_SOC_FSL_SAI is not set\n+# CONFIG_SND_SOC_FSL_SPDIF is not set\n+# CONFIG_SND_SOC_FSL_SSI is not set\n+# CONFIG_SND_SOC_GTM601 is not set\n+# CONFIG_SND_SOC_ICS43432 is not set\n+# CONFIG_SND_SOC_IMG is not set\n+# CONFIG_SND_SOC_IMX_AUDMIX is not set\n+# CONFIG_SND_SOC_IMX_AUDMUX is not set\n+# CONFIG_SND_SOC_IMX_ES8328 is not set\n+# CONFIG_SND_SOC_IMX_SPDIF is not set\n+# CONFIG_SND_SOC_IMX_WM8962 is not set\n+# CONFIG_SND_SOC_INNO_RK3036 is not set\n+# CONFIG_SND_SOC_INTEL_APL is not set\n+# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set\n+# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set\n+# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set\n+# CONFIG_SND_SOC_INTEL_CFL is not set\n+# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set\n+# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set\n+# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set\n+# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set\n+# CONFIG_SND_SOC_INTEL_CML_H is not set\n+# CONFIG_SND_SOC_INTEL_CML_LP is not set\n+# CONFIG_SND_SOC_INTEL_CNL is not set\n+# CONFIG_SND_SOC_INTEL_GLK is not set\n+# CONFIG_SND_SOC_INTEL_HASWELL is not set\n+# CONFIG_SND_SOC_INTEL_KBL is not set\n+# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set\n+# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set\n+# CONFIG_SND_SOC_INTEL_KEEMBAY is not set\n+# CONFIG_SND_SOC_INTEL_SKL is not set\n+# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set\n+# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set\n+# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set\n+# CONFIG_SND_SOC_INTEL_SKYLAKE is not set\n+# CONFIG_SND_SOC_INTEL_SST is not set\n+CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y\n+# CONFIG_SND_SOC_JZ4725B_CODEC is not set\n+# CONFIG_SND_SOC_JZ4740_CODEC is not set\n+# CONFIG_SND_SOC_JZ4770_CODEC is not set\n+# CONFIG_SND_SOC_MA120X0P is not set\n+# CONFIG_SND_SOC_MAX9759 is not set\n+# CONFIG_SND_SOC_MAX98088 is not set\n+# CONFIG_SND_SOC_MAX98357A is not set\n+# CONFIG_SND_SOC_MAX98373 is not set\n+# CONFIG_SND_SOC_MAX98373_I2C is not set\n+# CONFIG_SND_SOC_MAX98390 is not set\n+# CONFIG_SND_SOC_MAX98504 is not set\n+# CONFIG_SND_SOC_MAX9860 is not set\n+# CONFIG_SND_SOC_MAX9867 is not set\n+# CONFIG_SND_SOC_MAX98927 is not set\n+# CONFIG_SND_SOC_MEDIATEK is not set\n+# CONFIG_SND_SOC_MPC5200_AC97 is not set\n+# CONFIG_SND_SOC_MPC5200_I2S is not set\n+# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set\n+# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set\n+# CONFIG_SND_SOC_MT2701 is not set\n+# CONFIG_SND_SOC_MT6351 is not set\n+# CONFIG_SND_SOC_MT6358 is not set\n+# CONFIG_SND_SOC_MT6660 is not set\n+# CONFIG_SND_SOC_MT6797 is not set\n+# CONFIG_SND_SOC_MT8173 is not set\n+# CONFIG_SND_SOC_MT8183 is not set\n+# CONFIG_SND_SOC_MTK_BTCVSD is not set\n+# CONFIG_SND_SOC_NAU8540 is not set\n+# CONFIG_SND_SOC_NAU8810 is not set\n+# CONFIG_SND_SOC_NAU8822 is not set\n+# CONFIG_SND_SOC_NAU8824 is not set\n+# CONFIG_SND_SOC_PCM1681 is not set\n+# CONFIG_SND_SOC_PCM1789_I2C is not set\n+# CONFIG_SND_SOC_PCM1792A is not set\n+# CONFIG_SND_SOC_PCM179X_I2C is not set\n+# CONFIG_SND_SOC_PCM179X_SPI is not set\n+# CONFIG_SND_SOC_PCM186X_I2C is not set\n+# CONFIG_SND_SOC_PCM186X_SPI is not set\n+# CONFIG_SND_SOC_PCM3060_I2C is not set\n+# CONFIG_SND_SOC_PCM3060_SPI is not set\n+# CONFIG_SND_SOC_PCM3168A_I2C is not set\n+# CONFIG_SND_SOC_PCM3168A_SPI is not set\n+# CONFIG_SND_SOC_PCM512x_I2C is not set\n+# CONFIG_SND_SOC_PCM512x_SPI is not set\n+# CONFIG_SND_SOC_QCOM is not set\n+# CONFIG_SND_SOC_RK3328 is not set\n+# CONFIG_SND_SOC_RT5616 is not set\n+# CONFIG_SND_SOC_RT5631 is not set\n+# CONFIG_SND_SOC_RT5677_SPI is not set\n+# CONFIG_SND_SOC_SGTL5000 is not set\n+# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set\n+# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set\n+# CONFIG_SND_SOC_SOF_TOPLEVEL is not set\n+# CONFIG_SND_SOC_SPDIF is not set\n+# CONFIG_SND_SOC_SSM2305 is not set\n+# CONFIG_SND_SOC_SSM2602_I2C is not set\n+# CONFIG_SND_SOC_SSM2602_SPI is not set\n+# CONFIG_SND_SOC_SSM4567 is not set\n+# CONFIG_SND_SOC_STA32X is not set\n+# CONFIG_SND_SOC_STA350 is not set\n+# CONFIG_SND_SOC_STI_SAS is not set\n+# CONFIG_SND_SOC_TAS2552 is not set\n+# CONFIG_SND_SOC_TAS2562 is not set\n+# CONFIG_SND_SOC_TAS2764 is not set\n+# CONFIG_SND_SOC_TAS2770 is not set\n+# CONFIG_SND_SOC_TAS5086 is not set\n+# CONFIG_SND_SOC_TAS571X is not set\n+# CONFIG_SND_SOC_TAS5720 is not set\n+# CONFIG_SND_SOC_TAS6424 is not set\n+# CONFIG_SND_SOC_TDA7419 is not set\n+# CONFIG_SND_SOC_TFA9879 is not set\n+# CONFIG_SND_SOC_TLV320ADCX140 is not set\n+# CONFIG_SND_SOC_TLV320AIC23_I2C is not set\n+# CONFIG_SND_SOC_TLV320AIC23_SPI is not set\n+# CONFIG_SND_SOC_TLV320AIC31XX is not set\n+# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set\n+# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set\n+# CONFIG_SND_SOC_TLV320AIC3X is not set\n+# CONFIG_SND_SOC_TPA6130A2 is not set\n+# CONFIG_SND_SOC_TS3A227E is not set\n+# CONFIG_SND_SOC_TSCS42XX is not set\n+# CONFIG_SND_SOC_TSCS454 is not set\n+# CONFIG_SND_SOC_UDA1334 is not set\n+# CONFIG_SND_SOC_WM8510 is not set\n+# CONFIG_SND_SOC_WM8523 is not set\n+# CONFIG_SND_SOC_WM8524 is not set\n+# CONFIG_SND_SOC_WM8580 is not set\n+# CONFIG_SND_SOC_WM8711 is not set\n+# CONFIG_SND_SOC_WM8728 is not set\n+# CONFIG_SND_SOC_WM8731 is not set\n+# CONFIG_SND_SOC_WM8737 is not set\n+# CONFIG_SND_SOC_WM8741 is not set\n+# CONFIG_SND_SOC_WM8750 is not set\n+# CONFIG_SND_SOC_WM8753 is not set\n+# CONFIG_SND_SOC_WM8770 is not set\n+# CONFIG_SND_SOC_WM8776 is not set\n+# CONFIG_SND_SOC_WM8782 is not set\n+# CONFIG_SND_SOC_WM8804_I2C is not set\n+# CONFIG_SND_SOC_WM8804_SPI is not set\n+# CONFIG_SND_SOC_WM8903 is not set\n+# CONFIG_SND_SOC_WM8904 is not set\n+# CONFIG_SND_SOC_WM8960 is not set\n+# CONFIG_SND_SOC_WM8962 is not set\n+# CONFIG_SND_SOC_WM8974 is not set\n+# CONFIG_SND_SOC_WM8978 is not set\n+# CONFIG_SND_SOC_WM8985 is not set\n+# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set\n+# CONFIG_SND_SOC_XILINX_I2S is not set\n+# CONFIG_SND_SOC_XILINX_SPDIF is not set\n+# CONFIG_SND_SOC_XTFPGA_I2S is not set\n+# CONFIG_SND_SOC_ZL38060 is not set\n+# CONFIG_SND_SOC_ZX_AUD96P22 is not set\n+# CONFIG_SND_SONICVIBES is not set\n+# CONFIG_SND_SPI is not set\n+# CONFIG_SND_SSCAPE is not set\n+# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set\n+# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set\n+# CONFIG_SND_SUN4I_CODEC is not set\n+# CONFIG_SND_SUPPORT_OLD_API is not set\n+# CONFIG_SND_TIMER is not set\n+# CONFIG_SND_TRIDENT is not set\n+CONFIG_SND_USB=y\n+# CONFIG_SND_USB_6FIRE is not set\n+# CONFIG_SND_USB_AUDIO is not set\n+# CONFIG_SND_USB_CAIAQ is not set\n+# CONFIG_SND_USB_HIFACE is not set\n+# CONFIG_SND_USB_POD is not set\n+# CONFIG_SND_USB_PODHD is not set\n+# CONFIG_SND_USB_TONEPORT is not set\n+# CONFIG_SND_USB_UA101 is not set\n+# CONFIG_SND_USB_US122L is not set\n+# CONFIG_SND_USB_USX2Y is not set\n+# CONFIG_SND_USB_VARIAX is not set\n+# CONFIG_SND_VERBOSE_PRINTK is not set\n+CONFIG_SND_VERBOSE_PROCFS=y\n+# CONFIG_SND_VIA82XX is not set\n+# CONFIG_SND_VIA82XX_MODEM is not set\n+# CONFIG_SND_VIRTUOSO is not set\n+# CONFIG_SND_VX222 is not set\n+# CONFIG_SND_VXPOCKET is not set\n+# CONFIG_SND_WAVEFRONT is not set\n+CONFIG_SND_X86=y\n+# CONFIG_SND_XEN_FRONTEND is not set\n+# CONFIG_SND_YMFPCI is not set\n+# CONFIG_SNI_RM is not set\n+# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set\n+# CONFIG_SOCK_CGROUP_DATA is not set\n+# CONFIG_SOC_AM33XX is not set\n+# CONFIG_SOC_AM43XX is not set\n+# CONFIG_SOC_BRCMSTB is not set\n+# CONFIG_SOC_CAMERA is not set\n+# CONFIG_SOC_DRA7XX is not set\n+# CONFIG_SOC_HAS_OMAP2_SDRC is not set\n+# CONFIG_SOC_OMAP5 is not set\n+# CONFIG_SOC_TI is not set\n+# CONFIG_SOFTLOCKUP_DETECTOR is not set\n+# CONFIG_SOFT_WATCHDOG is not set\n+# CONFIG_SOLARIS_X86_PARTITION is not set\n+# CONFIG_SONYPI is not set\n+# CONFIG_SONY_LAPTOP is not set\n+# CONFIG_SOUND is not set\n+# CONFIG_SOUNDWIRE is not set\n+# CONFIG_SOUND_OSS_CORE is not set\n+# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set\n+# CONFIG_SOUND_PRIME is not set\n+# CONFIG_SP5100_TCO is not set\n+# CONFIG_SPARSEMEM_MANUAL is not set\n+# CONFIG_SPARSEMEM_STATIC is not set\n+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set\n+# CONFIG_SPARSE_IRQ is not set\n+# CONFIG_SPARSE_RCU_POINTER is not set\n+# CONFIG_SPEAKUP is not set\n+# CONFIG_SPI is not set\n+# CONFIG_SPINLOCK_TEST is not set\n+# CONFIG_SPI_ALTERA is not set\n+# CONFIG_SPI_ALTERA_CORE is not set\n+# CONFIG_SPI_AMD is not set\n+# CONFIG_SPI_AU1550 is not set\n+# CONFIG_SPI_AXI_SPI_ENGINE is not set\n+# CONFIG_SPI_BCM2835 is not set\n+# CONFIG_SPI_BCM_QSPI is not set\n+# CONFIG_SPI_BITBANG is not set\n+# CONFIG_SPI_BUTTERFLY is not set\n+# CONFIG_SPI_CADENCE is not set\n+# CONFIG_SPI_CADENCE_QUADSPI is not set\n+# CONFIG_SPI_DEBUG is not set\n+# CONFIG_SPI_DESIGNWARE is not set\n+# CONFIG_SPI_FSL_DSPI is not set\n+# CONFIG_SPI_FSL_ESPI is not set\n+# CONFIG_SPI_FSL_SPI is not set\n+# CONFIG_SPI_GPIO is not set\n+# CONFIG_SPI_GPIO_OLD is not set\n+# CONFIG_SPI_IMG_SPFI is not set\n+# CONFIG_SPI_LM70_LLP is not set\n+# CONFIG_SPI_LOOPBACK_TEST is not set\n+# CONFIG_SPI_MASTER is not set\n+# CONFIG_SPI_MEM is not set\n+# CONFIG_SPI_MPC52xx is not set\n+# CONFIG_SPI_MPC52xx_PSC is not set\n+# CONFIG_SPI_MTK_QUADSPI is not set\n+# CONFIG_SPI_MUX is not set\n+# CONFIG_SPI_MXIC is not set\n+# CONFIG_SPI_NXP_FLEXSPI is not set\n+# CONFIG_SPI_OCTEON is not set\n+# CONFIG_SPI_OC_TINY is not set\n+# CONFIG_SPI_ORION is not set\n+# CONFIG_SPI_PL022 is not set\n+# CONFIG_SPI_PPC4xx is not set\n+# CONFIG_SPI_PXA2XX is not set\n+# CONFIG_SPI_PXA2XX_PCI is not set\n+# CONFIG_SPI_QCOM_QSPI is not set\n+# CONFIG_SPI_ROCKCHIP is not set\n+# CONFIG_SPI_S3C64XX is not set\n+# CONFIG_SPI_SC18IS602 is not set\n+# CONFIG_SPI_SIFIVE is not set\n+# CONFIG_SPI_SLAVE is not set\n+# CONFIG_SPI_SPIDEV is not set\n+# CONFIG_SPI_THUNDERX is not set\n+# CONFIG_SPI_TI_QSPI is not set\n+# CONFIG_SPI_TLE62X0 is not set\n+# CONFIG_SPI_TOPCLIFF_PCH is not set\n+# CONFIG_SPI_XCOMM is not set\n+# CONFIG_SPI_XILINX is not set\n+# CONFIG_SPI_XWAY is not set\n+# CONFIG_SPI_ZYNQMP_GQSPI is not set\n+CONFIG_SPLIT_PTLOCK_CPUS=4\n+# CONFIG_SPMI is not set\n+# CONFIG_SPS30 is not set\n+CONFIG_SQUASHFS=y\n+# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set\n+# CONFIG_SQUASHFS_DECOMP_MULTI is not set\n+CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y\n+# CONFIG_SQUASHFS_DECOMP_SINGLE is not set\n+CONFIG_SQUASHFS_EMBEDDED=y\n+# CONFIG_SQUASHFS_FILE_CACHE is not set\n+CONFIG_SQUASHFS_FILE_DIRECT=y\n+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3\n+# CONFIG_SQUASHFS_LZ4 is not set\n+# CONFIG_SQUASHFS_LZO is not set\n+# CONFIG_SQUASHFS_XATTR is not set\n+CONFIG_SQUASHFS_XZ=y\n+# CONFIG_SQUASHFS_ZLIB is not set\n+# CONFIG_SQUASHFS_ZSTD is not set\n+# CONFIG_SRAM is not set\n+# CONFIG_SRF04 is not set\n+# CONFIG_SRF08 is not set\n+# CONFIG_SSB is not set\n+# CONFIG_SSB_DEBUG is not set\n+# CONFIG_SSB_DRIVER_GPIO is not set\n+# CONFIG_SSB_HOST_SOC is not set\n+# CONFIG_SSB_PCMCIAHOST is not set\n+CONFIG_SSB_POSSIBLE=y\n+# CONFIG_SSB_SDIOHOST is not set\n+# CONFIG_SSB_SILENT is not set\n+# CONFIG_SSFDC is not set\n+# CONFIG_STACKPROTECTOR is not set\n+# CONFIG_STACKPROTECTOR_STRONG is not set\n+# CONFIG_STACKTRACE is not set\n+# CONFIG_STACKTRACE_BUILD_ID is not set\n+CONFIG_STACKTRACE_SUPPORT=y\n+CONFIG_STACK_HASH_ORDER=20\n+# CONFIG_STACK_TRACER is not set\n+# CONFIG_STACK_VALIDATION is not set\n+CONFIG_STAGING=y\n+# CONFIG_STAGING_BOARD is not set\n+# CONFIG_STAGING_GASKET_FRAMEWORK is not set\n+# CONFIG_STAGING_MEDIA is not set\n+CONFIG_STANDALONE=y\n+# CONFIG_STATIC_KEYS_SELFTEST is not set\n+# CONFIG_STATIC_USERMODEHELPER is not set\n+CONFIG_STDBINUTILS=y\n+# CONFIG_STE10XP is not set\n+# CONFIG_STE_MODEM_RPROC is not set\n+# CONFIG_STK3310 is not set\n+# CONFIG_STK8312 is not set\n+# CONFIG_STK8BA50 is not set\n+# CONFIG_STM is not set\n+# CONFIG_STMMAC_ETH is not set\n+# CONFIG_STMMAC_PCI is not set\n+# CONFIG_STMMAC_PLATFORM is not set\n+# CONFIG_STM_DUMMY is not set\n+# CONFIG_STM_SOURCE_CONSOLE is not set\n+CONFIG_STP=y\n+# CONFIG_STREAM_PARSER is not set\n+# CONFIG_STRICT_DEVMEM is not set\n+CONFIG_STRICT_KERNEL_RWX=y\n+CONFIG_STRICT_MODULE_RWX=y\n+# CONFIG_STRING_SELFTEST is not set\n+CONFIG_STRIP_ASM_SYMS=y\n+# CONFIG_STX104 is not set\n+# CONFIG_ST_UVIS25 is not set\n+# CONFIG_SUN4I_GPADC is not set\n+# CONFIG_SUN50I_DE2_BUS is not set\n+# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set\n+# CONFIG_SUNDANCE is not set\n+# CONFIG_SUNGEM is not set\n+# CONFIG_SUNRPC is not set\n+# CONFIG_SUNRPC_DEBUG is not set\n+CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y\n+# CONFIG_SUNRPC_GSS is not set\n+# CONFIG_SUNXI_SRAM is not set\n+# CONFIG_SUN_PARTITION is not set\n+# CONFIG_SURFACE_3_BUTTON is not set\n+# CONFIG_SUSPEND is not set\n+# CONFIG_SUSPEND_SKIP_SYNC is not set\n+CONFIG_SWAP=y\n+# CONFIG_SWCONFIG is not set\n+# CONFIG_SWCONFIG_B53 is not set\n+# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set\n+# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set\n+# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set\n+# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set\n+# CONFIG_SWCONFIG_LEDS is not set\n+# CONFIG_SW_SYNC is not set\n+# CONFIG_SX9310 is not set\n+# CONFIG_SX9500 is not set\n+# CONFIG_SXGBE_ETH is not set\n+CONFIG_SYMBOLIC_ERRNAME=y\n+# CONFIG_SYNCLINK_CS is not set\n+# CONFIG_SYNC_FILE is not set\n+# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set\n+# CONFIG_SYNTH_EVENTS is not set\n+CONFIG_SYN_COOKIES=y\n+# CONFIG_SYSCON_REBOOT_MODE is not set\n+CONFIG_SYSCTL=y\n+# CONFIG_SYSCTL_SYSCALL is not set\n+CONFIG_SYSFS=y\n+# CONFIG_SYSFS_DEPRECATED is not set\n+# CONFIG_SYSFS_DEPRECATED_V2 is not set\n+# CONFIG_SYSFS_SYSCALL is not set\n+# CONFIG_SYSTEMPORT is not set\n+# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set\n+# CONFIG_SYSTEM_DATA_VERIFICATION is not set\n+# CONFIG_SYSTEM_TRUSTED_KEYRING is not set\n+CONFIG_SYSTEM_TRUSTED_KEYS=\"\"\n+# CONFIG_SYSV68_PARTITION is not set\n+CONFIG_SYSVIPC=y\n+CONFIG_SYSVIPC_SYSCTL=y\n+# CONFIG_SYSV_FS is not set\n+# CONFIG_SYS_HYPERVISOR is not set\n+# CONFIG_T5403 is not set\n+# CONFIG_TARGET_CORE is not set\n+# CONFIG_TASKSTATS is not set\n+# CONFIG_TASKS_RCU is not set\n+CONFIG_TASKS_TRACE_RCU_READ_MB=y\n+# CONFIG_TASK_XACCT is not set\n+# CONFIG_TC35815 is not set\n+# CONFIG_TCG_ATMEL is not set\n+# CONFIG_TCG_CRB is not set\n+# CONFIG_TCG_FTPM_TEE is not set\n+# CONFIG_TCG_INFINEON is not set\n+# CONFIG_TCG_NSC is not set\n+# CONFIG_TCG_ST33_I2C is not set\n+# CONFIG_TCG_TIS is not set\n+# CONFIG_TCG_TIS_I2C_ATMEL is not set\n+# CONFIG_TCG_TIS_I2C_CR50 is not set\n+# CONFIG_TCG_TIS_I2C_INFINEON is not set\n+# CONFIG_TCG_TIS_I2C_NUVOTON is not set\n+# CONFIG_TCG_TIS_SPI is not set\n+# CONFIG_TCG_TIS_ST33ZP24_I2C is not set\n+# CONFIG_TCG_TIS_ST33ZP24_SPI is not set\n+# CONFIG_TCG_TPM is not set\n+# CONFIG_TCG_VTPM_PROXY is not set\n+# CONFIG_TCG_XEN is not set\n+# CONFIG_TCIC is not set\n+CONFIG_TCP_CONG_ADVANCED=y\n+# CONFIG_TCP_CONG_BBR is not set\n+# CONFIG_TCP_CONG_BIC is not set\n+# CONFIG_TCP_CONG_CDG is not set\n+CONFIG_TCP_CONG_CUBIC=y\n+# CONFIG_TCP_CONG_DCTCP is not set\n+# CONFIG_TCP_CONG_HSTCP is not set\n+# CONFIG_TCP_CONG_HTCP is not set\n+# CONFIG_TCP_CONG_HYBLA is not set\n+# CONFIG_TCP_CONG_ILLINOIS is not set\n+# CONFIG_TCP_CONG_LP is not set\n+# CONFIG_TCP_CONG_NV is not set\n+# CONFIG_TCP_CONG_SCALABLE is not set\n+# CONFIG_TCP_CONG_VEGAS is not set\n+# CONFIG_TCP_CONG_VENO is not set\n+# CONFIG_TCP_CONG_WESTWOOD is not set\n+# CONFIG_TCP_CONG_YEAH is not set\n+# CONFIG_TCP_MD5SIG is not set\n+# CONFIG_TCS3414 is not set\n+# CONFIG_TCS3472 is not set\n+# CONFIG_TEE is not set\n+# CONFIG_TEGRA_AHB is not set\n+# CONFIG_TEGRA_HOST1X is not set\n+# CONFIG_TEHUTI is not set\n+# CONFIG_TERANETICS_PHY is not set\n+# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set\n+# CONFIG_TEST_BITFIELD is not set\n+# CONFIG_TEST_BITMAP is not set\n+# CONFIG_TEST_BITOPS is not set\n+# CONFIG_TEST_BLACKHOLE_DEV is not set\n+# CONFIG_TEST_BPF is not set\n+# CONFIG_TEST_DIV64 is not set\n+# CONFIG_TEST_FIRMWARE is not set\n+# CONFIG_TEST_FREE_PAGES is not set\n+# CONFIG_TEST_HASH is not set\n+# CONFIG_TEST_HEXDUMP is not set\n+# CONFIG_TEST_IDA is not set\n+# CONFIG_TEST_KMOD is not set\n+# CONFIG_TEST_KSTRTOX is not set\n+# CONFIG_TEST_LIST_SORT is not set\n+# CONFIG_TEST_LKM is not set\n+# CONFIG_TEST_LOCKUP is not set\n+# CONFIG_TEST_MEMCAT_P is not set\n+# CONFIG_TEST_MEMINIT is not set\n+# CONFIG_TEST_MIN_HEAP is not set\n+# CONFIG_TEST_OVERFLOW is not set\n+# CONFIG_TEST_POWER is not set\n+# CONFIG_TEST_PRINTF is not set\n+# CONFIG_TEST_RHASHTABLE is not set\n+# CONFIG_TEST_SORT is not set\n+# CONFIG_TEST_STACKINIT is not set\n+# CONFIG_TEST_STATIC_KEYS is not set\n+# CONFIG_TEST_STRING_HELPERS is not set\n+# CONFIG_TEST_STRSCPY is not set\n+# CONFIG_TEST_SYSCTL is not set\n+# CONFIG_TEST_UDELAY is not set\n+# CONFIG_TEST_USER_COPY is not set\n+# CONFIG_TEST_UUID is not set\n+# CONFIG_TEST_VMALLOC is not set\n+# CONFIG_TEST_XARRAY is not set\n+CONFIG_TEXTSEARCH=y\n+# CONFIG_TEXTSEARCH_BM is not set\n+# CONFIG_TEXTSEARCH_FSM is not set\n+# CONFIG_TEXTSEARCH_KMP is not set\n+# CONFIG_THERMAL is not set\n+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set\n+# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set\n+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set\n+# CONFIG_THERMAL_EMULATION is not set\n+# CONFIG_THERMAL_GOV_BANG_BANG is not set\n+# CONFIG_THERMAL_GOV_FAIR_SHARE is not set\n+# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set\n+# CONFIG_THERMAL_GOV_USER_SPACE is not set\n+# CONFIG_THERMAL_HWMON is not set\n+# CONFIG_THERMAL_MMIO is not set\n+# CONFIG_THERMAL_NETLINK is not set\n+# CONFIG_THERMAL_STATISTICS is not set\n+# CONFIG_THERMAL_WRITABLE_TRIPS is not set\n+# CONFIG_THINKPAD_ACPI is not set\n+CONFIG_THIN_ARCHIVES=y\n+# CONFIG_THRUSTMASTER_FF is not set\n+# CONFIG_THUMB2_KERNEL is not set\n+# CONFIG_THUNDERBOLT is not set\n+# CONFIG_THUNDER_NIC_BGX is not set\n+# CONFIG_THUNDER_NIC_PF is not set\n+# CONFIG_THUNDER_NIC_RGX is not set\n+# CONFIG_THUNDER_NIC_VF is not set\n+# CONFIG_TICK_CPU_ACCOUNTING is not set\n+CONFIG_TICK_ONESHOT=y\n+# CONFIG_TIFM_CORE is not set\n+# CONFIG_TIGON3 is not set\n+# CONFIG_TIMB_DMA is not set\n+CONFIG_TIMERFD=y\n+# CONFIG_TIMER_STATS is not set\n+# CONFIG_TIME_NS is not set\n+# CONFIG_TINYDRM_HX8357D is not set\n+# CONFIG_TINYDRM_ILI9225 is not set\n+# CONFIG_TINYDRM_ILI9341 is not set\n+# CONFIG_TINYDRM_ILI9486 is not set\n+# CONFIG_TINYDRM_MI0283QT is not set\n+# CONFIG_TINYDRM_REPAPER is not set\n+# CONFIG_TINYDRM_ST7586 is not set\n+# CONFIG_TINYDRM_ST7735R is not set\n+CONFIG_TINY_RCU=y\n+# CONFIG_TIPC is not set\n+# CONFIG_TI_ADC081C is not set\n+# CONFIG_TI_ADC0832 is not set\n+# CONFIG_TI_ADC084S021 is not set\n+# CONFIG_TI_ADC108S102 is not set\n+# CONFIG_TI_ADC12138 is not set\n+# CONFIG_TI_ADC128S052 is not set\n+# CONFIG_TI_ADC161S626 is not set\n+# CONFIG_TI_ADS1015 is not set\n+# CONFIG_TI_ADS124S08 is not set\n+# CONFIG_TI_ADS7950 is not set\n+# CONFIG_TI_ADS8344 is not set\n+# CONFIG_TI_ADS8688 is not set\n+# CONFIG_TI_AM335X_ADC is not set\n+# CONFIG_TI_CPSW is not set\n+# CONFIG_TI_CPSW_ALE is not set\n+# CONFIG_TI_CPSW_PHY_SEL is not set\n+# CONFIG_TI_CPTS is not set\n+# CONFIG_TI_DAC082S085 is not set\n+# CONFIG_TI_DAC5571 is not set\n+# CONFIG_TI_DAC7311 is not set\n+# CONFIG_TI_DAC7512 is not set\n+# CONFIG_TI_DAC7612 is not set\n+# CONFIG_TI_DAVINCI_CPDMA is not set\n+# CONFIG_TI_DAVINCI_MDIO is not set\n+# CONFIG_TI_ST is not set\n+# CONFIG_TI_SYSCON_RESET is not set\n+# CONFIG_TI_TLC4541 is not set\n+# CONFIG_TLAN is not set\n+# CONFIG_TLS is not set\n+# CONFIG_TMD_HERMES is not set\n+# CONFIG_TMP006 is not set\n+# CONFIG_TMP007 is not set\n+CONFIG_TMPFS=y\n+# CONFIG_TMPFS_INODE64 is not set\n+# CONFIG_TMPFS_POSIX_ACL is not set\n+CONFIG_TMPFS_XATTR=y\n+# CONFIG_TOPSTAR_LAPTOP is not set\n+# CONFIG_TORTURE_TEST is not set\n+# CONFIG_TOSHIBA_HAPS is not set\n+# CONFIG_TOUCHSCREEN_88PM860X is not set\n+# CONFIG_TOUCHSCREEN_AD7877 is not set\n+# CONFIG_TOUCHSCREEN_AD7879 is not set\n+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set\n+# CONFIG_TOUCHSCREEN_AD7879_SPI is not set\n+# CONFIG_TOUCHSCREEN_ADC is not set\n+# CONFIG_TOUCHSCREEN_ADS7846 is not set\n+# CONFIG_TOUCHSCREEN_AR1021_I2C is not set\n+# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set\n+# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set\n+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set\n+# CONFIG_TOUCHSCREEN_BU21013 is not set\n+# CONFIG_TOUCHSCREEN_BU21029 is not set\n+# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set\n+# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set\n+# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set\n+# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set\n+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set\n+# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set\n+# CONFIG_TOUCHSCREEN_DA9034 is not set\n+# CONFIG_TOUCHSCREEN_DA9052 is not set\n+# CONFIG_TOUCHSCREEN_DYNAPRO is not set\n+# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set\n+# CONFIG_TOUCHSCREEN_EETI is not set\n+# CONFIG_TOUCHSCREEN_EGALAX is not set\n+# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set\n+# CONFIG_TOUCHSCREEN_EKTF2127 is not set\n+# CONFIG_TOUCHSCREEN_ELAN is not set\n+# CONFIG_TOUCHSCREEN_ELO is not set\n+# CONFIG_TOUCHSCREEN_EXC3000 is not set\n+# CONFIG_TOUCHSCREEN_FUJITSU is not set\n+# CONFIG_TOUCHSCREEN_GOODIX is not set\n+# CONFIG_TOUCHSCREEN_GUNZE is not set\n+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set\n+# CONFIG_TOUCHSCREEN_HIDEEP is not set\n+# CONFIG_TOUCHSCREEN_HP600 is not set\n+# CONFIG_TOUCHSCREEN_HP7XX is not set\n+# CONFIG_TOUCHSCREEN_HTCPEN is not set\n+# CONFIG_TOUCHSCREEN_ILI210X is not set\n+# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set\n+# CONFIG_TOUCHSCREEN_INEXIO is not set\n+# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set\n+# CONFIG_TOUCHSCREEN_IPROC is not set\n+# CONFIG_TOUCHSCREEN_IQS5XX is not set\n+# CONFIG_TOUCHSCREEN_LPC32XX is not set\n+# CONFIG_TOUCHSCREEN_MAX11801 is not set\n+# CONFIG_TOUCHSCREEN_MC13783 is not set\n+# CONFIG_TOUCHSCREEN_MCS5000 is not set\n+# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set\n+# CONFIG_TOUCHSCREEN_MIGOR is not set\n+# CONFIG_TOUCHSCREEN_MK712 is not set\n+# CONFIG_TOUCHSCREEN_MMS114 is not set\n+# CONFIG_TOUCHSCREEN_MTOUCH is not set\n+# CONFIG_TOUCHSCREEN_MX25 is not set\n+# CONFIG_TOUCHSCREEN_MXS_LRADC is not set\n+# CONFIG_TOUCHSCREEN_PCAP is not set\n+# CONFIG_TOUCHSCREEN_PENMOUNT is not set\n+# CONFIG_TOUCHSCREEN_PIXCIR is not set\n+# CONFIG_TOUCHSCREEN_PROPERTIES is not set\n+# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set\n+# CONFIG_TOUCHSCREEN_RM_TS is not set\n+# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set\n+# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set\n+# CONFIG_TOUCHSCREEN_S3C2410 is not set\n+# CONFIG_TOUCHSCREEN_S6SY761 is not set\n+# CONFIG_TOUCHSCREEN_SILEAD is not set\n+# CONFIG_TOUCHSCREEN_SIS_I2C is not set\n+# CONFIG_TOUCHSCREEN_ST1232 is not set\n+# CONFIG_TOUCHSCREEN_STMFTS is not set\n+# CONFIG_TOUCHSCREEN_STMPE is not set\n+# CONFIG_TOUCHSCREEN_SUN4I is not set\n+# CONFIG_TOUCHSCREEN_SUR40 is not set\n+# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set\n+# CONFIG_TOUCHSCREEN_SX8654 is not set\n+# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set\n+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set\n+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set\n+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set\n+# CONFIG_TOUCHSCREEN_TPS6507X is not set\n+# CONFIG_TOUCHSCREEN_TS4800 is not set\n+# CONFIG_TOUCHSCREEN_TSC2004 is not set\n+# CONFIG_TOUCHSCREEN_TSC2005 is not set\n+# CONFIG_TOUCHSCREEN_TSC2007 is not set\n+# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set\n+# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set\n+# CONFIG_TOUCHSCREEN_TSC_SERIO is not set\n+# CONFIG_TOUCHSCREEN_UCB1400 is not set\n+# CONFIG_TOUCHSCREEN_USB_3M is not set\n+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set\n+# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set\n+# CONFIG_TOUCHSCREEN_USB_E2I is not set\n+# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set\n+# CONFIG_TOUCHSCREEN_USB_EGALAX is not set\n+# CONFIG_TOUCHSCREEN_USB_ELO is not set\n+# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set\n+# CONFIG_TOUCHSCREEN_USB_ETURBO is not set\n+# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set\n+# CONFIG_TOUCHSCREEN_USB_GOTOP is not set\n+# CONFIG_TOUCHSCREEN_USB_GUNZE is not set\n+# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set\n+# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set\n+# CONFIG_TOUCHSCREEN_USB_ITM is not set\n+# CONFIG_TOUCHSCREEN_USB_JASTEC is not set\n+# CONFIG_TOUCHSCREEN_USB_NEXIO is not set\n+# CONFIG_TOUCHSCREEN_USB_PANJIT is not set\n+# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set\n+# CONFIG_TOUCHSCREEN_W90X900 is not set\n+# CONFIG_TOUCHSCREEN_WACOM_I2C is not set\n+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set\n+# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set\n+# CONFIG_TOUCHSCREEN_WM831X is not set\n+# CONFIG_TOUCHSCREEN_WM9705 is not set\n+# CONFIG_TOUCHSCREEN_WM9712 is not set\n+# CONFIG_TOUCHSCREEN_WM9713 is not set\n+# CONFIG_TOUCHSCREEN_WM97XX is not set\n+# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set\n+# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set\n+# CONFIG_TOUCHSCREEN_ZET6223 is not set\n+# CONFIG_TOUCHSCREEN_ZFORCE is not set\n+# CONFIG_TOUCHSCREEN_ZINITIX is not set\n+# CONFIG_TPL0102 is not set\n+# CONFIG_TPS6105X is not set\n+# CONFIG_TPS65010 is not set\n+# CONFIG_TPS6507X is not set\n+# CONFIG_TRACEPOINT_BENCHMARK is not set\n+# CONFIG_TRACER_SNAPSHOT is not set\n+# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set\n+# CONFIG_TRACE_BRANCH_PROFILING is not set\n+# CONFIG_TRACE_EVAL_MAP_FILE is not set\n+# CONFIG_TRACE_EVENT_INJECT is not set\n+CONFIG_TRACE_IRQFLAGS_SUPPORT=y\n+# CONFIG_TRACE_SINK is not set\n+# CONFIG_TRACING_EVENTS_GPIO is not set\n+CONFIG_TRACING_SUPPORT=y\n+CONFIG_TRAD_SIGNALS=y\n+# CONFIG_TRANSPARENT_HUGEPAGE is not set\n+# CONFIG_TREE_RCU is not set\n+# CONFIG_TREE_RCU_TRACE is not set\n+# CONFIG_TRIM_UNUSED_KSYMS is not set\n+# CONFIG_TRUSTED_FOUNDATIONS is not set\n+# CONFIG_TRUSTED_KEYS is not set\n+# CONFIG_TSL2583 is not set\n+# CONFIG_TSL2772 is not set\n+# CONFIG_TSL2x7x is not set\n+# CONFIG_TSL4531 is not set\n+# CONFIG_TSYS01 is not set\n+# CONFIG_TSYS02D is not set\n+# CONFIG_TTPCI_EEPROM is not set\n+CONFIG_TTY=y\n+# CONFIG_TTY_PRINTK is not set\n+# CONFIG_TUN is not set\n+# CONFIG_TUN_VNET_CROSS_LE is not set\n+# CONFIG_TWL4030_CORE is not set\n+# CONFIG_TWL4030_MADC is not set\n+# CONFIG_TWL6030_GPADC is not set\n+# CONFIG_TWL6040_CORE is not set\n+# CONFIG_TYPEC is not set\n+# CONFIG_TYPEC_TCPM is not set\n+# CONFIG_TYPEC_UCSI is not set\n+# CONFIG_TYPHOON is not set\n+# CONFIG_UACCESS_WITH_MEMCPY is not set\n+# CONFIG_UBIFS_ATIME_SUPPORT is not set\n+# CONFIG_UBIFS_FS_AUTHENTICATION is not set\n+# CONFIG_UBIFS_FS_ENCRYPTION is not set\n+# CONFIG_UBIFS_FS_SECURITY is not set\n+CONFIG_UBIFS_FS_XATTR=y\n+# CONFIG_UBIFS_FS_ZLIB is not set\n+# CONFIG_UBIFS_FS_ZSTD is not set\n+# CONFIG_UBSAN is not set\n+CONFIG_UBSAN_ALIGNMENT=y\n+# CONFIG_UCB1400_CORE is not set\n+# CONFIG_UCSI is not set\n+# CONFIG_UDF_FS is not set\n+# CONFIG_UDMABUF is not set\n+CONFIG_UEVENT_HELPER=y\n+CONFIG_UEVENT_HELPER_PATH=\"/sbin/hotplug\"\n+# CONFIG_UFS_FS is not set\n+# CONFIG_UHID is not set\n+CONFIG_UID16=y\n+# CONFIG_UIO is not set\n+# CONFIG_ULTRA is not set\n+# CONFIG_ULTRIX_PARTITION is not set\n+# CONFIG_UNICODE is not set\n+# CONFIG_UNISYSSPAR is not set\n+# CONFIG_UNISYS_VISORBUS is not set\n+CONFIG_UNIX=y\n+CONFIG_UNIX98_PTYS=y\n+# CONFIG_UNIXWARE_DISKLABEL is not set\n+# CONFIG_UNIX_DIAG is not set\n+CONFIG_UNIX_SCM=y\n+# CONFIG_UNUSED_SYMBOLS is not set\n+# CONFIG_UNWINDER_FRAME_POINTER is not set\n+# CONFIG_UPROBES is not set\n+# CONFIG_UPROBE_EVENTS is not set\n+# CONFIG_US5182D is not set\n+# CONFIG_USB is not set\n+# CONFIG_USB4 is not set\n+# CONFIG_USBIP_CORE is not set\n+CONFIG_USBIP_VHCI_HC_PORTS=8\n+CONFIG_USBIP_VHCI_NR_HCS=1\n+# CONFIG_USBIP_VUDC is not set\n+# CONFIG_USBPCWATCHDOG is not set\n+# CONFIG_USB_ACM is not set\n+# CONFIG_USB_ADUTUX is not set\n+# CONFIG_USB_AIRSPY is not set\n+CONFIG_USB_ALI_M5632=y\n+# CONFIG_USB_AMD5536UDC is not set\n+CONFIG_USB_AN2720=y\n+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set\n+# CONFIG_USB_APPLEDISPLAY is not set\n+CONFIG_USB_ARCH_HAS_HCD=y\n+CONFIG_USB_ARMLINUX=y\n+# CONFIG_USB_ATM is not set\n+CONFIG_USB_AUTOSUSPEND_DELAY=2\n+# CONFIG_USB_BDC_UDC is not set\n+CONFIG_USB_BELKIN=y\n+# CONFIG_USB_C67X00_HCD is not set\n+# CONFIG_USB_CATC is not set\n+# CONFIG_USB_CDC_COMPOSITE is not set\n+# CONFIG_USB_CDNS3 is not set\n+# CONFIG_USB_CHAOSKEY is not set\n+# CONFIG_USB_CHIPIDEA is not set\n+# CONFIG_USB_CHIPIDEA_GENERIC is not set\n+# CONFIG_USB_CHIPIDEA_IMX is not set\n+# CONFIG_USB_CHIPIDEA_MSM is not set\n+# CONFIG_USB_CHIPIDEA_PCI is not set\n+# CONFIG_USB_CHIPIDEA_TEGRA is not set\n+# CONFIG_USB_CONFIGFS is not set\n+# CONFIG_USB_CONN_GPIO is not set\n+# CONFIG_USB_CXACRU is not set\n+# CONFIG_USB_CYPRESS_CY7C63 is not set\n+# CONFIG_USB_CYTHERM is not set\n+CONFIG_USB_DEFAULT_PERSIST=y\n+# CONFIG_USB_DSBR is not set\n+# CONFIG_USB_DUMMY_HCD is not set\n+# CONFIG_USB_DWC2 is not set\n+# CONFIG_USB_DWC2_DEBUG is not set\n+# CONFIG_USB_DWC2_DUAL_ROLE is not set\n+# CONFIG_USB_DWC2_HOST is not set\n+# CONFIG_USB_DWC2_PERIPHERAL is not set\n+# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set\n+# CONFIG_USB_DWC3 is not set\n+# CONFIG_USB_DWC3_EXYNOS is not set\n+# CONFIG_USB_DWC3_HAPS is not set\n+# CONFIG_USB_DWC3_KEYSTONE is not set\n+# CONFIG_USB_DWC3_OF_SIMPLE is not set\n+# CONFIG_USB_DWC3_PCI is not set\n+# CONFIG_USB_DWC3_QCOM is not set\n+# CONFIG_USB_DWC3_ULPI is not set\n+# CONFIG_USB_DYNAMIC_MINORS is not set\n+# CONFIG_USB_EG20T is not set\n+# CONFIG_USB_EHCI_ATH79 is not set\n+# CONFIG_USB_EHCI_FSL is not set\n+# CONFIG_USB_EHCI_HCD is not set\n+# CONFIG_USB_EHCI_HCD_AT91 is not set\n+# CONFIG_USB_EHCI_HCD_OMAP is not set\n+# CONFIG_USB_EHCI_HCD_PPC_OF is not set\n+# CONFIG_USB_EHCI_MSM is not set\n+# CONFIG_USB_EHCI_MV is not set\n+CONFIG_USB_EHCI_ROOT_HUB_TT=y\n+CONFIG_USB_EHCI_TT_NEWSCHED=y\n+# CONFIG_USB_EHSET_TEST_FIXTURE is not set\n+# CONFIG_USB_EMI26 is not set\n+# CONFIG_USB_EMI62 is not set\n+# CONFIG_USB_EPSON2888 is not set\n+# CONFIG_USB_EZUSB_FX2 is not set\n+# CONFIG_USB_FEW_INIT_RETRIES is not set\n+# CONFIG_USB_FOTG210_HCD is not set\n+# CONFIG_USB_FOTG210_UDC is not set\n+# CONFIG_USB_FSL_USB2 is not set\n+# CONFIG_USB_FTDI_ELAN is not set\n+# CONFIG_USB_FUNCTIONFS is not set\n+# CONFIG_USB_FUSB300 is not set\n+# CONFIG_USB_GADGET is not set\n+# CONFIG_USB_GADGETFS is not set\n+# CONFIG_USB_GADGET_DEBUG is not set\n+# CONFIG_USB_GADGET_DEBUG_FILES is not set\n+# CONFIG_USB_GADGET_DEBUG_FS is not set\n+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2\n+CONFIG_USB_GADGET_VBUS_DRAW=2\n+# CONFIG_USB_GADGET_XILINX is not set\n+# CONFIG_USB_GL860 is not set\n+# CONFIG_USB_GOKU is not set\n+# CONFIG_USB_GPIO_VBUS is not set\n+# CONFIG_USB_GR_UDC is not set\n+# CONFIG_USB_GSPCA is not set\n+# CONFIG_USB_GSPCA_BENQ is not set\n+# CONFIG_USB_GSPCA_CONEX is not set\n+# CONFIG_USB_GSPCA_CPIA1 is not set\n+# CONFIG_USB_GSPCA_DTCS033 is not set\n+# CONFIG_USB_GSPCA_ETOMS is not set\n+# CONFIG_USB_GSPCA_FINEPIX is not set\n+# CONFIG_USB_GSPCA_JEILINJ is not set\n+# CONFIG_USB_GSPCA_JL2005BCD is not set\n+# CONFIG_USB_GSPCA_KINECT is not set\n+# CONFIG_USB_GSPCA_KONICA is not set\n+# CONFIG_USB_GSPCA_MARS is not set\n+# CONFIG_USB_GSPCA_MR97310A is not set\n+# CONFIG_USB_GSPCA_NW80X is not set\n+# CONFIG_USB_GSPCA_OV519 is not set\n+# CONFIG_USB_GSPCA_OV534 is not set\n+# CONFIG_USB_GSPCA_OV534_9 is not set\n+# CONFIG_USB_GSPCA_PAC207 is not set\n+# CONFIG_USB_GSPCA_PAC7302 is not set\n+# CONFIG_USB_GSPCA_PAC7311 is not set\n+# CONFIG_USB_GSPCA_SE401 is not set\n+# CONFIG_USB_GSPCA_SN9C2028 is not set\n+# CONFIG_USB_GSPCA_SN9C20X is not set\n+# CONFIG_USB_GSPCA_SONIXB is not set\n+# CONFIG_USB_GSPCA_SONIXJ is not set\n+# CONFIG_USB_GSPCA_SPCA1528 is not set\n+# CONFIG_USB_GSPCA_SPCA500 is not set\n+# CONFIG_USB_GSPCA_SPCA501 is not set\n+# CONFIG_USB_GSPCA_SPCA505 is not set\n+# CONFIG_USB_GSPCA_SPCA506 is not set\n+# CONFIG_USB_GSPCA_SPCA508 is not set\n+# CONFIG_USB_GSPCA_SPCA561 is not set\n+# CONFIG_USB_GSPCA_SQ905 is not set\n+# CONFIG_USB_GSPCA_SQ905C is not set\n+# CONFIG_USB_GSPCA_SQ930X is not set\n+# CONFIG_USB_GSPCA_STK014 is not set\n+# CONFIG_USB_GSPCA_STK1135 is not set\n+# CONFIG_USB_GSPCA_STV0680 is not set\n+# CONFIG_USB_GSPCA_SUNPLUS is not set\n+# CONFIG_USB_GSPCA_T613 is not set\n+# CONFIG_USB_GSPCA_TOPRO is not set\n+# CONFIG_USB_GSPCA_TOUPTEK is not set\n+# CONFIG_USB_GSPCA_TV8532 is not set\n+# CONFIG_USB_GSPCA_VC032X is not set\n+# CONFIG_USB_GSPCA_VICAM is not set\n+# CONFIG_USB_GSPCA_XIRLINK_CIT is not set\n+# CONFIG_USB_GSPCA_ZC3XX is not set\n+# CONFIG_USB_G_ACM_MS is not set\n+# CONFIG_USB_G_DBGP is not set\n+# CONFIG_USB_G_HID is not set\n+# CONFIG_USB_G_MULTI is not set\n+# CONFIG_USB_G_NCM is not set\n+# CONFIG_USB_G_NOKIA is not set\n+# CONFIG_USB_G_PRINTER is not set\n+# CONFIG_USB_G_SERIAL is not set\n+# CONFIG_USB_G_WEBCAM is not set\n+# CONFIG_USB_HACKRF is not set\n+# CONFIG_USB_HCD_TEST_MODE is not set\n+# CONFIG_USB_HID is not set\n+# CONFIG_USB_HIDDEV is not set\n+# CONFIG_USB_HSIC_USB3503 is not set\n+# CONFIG_USB_HSIC_USB4604 is not set\n+# CONFIG_USB_HSO is not set\n+# CONFIG_USB_HUB_USB251XB is not set\n+# CONFIG_USB_HWA_HCD is not set\n+# CONFIG_USB_IDMOUSE is not set\n+# CONFIG_USB_IMX21_HCD is not set\n+# CONFIG_USB_IOWARRIOR is not set\n+# CONFIG_USB_IPHETH is not set\n+# CONFIG_USB_ISIGHTFW is not set\n+# CONFIG_USB_ISP116X_HCD is not set\n+# CONFIG_USB_ISP1301 is not set\n+# CONFIG_USB_ISP1362_HCD is not set\n+# CONFIG_USB_ISP1760 is not set\n+# CONFIG_USB_ISP1760_HCD is not set\n+# CONFIG_USB_KAWETH is not set\n+# CONFIG_USB_KBD is not set\n+# CONFIG_USB_KC2190 is not set\n+# CONFIG_USB_LAN78XX is not set\n+# CONFIG_USB_LCD is not set\n+# CONFIG_USB_LD is not set\n+# CONFIG_USB_LED is not set\n+# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set\n+# CONFIG_USB_LED_TRIG is not set\n+# CONFIG_USB_LEGOTOWER is not set\n+# CONFIG_USB_LGM_PHY is not set\n+# CONFIG_USB_LINK_LAYER_TEST is not set\n+# CONFIG_USB_M5602 is not set\n+# CONFIG_USB_M66592 is not set\n+# CONFIG_USB_MASS_STORAGE is not set\n+# CONFIG_USB_MAX3420_UDC is not set\n+# CONFIG_USB_MAX3421_HCD is not set\n+# CONFIG_USB_MDC800 is not set\n+# CONFIG_USB_MICROTEK is not set\n+# CONFIG_USB_MIDI_GADGET is not set\n+# CONFIG_USB_MON is not set\n+# CONFIG_USB_MOUSE is not set\n+# CONFIG_USB_MSI2500 is not set\n+# CONFIG_USB_MSM_OTG is not set\n+# CONFIG_USB_MTU3 is not set\n+# CONFIG_USB_MUSB_HDRC is not set\n+# CONFIG_USB_MV_U3D is not set\n+# CONFIG_USB_MV_UDC is not set\n+# CONFIG_USB_MXS_PHY is not set\n+# CONFIG_USB_NET2272 is not set\n+# CONFIG_USB_NET2280 is not set\n+# CONFIG_USB_NET_AQC111 is not set\n+# CONFIG_USB_NET_AX88179_178A is not set\n+# CONFIG_USB_NET_AX8817X is not set\n+# CONFIG_USB_NET_CDCETHER is not set\n+# CONFIG_USB_NET_CDC_EEM is not set\n+# CONFIG_USB_NET_CDC_MBIM is not set\n+# CONFIG_USB_NET_CDC_NCM is not set\n+# CONFIG_USB_NET_CDC_SUBSET is not set\n+# CONFIG_USB_NET_CH9200 is not set\n+# CONFIG_USB_NET_CX82310_ETH is not set\n+# CONFIG_USB_NET_DM9601 is not set\n+# CONFIG_USB_NET_DRIVERS is not set\n+# CONFIG_USB_NET_GL620A is not set\n+# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set\n+# CONFIG_USB_NET_INT51X1 is not set\n+# CONFIG_USB_NET_KALMIA is not set\n+# CONFIG_USB_NET_MCS7830 is not set\n+# CONFIG_USB_NET_NET1080 is not set\n+# CONFIG_USB_NET_PLUSB is not set\n+# CONFIG_USB_NET_QMI_WWAN is not set\n+# CONFIG_USB_NET_RNDIS_HOST is not set\n+# CONFIG_USB_NET_RNDIS_WLAN is not set\n+# CONFIG_USB_NET_SMSC75XX is not set\n+# CONFIG_USB_NET_SMSC95XX is not set\n+# CONFIG_USB_NET_SR9700 is not set\n+# CONFIG_USB_NET_SR9800 is not set\n+# CONFIG_USB_NET_ZAURUS is not set\n+# CONFIG_USB_OHCI_HCD is not set\n+# CONFIG_USB_OHCI_HCD_PCI is not set\n+# CONFIG_USB_OHCI_HCD_PPC_OF is not set\n+# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set\n+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set\n+# CONFIG_USB_OHCI_HCD_SSB is not set\n+CONFIG_USB_OHCI_LITTLE_ENDIAN=y\n+# CONFIG_USB_OTG is not set\n+# CONFIG_USB_OTG_BLACKLIST_HUB is not set\n+# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set\n+# CONFIG_USB_OTG_FSM is not set\n+# CONFIG_USB_OTG_PRODUCTLIST is not set\n+# CONFIG_USB_OTG_WHITELIST is not set\n+# CONFIG_USB_OXU210HP_HCD is not set\n+# CONFIG_USB_PCI is not set\n+# CONFIG_USB_PEGASUS is not set\n+# CONFIG_USB_PHY is not set\n+# CONFIG_USB_PRINTER is not set\n+# CONFIG_USB_PWC_INPUT_EVDEV is not set\n+# CONFIG_USB_PXA27X is not set\n+# CONFIG_USB_R8A66597 is not set\n+# CONFIG_USB_R8A66597_HCD is not set\n+# CONFIG_USB_RAW_GADGET is not set\n+# CONFIG_USB_RCAR_PHY is not set\n+# CONFIG_USB_RENESAS_USBHS is not set\n+# CONFIG_USB_RIO500 is not set\n+# CONFIG_USB_ROLE_SWITCH is not set\n+# CONFIG_USB_RTL8150 is not set\n+# CONFIG_USB_RTL8152 is not set\n+# CONFIG_USB_RTL8153_ECM is not set\n+# CONFIG_USB_S2255 is not set\n+# CONFIG_USB_SERIAL is not set\n+# CONFIG_USB_SERIAL_AIRCABLE is not set\n+# CONFIG_USB_SERIAL_ARK3116 is not set\n+# CONFIG_USB_SERIAL_BELKIN is not set\n+# CONFIG_USB_SERIAL_CH341 is not set\n+# CONFIG_USB_SERIAL_CP210X is not set\n+# CONFIG_USB_SERIAL_CYBERJACK is not set\n+# CONFIG_USB_SERIAL_CYPRESS_M8 is not set\n+# CONFIG_USB_SERIAL_DEBUG is not set\n+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set\n+# CONFIG_USB_SERIAL_EDGEPORT is not set\n+# CONFIG_USB_SERIAL_EDGEPORT_TI is not set\n+# CONFIG_USB_SERIAL_EMPEG is not set\n+# CONFIG_USB_SERIAL_F81232 is not set\n+# CONFIG_USB_SERIAL_F8153X is not set\n+# CONFIG_USB_SERIAL_FTDI_SIO is not set\n+# CONFIG_USB_SERIAL_GARMIN is not set\n+CONFIG_USB_SERIAL_GENERIC=y\n+# CONFIG_USB_SERIAL_IPAQ is not set\n+# CONFIG_USB_SERIAL_IPW is not set\n+# CONFIG_USB_SERIAL_IR is not set\n+# CONFIG_USB_SERIAL_IUU is not set\n+# CONFIG_USB_SERIAL_KEYSPAN is not set\n+CONFIG_USB_SERIAL_KEYSPAN_MPR=y\n+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set\n+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA19=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA28=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y\n+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y\n+# CONFIG_USB_SERIAL_KLSI is not set\n+# CONFIG_USB_SERIAL_KOBIL_SCT is not set\n+# CONFIG_USB_SERIAL_MCT_U232 is not set\n+# CONFIG_USB_SERIAL_METRO is not set\n+# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set\n+# CONFIG_USB_SERIAL_MOS7720 is not set\n+# CONFIG_USB_SERIAL_MOS7840 is not set\n+# CONFIG_USB_SERIAL_MXUPORT is not set\n+# CONFIG_USB_SERIAL_NAVMAN is not set\n+# CONFIG_USB_SERIAL_OMNINET is not set\n+# CONFIG_USB_SERIAL_OPTICON is not set\n+# CONFIG_USB_SERIAL_OPTION is not set\n+# CONFIG_USB_SERIAL_OTI6858 is not set\n+# CONFIG_USB_SERIAL_PL2303 is not set\n+# CONFIG_USB_SERIAL_QCAUX is not set\n+# CONFIG_USB_SERIAL_QT2 is not set\n+# CONFIG_USB_SERIAL_QUALCOMM is not set\n+# CONFIG_USB_SERIAL_SAFE is not set\n+CONFIG_USB_SERIAL_SAFE_PADDED=y\n+# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set\n+# CONFIG_USB_SERIAL_SIMPLE is not set\n+# CONFIG_USB_SERIAL_SPCP8X5 is not set\n+# CONFIG_USB_SERIAL_SSU100 is not set\n+# CONFIG_USB_SERIAL_SYMBOL is not set\n+# CONFIG_USB_SERIAL_TI is not set\n+# CONFIG_USB_SERIAL_UPD78F0730 is not set\n+# CONFIG_USB_SERIAL_VISOR is not set\n+# CONFIG_USB_SERIAL_WHITEHEAT is not set\n+# CONFIG_USB_SERIAL_WISHBONE is not set\n+# CONFIG_USB_SERIAL_XIRCOM is not set\n+# CONFIG_USB_SERIAL_XSENS_MT is not set\n+# CONFIG_USB_SEVSEG is not set\n+# CONFIG_USB_SIERRA_NET is not set\n+# CONFIG_USB_SISUSBVGA is not set\n+# CONFIG_USB_SL811_HCD is not set\n+# CONFIG_USB_SNP_UDC_PLAT is not set\n+# CONFIG_USB_SPEEDTOUCH is not set\n+# CONFIG_USB_STKWEBCAM is not set\n+# CONFIG_USB_STORAGE is not set\n+# CONFIG_USB_STORAGE_ALAUDA is not set\n+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set\n+# CONFIG_USB_STORAGE_DATAFAB is not set\n+# CONFIG_USB_STORAGE_DEBUG is not set\n+# CONFIG_USB_STORAGE_ENE_UB6250 is not set\n+# CONFIG_USB_STORAGE_FREECOM is not set\n+# CONFIG_USB_STORAGE_ISD200 is not set\n+# CONFIG_USB_STORAGE_JUMPSHOT is not set\n+# CONFIG_USB_STORAGE_KARMA is not set\n+# CONFIG_USB_STORAGE_ONETOUCH is not set\n+# CONFIG_USB_STORAGE_REALTEK is not set\n+# CONFIG_USB_STORAGE_SDDR09 is not set\n+# CONFIG_USB_STORAGE_SDDR55 is not set\n+# CONFIG_USB_STORAGE_USBAT is not set\n+# CONFIG_USB_STV06XX is not set\n+# CONFIG_USB_SUPPORT is not set\n+# CONFIG_USB_SWITCH_FSA9480 is not set\n+# CONFIG_USB_TEST is not set\n+# CONFIG_USB_TMC is not set\n+# CONFIG_USB_TRANCEVIBRATOR is not set\n+# CONFIG_USB_UAS is not set\n+# CONFIG_USB_UEAGLEATM is not set\n+# CONFIG_USB_ULPI is not set\n+# CONFIG_USB_ULPI_BUS is not set\n+# CONFIG_USB_USBNET is not set\n+# CONFIG_USB_USS720 is not set\n+# CONFIG_USB_VIDEO_CLASS is not set\n+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y\n+# CONFIG_USB_VL600 is not set\n+# CONFIG_USB_WDM is not set\n+# CONFIG_USB_WHCI_HCD is not set\n+# CONFIG_USB_WUSB is not set\n+# CONFIG_USB_WUSB_CBAF is not set\n+# CONFIG_USB_XHCI_DBGCAP is not set\n+# CONFIG_USB_XHCI_HCD is not set\n+# CONFIG_USB_XHCI_MVEBU is not set\n+# CONFIG_USB_XHCI_PCI_RENESAS is not set\n+# CONFIG_USB_XUSBATM is not set\n+# CONFIG_USB_YUREX is not set\n+# CONFIG_USB_ZD1201 is not set\n+# CONFIG_USB_ZERO is not set\n+# CONFIG_USB_ZR364XX is not set\n+# CONFIG_USELIB is not set\n+# CONFIG_USERFAULTFD is not set\n+# CONFIG_USE_OF is not set\n+# CONFIG_UTS_NS is not set\n+# CONFIG_UWB is not set\n+# CONFIG_U_SERIAL_CONSOLE is not set\n+# CONFIG_V4L_MEM2MEM_DRIVERS is not set\n+# CONFIG_V4L_PLATFORM_DRIVERS is not set\n+# CONFIG_V4L_TEST_DRIVERS is not set\n+# CONFIG_VALIDATE_FS_PARSER is not set\n+# CONFIG_VBOXGUEST is not set\n+# CONFIG_VCNL3020 is not set\n+# CONFIG_VCNL4000 is not set\n+# CONFIG_VCNL4035 is not set\n+# CONFIG_VDPA is not set\n+CONFIG_VDSO=y\n+# CONFIG_VEML6030 is not set\n+# CONFIG_VEML6070 is not set\n+# CONFIG_VETH is not set\n+# CONFIG_VEXPRESS_CONFIG is not set\n+# CONFIG_VF610_ADC is not set\n+# CONFIG_VF610_DAC is not set\n+# CONFIG_VFAT_FS is not set\n+# CONFIG_VFIO is not set\n+# CONFIG_VGASTATE is not set\n+# CONFIG_VGA_ARB is not set\n+# CONFIG_VGA_SWITCHEROO is not set\n+# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set\n+CONFIG_VHOST_MENU=y\n+# CONFIG_VHOST_NET is not set\n+# CONFIG_VHOST_VSOCK is not set\n+# CONFIG_VIA_RHINE is not set\n+# CONFIG_VIA_VELOCITY is not set\n+# CONFIG_VIDEO_AD5820 is not set\n+# CONFIG_VIDEO_AD9389B is not set\n+# CONFIG_VIDEO_ADP1653 is not set\n+# CONFIG_VIDEO_ADV7170 is not set\n+# CONFIG_VIDEO_ADV7175 is not set\n+# CONFIG_VIDEO_ADV7180 is not set\n+# CONFIG_VIDEO_ADV7183 is not set\n+# CONFIG_VIDEO_ADV7343 is not set\n+# CONFIG_VIDEO_ADV7393 is not set\n+# CONFIG_VIDEO_ADV748X is not set\n+# CONFIG_VIDEO_ADV7511 is not set\n+# CONFIG_VIDEO_ADV7604 is not set\n+# CONFIG_VIDEO_ADV7842 is not set\n+# CONFIG_VIDEO_ADV_DEBUG is not set\n+# CONFIG_VIDEO_AK7375 is not set\n+# CONFIG_VIDEO_AK881X is not set\n+# CONFIG_VIDEO_ASPEED is not set\n+# CONFIG_VIDEO_AU0828 is not set\n+# CONFIG_VIDEO_BT819 is not set\n+# CONFIG_VIDEO_BT848 is not set\n+# CONFIG_VIDEO_BT856 is not set\n+# CONFIG_VIDEO_BT866 is not set\n+# CONFIG_VIDEO_CADENCE is not set\n+# CONFIG_VIDEO_CAFE_CCIC is not set\n+# CONFIG_VIDEO_CS3308 is not set\n+# CONFIG_VIDEO_CS5345 is not set\n+# CONFIG_VIDEO_CS53L32A is not set\n+# CONFIG_VIDEO_CX231XX is not set\n+# CONFIG_VIDEO_CX2341X is not set\n+# CONFIG_VIDEO_CX25840 is not set\n+# CONFIG_VIDEO_CX88 is not set\n+# CONFIG_VIDEO_DEV is not set\n+# CONFIG_VIDEO_DM6446_CCDC is not set\n+# CONFIG_VIDEO_DT3155 is not set\n+# CONFIG_VIDEO_DW9714 is not set\n+# CONFIG_VIDEO_DW9768 is not set\n+# CONFIG_VIDEO_DW9807_VCM is not set\n+# CONFIG_VIDEO_EM28XX is not set\n+# CONFIG_VIDEO_ET8EK8 is not set\n+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set\n+# CONFIG_VIDEO_GO7007 is not set\n+# CONFIG_VIDEO_GS1662 is not set\n+# CONFIG_VIDEO_HDPVR is not set\n+# CONFIG_VIDEO_HEXIUM_GEMINI is not set\n+# CONFIG_VIDEO_HEXIUM_ORION is not set\n+# CONFIG_VIDEO_HI556 is not set\n+# CONFIG_VIDEO_I2C is not set\n+# CONFIG_VIDEO_IMX214 is not set\n+# CONFIG_VIDEO_IMX219 is not set\n+# CONFIG_VIDEO_IMX258 is not set\n+# CONFIG_VIDEO_IMX274 is not set\n+# CONFIG_VIDEO_IMX290 is not set\n+# CONFIG_VIDEO_IMX319 is not set\n+# CONFIG_VIDEO_IMX355 is not set\n+# CONFIG_VIDEO_IR_I2C is not set\n+# CONFIG_VIDEO_IVTV is not set\n+# CONFIG_VIDEO_KS0127 is not set\n+# CONFIG_VIDEO_LM3560 is not set\n+# CONFIG_VIDEO_LM3646 is not set\n+# CONFIG_VIDEO_M52790 is not set\n+# CONFIG_VIDEO_M5MOLS is not set\n+# CONFIG_VIDEO_MAX9286 is not set\n+# CONFIG_VIDEO_ML86V7667 is not set\n+# CONFIG_VIDEO_MSP3400 is not set\n+# CONFIG_VIDEO_MT9M001 is not set\n+# CONFIG_VIDEO_MT9M032 is not set\n+# CONFIG_VIDEO_MT9M111 is not set\n+# CONFIG_VIDEO_MT9P031 is not set\n+# CONFIG_VIDEO_MT9T001 is not set\n+# CONFIG_VIDEO_MT9T112 is not set\n+# CONFIG_VIDEO_MT9V011 is not set\n+# CONFIG_VIDEO_MT9V032 is not set\n+# CONFIG_VIDEO_MT9V111 is not set\n+# CONFIG_VIDEO_MUX is not set\n+# CONFIG_VIDEO_MXB is not set\n+# CONFIG_VIDEO_NOON010PC30 is not set\n+# CONFIG_VIDEO_OMAP2_VOUT is not set\n+# CONFIG_VIDEO_OV13858 is not set\n+# CONFIG_VIDEO_OV2640 is not set\n+# CONFIG_VIDEO_OV2659 is not set\n+# CONFIG_VIDEO_OV2680 is not set\n+# CONFIG_VIDEO_OV2685 is not set\n+# CONFIG_VIDEO_OV5640 is not set\n+# CONFIG_VIDEO_OV5645 is not set\n+# CONFIG_VIDEO_OV5647 is not set\n+# CONFIG_VIDEO_OV5670 is not set\n+# CONFIG_VIDEO_OV5675 is not set\n+# CONFIG_VIDEO_OV5695 is not set\n+# CONFIG_VIDEO_OV6650 is not set\n+# CONFIG_VIDEO_OV7251 is not set\n+# CONFIG_VIDEO_OV7640 is not set\n+# CONFIG_VIDEO_OV7670 is not set\n+# CONFIG_VIDEO_OV772X is not set\n+# CONFIG_VIDEO_OV7740 is not set\n+# CONFIG_VIDEO_OV8856 is not set\n+# CONFIG_VIDEO_OV9640 is not set\n+# CONFIG_VIDEO_OV9650 is not set\n+# CONFIG_VIDEO_PVRUSB2 is not set\n+# CONFIG_VIDEO_RDACM20 is not set\n+# CONFIG_VIDEO_RJ54N1 is not set\n+# CONFIG_VIDEO_S5C73M3 is not set\n+# CONFIG_VIDEO_S5K4ECGX is not set\n+# CONFIG_VIDEO_S5K5BAF is not set\n+# CONFIG_VIDEO_S5K6A3 is not set\n+# CONFIG_VIDEO_S5K6AA is not set\n+# CONFIG_VIDEO_SAA6588 is not set\n+# CONFIG_VIDEO_SAA6752HS is not set\n+# CONFIG_VIDEO_SAA7110 is not set\n+# CONFIG_VIDEO_SAA711X is not set\n+# CONFIG_VIDEO_SAA7127 is not set\n+# CONFIG_VIDEO_SAA7134 is not set\n+# CONFIG_VIDEO_SAA717X is not set\n+# CONFIG_VIDEO_SAA7185 is not set\n+# CONFIG_VIDEO_SH_MOBILE_CEU is not set\n+# CONFIG_VIDEO_SMIAPP is not set\n+# CONFIG_VIDEO_SONY_BTF_MPX is not set\n+# CONFIG_VIDEO_SR030PC30 is not set\n+# CONFIG_VIDEO_STK1160_COMMON is not set\n+# CONFIG_VIDEO_ST_MIPID02 is not set\n+# CONFIG_VIDEO_TC358743 is not set\n+# CONFIG_VIDEO_TDA1997X is not set\n+# CONFIG_VIDEO_TDA7432 is not set\n+# CONFIG_VIDEO_TDA9840 is not set\n+# CONFIG_VIDEO_TEA6415C is not set\n+# CONFIG_VIDEO_TEA6420 is not set\n+# CONFIG_VIDEO_THS7303 is not set\n+# CONFIG_VIDEO_THS8200 is not set\n+# CONFIG_VIDEO_TIMBERDALE is not set\n+# CONFIG_VIDEO_TLV320AIC23B is not set\n+# CONFIG_VIDEO_TM6000 is not set\n+# CONFIG_VIDEO_TVAUDIO is not set\n+# CONFIG_VIDEO_TVP514X is not set\n+# CONFIG_VIDEO_TVP5150 is not set\n+# CONFIG_VIDEO_TVP7002 is not set\n+# CONFIG_VIDEO_TW2804 is not set\n+# CONFIG_VIDEO_TW9903 is not set\n+# CONFIG_VIDEO_TW9906 is not set\n+# CONFIG_VIDEO_TW9910 is not set\n+# CONFIG_VIDEO_UDA1342 is not set\n+# CONFIG_VIDEO_UPD64031A is not set\n+# CONFIG_VIDEO_UPD64083 is not set\n+# CONFIG_VIDEO_USBTV is not set\n+# CONFIG_VIDEO_USBVISION is not set\n+# CONFIG_VIDEO_V4L2 is not set\n+# CONFIG_VIDEO_VP27SMPX is not set\n+# CONFIG_VIDEO_VPX3220 is not set\n+# CONFIG_VIDEO_VS6624 is not set\n+# CONFIG_VIDEO_WM8739 is not set\n+# CONFIG_VIDEO_WM8775 is not set\n+# CONFIG_VIDEO_XILINX is not set\n+# CONFIG_VIDEO_ZORAN is not set\n+# CONFIG_VIRTIO_BALLOON is not set\n+# CONFIG_VIRTIO_BLK_SCSI is not set\n+# CONFIG_VIRTIO_CONSOLE is not set\n+# CONFIG_VIRTIO_FS is not set\n+# CONFIG_VIRTIO_INPUT is not set\n+CONFIG_VIRTIO_MENU=y\n+# CONFIG_VIRTIO_MMIO is not set\n+# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set\n+# CONFIG_VIRTIO_PCI is not set\n+# CONFIG_VIRTUALIZATION is not set\n+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set\n+# CONFIG_VIRT_DRIVERS is not set\n+CONFIG_VIRT_TO_BUS=y\n+# CONFIG_VITESSE_PHY is not set\n+# CONFIG_VL53L0X_I2C is not set\n+# CONFIG_VL6180 is not set\n+CONFIG_VLAN_8021Q=y\n+# CONFIG_VLAN_8021Q_GVRP is not set\n+# CONFIG_VLAN_8021Q_MVRP is not set\n+# CONFIG_VME_BUS is not set\n+# CONFIG_VMLINUX_MAP is not set\n+# CONFIG_VMSPLIT_1G is not set\n+# CONFIG_VMSPLIT_2G is not set\n+# CONFIG_VMSPLIT_2G_OPT is not set\n+CONFIG_VMSPLIT_3G=y\n+# CONFIG_VMSPLIT_3G_OPT is not set\n+# CONFIG_VMWARE_PVSCSI is not set\n+# CONFIG_VMXNET3 is not set\n+# CONFIG_VM_EVENT_COUNTERS is not set\n+# CONFIG_VOP_BUS is not set\n+# CONFIG_VORTEX is not set\n+# CONFIG_VSOCKETS is not set\n+# CONFIG_VSOCKETS_DIAG is not set\n+# CONFIG_VT is not set\n+# CONFIG_VT6655 is not set\n+# CONFIG_VT6656 is not set\n+# CONFIG_VXFS_FS is not set\n+# CONFIG_VXGE is not set\n+# CONFIG_VXLAN is not set\n+# CONFIG_VZ89X is not set\n+# CONFIG_W1 is not set\n+# CONFIG_W1_CON is not set\n+# CONFIG_W1_MASTER_DS1WM is not set\n+# CONFIG_W1_MASTER_DS2482 is not set\n+# CONFIG_W1_MASTER_DS2490 is not set\n+# CONFIG_W1_MASTER_GPIO is not set\n+# CONFIG_W1_MASTER_MATROX is not set\n+# CONFIG_W1_MASTER_SGI is not set\n+# CONFIG_W1_SLAVE_DS2405 is not set\n+# CONFIG_W1_SLAVE_DS2406 is not set\n+# CONFIG_W1_SLAVE_DS2408 is not set\n+# CONFIG_W1_SLAVE_DS2413 is not set\n+# CONFIG_W1_SLAVE_DS2423 is not set\n+# CONFIG_W1_SLAVE_DS2430 is not set\n+# CONFIG_W1_SLAVE_DS2431 is not set\n+# CONFIG_W1_SLAVE_DS2433 is not set\n+# CONFIG_W1_SLAVE_DS2438 is not set\n+# CONFIG_W1_SLAVE_DS250X is not set\n+# CONFIG_W1_SLAVE_DS2780 is not set\n+# CONFIG_W1_SLAVE_DS2781 is not set\n+# CONFIG_W1_SLAVE_DS2805 is not set\n+# CONFIG_W1_SLAVE_DS28E04 is not set\n+# CONFIG_W1_SLAVE_DS28E17 is not set\n+# CONFIG_W1_SLAVE_SMEM is not set\n+# CONFIG_W1_SLAVE_THERM is not set\n+# CONFIG_W83627HF_WDT is not set\n+# CONFIG_W83877F_WDT is not set\n+# CONFIG_W83977F_WDT is not set\n+# CONFIG_WAN is not set\n+# CONFIG_WANXL is not set\n+# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set\n+CONFIG_WATCHDOG=y\n+# CONFIG_WATCHDOG_CORE is not set\n+CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y\n+# CONFIG_WATCHDOG_NOWAYOUT is not set\n+CONFIG_WATCHDOG_OPEN_TIMEOUT=0\n+# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set\n+# CONFIG_WATCHDOG_SYSFS is not set\n+# CONFIG_WATCH_QUEUE is not set\n+# CONFIG_WD80x3 is not set\n+# CONFIG_WDAT_WDT is not set\n+# CONFIG_WDTPCI is not set\n+CONFIG_WEXT_CORE=y\n+CONFIG_WEXT_PRIV=y\n+CONFIG_WEXT_PROC=y\n+CONFIG_WEXT_SPY=y\n+CONFIG_WILINK_PLATFORM_DATA=y\n+# CONFIG_WIMAX is not set\n+# CONFIG_WIREGUARD is not set\n+CONFIG_WIRELESS=y\n+CONFIG_WIRELESS_EXT=y\n+# CONFIG_WIRELESS_WDS is not set\n+# CONFIG_WIZNET_W5100 is not set\n+# CONFIG_WIZNET_W5300 is not set\n+# CONFIG_WL1251 is not set\n+# CONFIG_WL12XX is not set\n+# CONFIG_WL18XX is not set\n+CONFIG_WLAN=y\n+# CONFIG_WLAN_VENDOR_ADMTEK is not set\n+# CONFIG_WLAN_VENDOR_ATH is not set\n+# CONFIG_WLAN_VENDOR_ATMEL is not set\n+# CONFIG_WLAN_VENDOR_BROADCOM is not set\n+# CONFIG_WLAN_VENDOR_CISCO is not set\n+# CONFIG_WLAN_VENDOR_INTEL is not set\n+# CONFIG_WLAN_VENDOR_INTERSIL is not set\n+# CONFIG_WLAN_VENDOR_MARVELL is not set\n+# CONFIG_WLAN_VENDOR_MEDIATEK is not set\n+# CONFIG_WLAN_VENDOR_MICROCHIP is not set\n+# CONFIG_WLAN_VENDOR_QUANTENNA is not set\n+# CONFIG_WLAN_VENDOR_RALINK is not set\n+# CONFIG_WLAN_VENDOR_REALTEK is not set\n+# CONFIG_WLAN_VENDOR_RSI is not set\n+# CONFIG_WLAN_VENDOR_ST is not set\n+# CONFIG_WLAN_VENDOR_TI is not set\n+# CONFIG_WLAN_VENDOR_ZYDAS is not set\n+# CONFIG_WLCORE is not set\n+CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y\n+# CONFIG_WQ_WATCHDOG is not set\n+# CONFIG_WWAN is not set\n+# CONFIG_WW_MUTEX_SELFTEST is not set\n+# CONFIG_X25 is not set\n+# CONFIG_X509_CERTIFICATE_PARSER is not set\n+# CONFIG_X86_PKG_TEMP_THERMAL is not set\n+CONFIG_X86_SYSFB=y\n+# CONFIG_XDP_SOCKETS is not set\n+# CONFIG_XEN is not set\n+# CONFIG_XEN_GRANT_DMA_ALLOC is not set\n+# CONFIG_XEN_PVCALLS_FRONTEND is not set\n+CONFIG_XEN_SCRUB_PAGES_DEFAULT=y\n+CONFIG_XFRM=y\n+# CONFIG_XFRM_INTERFACE is not set\n+# CONFIG_XFRM_IPCOMP is not set\n+# CONFIG_XFRM_MIGRATE is not set\n+# CONFIG_XFRM_STATISTICS is not set\n+# CONFIG_XFRM_SUB_POLICY is not set\n+# CONFIG_XFRM_USER is not set\n+# CONFIG_XFS_DEBUG is not set\n+# CONFIG_XFS_FS is not set\n+# CONFIG_XFS_ONLINE_SCRUB is not set\n+# CONFIG_XFS_POSIX_ACL is not set\n+# CONFIG_XFS_QUOTA is not set\n+# CONFIG_XFS_RT is not set\n+# CONFIG_XFS_SUPPORT_V4 is not set\n+# CONFIG_XFS_WARN is not set\n+# CONFIG_XILINX_AXI_EMAC is not set\n+# CONFIG_XILINX_DMA is not set\n+# CONFIG_XILINX_EMACLITE is not set\n+# CONFIG_XILINX_GMII2RGMII is not set\n+# CONFIG_XILINX_LL_TEMAC is not set\n+# CONFIG_XILINX_SDFEC is not set\n+# CONFIG_XILINX_VCU is not set\n+# CONFIG_XILINX_WATCHDOG is not set\n+# CONFIG_XILINX_XADC is not set\n+# CONFIG_XILINX_ZYNQMP_DMA is not set\n+# CONFIG_XILINX_ZYNQMP_DPDMA is not set\n+# CONFIG_XILLYBUS is not set\n+# CONFIG_XILLYUSB is not set\n+# CONFIG_XIL_AXIS_FIFO is not set\n+# CONFIG_XIP_KERNEL is not set\n+# CONFIG_XMON is not set\n+CONFIG_XZ_DEC=y\n+# CONFIG_XZ_DEC_ARM is not set\n+# CONFIG_XZ_DEC_ARMTHUMB is not set\n+# CONFIG_XZ_DEC_BCJ is not set\n+# CONFIG_XZ_DEC_IA64 is not set\n+# CONFIG_XZ_DEC_POWERPC is not set\n+# CONFIG_XZ_DEC_SPARC is not set\n+# CONFIG_XZ_DEC_TEST is not set\n+# CONFIG_XZ_DEC_X86 is not set\n+# CONFIG_YAM is not set\n+# CONFIG_YELLOWFIN is not set\n+# CONFIG_YENTA is not set\n+# CONFIG_YENTA_O2 is not set\n+# CONFIG_YENTA_RICOH is not set\n+# CONFIG_YENTA_TI is not set\n+# CONFIG_YENTA_TOSHIBA is not set\n+# CONFIG_ZBUD is not set\n+# CONFIG_ZD1211RW is not set\n+# CONFIG_ZD1211RW_DEBUG is not set\n+# CONFIG_ZEROPLUS_FF is not set\n+# CONFIG_ZIIRAVE_WATCHDOG is not set\n+# CONFIG_ZISOFS is not set\n+# CONFIG_ZLIB_DEFLATE is not set\n+# CONFIG_ZLIB_INFLATE is not set\n+CONFIG_ZONE_DMA=y\n+# CONFIG_ZOPT2201 is not set\n+# CONFIG_ZPA2326 is not set\n+# CONFIG_ZPOOL is not set\n+# CONFIG_ZRAM is not set\n+# CONFIG_ZRAM_MEMORY_TRACKING is not set\n+# CONFIG_ZSMALLOC is not set\n+# CONFIG_ZX_TDM is not set\ndiff --git a/target/linux/generic/hack-5.14/204-module_strip.patch b/target/linux/generic/hack-5.14/204-module_strip.patch\nnew file mode 100644\nindex 0000000000..9b25707f95\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/204-module_strip.patch\n@@ -0,0 +1,196 @@\n+From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 16:56:48 +0200\n+Subject: build: add a hack for removing non-essential module info\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/module.h      | 13 ++++++++-----\n+ include/linux/moduleparam.h | 15 ++++++++++++---\n+ init/Kconfig                |  7 +++++++\n+ kernel/module.c             |  5 ++++-\n+ scripts/mod/modpost.c       | 12 ++++++++++++\n+ 5 files changed, 43 insertions(+), 9 deletions(-)\n+\n+--- a/include/linux/module.h\n++++ b/include/linux/module.h\n+@@ -164,6 +164,7 @@ extern void cleanup_module(void);\n+ \n+ /* Generic info of form tag = \"info\" */\n+ #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)\n++#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info)\n+ \n+ /* For userspace: you can also call me... */\n+ #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)\n+@@ -233,12 +234,12 @@ extern void cleanup_module(void);\n+  * Author(s), use \"Name <email>\" or just \"Name\", for multiple\n+  * authors use multiple MODULE_AUTHOR() statements/lines.\n+  */\n+-#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)\n++#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author)\n+ \n+ /* What your module does. */\n+-#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)\n++#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description)\n+ \n+-#ifdef MODULE\n++#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED)\n+ /* Creates an alias so file2alias.c can find device table. */\n+ #define MODULE_DEVICE_TABLE(type, name)\t\t\t\t\t\\\n+ extern typeof(name) __mod_##type##__##name##_device_table\t\t\\\n+@@ -265,7 +266,9 @@ extern typeof(name) __mod_##type##__##na\n+  */\n+ \n+ #if defined(MODULE) || !defined(CONFIG_SYSFS)\n+-#define MODULE_VERSION(_version) MODULE_INFO(version, _version)\n++#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version)\n++#elif defined(CONFIG_MODULE_STRIPPED)\n++#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)\n+ #else\n+ #define MODULE_VERSION(_version)\t\t\t\t\t\\\n+ \tMODULE_INFO(version, _version);\t\t\t\t\t\\\n+@@ -288,7 +291,7 @@ extern typeof(name) __mod_##type##__##na\n+ /* Optional firmware file (or files) needed by the module\n+  * format is simply firmware file name.  Multiple firmware\n+  * files require multiple MODULE_FIRMWARE() specifiers */\n+-#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)\n++#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)\n+ \n+ #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, #ns)\n+ \n+--- a/include/linux/moduleparam.h\n++++ b/include/linux/moduleparam.h\n+@@ -20,6 +20,16 @@\n+ /* Chosen so that structs with an unsigned long line up. */\n+ #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))\n+ \n++/* This struct is here for syntactic coherency, it is not used */\n++#define __MODULE_INFO_DISABLED(name)\t\t\t\t\t  \\\n++  struct __UNIQUE_ID(name) {}\n++\n++#ifdef CONFIG_MODULE_STRIPPED\n++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name)\n++#else\n++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)\n++#endif\n++\n+ #define __MODULE_INFO(tag, name, info)\t\t\t\t\t  \\\n+ \tstatic const char __UNIQUE_ID(name)[]\t\t\t\t  \\\n+ \t\t__used __section(\".modinfo\") __aligned(1)\t\t  \\\n+@@ -31,7 +41,7 @@\n+ /* One for each parameter, describing how to use it.  Some files do\n+    multiple of these per line, so can't just use MODULE_INFO. */\n+ #define MODULE_PARM_DESC(_parm, desc) \\\n+-\t__MODULE_INFO(parm, _parm, #_parm \":\" desc)\n++\t__MODULE_INFO_STRIP(parm, _parm, #_parm \":\" desc)\n+ \n+ struct kernel_param;\n+ \n+--- a/init/Kconfig\n++++ b/init/Kconfig\n+@@ -2324,6 +2324,13 @@ config UNUSED_KSYMS_WHITELIST\n+ \t  one per line. The path can be absolute, or relative to the kernel\n+ \t  source tree.\n+ \n++config MODULE_STRIPPED\n++\tbool \"Reduce module size\"\n++\tdepends on MODULES\n++\thelp\n++\t  Remove module parameter descriptions, author info, version, aliases,\n++\t  device tables, etc.\n++\n+ endif # MODULES\n+ \n+ config MODULES_TREE_LOOKUP\n+--- a/kernel/module.c\n++++ b/kernel/module.c\n+@@ -3227,9 +3227,11 @@ static int setup_load_info(struct load_i\n+ \n+ static int check_modinfo(struct module *mod, struct load_info *info, int flags)\n+ {\n+-\tconst char *modmagic = get_modinfo(info, \"vermagic\");\n+ \tint err;\n+ \n++#ifndef CONFIG_MODULE_STRIPPED\n++\tconst char *modmagic = get_modinfo(info, \"vermagic\");\n++\n+ \tif (flags & MODULE_INIT_IGNORE_VERMAGIC)\n+ \t\tmodmagic = NULL;\n+ \n+@@ -3250,6 +3252,7 @@ static int check_modinfo(struct module *\n+ \t\t\t\tmod->name);\n+ \t\tadd_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);\n+ \t}\n++#endif\n+ \n+ \tcheck_modinfo_retpoline(mod, info);\n+ \n+--- a/scripts/mod/modpost.c\n++++ b/scripts/mod/modpost.c\n+@@ -2024,7 +2024,9 @@ static void read_symbols(const char *mod\n+ \t\tsymname = remove_dot(info.strtab + sym->st_name);\n+ \n+ \t\thandle_symbol(mod, &info, sym, symname);\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \t\thandle_moddevtable(mod, &info, sym, symname);\n++#endif\n+ \t}\n+ \n+ \tfor (sym = info.symtab_start; sym < info.symtab_stop; sym++) {\n+@@ -2203,8 +2205,10 @@ static void add_header(struct buffer *b,\n+ \tbuf_printf(b, \"BUILD_SALT;\\n\");\n+ \tbuf_printf(b, \"BUILD_LTO_INFO;\\n\");\n+ \tbuf_printf(b, \"\\n\");\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \tbuf_printf(b, \"MODULE_INFO(vermagic, VERMAGIC_STRING);\\n\");\n+ \tbuf_printf(b, \"MODULE_INFO(name, KBUILD_MODNAME);\\n\");\n++#endif\n+ \tbuf_printf(b, \"\\n\");\n+ \tbuf_printf(b, \"__visible struct module __this_module\\n\");\n+ \tbuf_printf(b, \"__section(\\\".gnu.linkonce.this_module\\\") = {\\n\");\n+@@ -2221,8 +2225,10 @@ static void add_header(struct buffer *b,\n+ \n+ static void add_intree_flag(struct buffer *b, int is_intree)\n+ {\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \tif (is_intree)\n+ \t\tbuf_printf(b, \"\\nMODULE_INFO(intree, \\\"Y\\\");\\n\");\n++#endif\n+ }\n+ \n+ /* Cannot check for assembler */\n+@@ -2235,8 +2241,10 @@ static void add_retpoline(struct buffer\n+ \n+ static void add_staging_flag(struct buffer *b, const char *name)\n+ {\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \tif (strstarts(name, \"drivers/staging\"))\n+ \t\tbuf_printf(b, \"\\nMODULE_INFO(staging, \\\"Y\\\");\\n\");\n++#endif\n+ }\n+ \n+ /**\n+@@ -2316,11 +2324,13 @@ static void add_depends(struct buffer *b\n+ \n+ static void add_srcversion(struct buffer *b, struct module *mod)\n+ {\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \tif (mod->srcversion[0]) {\n+ \t\tbuf_printf(b, \"\\n\");\n+ \t\tbuf_printf(b, \"MODULE_INFO(srcversion, \\\"%s\\\");\\n\",\n+ \t\t\t   mod->srcversion);\n+ \t}\n++#endif\n+ }\n+ \n+ static void write_buf(struct buffer *b, const char *fname)\n+@@ -2569,7 +2579,9 @@ int main(int argc, char **argv)\n+ \t\tadd_staging_flag(&buf, mod->name);\n+ \t\tadd_versions(&buf, mod);\n+ \t\tadd_depends(&buf, mod);\n++#ifndef CONFIG_MODULE_STRIPPED\n+ \t\tadd_moddevtable(&buf, mod);\n++#endif\n+ \t\tadd_srcversion(&buf, mod);\n+ \n+ \t\tsprintf(fname, \"%s.mod.c\", mod->name);\ndiff --git a/target/linux/generic/hack-5.14/210-darwin_scripts_include.patch b/target/linux/generic/hack-5.14/210-darwin_scripts_include.patch\nnew file mode 100644\nindex 0000000000..d68e2f88aa\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/210-darwin_scripts_include.patch\n@@ -0,0 +1,3053 @@\n+From db7c30dcd9a0391bf13b62c9f91e144d762ef43a Mon Sep 17 00:00:00 2001\n+From: Florian Fainelli <f.fainelli@gmail.com>\n+Date: Fri, 7 Jul 2017 17:00:49 +0200\n+Subject: Add an OSX specific patch to make the kernel be compiled\n+\n+lede-commit: 3fc2a24f0422b2f55f9ed43f116db3111f700526\n+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>\n+---\n+ scripts/kconfig/Makefile   |    3 +\n+ scripts/mod/elf.h          | 3007 ++++++++++++++++++++++++++++++++++++++++++++\n+ scripts/mod/mk_elfconfig.c |    4 +\n+ scripts/mod/modpost.h      |    4 +\n+ 4 files changed, 3018 insertions(+)\n+ create mode 100644 scripts/mod/elf.h\n+\n+--- /dev/null\n++++ b/scripts/mod/elf.h\n+@@ -0,0 +1,3007 @@\n++/* This file defines standard ELF types, structures, and macros.\n++   Copyright (C) 1995-2012 Free Software Foundation, Inc.\n++   This file is part of the GNU C Library.\n++\n++   The GNU C Library is free software; you can redistribute it and/or\n++   modify it under the terms of the GNU Lesser General Public\n++   License as published by the Free Software Foundation; either\n++   version 2.1 of the License, or (at your option) any later version.\n++\n++   The GNU C Library is distributed in the hope that it will be useful,\n++   but WITHOUT ANY WARRANTY; without even the implied warranty of\n++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n++   Lesser General Public License for more details.\n++\n++   You should have received a copy of the GNU Lesser General Public\n++   License along with the GNU C Library; if not, see\n++   <http://www.gnu.org/licenses/>.  */\n++\n++#ifndef _ELF_H\n++#define\t_ELF_H 1\n++\n++/* Standard ELF types.  */\n++\n++#include <stdint.h>\n++\n++/* Type for a 16-bit quantity.  */\n++typedef uint16_t Elf32_Half;\n++typedef uint16_t Elf64_Half;\n++\n++/* Types for signed and unsigned 32-bit quantities.  */\n++typedef uint32_t Elf32_Word;\n++typedef\tint32_t  Elf32_Sword;\n++typedef uint32_t Elf64_Word;\n++typedef\tint32_t  Elf64_Sword;\n++\n++/* Types for signed and unsigned 64-bit quantities.  */\n++typedef uint64_t Elf32_Xword;\n++typedef\tint64_t  Elf32_Sxword;\n++typedef uint64_t Elf64_Xword;\n++typedef\tint64_t  Elf64_Sxword;\n++\n++/* Type of addresses.  */\n++typedef uint32_t Elf32_Addr;\n++typedef uint64_t Elf64_Addr;\n++\n++/* Type of file offsets.  */\n++typedef uint32_t Elf32_Off;\n++typedef uint64_t Elf64_Off;\n++\n++/* Type for section indices, which are 16-bit quantities.  */\n++typedef uint16_t Elf32_Section;\n++typedef uint16_t Elf64_Section;\n++\n++/* Type for version symbol information.  */\n++typedef Elf32_Half Elf32_Versym;\n++typedef Elf64_Half Elf64_Versym;\n++\n++\n++/* The ELF file header.  This appears at the start of every ELF file.  */\n++\n++#define EI_NIDENT (16)\n++\n++typedef struct\n++{\n++  unsigned char\te_ident[EI_NIDENT];\t/* Magic number and other info */\n++  Elf32_Half\te_type;\t\t\t/* Object file type */\n++  Elf32_Half\te_machine;\t\t/* Architecture */\n++  Elf32_Word\te_version;\t\t/* Object file version */\n++  Elf32_Addr\te_entry;\t\t/* Entry point virtual address */\n++  Elf32_Off\te_phoff;\t\t/* Program header table file offset */\n++  Elf32_Off\te_shoff;\t\t/* Section header table file offset */\n++  Elf32_Word\te_flags;\t\t/* Processor-specific flags */\n++  Elf32_Half\te_ehsize;\t\t/* ELF header size in bytes */\n++  Elf32_Half\te_phentsize;\t\t/* Program header table entry size */\n++  Elf32_Half\te_phnum;\t\t/* Program header table entry count */\n++  Elf32_Half\te_shentsize;\t\t/* Section header table entry size */\n++  Elf32_Half\te_shnum;\t\t/* Section header table entry count */\n++  Elf32_Half\te_shstrndx;\t\t/* Section header string table index */\n++} Elf32_Ehdr;\n++\n++typedef struct\n++{\n++  unsigned char\te_ident[EI_NIDENT];\t/* Magic number and other info */\n++  Elf64_Half\te_type;\t\t\t/* Object file type */\n++  Elf64_Half\te_machine;\t\t/* Architecture */\n++  Elf64_Word\te_version;\t\t/* Object file version */\n++  Elf64_Addr\te_entry;\t\t/* Entry point virtual address */\n++  Elf64_Off\te_phoff;\t\t/* Program header table file offset */\n++  Elf64_Off\te_shoff;\t\t/* Section header table file offset */\n++  Elf64_Word\te_flags;\t\t/* Processor-specific flags */\n++  Elf64_Half\te_ehsize;\t\t/* ELF header size in bytes */\n++  Elf64_Half\te_phentsize;\t\t/* Program header table entry size */\n++  Elf64_Half\te_phnum;\t\t/* Program header table entry count */\n++  Elf64_Half\te_shentsize;\t\t/* Section header table entry size */\n++  Elf64_Half\te_shnum;\t\t/* Section header table entry count */\n++  Elf64_Half\te_shstrndx;\t\t/* Section header string table index */\n++} Elf64_Ehdr;\n++\n++/* Fields in the e_ident array.  The EI_* macros are indices into the\n++   array.  The macros under each EI_* macro are the values the byte\n++   may have.  */\n++\n++#define EI_MAG0\t\t0\t\t/* File identification byte 0 index */\n++#define ELFMAG0\t\t0x7f\t\t/* Magic number byte 0 */\n++\n++#define EI_MAG1\t\t1\t\t/* File identification byte 1 index */\n++#define ELFMAG1\t\t'E'\t\t/* Magic number byte 1 */\n++\n++#define EI_MAG2\t\t2\t\t/* File identification byte 2 index */\n++#define ELFMAG2\t\t'L'\t\t/* Magic number byte 2 */\n++\n++#define EI_MAG3\t\t3\t\t/* File identification byte 3 index */\n++#define ELFMAG3\t\t'F'\t\t/* Magic number byte 3 */\n++\n++/* Conglomeration of the identification bytes, for easy testing as a word.  */\n++#define\tELFMAG\t\t\"\\177ELF\"\n++#define\tSELFMAG\t\t4\n++\n++#define EI_CLASS\t4\t\t/* File class byte index */\n++#define ELFCLASSNONE\t0\t\t/* Invalid class */\n++#define ELFCLASS32\t1\t\t/* 32-bit objects */\n++#define ELFCLASS64\t2\t\t/* 64-bit objects */\n++#define ELFCLASSNUM\t3\n++\n++#define EI_DATA\t\t5\t\t/* Data encoding byte index */\n++#define ELFDATANONE\t0\t\t/* Invalid data encoding */\n++#define ELFDATA2LSB\t1\t\t/* 2's complement, little endian */\n++#define ELFDATA2MSB\t2\t\t/* 2's complement, big endian */\n++#define ELFDATANUM\t3\n++\n++#define EI_VERSION\t6\t\t/* File version byte index */\n++\t\t\t\t\t/* Value must be EV_CURRENT */\n++\n++#define EI_OSABI\t7\t\t/* OS ABI identification */\n++#define ELFOSABI_NONE\t\t0\t/* UNIX System V ABI */\n++#define ELFOSABI_SYSV\t\t0\t/* Alias.  */\n++#define ELFOSABI_HPUX\t\t1\t/* HP-UX */\n++#define ELFOSABI_NETBSD\t\t2\t/* NetBSD.  */\n++#define ELFOSABI_GNU\t\t3\t/* Object uses GNU ELF extensions.  */\n++#define ELFOSABI_LINUX\t\tELFOSABI_GNU /* Compatibility alias.  */\n++#define ELFOSABI_SOLARIS\t6\t/* Sun Solaris.  */\n++#define ELFOSABI_AIX\t\t7\t/* IBM AIX.  */\n++#define ELFOSABI_IRIX\t\t8\t/* SGI Irix.  */\n++#define ELFOSABI_FREEBSD\t9\t/* FreeBSD.  */\n++#define ELFOSABI_TRU64\t\t10\t/* Compaq TRU64 UNIX.  */\n++#define ELFOSABI_MODESTO\t11\t/* Novell Modesto.  */\n++#define ELFOSABI_OPENBSD\t12\t/* OpenBSD.  */\n++#define ELFOSABI_ARM_AEABI\t64\t/* ARM EABI */\n++#define ELFOSABI_ARM\t\t97\t/* ARM */\n++#define ELFOSABI_STANDALONE\t255\t/* Standalone (embedded) application */\n++\n++#define EI_ABIVERSION\t8\t\t/* ABI version */\n++\n++#define EI_PAD\t\t9\t\t/* Byte index of padding bytes */\n++\n++/* Legal values for e_type (object file type).  */\n++\n++#define ET_NONE\t\t0\t\t/* No file type */\n++#define ET_REL\t\t1\t\t/* Relocatable file */\n++#define ET_EXEC\t\t2\t\t/* Executable file */\n++#define ET_DYN\t\t3\t\t/* Shared object file */\n++#define ET_CORE\t\t4\t\t/* Core file */\n++#define\tET_NUM\t\t5\t\t/* Number of defined types */\n++#define ET_LOOS\t\t0xfe00\t\t/* OS-specific range start */\n++#define ET_HIOS\t\t0xfeff\t\t/* OS-specific range end */\n++#define ET_LOPROC\t0xff00\t\t/* Processor-specific range start */\n++#define ET_HIPROC\t0xffff\t\t/* Processor-specific range end */\n++\n++/* Legal values for e_machine (architecture).  */\n++\n++#define EM_NONE\t\t 0\t\t/* No machine */\n++#define EM_M32\t\t 1\t\t/* AT&T WE 32100 */\n++#define EM_SPARC\t 2\t\t/* SUN SPARC */\n++#define EM_386\t\t 3\t\t/* Intel 80386 */\n++#define EM_68K\t\t 4\t\t/* Motorola m68k family */\n++#define EM_88K\t\t 5\t\t/* Motorola m88k family */\n++#define EM_860\t\t 7\t\t/* Intel 80860 */\n++#define EM_MIPS\t\t 8\t\t/* MIPS R3000 big-endian */\n++#define EM_S370\t\t 9\t\t/* IBM System/370 */\n++#define EM_MIPS_RS3_LE\t10\t\t/* MIPS R3000 little-endian */\n++\n++#define EM_PARISC\t15\t\t/* HPPA */\n++#define EM_VPP500\t17\t\t/* Fujitsu VPP500 */\n++#define EM_SPARC32PLUS\t18\t\t/* Sun's \"v8plus\" */\n++#define EM_960\t\t19\t\t/* Intel 80960 */\n++#define EM_PPC\t\t20\t\t/* PowerPC */\n++#define EM_PPC64\t21\t\t/* PowerPC 64-bit */\n++#define EM_S390\t\t22\t\t/* IBM S390 */\n++\n++#define EM_V800\t\t36\t\t/* NEC V800 series */\n++#define EM_FR20\t\t37\t\t/* Fujitsu FR20 */\n++#define EM_RH32\t\t38\t\t/* TRW RH-32 */\n++#define EM_RCE\t\t39\t\t/* Motorola RCE */\n++#define EM_ARM\t\t40\t\t/* ARM */\n++#define EM_FAKE_ALPHA\t41\t\t/* Digital Alpha */\n++#define EM_SH\t\t42\t\t/* Hitachi SH */\n++#define EM_SPARCV9\t43\t\t/* SPARC v9 64-bit */\n++#define EM_TRICORE\t44\t\t/* Siemens Tricore */\n++#define EM_ARC\t\t45\t\t/* Argonaut RISC Core */\n++#define EM_H8_300\t46\t\t/* Hitachi H8/300 */\n++#define EM_H8_300H\t47\t\t/* Hitachi H8/300H */\n++#define EM_H8S\t\t48\t\t/* Hitachi H8S */\n++#define EM_H8_500\t49\t\t/* Hitachi H8/500 */\n++#define EM_IA_64\t50\t\t/* Intel Merced */\n++#define EM_MIPS_X\t51\t\t/* Stanford MIPS-X */\n++#define EM_COLDFIRE\t52\t\t/* Motorola Coldfire */\n++#define EM_68HC12\t53\t\t/* Motorola M68HC12 */\n++#define EM_MMA\t\t54\t\t/* Fujitsu MMA Multimedia Accelerator*/\n++#define EM_PCP\t\t55\t\t/* Siemens PCP */\n++#define EM_NCPU\t\t56\t\t/* Sony nCPU embeeded RISC */\n++#define EM_NDR1\t\t57\t\t/* Denso NDR1 microprocessor */\n++#define EM_STARCORE\t58\t\t/* Motorola Start*Core processor */\n++#define EM_ME16\t\t59\t\t/* Toyota ME16 processor */\n++#define EM_ST100\t60\t\t/* STMicroelectronic ST100 processor */\n++#define EM_TINYJ\t61\t\t/* Advanced Logic Corp. Tinyj emb.fam*/\n++#define EM_X86_64\t62\t\t/* AMD x86-64 architecture */\n++#define EM_PDSP\t\t63\t\t/* Sony DSP Processor */\n++\n++#define EM_FX66\t\t66\t\t/* Siemens FX66 microcontroller */\n++#define EM_ST9PLUS\t67\t\t/* STMicroelectronics ST9+ 8/16 mc */\n++#define EM_ST7\t\t68\t\t/* STmicroelectronics ST7 8 bit mc */\n++#define EM_68HC16\t69\t\t/* Motorola MC68HC16 microcontroller */\n++#define EM_68HC11\t70\t\t/* Motorola MC68HC11 microcontroller */\n++#define EM_68HC08\t71\t\t/* Motorola MC68HC08 microcontroller */\n++#define EM_68HC05\t72\t\t/* Motorola MC68HC05 microcontroller */\n++#define EM_SVX\t\t73\t\t/* Silicon Graphics SVx */\n++#define EM_ST19\t\t74\t\t/* STMicroelectronics ST19 8 bit mc */\n++#define EM_VAX\t\t75\t\t/* Digital VAX */\n++#define EM_CRIS\t\t76\t\t/* Axis Communications 32-bit embedded processor */\n++#define EM_JAVELIN\t77\t\t/* Infineon Technologies 32-bit embedded processor */\n++#define EM_FIREPATH\t78\t\t/* Element 14 64-bit DSP Processor */\n++#define EM_ZSP\t\t79\t\t/* LSI Logic 16-bit DSP Processor */\n++#define EM_MMIX\t\t80\t\t/* Donald Knuth's educational 64-bit processor */\n++#define EM_HUANY\t81\t\t/* Harvard University machine-independent object files */\n++#define EM_PRISM\t82\t\t/* SiTera Prism */\n++#define EM_AVR\t\t83\t\t/* Atmel AVR 8-bit microcontroller */\n++#define EM_FR30\t\t84\t\t/* Fujitsu FR30 */\n++#define EM_D10V\t\t85\t\t/* Mitsubishi D10V */\n++#define EM_D30V\t\t86\t\t/* Mitsubishi D30V */\n++#define EM_V850\t\t87\t\t/* NEC v850 */\n++#define EM_M32R\t\t88\t\t/* Mitsubishi M32R */\n++#define EM_MN10300\t89\t\t/* Matsushita MN10300 */\n++#define EM_MN10200\t90\t\t/* Matsushita MN10200 */\n++#define EM_PJ\t\t91\t\t/* picoJava */\n++#define EM_OPENRISC\t92\t\t/* OpenRISC 32-bit embedded processor */\n++#define EM_ARC_A5\t93\t\t/* ARC Cores Tangent-A5 */\n++#define EM_XTENSA\t94\t\t/* Tensilica Xtensa Architecture */\n++#define EM_TILEPRO\t188\t\t/* Tilera TILEPro */\n++#define EM_TILEGX\t191\t\t/* Tilera TILE-Gx */\n++#define EM_NUM\t\t192\n++\n++/* If it is necessary to assign new unofficial EM_* values, please\n++   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the\n++   chances of collision with official or non-GNU unofficial values.  */\n++\n++#define EM_ALPHA\t0x9026\n++\n++/* Legal values for e_version (version).  */\n++\n++#define EV_NONE\t\t0\t\t/* Invalid ELF version */\n++#define EV_CURRENT\t1\t\t/* Current version */\n++#define EV_NUM\t\t2\n++\n++/* Section header.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tsh_name;\t\t/* Section name (string tbl index) */\n++  Elf32_Word\tsh_type;\t\t/* Section type */\n++  Elf32_Word\tsh_flags;\t\t/* Section flags */\n++  Elf32_Addr\tsh_addr;\t\t/* Section virtual addr at execution */\n++  Elf32_Off\tsh_offset;\t\t/* Section file offset */\n++  Elf32_Word\tsh_size;\t\t/* Section size in bytes */\n++  Elf32_Word\tsh_link;\t\t/* Link to another section */\n++  Elf32_Word\tsh_info;\t\t/* Additional section information */\n++  Elf32_Word\tsh_addralign;\t\t/* Section alignment */\n++  Elf32_Word\tsh_entsize;\t\t/* Entry size if section holds table */\n++} Elf32_Shdr;\n++\n++typedef struct\n++{\n++  Elf64_Word\tsh_name;\t\t/* Section name (string tbl index) */\n++  Elf64_Word\tsh_type;\t\t/* Section type */\n++  Elf64_Xword\tsh_flags;\t\t/* Section flags */\n++  Elf64_Addr\tsh_addr;\t\t/* Section virtual addr at execution */\n++  Elf64_Off\tsh_offset;\t\t/* Section file offset */\n++  Elf64_Xword\tsh_size;\t\t/* Section size in bytes */\n++  Elf64_Word\tsh_link;\t\t/* Link to another section */\n++  Elf64_Word\tsh_info;\t\t/* Additional section information */\n++  Elf64_Xword\tsh_addralign;\t\t/* Section alignment */\n++  Elf64_Xword\tsh_entsize;\t\t/* Entry size if section holds table */\n++} Elf64_Shdr;\n++\n++/* Special section indices.  */\n++\n++#define SHN_UNDEF\t0\t\t/* Undefined section */\n++#define SHN_LORESERVE\t0xff00\t\t/* Start of reserved indices */\n++#define SHN_LOPROC\t0xff00\t\t/* Start of processor-specific */\n++#define SHN_BEFORE\t0xff00\t\t/* Order section before all others\n++\t\t\t\t\t   (Solaris).  */\n++#define SHN_AFTER\t0xff01\t\t/* Order section after all others\n++\t\t\t\t\t   (Solaris).  */\n++#define SHN_HIPROC\t0xff1f\t\t/* End of processor-specific */\n++#define SHN_LOOS\t0xff20\t\t/* Start of OS-specific */\n++#define SHN_HIOS\t0xff3f\t\t/* End of OS-specific */\n++#define SHN_ABS\t\t0xfff1\t\t/* Associated symbol is absolute */\n++#define SHN_COMMON\t0xfff2\t\t/* Associated symbol is common */\n++#define SHN_XINDEX\t0xffff\t\t/* Index is in extra table.  */\n++#define SHN_HIRESERVE\t0xffff\t\t/* End of reserved indices */\n++\n++/* Legal values for sh_type (section type).  */\n++\n++#define SHT_NULL\t  0\t\t/* Section header table entry unused */\n++#define SHT_PROGBITS\t  1\t\t/* Program data */\n++#define SHT_SYMTAB\t  2\t\t/* Symbol table */\n++#define SHT_STRTAB\t  3\t\t/* String table */\n++#define SHT_RELA\t  4\t\t/* Relocation entries with addends */\n++#define SHT_HASH\t  5\t\t/* Symbol hash table */\n++#define SHT_DYNAMIC\t  6\t\t/* Dynamic linking information */\n++#define SHT_NOTE\t  7\t\t/* Notes */\n++#define SHT_NOBITS\t  8\t\t/* Program space with no data (bss) */\n++#define SHT_REL\t\t  9\t\t/* Relocation entries, no addends */\n++#define SHT_SHLIB\t  10\t\t/* Reserved */\n++#define SHT_DYNSYM\t  11\t\t/* Dynamic linker symbol table */\n++#define SHT_INIT_ARRAY\t  14\t\t/* Array of constructors */\n++#define SHT_FINI_ARRAY\t  15\t\t/* Array of destructors */\n++#define SHT_PREINIT_ARRAY 16\t\t/* Array of pre-constructors */\n++#define SHT_GROUP\t  17\t\t/* Section group */\n++#define SHT_SYMTAB_SHNDX  18\t\t/* Extended section indeces */\n++#define\tSHT_NUM\t\t  19\t\t/* Number of defined types.  */\n++#define SHT_LOOS\t  0x60000000\t/* Start OS-specific.  */\n++#define SHT_GNU_ATTRIBUTES 0x6ffffff5\t/* Object attributes.  */\n++#define SHT_GNU_HASH\t  0x6ffffff6\t/* GNU-style hash table.  */\n++#define SHT_GNU_LIBLIST\t  0x6ffffff7\t/* Prelink library list */\n++#define SHT_CHECKSUM\t  0x6ffffff8\t/* Checksum for DSO content.  */\n++#define SHT_LOSUNW\t  0x6ffffffa\t/* Sun-specific low bound.  */\n++#define SHT_SUNW_move\t  0x6ffffffa\n++#define SHT_SUNW_COMDAT   0x6ffffffb\n++#define SHT_SUNW_syminfo  0x6ffffffc\n++#define SHT_GNU_verdef\t  0x6ffffffd\t/* Version definition section.  */\n++#define SHT_GNU_verneed\t  0x6ffffffe\t/* Version needs section.  */\n++#define SHT_GNU_versym\t  0x6fffffff\t/* Version symbol table.  */\n++#define SHT_HISUNW\t  0x6fffffff\t/* Sun-specific high bound.  */\n++#define SHT_HIOS\t  0x6fffffff\t/* End OS-specific type */\n++#define SHT_LOPROC\t  0x70000000\t/* Start of processor-specific */\n++#define SHT_HIPROC\t  0x7fffffff\t/* End of processor-specific */\n++#define SHT_LOUSER\t  0x80000000\t/* Start of application-specific */\n++#define SHT_HIUSER\t  0x8fffffff\t/* End of application-specific */\n++\n++/* Legal values for sh_flags (section flags).  */\n++\n++#define SHF_WRITE\t     (1 << 0)\t/* Writable */\n++#define SHF_ALLOC\t     (1 << 1)\t/* Occupies memory during execution */\n++#define SHF_EXECINSTR\t     (1 << 2)\t/* Executable */\n++#define SHF_MERGE\t     (1 << 4)\t/* Might be merged */\n++#define SHF_STRINGS\t     (1 << 5)\t/* Contains nul-terminated strings */\n++#define SHF_INFO_LINK\t     (1 << 6)\t/* `sh_info' contains SHT index */\n++#define SHF_LINK_ORDER\t     (1 << 7)\t/* Preserve order after combining */\n++#define SHF_OS_NONCONFORMING (1 << 8)\t/* Non-standard OS specific handling\n++\t\t\t\t\t   required */\n++#define SHF_GROUP\t     (1 << 9)\t/* Section is member of a group.  */\n++#define SHF_TLS\t\t     (1 << 10)\t/* Section hold thread-local data.  */\n++#define SHF_MASKOS\t     0x0ff00000\t/* OS-specific.  */\n++#define SHF_MASKPROC\t     0xf0000000\t/* Processor-specific */\n++#define SHF_ORDERED\t     (1 << 30)\t/* Special ordering requirement\n++\t\t\t\t\t   (Solaris).  */\n++#define SHF_EXCLUDE\t     (1 << 31)\t/* Section is excluded unless\n++\t\t\t\t\t   referenced or allocated (Solaris).*/\n++\n++/* Section group handling.  */\n++#define GRP_COMDAT\t0x1\t\t/* Mark group as COMDAT.  */\n++\n++/* Symbol table entry.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tst_name;\t\t/* Symbol name (string tbl index) */\n++  Elf32_Addr\tst_value;\t\t/* Symbol value */\n++  Elf32_Word\tst_size;\t\t/* Symbol size */\n++  unsigned char\tst_info;\t\t/* Symbol type and binding */\n++  unsigned char\tst_other;\t\t/* Symbol visibility */\n++  Elf32_Section\tst_shndx;\t\t/* Section index */\n++} Elf32_Sym;\n++\n++typedef struct\n++{\n++  Elf64_Word\tst_name;\t\t/* Symbol name (string tbl index) */\n++  unsigned char\tst_info;\t\t/* Symbol type and binding */\n++  unsigned char st_other;\t\t/* Symbol visibility */\n++  Elf64_Section\tst_shndx;\t\t/* Section index */\n++  Elf64_Addr\tst_value;\t\t/* Symbol value */\n++  Elf64_Xword\tst_size;\t\t/* Symbol size */\n++} Elf64_Sym;\n++\n++/* The syminfo section if available contains additional information about\n++   every dynamic symbol.  */\n++\n++typedef struct\n++{\n++  Elf32_Half si_boundto;\t\t/* Direct bindings, symbol bound to */\n++  Elf32_Half si_flags;\t\t\t/* Per symbol flags */\n++} Elf32_Syminfo;\n++\n++typedef struct\n++{\n++  Elf64_Half si_boundto;\t\t/* Direct bindings, symbol bound to */\n++  Elf64_Half si_flags;\t\t\t/* Per symbol flags */\n++} Elf64_Syminfo;\n++\n++/* Possible values for si_boundto.  */\n++#define SYMINFO_BT_SELF\t\t0xffff\t/* Symbol bound to self */\n++#define SYMINFO_BT_PARENT\t0xfffe\t/* Symbol bound to parent */\n++#define SYMINFO_BT_LOWRESERVE\t0xff00\t/* Beginning of reserved entries */\n++\n++/* Possible bitmasks for si_flags.  */\n++#define SYMINFO_FLG_DIRECT\t0x0001\t/* Direct bound symbol */\n++#define SYMINFO_FLG_PASSTHRU\t0x0002\t/* Pass-thru symbol for translator */\n++#define SYMINFO_FLG_COPY\t0x0004\t/* Symbol is a copy-reloc */\n++#define SYMINFO_FLG_LAZYLOAD\t0x0008\t/* Symbol bound to object to be lazy\n++\t\t\t\t\t   loaded */\n++/* Syminfo version values.  */\n++#define SYMINFO_NONE\t\t0\n++#define SYMINFO_CURRENT\t\t1\n++#define SYMINFO_NUM\t\t2\n++\n++\n++/* How to extract and insert information held in the st_info field.  */\n++\n++#define ELF32_ST_BIND(val)\t\t(((unsigned char) (val)) >> 4)\n++#define ELF32_ST_TYPE(val)\t\t((val) & 0xf)\n++#define ELF32_ST_INFO(bind, type)\t(((bind) << 4) + ((type) & 0xf))\n++\n++/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */\n++#define ELF64_ST_BIND(val)\t\tELF32_ST_BIND (val)\n++#define ELF64_ST_TYPE(val)\t\tELF32_ST_TYPE (val)\n++#define ELF64_ST_INFO(bind, type)\tELF32_ST_INFO ((bind), (type))\n++\n++/* Legal values for ST_BIND subfield of st_info (symbol binding).  */\n++\n++#define STB_LOCAL\t0\t\t/* Local symbol */\n++#define STB_GLOBAL\t1\t\t/* Global symbol */\n++#define STB_WEAK\t2\t\t/* Weak symbol */\n++#define\tSTB_NUM\t\t3\t\t/* Number of defined types.  */\n++#define STB_LOOS\t10\t\t/* Start of OS-specific */\n++#define STB_GNU_UNIQUE\t10\t\t/* Unique symbol.  */\n++#define STB_HIOS\t12\t\t/* End of OS-specific */\n++#define STB_LOPROC\t13\t\t/* Start of processor-specific */\n++#define STB_HIPROC\t15\t\t/* End of processor-specific */\n++\n++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */\n++\n++#define STT_NOTYPE\t0\t\t/* Symbol type is unspecified */\n++#define STT_OBJECT\t1\t\t/* Symbol is a data object */\n++#define STT_FUNC\t2\t\t/* Symbol is a code object */\n++#define STT_SECTION\t3\t\t/* Symbol associated with a section */\n++#define STT_FILE\t4\t\t/* Symbol's name is file name */\n++#define STT_COMMON\t5\t\t/* Symbol is a common data object */\n++#define STT_TLS\t\t6\t\t/* Symbol is thread-local data object*/\n++#define\tSTT_NUM\t\t7\t\t/* Number of defined types.  */\n++#define STT_LOOS\t10\t\t/* Start of OS-specific */\n++#define STT_GNU_IFUNC\t10\t\t/* Symbol is indirect code object */\n++#define STT_HIOS\t12\t\t/* End of OS-specific */\n++#define STT_LOPROC\t13\t\t/* Start of processor-specific */\n++#define STT_HIPROC\t15\t\t/* End of processor-specific */\n++\n++\n++/* Symbol table indices are found in the hash buckets and chain table\n++   of a symbol hash table section.  This special index value indicates\n++   the end of a chain, meaning no further symbols are found in that bucket.  */\n++\n++#define STN_UNDEF\t0\t\t/* End of a chain.  */\n++\n++\n++/* How to extract and insert information held in the st_other field.  */\n++\n++#define ELF32_ST_VISIBILITY(o)\t((o) & 0x03)\n++\n++/* For ELF64 the definitions are the same.  */\n++#define ELF64_ST_VISIBILITY(o)\tELF32_ST_VISIBILITY (o)\n++\n++/* Symbol visibility specification encoded in the st_other field.  */\n++#define STV_DEFAULT\t0\t\t/* Default symbol visibility rules */\n++#define STV_INTERNAL\t1\t\t/* Processor specific hidden class */\n++#define STV_HIDDEN\t2\t\t/* Sym unavailable in other modules */\n++#define STV_PROTECTED\t3\t\t/* Not preemptible, not exported */\n++\n++\n++/* Relocation table entry without addend (in section of type SHT_REL).  */\n++\n++typedef struct\n++{\n++  Elf32_Addr\tr_offset;\t\t/* Address */\n++  Elf32_Word\tr_info;\t\t\t/* Relocation type and symbol index */\n++} Elf32_Rel;\n++\n++/* I have seen two different definitions of the Elf64_Rel and\n++   Elf64_Rela structures, so we'll leave them out until Novell (or\n++   whoever) gets their act together.  */\n++/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */\n++\n++typedef struct\n++{\n++  Elf64_Addr\tr_offset;\t\t/* Address */\n++  Elf64_Xword\tr_info;\t\t\t/* Relocation type and symbol index */\n++} Elf64_Rel;\n++\n++/* Relocation table entry with addend (in section of type SHT_RELA).  */\n++\n++typedef struct\n++{\n++  Elf32_Addr\tr_offset;\t\t/* Address */\n++  Elf32_Word\tr_info;\t\t\t/* Relocation type and symbol index */\n++  Elf32_Sword\tr_addend;\t\t/* Addend */\n++} Elf32_Rela;\n++\n++typedef struct\n++{\n++  Elf64_Addr\tr_offset;\t\t/* Address */\n++  Elf64_Xword\tr_info;\t\t\t/* Relocation type and symbol index */\n++  Elf64_Sxword\tr_addend;\t\t/* Addend */\n++} Elf64_Rela;\n++\n++/* How to extract and insert information held in the r_info field.  */\n++\n++#define ELF32_R_SYM(val)\t\t((val) >> 8)\n++#define ELF32_R_TYPE(val)\t\t((val) & 0xff)\n++#define ELF32_R_INFO(sym, type)\t\t(((sym) << 8) + ((type) & 0xff))\n++\n++#define ELF64_R_SYM(i)\t\t\t((i) >> 32)\n++#define ELF64_R_TYPE(i)\t\t\t((i) & 0xffffffff)\n++#define ELF64_R_INFO(sym,type)\t\t((((Elf64_Xword) (sym)) << 32) + (type))\n++\n++/* Program segment header.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tp_type;\t\t\t/* Segment type */\n++  Elf32_Off\tp_offset;\t\t/* Segment file offset */\n++  Elf32_Addr\tp_vaddr;\t\t/* Segment virtual address */\n++  Elf32_Addr\tp_paddr;\t\t/* Segment physical address */\n++  Elf32_Word\tp_filesz;\t\t/* Segment size in file */\n++  Elf32_Word\tp_memsz;\t\t/* Segment size in memory */\n++  Elf32_Word\tp_flags;\t\t/* Segment flags */\n++  Elf32_Word\tp_align;\t\t/* Segment alignment */\n++} Elf32_Phdr;\n++\n++typedef struct\n++{\n++  Elf64_Word\tp_type;\t\t\t/* Segment type */\n++  Elf64_Word\tp_flags;\t\t/* Segment flags */\n++  Elf64_Off\tp_offset;\t\t/* Segment file offset */\n++  Elf64_Addr\tp_vaddr;\t\t/* Segment virtual address */\n++  Elf64_Addr\tp_paddr;\t\t/* Segment physical address */\n++  Elf64_Xword\tp_filesz;\t\t/* Segment size in file */\n++  Elf64_Xword\tp_memsz;\t\t/* Segment size in memory */\n++  Elf64_Xword\tp_align;\t\t/* Segment alignment */\n++} Elf64_Phdr;\n++\n++/* Special value for e_phnum.  This indicates that the real number of\n++   program headers is too large to fit into e_phnum.  Instead the real\n++   value is in the field sh_info of section 0.  */\n++\n++#define PN_XNUM\t\t0xffff\n++\n++/* Legal values for p_type (segment type).  */\n++\n++#define\tPT_NULL\t\t0\t\t/* Program header table entry unused */\n++#define PT_LOAD\t\t1\t\t/* Loadable program segment */\n++#define PT_DYNAMIC\t2\t\t/* Dynamic linking information */\n++#define PT_INTERP\t3\t\t/* Program interpreter */\n++#define PT_NOTE\t\t4\t\t/* Auxiliary information */\n++#define PT_SHLIB\t5\t\t/* Reserved */\n++#define PT_PHDR\t\t6\t\t/* Entry for header table itself */\n++#define PT_TLS\t\t7\t\t/* Thread-local storage segment */\n++#define\tPT_NUM\t\t8\t\t/* Number of defined types */\n++#define PT_LOOS\t\t0x60000000\t/* Start of OS-specific */\n++#define PT_GNU_EH_FRAME\t0x6474e550\t/* GCC .eh_frame_hdr segment */\n++#define PT_GNU_STACK\t0x6474e551\t/* Indicates stack executability */\n++#define PT_GNU_RELRO\t0x6474e552\t/* Read-only after relocation */\n++#define PT_LOSUNW\t0x6ffffffa\n++#define PT_SUNWBSS\t0x6ffffffa\t/* Sun Specific segment */\n++#define PT_SUNWSTACK\t0x6ffffffb\t/* Stack segment */\n++#define PT_HISUNW\t0x6fffffff\n++#define PT_HIOS\t\t0x6fffffff\t/* End of OS-specific */\n++#define PT_LOPROC\t0x70000000\t/* Start of processor-specific */\n++#define PT_HIPROC\t0x7fffffff\t/* End of processor-specific */\n++\n++/* Legal values for p_flags (segment flags).  */\n++\n++#define PF_X\t\t(1 << 0)\t/* Segment is executable */\n++#define PF_W\t\t(1 << 1)\t/* Segment is writable */\n++#define PF_R\t\t(1 << 2)\t/* Segment is readable */\n++#define PF_MASKOS\t0x0ff00000\t/* OS-specific */\n++#define PF_MASKPROC\t0xf0000000\t/* Processor-specific */\n++\n++/* Legal values for note segment descriptor types for core files. */\n++\n++#define NT_PRSTATUS\t1\t\t/* Contains copy of prstatus struct */\n++#define NT_FPREGSET\t2\t\t/* Contains copy of fpregset struct */\n++#define NT_PRPSINFO\t3\t\t/* Contains copy of prpsinfo struct */\n++#define NT_PRXREG\t4\t\t/* Contains copy of prxregset struct */\n++#define NT_TASKSTRUCT\t4\t\t/* Contains copy of task structure */\n++#define NT_PLATFORM\t5\t\t/* String from sysinfo(SI_PLATFORM) */\n++#define NT_AUXV\t\t6\t\t/* Contains copy of auxv array */\n++#define NT_GWINDOWS\t7\t\t/* Contains copy of gwindows struct */\n++#define NT_ASRS\t\t8\t\t/* Contains copy of asrset struct */\n++#define NT_PSTATUS\t10\t\t/* Contains copy of pstatus struct */\n++#define NT_PSINFO\t13\t\t/* Contains copy of psinfo struct */\n++#define NT_PRCRED\t14\t\t/* Contains copy of prcred struct */\n++#define NT_UTSNAME\t15\t\t/* Contains copy of utsname struct */\n++#define NT_LWPSTATUS\t16\t\t/* Contains copy of lwpstatus struct */\n++#define NT_LWPSINFO\t17\t\t/* Contains copy of lwpinfo struct */\n++#define NT_PRFPXREG\t20\t\t/* Contains copy of fprxregset struct */\n++#define NT_PRXFPREG\t0x46e62b7f\t/* Contains copy of user_fxsr_struct */\n++#define NT_PPC_VMX\t0x100\t\t/* PowerPC Altivec/VMX registers */\n++#define NT_PPC_SPE\t0x101\t\t/* PowerPC SPE/EVR registers */\n++#define NT_PPC_VSX\t0x102\t\t/* PowerPC VSX registers */\n++#define NT_386_TLS\t0x200\t\t/* i386 TLS slots (struct user_desc) */\n++#define NT_386_IOPERM\t0x201\t\t/* x86 io permission bitmap (1=deny) */\n++#define NT_X86_XSTATE\t0x202\t\t/* x86 extended state using xsave */\n++\n++/* Legal values for the note segment descriptor types for object files.  */\n++\n++#define NT_VERSION\t1\t\t/* Contains a version string.  */\n++\n++\n++/* Dynamic section entry.  */\n++\n++typedef struct\n++{\n++  Elf32_Sword\td_tag;\t\t\t/* Dynamic entry type */\n++  union\n++    {\n++      Elf32_Word d_val;\t\t\t/* Integer value */\n++      Elf32_Addr d_ptr;\t\t\t/* Address value */\n++    } d_un;\n++} Elf32_Dyn;\n++\n++typedef struct\n++{\n++  Elf64_Sxword\td_tag;\t\t\t/* Dynamic entry type */\n++  union\n++    {\n++      Elf64_Xword d_val;\t\t/* Integer value */\n++      Elf64_Addr d_ptr;\t\t\t/* Address value */\n++    } d_un;\n++} Elf64_Dyn;\n++\n++/* Legal values for d_tag (dynamic entry type).  */\n++\n++#define DT_NULL\t\t0\t\t/* Marks end of dynamic section */\n++#define DT_NEEDED\t1\t\t/* Name of needed library */\n++#define DT_PLTRELSZ\t2\t\t/* Size in bytes of PLT relocs */\n++#define DT_PLTGOT\t3\t\t/* Processor defined value */\n++#define DT_HASH\t\t4\t\t/* Address of symbol hash table */\n++#define DT_STRTAB\t5\t\t/* Address of string table */\n++#define DT_SYMTAB\t6\t\t/* Address of symbol table */\n++#define DT_RELA\t\t7\t\t/* Address of Rela relocs */\n++#define DT_RELASZ\t8\t\t/* Total size of Rela relocs */\n++#define DT_RELAENT\t9\t\t/* Size of one Rela reloc */\n++#define DT_STRSZ\t10\t\t/* Size of string table */\n++#define DT_SYMENT\t11\t\t/* Size of one symbol table entry */\n++#define DT_INIT\t\t12\t\t/* Address of init function */\n++#define DT_FINI\t\t13\t\t/* Address of termination function */\n++#define DT_SONAME\t14\t\t/* Name of shared object */\n++#define DT_RPATH\t15\t\t/* Library search path (deprecated) */\n++#define DT_SYMBOLIC\t16\t\t/* Start symbol search here */\n++#define DT_REL\t\t17\t\t/* Address of Rel relocs */\n++#define DT_RELSZ\t18\t\t/* Total size of Rel relocs */\n++#define DT_RELENT\t19\t\t/* Size of one Rel reloc */\n++#define DT_PLTREL\t20\t\t/* Type of reloc in PLT */\n++#define DT_DEBUG\t21\t\t/* For debugging; unspecified */\n++#define DT_TEXTREL\t22\t\t/* Reloc might modify .text */\n++#define DT_JMPREL\t23\t\t/* Address of PLT relocs */\n++#define\tDT_BIND_NOW\t24\t\t/* Process relocations of object */\n++#define\tDT_INIT_ARRAY\t25\t\t/* Array with addresses of init fct */\n++#define\tDT_FINI_ARRAY\t26\t\t/* Array with addresses of fini fct */\n++#define\tDT_INIT_ARRAYSZ\t27\t\t/* Size in bytes of DT_INIT_ARRAY */\n++#define\tDT_FINI_ARRAYSZ\t28\t\t/* Size in bytes of DT_FINI_ARRAY */\n++#define DT_RUNPATH\t29\t\t/* Library search path */\n++#define DT_FLAGS\t30\t\t/* Flags for the object being loaded */\n++#define DT_ENCODING\t32\t\t/* Start of encoded range */\n++#define DT_PREINIT_ARRAY 32\t\t/* Array with addresses of preinit fct*/\n++#define DT_PREINIT_ARRAYSZ 33\t\t/* size in bytes of DT_PREINIT_ARRAY */\n++#define\tDT_NUM\t\t34\t\t/* Number used */\n++#define DT_LOOS\t\t0x6000000d\t/* Start of OS-specific */\n++#define DT_HIOS\t\t0x6ffff000\t/* End of OS-specific */\n++#define DT_LOPROC\t0x70000000\t/* Start of processor-specific */\n++#define DT_HIPROC\t0x7fffffff\t/* End of processor-specific */\n++#define\tDT_PROCNUM\tDT_MIPS_NUM\t/* Most used by any processor */\n++\n++/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the\n++   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's\n++   approach.  */\n++#define DT_VALRNGLO\t0x6ffffd00\n++#define DT_GNU_PRELINKED 0x6ffffdf5\t/* Prelinking timestamp */\n++#define DT_GNU_CONFLICTSZ 0x6ffffdf6\t/* Size of conflict section */\n++#define DT_GNU_LIBLISTSZ 0x6ffffdf7\t/* Size of library list */\n++#define DT_CHECKSUM\t0x6ffffdf8\n++#define DT_PLTPADSZ\t0x6ffffdf9\n++#define DT_MOVEENT\t0x6ffffdfa\n++#define DT_MOVESZ\t0x6ffffdfb\n++#define DT_FEATURE_1\t0x6ffffdfc\t/* Feature selection (DTF_*).  */\n++#define DT_POSFLAG_1\t0x6ffffdfd\t/* Flags for DT_* entries, effecting\n++\t\t\t\t\t   the following DT_* entry.  */\n++#define DT_SYMINSZ\t0x6ffffdfe\t/* Size of syminfo table (in bytes) */\n++#define DT_SYMINENT\t0x6ffffdff\t/* Entry size of syminfo */\n++#define DT_VALRNGHI\t0x6ffffdff\n++#define DT_VALTAGIDX(tag)\t(DT_VALRNGHI - (tag))\t/* Reverse order! */\n++#define DT_VALNUM 12\n++\n++/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the\n++   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.\n++\n++   If any adjustment is made to the ELF object after it has been\n++   built these entries will need to be adjusted.  */\n++#define DT_ADDRRNGLO\t0x6ffffe00\n++#define DT_GNU_HASH\t0x6ffffef5\t/* GNU-style hash table.  */\n++#define DT_TLSDESC_PLT\t0x6ffffef6\n++#define DT_TLSDESC_GOT\t0x6ffffef7\n++#define DT_GNU_CONFLICT\t0x6ffffef8\t/* Start of conflict section */\n++#define DT_GNU_LIBLIST\t0x6ffffef9\t/* Library list */\n++#define DT_CONFIG\t0x6ffffefa\t/* Configuration information.  */\n++#define DT_DEPAUDIT\t0x6ffffefb\t/* Dependency auditing.  */\n++#define DT_AUDIT\t0x6ffffefc\t/* Object auditing.  */\n++#define\tDT_PLTPAD\t0x6ffffefd\t/* PLT padding.  */\n++#define\tDT_MOVETAB\t0x6ffffefe\t/* Move table.  */\n++#define DT_SYMINFO\t0x6ffffeff\t/* Syminfo table.  */\n++#define DT_ADDRRNGHI\t0x6ffffeff\n++#define DT_ADDRTAGIDX(tag)\t(DT_ADDRRNGHI - (tag))\t/* Reverse order! */\n++#define DT_ADDRNUM 11\n++\n++/* The versioning entry types.  The next are defined as part of the\n++   GNU extension.  */\n++#define DT_VERSYM\t0x6ffffff0\n++\n++#define DT_RELACOUNT\t0x6ffffff9\n++#define DT_RELCOUNT\t0x6ffffffa\n++\n++/* These were chosen by Sun.  */\n++#define DT_FLAGS_1\t0x6ffffffb\t/* State flags, see DF_1_* below.  */\n++#define\tDT_VERDEF\t0x6ffffffc\t/* Address of version definition\n++\t\t\t\t\t   table */\n++#define\tDT_VERDEFNUM\t0x6ffffffd\t/* Number of version definitions */\n++#define\tDT_VERNEED\t0x6ffffffe\t/* Address of table with needed\n++\t\t\t\t\t   versions */\n++#define\tDT_VERNEEDNUM\t0x6fffffff\t/* Number of needed versions */\n++#define DT_VERSIONTAGIDX(tag)\t(DT_VERNEEDNUM - (tag))\t/* Reverse order! */\n++#define DT_VERSIONTAGNUM 16\n++\n++/* Sun added these machine-independent extensions in the \"processor-specific\"\n++   range.  Be compatible.  */\n++#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */\n++#define DT_FILTER       0x7fffffff      /* Shared object to get values from */\n++#define DT_EXTRATAGIDX(tag)\t((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)\n++#define DT_EXTRANUM\t3\n++\n++/* Values of `d_un.d_val' in the DT_FLAGS entry.  */\n++#define DF_ORIGIN\t0x00000001\t/* Object may use DF_ORIGIN */\n++#define DF_SYMBOLIC\t0x00000002\t/* Symbol resolutions starts here */\n++#define DF_TEXTREL\t0x00000004\t/* Object contains text relocations */\n++#define DF_BIND_NOW\t0x00000008\t/* No lazy binding for this object */\n++#define DF_STATIC_TLS\t0x00000010\t/* Module uses the static TLS model */\n++\n++/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1\n++   entry in the dynamic section.  */\n++#define DF_1_NOW\t0x00000001\t/* Set RTLD_NOW for this object.  */\n++#define DF_1_GLOBAL\t0x00000002\t/* Set RTLD_GLOBAL for this object.  */\n++#define DF_1_GROUP\t0x00000004\t/* Set RTLD_GROUP for this object.  */\n++#define DF_1_NODELETE\t0x00000008\t/* Set RTLD_NODELETE for this object.*/\n++#define DF_1_LOADFLTR\t0x00000010\t/* Trigger filtee loading at runtime.*/\n++#define DF_1_INITFIRST\t0x00000020\t/* Set RTLD_INITFIRST for this object*/\n++#define DF_1_NOOPEN\t0x00000040\t/* Set RTLD_NOOPEN for this object.  */\n++#define DF_1_ORIGIN\t0x00000080\t/* $ORIGIN must be handled.  */\n++#define DF_1_DIRECT\t0x00000100\t/* Direct binding enabled.  */\n++#define DF_1_TRANS\t0x00000200\n++#define DF_1_INTERPOSE\t0x00000400\t/* Object is used to interpose.  */\n++#define DF_1_NODEFLIB\t0x00000800\t/* Ignore default lib search path.  */\n++#define DF_1_NODUMP\t0x00001000\t/* Object can't be dldump'ed.  */\n++#define DF_1_CONFALT\t0x00002000\t/* Configuration alternative created.*/\n++#define DF_1_ENDFILTEE\t0x00004000\t/* Filtee terminates filters search. */\n++#define\tDF_1_DISPRELDNE\t0x00008000\t/* Disp reloc applied at build time. */\n++#define\tDF_1_DISPRELPND\t0x00010000\t/* Disp reloc applied at run-time.  */\n++\n++/* Flags for the feature selection in DT_FEATURE_1.  */\n++#define DTF_1_PARINIT\t0x00000001\n++#define DTF_1_CONFEXP\t0x00000002\n++\n++/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */\n++#define DF_P1_LAZYLOAD\t0x00000001\t/* Lazyload following object.  */\n++#define DF_P1_GROUPPERM\t0x00000002\t/* Symbols from next object are not\n++\t\t\t\t\t   generally available.  */\n++\n++/* Version definition sections.  */\n++\n++typedef struct\n++{\n++  Elf32_Half\tvd_version;\t\t/* Version revision */\n++  Elf32_Half\tvd_flags;\t\t/* Version information */\n++  Elf32_Half\tvd_ndx;\t\t\t/* Version Index */\n++  Elf32_Half\tvd_cnt;\t\t\t/* Number of associated aux entries */\n++  Elf32_Word\tvd_hash;\t\t/* Version name hash value */\n++  Elf32_Word\tvd_aux;\t\t\t/* Offset in bytes to verdaux array */\n++  Elf32_Word\tvd_next;\t\t/* Offset in bytes to next verdef\n++\t\t\t\t\t   entry */\n++} Elf32_Verdef;\n++\n++typedef struct\n++{\n++  Elf64_Half\tvd_version;\t\t/* Version revision */\n++  Elf64_Half\tvd_flags;\t\t/* Version information */\n++  Elf64_Half\tvd_ndx;\t\t\t/* Version Index */\n++  Elf64_Half\tvd_cnt;\t\t\t/* Number of associated aux entries */\n++  Elf64_Word\tvd_hash;\t\t/* Version name hash value */\n++  Elf64_Word\tvd_aux;\t\t\t/* Offset in bytes to verdaux array */\n++  Elf64_Word\tvd_next;\t\t/* Offset in bytes to next verdef\n++\t\t\t\t\t   entry */\n++} Elf64_Verdef;\n++\n++\n++/* Legal values for vd_version (version revision).  */\n++#define VER_DEF_NONE\t0\t\t/* No version */\n++#define VER_DEF_CURRENT\t1\t\t/* Current version */\n++#define VER_DEF_NUM\t2\t\t/* Given version number */\n++\n++/* Legal values for vd_flags (version information flags).  */\n++#define VER_FLG_BASE\t0x1\t\t/* Version definition of file itself */\n++#define VER_FLG_WEAK\t0x2\t\t/* Weak version identifier */\n++\n++/* Versym symbol index values.  */\n++#define\tVER_NDX_LOCAL\t\t0\t/* Symbol is local.  */\n++#define\tVER_NDX_GLOBAL\t\t1\t/* Symbol is global.  */\n++#define\tVER_NDX_LORESERVE\t0xff00\t/* Beginning of reserved entries.  */\n++#define\tVER_NDX_ELIMINATE\t0xff01\t/* Symbol is to be eliminated.  */\n++\n++/* Auxialiary version information.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tvda_name;\t\t/* Version or dependency names */\n++  Elf32_Word\tvda_next;\t\t/* Offset in bytes to next verdaux\n++\t\t\t\t\t   entry */\n++} Elf32_Verdaux;\n++\n++typedef struct\n++{\n++  Elf64_Word\tvda_name;\t\t/* Version or dependency names */\n++  Elf64_Word\tvda_next;\t\t/* Offset in bytes to next verdaux\n++\t\t\t\t\t   entry */\n++} Elf64_Verdaux;\n++\n++\n++/* Version dependency section.  */\n++\n++typedef struct\n++{\n++  Elf32_Half\tvn_version;\t\t/* Version of structure */\n++  Elf32_Half\tvn_cnt;\t\t\t/* Number of associated aux entries */\n++  Elf32_Word\tvn_file;\t\t/* Offset of filename for this\n++\t\t\t\t\t   dependency */\n++  Elf32_Word\tvn_aux;\t\t\t/* Offset in bytes to vernaux array */\n++  Elf32_Word\tvn_next;\t\t/* Offset in bytes to next verneed\n++\t\t\t\t\t   entry */\n++} Elf32_Verneed;\n++\n++typedef struct\n++{\n++  Elf64_Half\tvn_version;\t\t/* Version of structure */\n++  Elf64_Half\tvn_cnt;\t\t\t/* Number of associated aux entries */\n++  Elf64_Word\tvn_file;\t\t/* Offset of filename for this\n++\t\t\t\t\t   dependency */\n++  Elf64_Word\tvn_aux;\t\t\t/* Offset in bytes to vernaux array */\n++  Elf64_Word\tvn_next;\t\t/* Offset in bytes to next verneed\n++\t\t\t\t\t   entry */\n++} Elf64_Verneed;\n++\n++\n++/* Legal values for vn_version (version revision).  */\n++#define VER_NEED_NONE\t 0\t\t/* No version */\n++#define VER_NEED_CURRENT 1\t\t/* Current version */\n++#define VER_NEED_NUM\t 2\t\t/* Given version number */\n++\n++/* Auxiliary needed version information.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tvna_hash;\t\t/* Hash value of dependency name */\n++  Elf32_Half\tvna_flags;\t\t/* Dependency specific information */\n++  Elf32_Half\tvna_other;\t\t/* Unused */\n++  Elf32_Word\tvna_name;\t\t/* Dependency name string offset */\n++  Elf32_Word\tvna_next;\t\t/* Offset in bytes to next vernaux\n++\t\t\t\t\t   entry */\n++} Elf32_Vernaux;\n++\n++typedef struct\n++{\n++  Elf64_Word\tvna_hash;\t\t/* Hash value of dependency name */\n++  Elf64_Half\tvna_flags;\t\t/* Dependency specific information */\n++  Elf64_Half\tvna_other;\t\t/* Unused */\n++  Elf64_Word\tvna_name;\t\t/* Dependency name string offset */\n++  Elf64_Word\tvna_next;\t\t/* Offset in bytes to next vernaux\n++\t\t\t\t\t   entry */\n++} Elf64_Vernaux;\n++\n++\n++/* Legal values for vna_flags.  */\n++#define VER_FLG_WEAK\t0x2\t\t/* Weak version identifier */\n++\n++\n++/* Auxiliary vector.  */\n++\n++/* This vector is normally only used by the program interpreter.  The\n++   usual definition in an ABI supplement uses the name auxv_t.  The\n++   vector is not usually defined in a standard <elf.h> file, but it\n++   can't hurt.  We rename it to avoid conflicts.  The sizes of these\n++   types are an arrangement between the exec server and the program\n++   interpreter, so we don't fully specify them here.  */\n++\n++typedef struct\n++{\n++  uint32_t a_type;\t\t/* Entry type */\n++  union\n++    {\n++      uint32_t a_val;\t\t/* Integer value */\n++      /* We use to have pointer elements added here.  We cannot do that,\n++\t though, since it does not work when using 32-bit definitions\n++\t on 64-bit platforms and vice versa.  */\n++    } a_un;\n++} Elf32_auxv_t;\n++\n++typedef struct\n++{\n++  uint64_t a_type;\t\t/* Entry type */\n++  union\n++    {\n++      uint64_t a_val;\t\t/* Integer value */\n++      /* We use to have pointer elements added here.  We cannot do that,\n++\t though, since it does not work when using 32-bit definitions\n++\t on 64-bit platforms and vice versa.  */\n++    } a_un;\n++} Elf64_auxv_t;\n++\n++/* Legal values for a_type (entry type).  */\n++\n++#define AT_NULL\t\t0\t\t/* End of vector */\n++#define AT_IGNORE\t1\t\t/* Entry should be ignored */\n++#define AT_EXECFD\t2\t\t/* File descriptor of program */\n++#define AT_PHDR\t\t3\t\t/* Program headers for program */\n++#define AT_PHENT\t4\t\t/* Size of program header entry */\n++#define AT_PHNUM\t5\t\t/* Number of program headers */\n++#define AT_PAGESZ\t6\t\t/* System page size */\n++#define AT_BASE\t\t7\t\t/* Base address of interpreter */\n++#define AT_FLAGS\t8\t\t/* Flags */\n++#define AT_ENTRY\t9\t\t/* Entry point of program */\n++#define AT_NOTELF\t10\t\t/* Program is not ELF */\n++#define AT_UID\t\t11\t\t/* Real uid */\n++#define AT_EUID\t\t12\t\t/* Effective uid */\n++#define AT_GID\t\t13\t\t/* Real gid */\n++#define AT_EGID\t\t14\t\t/* Effective gid */\n++#define AT_CLKTCK\t17\t\t/* Frequency of times() */\n++\n++/* Some more special a_type values describing the hardware.  */\n++#define AT_PLATFORM\t15\t\t/* String identifying platform.  */\n++#define AT_HWCAP\t16\t\t/* Machine dependent hints about\n++\t\t\t\t\t   processor capabilities.  */\n++\n++/* This entry gives some information about the FPU initialization\n++   performed by the kernel.  */\n++#define AT_FPUCW\t18\t\t/* Used FPU control word.  */\n++\n++/* Cache block sizes.  */\n++#define AT_DCACHEBSIZE\t19\t\t/* Data cache block size.  */\n++#define AT_ICACHEBSIZE\t20\t\t/* Instruction cache block size.  */\n++#define AT_UCACHEBSIZE\t21\t\t/* Unified cache block size.  */\n++\n++/* A special ignored value for PPC, used by the kernel to control the\n++   interpretation of the AUXV. Must be > 16.  */\n++#define AT_IGNOREPPC\t22\t\t/* Entry should be ignored.  */\n++\n++#define\tAT_SECURE\t23\t\t/* Boolean, was exec setuid-like?  */\n++\n++#define AT_BASE_PLATFORM 24\t\t/* String identifying real platforms.*/\n++\n++#define AT_RANDOM\t25\t\t/* Address of 16 random bytes.  */\n++\n++#define AT_EXECFN\t31\t\t/* Filename of executable.  */\n++\n++/* Pointer to the global system page used for system calls and other\n++   nice things.  */\n++#define AT_SYSINFO\t32\n++#define AT_SYSINFO_EHDR\t33\n++\n++/* Shapes of the caches.  Bits 0-3 contains associativity; bits 4-7 contains\n++   log2 of line size; mask those to get cache size.  */\n++#define AT_L1I_CACHESHAPE\t34\n++#define AT_L1D_CACHESHAPE\t35\n++#define AT_L2_CACHESHAPE\t36\n++#define AT_L3_CACHESHAPE\t37\n++\n++/* Note section contents.  Each entry in the note section begins with\n++   a header of a fixed form.  */\n++\n++typedef struct\n++{\n++  Elf32_Word n_namesz;\t\t\t/* Length of the note's name.  */\n++  Elf32_Word n_descsz;\t\t\t/* Length of the note's descriptor.  */\n++  Elf32_Word n_type;\t\t\t/* Type of the note.  */\n++} Elf32_Nhdr;\n++\n++typedef struct\n++{\n++  Elf64_Word n_namesz;\t\t\t/* Length of the note's name.  */\n++  Elf64_Word n_descsz;\t\t\t/* Length of the note's descriptor.  */\n++  Elf64_Word n_type;\t\t\t/* Type of the note.  */\n++} Elf64_Nhdr;\n++\n++/* Known names of notes.  */\n++\n++/* Solaris entries in the note section have this name.  */\n++#define ELF_NOTE_SOLARIS\t\"SUNW Solaris\"\n++\n++/* Note entries for GNU systems have this name.  */\n++#define ELF_NOTE_GNU\t\t\"GNU\"\n++\n++\n++/* Defined types of notes for Solaris.  */\n++\n++/* Value of descriptor (one word) is desired pagesize for the binary.  */\n++#define ELF_NOTE_PAGESIZE_HINT\t1\n++\n++\n++/* Defined note types for GNU systems.  */\n++\n++/* ABI information.  The descriptor consists of words:\n++   word 0: OS descriptor\n++   word 1: major version of the ABI\n++   word 2: minor version of the ABI\n++   word 3: subminor version of the ABI\n++*/\n++#define NT_GNU_ABI_TAG\t1\n++#define ELF_NOTE_ABI\tNT_GNU_ABI_TAG /* Old name.  */\n++\n++/* Known OSes.  These values can appear in word 0 of an\n++   NT_GNU_ABI_TAG note section entry.  */\n++#define ELF_NOTE_OS_LINUX\t0\n++#define ELF_NOTE_OS_GNU\t\t1\n++#define ELF_NOTE_OS_SOLARIS2\t2\n++#define ELF_NOTE_OS_FREEBSD\t3\n++\n++/* Synthetic hwcap information.  The descriptor begins with two words:\n++   word 0: number of entries\n++   word 1: bitmask of enabled entries\n++   Then follow variable-length entries, one byte followed by a\n++   '\\0'-terminated hwcap name string.  The byte gives the bit\n++   number to test if enabled, (1U << bit) & bitmask.  */\n++#define NT_GNU_HWCAP\t2\n++\n++/* Build ID bits as generated by ld --build-id.\n++   The descriptor consists of any nonzero number of bytes.  */\n++#define NT_GNU_BUILD_ID\t3\n++\n++/* Version note generated by GNU gold containing a version string.  */\n++#define NT_GNU_GOLD_VERSION\t4\n++\n++\n++/* Move records.  */\n++typedef struct\n++{\n++  Elf32_Xword m_value;\t\t/* Symbol value.  */\n++  Elf32_Word m_info;\t\t/* Size and index.  */\n++  Elf32_Word m_poffset;\t\t/* Symbol offset.  */\n++  Elf32_Half m_repeat;\t\t/* Repeat count.  */\n++  Elf32_Half m_stride;\t\t/* Stride info.  */\n++} Elf32_Move;\n++\n++typedef struct\n++{\n++  Elf64_Xword m_value;\t\t/* Symbol value.  */\n++  Elf64_Xword m_info;\t\t/* Size and index.  */\n++  Elf64_Xword m_poffset;\t/* Symbol offset.  */\n++  Elf64_Half m_repeat;\t\t/* Repeat count.  */\n++  Elf64_Half m_stride;\t\t/* Stride info.  */\n++} Elf64_Move;\n++\n++/* Macro to construct move records.  */\n++#define ELF32_M_SYM(info)\t((info) >> 8)\n++#define ELF32_M_SIZE(info)\t((unsigned char) (info))\n++#define ELF32_M_INFO(sym, size)\t(((sym) << 8) + (unsigned char) (size))\n++\n++#define ELF64_M_SYM(info)\tELF32_M_SYM (info)\n++#define ELF64_M_SIZE(info)\tELF32_M_SIZE (info)\n++#define ELF64_M_INFO(sym, size)\tELF32_M_INFO (sym, size)\n++\n++\n++/* Motorola 68k specific definitions.  */\n++\n++/* Values for Elf32_Ehdr.e_flags.  */\n++#define EF_CPU32\t0x00810000\n++\n++/* m68k relocs.  */\n++\n++#define R_68K_NONE\t0\t\t/* No reloc */\n++#define R_68K_32\t1\t\t/* Direct 32 bit  */\n++#define R_68K_16\t2\t\t/* Direct 16 bit  */\n++#define R_68K_8\t\t3\t\t/* Direct 8 bit  */\n++#define R_68K_PC32\t4\t\t/* PC relative 32 bit */\n++#define R_68K_PC16\t5\t\t/* PC relative 16 bit */\n++#define R_68K_PC8\t6\t\t/* PC relative 8 bit */\n++#define R_68K_GOT32\t7\t\t/* 32 bit PC relative GOT entry */\n++#define R_68K_GOT16\t8\t\t/* 16 bit PC relative GOT entry */\n++#define R_68K_GOT8\t9\t\t/* 8 bit PC relative GOT entry */\n++#define R_68K_GOT32O\t10\t\t/* 32 bit GOT offset */\n++#define R_68K_GOT16O\t11\t\t/* 16 bit GOT offset */\n++#define R_68K_GOT8O\t12\t\t/* 8 bit GOT offset */\n++#define R_68K_PLT32\t13\t\t/* 32 bit PC relative PLT address */\n++#define R_68K_PLT16\t14\t\t/* 16 bit PC relative PLT address */\n++#define R_68K_PLT8\t15\t\t/* 8 bit PC relative PLT address */\n++#define R_68K_PLT32O\t16\t\t/* 32 bit PLT offset */\n++#define R_68K_PLT16O\t17\t\t/* 16 bit PLT offset */\n++#define R_68K_PLT8O\t18\t\t/* 8 bit PLT offset */\n++#define R_68K_COPY\t19\t\t/* Copy symbol at runtime */\n++#define R_68K_GLOB_DAT\t20\t\t/* Create GOT entry */\n++#define R_68K_JMP_SLOT\t21\t\t/* Create PLT entry */\n++#define R_68K_RELATIVE\t22\t\t/* Adjust by program base */\n++#define R_68K_TLS_GD32      25          /* 32 bit GOT offset for GD */\n++#define R_68K_TLS_GD16      26          /* 16 bit GOT offset for GD */\n++#define R_68K_TLS_GD8       27          /* 8 bit GOT offset for GD */\n++#define R_68K_TLS_LDM32     28          /* 32 bit GOT offset for LDM */\n++#define R_68K_TLS_LDM16     29          /* 16 bit GOT offset for LDM */\n++#define R_68K_TLS_LDM8      30          /* 8 bit GOT offset for LDM */\n++#define R_68K_TLS_LDO32     31          /* 32 bit module-relative offset */\n++#define R_68K_TLS_LDO16     32          /* 16 bit module-relative offset */\n++#define R_68K_TLS_LDO8      33          /* 8 bit module-relative offset */\n++#define R_68K_TLS_IE32      34          /* 32 bit GOT offset for IE */\n++#define R_68K_TLS_IE16      35          /* 16 bit GOT offset for IE */\n++#define R_68K_TLS_IE8       36          /* 8 bit GOT offset for IE */\n++#define R_68K_TLS_LE32      37          /* 32 bit offset relative to\n++\t\t\t\t\t   static TLS block */\n++#define R_68K_TLS_LE16      38          /* 16 bit offset relative to\n++\t\t\t\t\t   static TLS block */\n++#define R_68K_TLS_LE8       39          /* 8 bit offset relative to\n++\t\t\t\t\t   static TLS block */\n++#define R_68K_TLS_DTPMOD32  40          /* 32 bit module number */\n++#define R_68K_TLS_DTPREL32  41          /* 32 bit module-relative offset */\n++#define R_68K_TLS_TPREL32   42          /* 32 bit TP-relative offset */\n++/* Keep this the last entry.  */\n++#define R_68K_NUM\t43\n++\n++/* Intel 80386 specific definitions.  */\n++\n++/* i386 relocs.  */\n++\n++#define R_386_NONE\t   0\t\t/* No reloc */\n++#define R_386_32\t   1\t\t/* Direct 32 bit  */\n++#define R_386_PC32\t   2\t\t/* PC relative 32 bit */\n++#define R_386_GOT32\t   3\t\t/* 32 bit GOT entry */\n++#define R_386_PLT32\t   4\t\t/* 32 bit PLT address */\n++#define R_386_COPY\t   5\t\t/* Copy symbol at runtime */\n++#define R_386_GLOB_DAT\t   6\t\t/* Create GOT entry */\n++#define R_386_JMP_SLOT\t   7\t\t/* Create PLT entry */\n++#define R_386_RELATIVE\t   8\t\t/* Adjust by program base */\n++#define R_386_GOTOFF\t   9\t\t/* 32 bit offset to GOT */\n++#define R_386_GOTPC\t   10\t\t/* 32 bit PC relative offset to GOT */\n++#define R_386_32PLT\t   11\n++#define R_386_TLS_TPOFF\t   14\t\t/* Offset in static TLS block */\n++#define R_386_TLS_IE\t   15\t\t/* Address of GOT entry for static TLS\n++\t\t\t\t\t   block offset */\n++#define R_386_TLS_GOTIE\t   16\t\t/* GOT entry for static TLS block\n++\t\t\t\t\t   offset */\n++#define R_386_TLS_LE\t   17\t\t/* Offset relative to static TLS\n++\t\t\t\t\t   block */\n++#define R_386_TLS_GD\t   18\t\t/* Direct 32 bit for GNU version of\n++\t\t\t\t\t   general dynamic thread local data */\n++#define R_386_TLS_LDM\t   19\t\t/* Direct 32 bit for GNU version of\n++\t\t\t\t\t   local dynamic thread local data\n++\t\t\t\t\t   in LE code */\n++#define R_386_16\t   20\n++#define R_386_PC16\t   21\n++#define R_386_8\t\t   22\n++#define R_386_PC8\t   23\n++#define R_386_TLS_GD_32\t   24\t\t/* Direct 32 bit for general dynamic\n++\t\t\t\t\t   thread local data */\n++#define R_386_TLS_GD_PUSH  25\t\t/* Tag for pushl in GD TLS code */\n++#define R_386_TLS_GD_CALL  26\t\t/* Relocation for call to\n++\t\t\t\t\t   __tls_get_addr() */\n++#define R_386_TLS_GD_POP   27\t\t/* Tag for popl in GD TLS code */\n++#define R_386_TLS_LDM_32   28\t\t/* Direct 32 bit for local dynamic\n++\t\t\t\t\t   thread local data in LE code */\n++#define R_386_TLS_LDM_PUSH 29\t\t/* Tag for pushl in LDM TLS code */\n++#define R_386_TLS_LDM_CALL 30\t\t/* Relocation for call to\n++\t\t\t\t\t   __tls_get_addr() in LDM code */\n++#define R_386_TLS_LDM_POP  31\t\t/* Tag for popl in LDM TLS code */\n++#define R_386_TLS_LDO_32   32\t\t/* Offset relative to TLS block */\n++#define R_386_TLS_IE_32\t   33\t\t/* GOT entry for negated static TLS\n++\t\t\t\t\t   block offset */\n++#define R_386_TLS_LE_32\t   34\t\t/* Negated offset relative to static\n++\t\t\t\t\t   TLS block */\n++#define R_386_TLS_DTPMOD32 35\t\t/* ID of module containing symbol */\n++#define R_386_TLS_DTPOFF32 36\t\t/* Offset in TLS block */\n++#define R_386_TLS_TPOFF32  37\t\t/* Negated offset in static TLS block */\n++/* 38? */\n++#define R_386_TLS_GOTDESC  39\t\t/* GOT offset for TLS descriptor.  */\n++#define R_386_TLS_DESC_CALL 40\t\t/* Marker of call through TLS\n++\t\t\t\t\t   descriptor for\n++\t\t\t\t\t   relaxation.  */\n++#define R_386_TLS_DESC     41\t\t/* TLS descriptor containing\n++\t\t\t\t\t   pointer to code and to\n++\t\t\t\t\t   argument, returning the TLS\n++\t\t\t\t\t   offset for the symbol.  */\n++#define R_386_IRELATIVE\t   42\t\t/* Adjust indirectly by program base */\n++/* Keep this the last entry.  */\n++#define R_386_NUM\t   43\n++\n++/* SUN SPARC specific definitions.  */\n++\n++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */\n++\n++#define STT_SPARC_REGISTER\t13\t/* Global register reserved to app. */\n++\n++/* Values for Elf64_Ehdr.e_flags.  */\n++\n++#define EF_SPARCV9_MM\t\t3\n++#define EF_SPARCV9_TSO\t\t0\n++#define EF_SPARCV9_PSO\t\t1\n++#define EF_SPARCV9_RMO\t\t2\n++#define EF_SPARC_LEDATA\t\t0x800000 /* little endian data */\n++#define EF_SPARC_EXT_MASK\t0xFFFF00\n++#define EF_SPARC_32PLUS\t\t0x000100 /* generic V8+ features */\n++#define EF_SPARC_SUN_US1\t0x000200 /* Sun UltraSPARC1 extensions */\n++#define EF_SPARC_HAL_R1\t\t0x000400 /* HAL R1 extensions */\n++#define EF_SPARC_SUN_US3\t0x000800 /* Sun UltraSPARCIII extensions */\n++\n++/* SPARC relocs.  */\n++\n++#define R_SPARC_NONE\t\t0\t/* No reloc */\n++#define R_SPARC_8\t\t1\t/* Direct 8 bit */\n++#define R_SPARC_16\t\t2\t/* Direct 16 bit */\n++#define R_SPARC_32\t\t3\t/* Direct 32 bit */\n++#define R_SPARC_DISP8\t\t4\t/* PC relative 8 bit */\n++#define R_SPARC_DISP16\t\t5\t/* PC relative 16 bit */\n++#define R_SPARC_DISP32\t\t6\t/* PC relative 32 bit */\n++#define R_SPARC_WDISP30\t\t7\t/* PC relative 30 bit shifted */\n++#define R_SPARC_WDISP22\t\t8\t/* PC relative 22 bit shifted */\n++#define R_SPARC_HI22\t\t9\t/* High 22 bit */\n++#define R_SPARC_22\t\t10\t/* Direct 22 bit */\n++#define R_SPARC_13\t\t11\t/* Direct 13 bit */\n++#define R_SPARC_LO10\t\t12\t/* Truncated 10 bit */\n++#define R_SPARC_GOT10\t\t13\t/* Truncated 10 bit GOT entry */\n++#define R_SPARC_GOT13\t\t14\t/* 13 bit GOT entry */\n++#define R_SPARC_GOT22\t\t15\t/* 22 bit GOT entry shifted */\n++#define R_SPARC_PC10\t\t16\t/* PC relative 10 bit truncated */\n++#define R_SPARC_PC22\t\t17\t/* PC relative 22 bit shifted */\n++#define R_SPARC_WPLT30\t\t18\t/* 30 bit PC relative PLT address */\n++#define R_SPARC_COPY\t\t19\t/* Copy symbol at runtime */\n++#define R_SPARC_GLOB_DAT\t20\t/* Create GOT entry */\n++#define R_SPARC_JMP_SLOT\t21\t/* Create PLT entry */\n++#define R_SPARC_RELATIVE\t22\t/* Adjust by program base */\n++#define R_SPARC_UA32\t\t23\t/* Direct 32 bit unaligned */\n++\n++/* Additional Sparc64 relocs.  */\n++\n++#define R_SPARC_PLT32\t\t24\t/* Direct 32 bit ref to PLT entry */\n++#define R_SPARC_HIPLT22\t\t25\t/* High 22 bit PLT entry */\n++#define R_SPARC_LOPLT10\t\t26\t/* Truncated 10 bit PLT entry */\n++#define R_SPARC_PCPLT32\t\t27\t/* PC rel 32 bit ref to PLT entry */\n++#define R_SPARC_PCPLT22\t\t28\t/* PC rel high 22 bit PLT entry */\n++#define R_SPARC_PCPLT10\t\t29\t/* PC rel trunc 10 bit PLT entry */\n++#define R_SPARC_10\t\t30\t/* Direct 10 bit */\n++#define R_SPARC_11\t\t31\t/* Direct 11 bit */\n++#define R_SPARC_64\t\t32\t/* Direct 64 bit */\n++#define R_SPARC_OLO10\t\t33\t/* 10bit with secondary 13bit addend */\n++#define R_SPARC_HH22\t\t34\t/* Top 22 bits of direct 64 bit */\n++#define R_SPARC_HM10\t\t35\t/* High middle 10 bits of ... */\n++#define R_SPARC_LM22\t\t36\t/* Low middle 22 bits of ... */\n++#define R_SPARC_PC_HH22\t\t37\t/* Top 22 bits of pc rel 64 bit */\n++#define R_SPARC_PC_HM10\t\t38\t/* High middle 10 bit of ... */\n++#define R_SPARC_PC_LM22\t\t39\t/* Low miggle 22 bits of ... */\n++#define R_SPARC_WDISP16\t\t40\t/* PC relative 16 bit shifted */\n++#define R_SPARC_WDISP19\t\t41\t/* PC relative 19 bit shifted */\n++#define R_SPARC_GLOB_JMP\t42\t/* was part of v9 ABI but was removed */\n++#define R_SPARC_7\t\t43\t/* Direct 7 bit */\n++#define R_SPARC_5\t\t44\t/* Direct 5 bit */\n++#define R_SPARC_6\t\t45\t/* Direct 6 bit */\n++#define R_SPARC_DISP64\t\t46\t/* PC relative 64 bit */\n++#define R_SPARC_PLT64\t\t47\t/* Direct 64 bit ref to PLT entry */\n++#define R_SPARC_HIX22\t\t48\t/* High 22 bit complemented */\n++#define R_SPARC_LOX10\t\t49\t/* Truncated 11 bit complemented */\n++#define R_SPARC_H44\t\t50\t/* Direct high 12 of 44 bit */\n++#define R_SPARC_M44\t\t51\t/* Direct mid 22 of 44 bit */\n++#define R_SPARC_L44\t\t52\t/* Direct low 10 of 44 bit */\n++#define R_SPARC_REGISTER\t53\t/* Global register usage */\n++#define R_SPARC_UA64\t\t54\t/* Direct 64 bit unaligned */\n++#define R_SPARC_UA16\t\t55\t/* Direct 16 bit unaligned */\n++#define R_SPARC_TLS_GD_HI22\t56\n++#define R_SPARC_TLS_GD_LO10\t57\n++#define R_SPARC_TLS_GD_ADD\t58\n++#define R_SPARC_TLS_GD_CALL\t59\n++#define R_SPARC_TLS_LDM_HI22\t60\n++#define R_SPARC_TLS_LDM_LO10\t61\n++#define R_SPARC_TLS_LDM_ADD\t62\n++#define R_SPARC_TLS_LDM_CALL\t63\n++#define R_SPARC_TLS_LDO_HIX22\t64\n++#define R_SPARC_TLS_LDO_LOX10\t65\n++#define R_SPARC_TLS_LDO_ADD\t66\n++#define R_SPARC_TLS_IE_HI22\t67\n++#define R_SPARC_TLS_IE_LO10\t68\n++#define R_SPARC_TLS_IE_LD\t69\n++#define R_SPARC_TLS_IE_LDX\t70\n++#define R_SPARC_TLS_IE_ADD\t71\n++#define R_SPARC_TLS_LE_HIX22\t72\n++#define R_SPARC_TLS_LE_LOX10\t73\n++#define R_SPARC_TLS_DTPMOD32\t74\n++#define R_SPARC_TLS_DTPMOD64\t75\n++#define R_SPARC_TLS_DTPOFF32\t76\n++#define R_SPARC_TLS_DTPOFF64\t77\n++#define R_SPARC_TLS_TPOFF32\t78\n++#define R_SPARC_TLS_TPOFF64\t79\n++#define R_SPARC_GOTDATA_HIX22\t80\n++#define R_SPARC_GOTDATA_LOX10\t81\n++#define R_SPARC_GOTDATA_OP_HIX22\t82\n++#define R_SPARC_GOTDATA_OP_LOX10\t83\n++#define R_SPARC_GOTDATA_OP\t84\n++#define R_SPARC_H34\t\t85\n++#define R_SPARC_SIZE32\t\t86\n++#define R_SPARC_SIZE64\t\t87\n++#define R_SPARC_WDISP10\t\t88\n++#define R_SPARC_JMP_IREL\t248\n++#define R_SPARC_IRELATIVE\t249\n++#define R_SPARC_GNU_VTINHERIT\t250\n++#define R_SPARC_GNU_VTENTRY\t251\n++#define R_SPARC_REV32\t\t252\n++/* Keep this the last entry.  */\n++#define R_SPARC_NUM\t\t253\n++\n++/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */\n++\n++#define DT_SPARC_REGISTER 0x70000001\n++#define DT_SPARC_NUM\t2\n++\n++/* MIPS R3000 specific definitions.  */\n++\n++/* Legal values for e_flags field of Elf32_Ehdr.  */\n++\n++#define EF_MIPS_NOREORDER   1\t\t/* A .noreorder directive was used */\n++#define EF_MIPS_PIC\t    2\t\t/* Contains PIC code */\n++#define EF_MIPS_CPIC\t    4\t\t/* Uses PIC calling sequence */\n++#define EF_MIPS_XGOT\t    8\n++#define EF_MIPS_64BIT_WHIRL 16\n++#define EF_MIPS_ABI2\t    32\n++#define EF_MIPS_ABI_ON32    64\n++#define EF_MIPS_ARCH\t    0xf0000000\t/* MIPS architecture level */\n++\n++/* Legal values for MIPS architecture level.  */\n++\n++#define EF_MIPS_ARCH_1\t    0x00000000\t/* -mips1 code.  */\n++#define EF_MIPS_ARCH_2\t    0x10000000\t/* -mips2 code.  */\n++#define EF_MIPS_ARCH_3\t    0x20000000\t/* -mips3 code.  */\n++#define EF_MIPS_ARCH_4\t    0x30000000\t/* -mips4 code.  */\n++#define EF_MIPS_ARCH_5\t    0x40000000\t/* -mips5 code.  */\n++#define EF_MIPS_ARCH_32\t    0x60000000\t/* MIPS32 code.  */\n++#define EF_MIPS_ARCH_64\t    0x70000000\t/* MIPS64 code.  */\n++\n++/* The following are non-official names and should not be used.  */\n++\n++#define E_MIPS_ARCH_1\t  0x00000000\t/* -mips1 code.  */\n++#define E_MIPS_ARCH_2\t  0x10000000\t/* -mips2 code.  */\n++#define E_MIPS_ARCH_3\t  0x20000000\t/* -mips3 code.  */\n++#define E_MIPS_ARCH_4\t  0x30000000\t/* -mips4 code.  */\n++#define E_MIPS_ARCH_5\t  0x40000000\t/* -mips5 code.  */\n++#define E_MIPS_ARCH_32\t  0x60000000\t/* MIPS32 code.  */\n++#define E_MIPS_ARCH_64\t  0x70000000\t/* MIPS64 code.  */\n++\n++/* Special section indices.  */\n++\n++#define SHN_MIPS_ACOMMON    0xff00\t/* Allocated common symbols */\n++#define SHN_MIPS_TEXT\t    0xff01\t/* Allocated test symbols.  */\n++#define SHN_MIPS_DATA\t    0xff02\t/* Allocated data symbols.  */\n++#define SHN_MIPS_SCOMMON    0xff03\t/* Small common symbols */\n++#define SHN_MIPS_SUNDEFINED 0xff04\t/* Small undefined symbols */\n++\n++/* Legal values for sh_type field of Elf32_Shdr.  */\n++\n++#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */\n++#define SHT_MIPS_MSYM\t       0x70000001\n++#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */\n++#define SHT_MIPS_GPTAB\t       0x70000003 /* Global data area sizes */\n++#define SHT_MIPS_UCODE\t       0x70000004 /* Reserved for SGI/MIPS compilers */\n++#define SHT_MIPS_DEBUG\t       0x70000005 /* MIPS ECOFF debugging information*/\n++#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */\n++#define SHT_MIPS_PACKAGE       0x70000007\n++#define SHT_MIPS_PACKSYM       0x70000008\n++#define SHT_MIPS_RELD\t       0x70000009\n++#define SHT_MIPS_IFACE         0x7000000b\n++#define SHT_MIPS_CONTENT       0x7000000c\n++#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */\n++#define SHT_MIPS_SHDR\t       0x70000010\n++#define SHT_MIPS_FDESC\t       0x70000011\n++#define SHT_MIPS_EXTSYM\t       0x70000012\n++#define SHT_MIPS_DENSE\t       0x70000013\n++#define SHT_MIPS_PDESC\t       0x70000014\n++#define SHT_MIPS_LOCSYM\t       0x70000015\n++#define SHT_MIPS_AUXSYM\t       0x70000016\n++#define SHT_MIPS_OPTSYM\t       0x70000017\n++#define SHT_MIPS_LOCSTR\t       0x70000018\n++#define SHT_MIPS_LINE\t       0x70000019\n++#define SHT_MIPS_RFDESC\t       0x7000001a\n++#define SHT_MIPS_DELTASYM      0x7000001b\n++#define SHT_MIPS_DELTAINST     0x7000001c\n++#define SHT_MIPS_DELTACLASS    0x7000001d\n++#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */\n++#define SHT_MIPS_DELTADECL     0x7000001f\n++#define SHT_MIPS_SYMBOL_LIB    0x70000020\n++#define SHT_MIPS_EVENTS\t       0x70000021 /* Event section.  */\n++#define SHT_MIPS_TRANSLATE     0x70000022\n++#define SHT_MIPS_PIXIE\t       0x70000023\n++#define SHT_MIPS_XLATE\t       0x70000024\n++#define SHT_MIPS_XLATE_DEBUG   0x70000025\n++#define SHT_MIPS_WHIRL\t       0x70000026\n++#define SHT_MIPS_EH_REGION     0x70000027\n++#define SHT_MIPS_XLATE_OLD     0x70000028\n++#define SHT_MIPS_PDR_EXCEPTION 0x70000029\n++\n++/* Legal values for sh_flags field of Elf32_Shdr.  */\n++\n++#define SHF_MIPS_GPREL\t 0x10000000\t/* Must be part of global data area */\n++#define SHF_MIPS_MERGE\t 0x20000000\n++#define SHF_MIPS_ADDR\t 0x40000000\n++#define SHF_MIPS_STRINGS 0x80000000\n++#define SHF_MIPS_NOSTRIP 0x08000000\n++#define SHF_MIPS_LOCAL\t 0x04000000\n++#define SHF_MIPS_NAMES\t 0x02000000\n++#define SHF_MIPS_NODUPE\t 0x01000000\n++\n++\n++/* Symbol tables.  */\n++\n++/* MIPS specific values for `st_other'.  */\n++#define STO_MIPS_DEFAULT\t\t0x0\n++#define STO_MIPS_INTERNAL\t\t0x1\n++#define STO_MIPS_HIDDEN\t\t\t0x2\n++#define STO_MIPS_PROTECTED\t\t0x3\n++#define STO_MIPS_PLT\t\t\t0x8\n++#define STO_MIPS_SC_ALIGN_UNUSED\t0xff\n++\n++/* MIPS specific values for `st_info'.  */\n++#define STB_MIPS_SPLIT_COMMON\t\t13\n++\n++/* Entries found in sections of type SHT_MIPS_GPTAB.  */\n++\n++typedef union\n++{\n++  struct\n++    {\n++      Elf32_Word gt_current_g_value;\t/* -G value used for compilation */\n++      Elf32_Word gt_unused;\t\t/* Not used */\n++    } gt_header;\t\t\t/* First entry in section */\n++  struct\n++    {\n++      Elf32_Word gt_g_value;\t\t/* If this value were used for -G */\n++      Elf32_Word gt_bytes;\t\t/* This many bytes would be used */\n++    } gt_entry;\t\t\t\t/* Subsequent entries in section */\n++} Elf32_gptab;\n++\n++/* Entry found in sections of type SHT_MIPS_REGINFO.  */\n++\n++typedef struct\n++{\n++  Elf32_Word\tri_gprmask;\t\t/* General registers used */\n++  Elf32_Word\tri_cprmask[4];\t\t/* Coprocessor registers used */\n++  Elf32_Sword\tri_gp_value;\t\t/* $gp register value */\n++} Elf32_RegInfo;\n++\n++/* Entries found in sections of type SHT_MIPS_OPTIONS.  */\n++\n++typedef struct\n++{\n++  unsigned char kind;\t\t/* Determines interpretation of the\n++\t\t\t\t   variable part of descriptor.  */\n++  unsigned char size;\t\t/* Size of descriptor, including header.  */\n++  Elf32_Section section;\t/* Section header index of section affected,\n++\t\t\t\t   0 for global options.  */\n++  Elf32_Word info;\t\t/* Kind-specific information.  */\n++} Elf_Options;\n++\n++/* Values for `kind' field in Elf_Options.  */\n++\n++#define ODK_NULL\t0\t/* Undefined.  */\n++#define ODK_REGINFO\t1\t/* Register usage information.  */\n++#define ODK_EXCEPTIONS\t2\t/* Exception processing options.  */\n++#define ODK_PAD\t\t3\t/* Section padding options.  */\n++#define ODK_HWPATCH\t4\t/* Hardware workarounds performed */\n++#define ODK_FILL\t5\t/* record the fill value used by the linker. */\n++#define ODK_TAGS\t6\t/* reserve space for desktop tools to write. */\n++#define ODK_HWAND\t7\t/* HW workarounds.  'AND' bits when merging. */\n++#define ODK_HWOR\t8\t/* HW workarounds.  'OR' bits when merging.  */\n++\n++/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */\n++\n++#define OEX_FPU_MIN\t0x1f\t/* FPE's which MUST be enabled.  */\n++#define OEX_FPU_MAX\t0x1f00\t/* FPE's which MAY be enabled.  */\n++#define OEX_PAGE0\t0x10000\t/* page zero must be mapped.  */\n++#define OEX_SMM\t\t0x20000\t/* Force sequential memory mode?  */\n++#define OEX_FPDBUG\t0x40000\t/* Force floating point debug mode?  */\n++#define OEX_PRECISEFP\tOEX_FPDBUG\n++#define OEX_DISMISS\t0x80000\t/* Dismiss invalid address faults?  */\n++\n++#define OEX_FPU_INVAL\t0x10\n++#define OEX_FPU_DIV0\t0x08\n++#define OEX_FPU_OFLO\t0x04\n++#define OEX_FPU_UFLO\t0x02\n++#define OEX_FPU_INEX\t0x01\n++\n++/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */\n++\n++#define OHW_R4KEOP\t0x1\t/* R4000 end-of-page patch.  */\n++#define OHW_R8KPFETCH\t0x2\t/* may need R8000 prefetch patch.  */\n++#define OHW_R5KEOP\t0x4\t/* R5000 end-of-page patch.  */\n++#define OHW_R5KCVTL\t0x8\t/* R5000 cvt.[ds].l bug.  clean=1.  */\n++\n++#define OPAD_PREFIX\t0x1\n++#define OPAD_POSTFIX\t0x2\n++#define OPAD_SYMBOL\t0x4\n++\n++/* Entry found in `.options' section.  */\n++\n++typedef struct\n++{\n++  Elf32_Word hwp_flags1;\t/* Extra flags.  */\n++  Elf32_Word hwp_flags2;\t/* Extra flags.  */\n++} Elf_Options_Hw;\n++\n++/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */\n++\n++#define OHWA0_R4KEOP_CHECKED\t0x00000001\n++#define OHWA1_R4KEOP_CLEAN\t0x00000002\n++\n++/* MIPS relocs.  */\n++\n++#define R_MIPS_NONE\t\t0\t/* No reloc */\n++#define R_MIPS_16\t\t1\t/* Direct 16 bit */\n++#define R_MIPS_32\t\t2\t/* Direct 32 bit */\n++#define R_MIPS_REL32\t\t3\t/* PC relative 32 bit */\n++#define R_MIPS_26\t\t4\t/* Direct 26 bit shifted */\n++#define R_MIPS_HI16\t\t5\t/* High 16 bit */\n++#define R_MIPS_LO16\t\t6\t/* Low 16 bit */\n++#define R_MIPS_GPREL16\t\t7\t/* GP relative 16 bit */\n++#define R_MIPS_LITERAL\t\t8\t/* 16 bit literal entry */\n++#define R_MIPS_GOT16\t\t9\t/* 16 bit GOT entry */\n++#define R_MIPS_PC16\t\t10\t/* PC relative 16 bit */\n++#define R_MIPS_CALL16\t\t11\t/* 16 bit GOT entry for function */\n++#define R_MIPS_GPREL32\t\t12\t/* GP relative 32 bit */\n++\n++#define R_MIPS_SHIFT5\t\t16\n++#define R_MIPS_SHIFT6\t\t17\n++#define R_MIPS_64\t\t18\n++#define R_MIPS_GOT_DISP\t\t19\n++#define R_MIPS_GOT_PAGE\t\t20\n++#define R_MIPS_GOT_OFST\t\t21\n++#define R_MIPS_GOT_HI16\t\t22\n++#define R_MIPS_GOT_LO16\t\t23\n++#define R_MIPS_SUB\t\t24\n++#define R_MIPS_INSERT_A\t\t25\n++#define R_MIPS_INSERT_B\t\t26\n++#define R_MIPS_DELETE\t\t27\n++#define R_MIPS_HIGHER\t\t28\n++#define R_MIPS_HIGHEST\t\t29\n++#define R_MIPS_CALL_HI16\t30\n++#define R_MIPS_CALL_LO16\t31\n++#define R_MIPS_SCN_DISP\t\t32\n++#define R_MIPS_REL16\t\t33\n++#define R_MIPS_ADD_IMMEDIATE\t34\n++#define R_MIPS_PJUMP\t\t35\n++#define R_MIPS_RELGOT\t\t36\n++#define R_MIPS_JALR\t\t37\n++#define R_MIPS_TLS_DTPMOD32\t38\t/* Module number 32 bit */\n++#define R_MIPS_TLS_DTPREL32\t39\t/* Module-relative offset 32 bit */\n++#define R_MIPS_TLS_DTPMOD64\t40\t/* Module number 64 bit */\n++#define R_MIPS_TLS_DTPREL64\t41\t/* Module-relative offset 64 bit */\n++#define R_MIPS_TLS_GD\t\t42\t/* 16 bit GOT offset for GD */\n++#define R_MIPS_TLS_LDM\t\t43\t/* 16 bit GOT offset for LDM */\n++#define R_MIPS_TLS_DTPREL_HI16\t44\t/* Module-relative offset, high 16 bits */\n++#define R_MIPS_TLS_DTPREL_LO16\t45\t/* Module-relative offset, low 16 bits */\n++#define R_MIPS_TLS_GOTTPREL\t46\t/* 16 bit GOT offset for IE */\n++#define R_MIPS_TLS_TPREL32\t47\t/* TP-relative offset, 32 bit */\n++#define R_MIPS_TLS_TPREL64\t48\t/* TP-relative offset, 64 bit */\n++#define R_MIPS_TLS_TPREL_HI16\t49\t/* TP-relative offset, high 16 bits */\n++#define R_MIPS_TLS_TPREL_LO16\t50\t/* TP-relative offset, low 16 bits */\n++#define R_MIPS_GLOB_DAT\t\t51\n++#define R_MIPS_COPY\t\t126\n++#define R_MIPS_JUMP_SLOT        127\n++/* Keep this the last entry.  */\n++#define R_MIPS_NUM\t\t128\n++\n++/* Legal values for p_type field of Elf32_Phdr.  */\n++\n++#define PT_MIPS_REGINFO\t0x70000000\t/* Register usage information */\n++#define PT_MIPS_RTPROC  0x70000001\t/* Runtime procedure table. */\n++#define PT_MIPS_OPTIONS 0x70000002\n++\n++/* Special program header types.  */\n++\n++#define PF_MIPS_LOCAL\t0x10000000\n++\n++/* Legal values for d_tag field of Elf32_Dyn.  */\n++\n++#define DT_MIPS_RLD_VERSION  0x70000001\t/* Runtime linker interface version */\n++#define DT_MIPS_TIME_STAMP   0x70000002\t/* Timestamp */\n++#define DT_MIPS_ICHECKSUM    0x70000003\t/* Checksum */\n++#define DT_MIPS_IVERSION     0x70000004\t/* Version string (string tbl index) */\n++#define DT_MIPS_FLAGS\t     0x70000005\t/* Flags */\n++#define DT_MIPS_BASE_ADDRESS 0x70000006\t/* Base address */\n++#define DT_MIPS_MSYM\t     0x70000007\n++#define DT_MIPS_CONFLICT     0x70000008\t/* Address of CONFLICT section */\n++#define DT_MIPS_LIBLIST\t     0x70000009\t/* Address of LIBLIST section */\n++#define DT_MIPS_LOCAL_GOTNO  0x7000000a\t/* Number of local GOT entries */\n++#define DT_MIPS_CONFLICTNO   0x7000000b\t/* Number of CONFLICT entries */\n++#define DT_MIPS_LIBLISTNO    0x70000010\t/* Number of LIBLIST entries */\n++#define DT_MIPS_SYMTABNO     0x70000011\t/* Number of DYNSYM entries */\n++#define DT_MIPS_UNREFEXTNO   0x70000012\t/* First external DYNSYM */\n++#define DT_MIPS_GOTSYM\t     0x70000013\t/* First GOT entry in DYNSYM */\n++#define DT_MIPS_HIPAGENO     0x70000014\t/* Number of GOT page table entries */\n++#define DT_MIPS_RLD_MAP\t     0x70000016\t/* Address of run time loader map.  */\n++#define DT_MIPS_DELTA_CLASS  0x70000017\t/* Delta C++ class definition.  */\n++#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in\n++\t\t\t\t\t\tDT_MIPS_DELTA_CLASS.  */\n++#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */\n++#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in\n++\t\t\t\t\t\tDT_MIPS_DELTA_INSTANCE.  */\n++#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */\n++#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in\n++\t\t\t\t\t     DT_MIPS_DELTA_RELOC.  */\n++#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta\n++\t\t\t\t\t   relocations refer to.  */\n++#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in\n++\t\t\t\t\t   DT_MIPS_DELTA_SYM.  */\n++#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the\n++\t\t\t\t\t     class declaration.  */\n++#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in\n++\t\t\t\t\t\tDT_MIPS_DELTA_CLASSSYM.  */\n++#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */\n++#define DT_MIPS_PIXIE_INIT   0x70000023\n++#define DT_MIPS_SYMBOL_LIB   0x70000024\n++#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025\n++#define DT_MIPS_LOCAL_GOTIDX 0x70000026\n++#define DT_MIPS_HIDDEN_GOTIDX 0x70000027\n++#define DT_MIPS_PROTECTED_GOTIDX 0x70000028\n++#define DT_MIPS_OPTIONS\t     0x70000029 /* Address of .options.  */\n++#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */\n++#define DT_MIPS_DYNSTR_ALIGN 0x7000002b\n++#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */\n++#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve\n++\t\t\t\t\t\t    function stored in GOT.  */\n++#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added\n++\t\t\t\t\t   by rld on dlopen() calls.  */\n++#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */\n++#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */\n++#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */\n++/* The address of .got.plt in an executable using the new non-PIC ABI.  */\n++#define DT_MIPS_PLTGOT\t     0x70000032\n++/* The base of the PLT in an executable using the new non-PIC ABI if that\n++   PLT is writable.  For a non-writable PLT, this is omitted or has a zero\n++   value.  */\n++#define DT_MIPS_RWPLT        0x70000034\n++#define DT_MIPS_NUM\t     0x35\n++\n++/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */\n++\n++#define RHF_NONE\t\t   0\t\t/* No flags */\n++#define RHF_QUICKSTART\t\t   (1 << 0)\t/* Use quickstart */\n++#define RHF_NOTPOT\t\t   (1 << 1)\t/* Hash size not power of 2 */\n++#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)\t/* Ignore LD_LIBRARY_PATH */\n++#define RHF_NO_MOVE\t\t   (1 << 3)\n++#define RHF_SGI_ONLY\t\t   (1 << 4)\n++#define RHF_GUARANTEE_INIT\t   (1 << 5)\n++#define RHF_DELTA_C_PLUS_PLUS\t   (1 << 6)\n++#define RHF_GUARANTEE_START_INIT   (1 << 7)\n++#define RHF_PIXIE\t\t   (1 << 8)\n++#define RHF_DEFAULT_DELAY_LOAD\t   (1 << 9)\n++#define RHF_REQUICKSTART\t   (1 << 10)\n++#define RHF_REQUICKSTARTED\t   (1 << 11)\n++#define RHF_CORD\t\t   (1 << 12)\n++#define RHF_NO_UNRES_UNDEF\t   (1 << 13)\n++#define RHF_RLD_ORDER_SAFE\t   (1 << 14)\n++\n++/* Entries found in sections of type SHT_MIPS_LIBLIST.  */\n++\n++typedef struct\n++{\n++  Elf32_Word l_name;\t\t/* Name (string table index) */\n++  Elf32_Word l_time_stamp;\t/* Timestamp */\n++  Elf32_Word l_checksum;\t/* Checksum */\n++  Elf32_Word l_version;\t\t/* Interface version */\n++  Elf32_Word l_flags;\t\t/* Flags */\n++} Elf32_Lib;\n++\n++typedef struct\n++{\n++  Elf64_Word l_name;\t\t/* Name (string table index) */\n++  Elf64_Word l_time_stamp;\t/* Timestamp */\n++  Elf64_Word l_checksum;\t/* Checksum */\n++  Elf64_Word l_version;\t\t/* Interface version */\n++  Elf64_Word l_flags;\t\t/* Flags */\n++} Elf64_Lib;\n++\n++\n++/* Legal values for l_flags.  */\n++\n++#define LL_NONE\t\t  0\n++#define LL_EXACT_MATCH\t  (1 << 0)\t/* Require exact match */\n++#define LL_IGNORE_INT_VER (1 << 1)\t/* Ignore interface version */\n++#define LL_REQUIRE_MINOR  (1 << 2)\n++#define LL_EXPORTS\t  (1 << 3)\n++#define LL_DELAY_LOAD\t  (1 << 4)\n++#define LL_DELTA\t  (1 << 5)\n++\n++/* Entries found in sections of type SHT_MIPS_CONFLICT.  */\n++\n++typedef Elf32_Addr Elf32_Conflict;\n++\n++\n++/* HPPA specific definitions.  */\n++\n++/* Legal values for e_flags field of Elf32_Ehdr.  */\n++\n++#define EF_PARISC_TRAPNIL\t0x00010000 /* Trap nil pointer dereference.  */\n++#define EF_PARISC_EXT\t\t0x00020000 /* Program uses arch. extensions. */\n++#define EF_PARISC_LSB\t\t0x00040000 /* Program expects little endian. */\n++#define EF_PARISC_WIDE\t\t0x00080000 /* Program expects wide mode.  */\n++#define EF_PARISC_NO_KABP\t0x00100000 /* No kernel assisted branch\n++\t\t\t\t\t      prediction.  */\n++#define EF_PARISC_LAZYSWAP\t0x00400000 /* Allow lazy swapping.  */\n++#define EF_PARISC_ARCH\t\t0x0000ffff /* Architecture version.  */\n++\n++/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */\n++\n++#define EFA_PARISC_1_0\t\t    0x020b /* PA-RISC 1.0 big-endian.  */\n++#define EFA_PARISC_1_1\t\t    0x0210 /* PA-RISC 1.1 big-endian.  */\n++#define EFA_PARISC_2_0\t\t    0x0214 /* PA-RISC 2.0 big-endian.  */\n++\n++/* Additional section indeces.  */\n++\n++#define SHN_PARISC_ANSI_COMMON\t0xff00\t   /* Section for tenatively declared\n++\t\t\t\t\t      symbols in ANSI C.  */\n++#define SHN_PARISC_HUGE_COMMON\t0xff01\t   /* Common blocks in huge model.  */\n++\n++/* Legal values for sh_type field of Elf32_Shdr.  */\n++\n++#define SHT_PARISC_EXT\t\t0x70000000 /* Contains product specific ext. */\n++#define SHT_PARISC_UNWIND\t0x70000001 /* Unwind information.  */\n++#define SHT_PARISC_DOC\t\t0x70000002 /* Debug info for optimized code. */\n++\n++/* Legal values for sh_flags field of Elf32_Shdr.  */\n++\n++#define SHF_PARISC_SHORT\t0x20000000 /* Section with short addressing. */\n++#define SHF_PARISC_HUGE\t\t0x40000000 /* Section far from gp.  */\n++#define SHF_PARISC_SBP\t\t0x80000000 /* Static branch prediction code. */\n++\n++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */\n++\n++#define STT_PARISC_MILLICODE\t13\t/* Millicode function entry point.  */\n++\n++#define STT_HP_OPAQUE\t\t(STT_LOOS + 0x1)\n++#define STT_HP_STUB\t\t(STT_LOOS + 0x2)\n++\n++/* HPPA relocs.  */\n++\n++#define R_PARISC_NONE\t\t0\t/* No reloc.  */\n++#define R_PARISC_DIR32\t\t1\t/* Direct 32-bit reference.  */\n++#define R_PARISC_DIR21L\t\t2\t/* Left 21 bits of eff. address.  */\n++#define R_PARISC_DIR17R\t\t3\t/* Right 17 bits of eff. address.  */\n++#define R_PARISC_DIR17F\t\t4\t/* 17 bits of eff. address.  */\n++#define R_PARISC_DIR14R\t\t6\t/* Right 14 bits of eff. address.  */\n++#define R_PARISC_PCREL32\t9\t/* 32-bit rel. address.  */\n++#define R_PARISC_PCREL21L\t10\t/* Left 21 bits of rel. address.  */\n++#define R_PARISC_PCREL17R\t11\t/* Right 17 bits of rel. address.  */\n++#define R_PARISC_PCREL17F\t12\t/* 17 bits of rel. address.  */\n++#define R_PARISC_PCREL14R\t14\t/* Right 14 bits of rel. address.  */\n++#define R_PARISC_DPREL21L\t18\t/* Left 21 bits of rel. address.  */\n++#define R_PARISC_DPREL14R\t22\t/* Right 14 bits of rel. address.  */\n++#define R_PARISC_GPREL21L\t26\t/* GP-relative, left 21 bits.  */\n++#define R_PARISC_GPREL14R\t30\t/* GP-relative, right 14 bits.  */\n++#define R_PARISC_LTOFF21L\t34\t/* LT-relative, left 21 bits.  */\n++#define R_PARISC_LTOFF14R\t38\t/* LT-relative, right 14 bits.  */\n++#define R_PARISC_SECREL32\t41\t/* 32 bits section rel. address.  */\n++#define R_PARISC_SEGBASE\t48\t/* No relocation, set segment base.  */\n++#define R_PARISC_SEGREL32\t49\t/* 32 bits segment rel. address.  */\n++#define R_PARISC_PLTOFF21L\t50\t/* PLT rel. address, left 21 bits.  */\n++#define R_PARISC_PLTOFF14R\t54\t/* PLT rel. address, right 14 bits.  */\n++#define R_PARISC_LTOFF_FPTR32\t57\t/* 32 bits LT-rel. function pointer. */\n++#define R_PARISC_LTOFF_FPTR21L\t58\t/* LT-rel. fct ptr, left 21 bits. */\n++#define R_PARISC_LTOFF_FPTR14R\t62\t/* LT-rel. fct ptr, right 14 bits. */\n++#define R_PARISC_FPTR64\t\t64\t/* 64 bits function address.  */\n++#define R_PARISC_PLABEL32\t65\t/* 32 bits function address.  */\n++#define R_PARISC_PLABEL21L\t66\t/* Left 21 bits of fdesc address.  */\n++#define R_PARISC_PLABEL14R\t70\t/* Right 14 bits of fdesc address.  */\n++#define R_PARISC_PCREL64\t72\t/* 64 bits PC-rel. address.  */\n++#define R_PARISC_PCREL22F\t74\t/* 22 bits PC-rel. address.  */\n++#define R_PARISC_PCREL14WR\t75\t/* PC-rel. address, right 14 bits.  */\n++#define R_PARISC_PCREL14DR\t76\t/* PC rel. address, right 14 bits.  */\n++#define R_PARISC_PCREL16F\t77\t/* 16 bits PC-rel. address.  */\n++#define R_PARISC_PCREL16WF\t78\t/* 16 bits PC-rel. address.  */\n++#define R_PARISC_PCREL16DF\t79\t/* 16 bits PC-rel. address.  */\n++#define R_PARISC_DIR64\t\t80\t/* 64 bits of eff. address.  */\n++#define R_PARISC_DIR14WR\t83\t/* 14 bits of eff. address.  */\n++#define R_PARISC_DIR14DR\t84\t/* 14 bits of eff. address.  */\n++#define R_PARISC_DIR16F\t\t85\t/* 16 bits of eff. address.  */\n++#define R_PARISC_DIR16WF\t86\t/* 16 bits of eff. address.  */\n++#define R_PARISC_DIR16DF\t87\t/* 16 bits of eff. address.  */\n++#define R_PARISC_GPREL64\t88\t/* 64 bits of GP-rel. address.  */\n++#define R_PARISC_GPREL14WR\t91\t/* GP-rel. address, right 14 bits.  */\n++#define R_PARISC_GPREL14DR\t92\t/* GP-rel. address, right 14 bits.  */\n++#define R_PARISC_GPREL16F\t93\t/* 16 bits GP-rel. address.  */\n++#define R_PARISC_GPREL16WF\t94\t/* 16 bits GP-rel. address.  */\n++#define R_PARISC_GPREL16DF\t95\t/* 16 bits GP-rel. address.  */\n++#define R_PARISC_LTOFF64\t96\t/* 64 bits LT-rel. address.  */\n++#define R_PARISC_LTOFF14WR\t99\t/* LT-rel. address, right 14 bits.  */\n++#define R_PARISC_LTOFF14DR\t100\t/* LT-rel. address, right 14 bits.  */\n++#define R_PARISC_LTOFF16F\t101\t/* 16 bits LT-rel. address.  */\n++#define R_PARISC_LTOFF16WF\t102\t/* 16 bits LT-rel. address.  */\n++#define R_PARISC_LTOFF16DF\t103\t/* 16 bits LT-rel. address.  */\n++#define R_PARISC_SECREL64\t104\t/* 64 bits section rel. address.  */\n++#define R_PARISC_SEGREL64\t112\t/* 64 bits segment rel. address.  */\n++#define R_PARISC_PLTOFF14WR\t115\t/* PLT-rel. address, right 14 bits.  */\n++#define R_PARISC_PLTOFF14DR\t116\t/* PLT-rel. address, right 14 bits.  */\n++#define R_PARISC_PLTOFF16F\t117\t/* 16 bits LT-rel. address.  */\n++#define R_PARISC_PLTOFF16WF\t118\t/* 16 bits PLT-rel. address.  */\n++#define R_PARISC_PLTOFF16DF\t119\t/* 16 bits PLT-rel. address.  */\n++#define R_PARISC_LTOFF_FPTR64\t120\t/* 64 bits LT-rel. function ptr.  */\n++#define R_PARISC_LTOFF_FPTR14WR\t123\t/* LT-rel. fct. ptr., right 14 bits. */\n++#define R_PARISC_LTOFF_FPTR14DR\t124\t/* LT-rel. fct. ptr., right 14 bits. */\n++#define R_PARISC_LTOFF_FPTR16F\t125\t/* 16 bits LT-rel. function ptr.  */\n++#define R_PARISC_LTOFF_FPTR16WF\t126\t/* 16 bits LT-rel. function ptr.  */\n++#define R_PARISC_LTOFF_FPTR16DF\t127\t/* 16 bits LT-rel. function ptr.  */\n++#define R_PARISC_LORESERVE\t128\n++#define R_PARISC_COPY\t\t128\t/* Copy relocation.  */\n++#define R_PARISC_IPLT\t\t129\t/* Dynamic reloc, imported PLT */\n++#define R_PARISC_EPLT\t\t130\t/* Dynamic reloc, exported PLT */\n++#define R_PARISC_TPREL32\t153\t/* 32 bits TP-rel. address.  */\n++#define R_PARISC_TPREL21L\t154\t/* TP-rel. address, left 21 bits.  */\n++#define R_PARISC_TPREL14R\t158\t/* TP-rel. address, right 14 bits.  */\n++#define R_PARISC_LTOFF_TP21L\t162\t/* LT-TP-rel. address, left 21 bits. */\n++#define R_PARISC_LTOFF_TP14R\t166\t/* LT-TP-rel. address, right 14 bits.*/\n++#define R_PARISC_LTOFF_TP14F\t167\t/* 14 bits LT-TP-rel. address.  */\n++#define R_PARISC_TPREL64\t216\t/* 64 bits TP-rel. address.  */\n++#define R_PARISC_TPREL14WR\t219\t/* TP-rel. address, right 14 bits.  */\n++#define R_PARISC_TPREL14DR\t220\t/* TP-rel. address, right 14 bits.  */\n++#define R_PARISC_TPREL16F\t221\t/* 16 bits TP-rel. address.  */\n++#define R_PARISC_TPREL16WF\t222\t/* 16 bits TP-rel. address.  */\n++#define R_PARISC_TPREL16DF\t223\t/* 16 bits TP-rel. address.  */\n++#define R_PARISC_LTOFF_TP64\t224\t/* 64 bits LT-TP-rel. address.  */\n++#define R_PARISC_LTOFF_TP14WR\t227\t/* LT-TP-rel. address, right 14 bits.*/\n++#define R_PARISC_LTOFF_TP14DR\t228\t/* LT-TP-rel. address, right 14 bits.*/\n++#define R_PARISC_LTOFF_TP16F\t229\t/* 16 bits LT-TP-rel. address.  */\n++#define R_PARISC_LTOFF_TP16WF\t230\t/* 16 bits LT-TP-rel. address.  */\n++#define R_PARISC_LTOFF_TP16DF\t231\t/* 16 bits LT-TP-rel. address.  */\n++#define R_PARISC_GNU_VTENTRY\t232\n++#define R_PARISC_GNU_VTINHERIT\t233\n++#define R_PARISC_TLS_GD21L\t234\t/* GD 21-bit left.  */\n++#define R_PARISC_TLS_GD14R\t235\t/* GD 14-bit right.  */\n++#define R_PARISC_TLS_GDCALL\t236\t/* GD call to __t_g_a.  */\n++#define R_PARISC_TLS_LDM21L\t237\t/* LD module 21-bit left.  */\n++#define R_PARISC_TLS_LDM14R\t238\t/* LD module 14-bit right.  */\n++#define R_PARISC_TLS_LDMCALL\t239\t/* LD module call to __t_g_a.  */\n++#define R_PARISC_TLS_LDO21L\t240\t/* LD offset 21-bit left.  */\n++#define R_PARISC_TLS_LDO14R\t241\t/* LD offset 14-bit right.  */\n++#define R_PARISC_TLS_DTPMOD32\t242\t/* DTP module 32-bit.  */\n++#define R_PARISC_TLS_DTPMOD64\t243\t/* DTP module 64-bit.  */\n++#define R_PARISC_TLS_DTPOFF32\t244\t/* DTP offset 32-bit.  */\n++#define R_PARISC_TLS_DTPOFF64\t245\t/* DTP offset 32-bit.  */\n++#define R_PARISC_TLS_LE21L\tR_PARISC_TPREL21L\n++#define R_PARISC_TLS_LE14R\tR_PARISC_TPREL14R\n++#define R_PARISC_TLS_IE21L\tR_PARISC_LTOFF_TP21L\n++#define R_PARISC_TLS_IE14R\tR_PARISC_LTOFF_TP14R\n++#define R_PARISC_TLS_TPREL32\tR_PARISC_TPREL32\n++#define R_PARISC_TLS_TPREL64\tR_PARISC_TPREL64\n++#define R_PARISC_HIRESERVE\t255\n++\n++/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */\n++\n++#define PT_HP_TLS\t\t(PT_LOOS + 0x0)\n++#define PT_HP_CORE_NONE\t\t(PT_LOOS + 0x1)\n++#define PT_HP_CORE_VERSION\t(PT_LOOS + 0x2)\n++#define PT_HP_CORE_KERNEL\t(PT_LOOS + 0x3)\n++#define PT_HP_CORE_COMM\t\t(PT_LOOS + 0x4)\n++#define PT_HP_CORE_PROC\t\t(PT_LOOS + 0x5)\n++#define PT_HP_CORE_LOADABLE\t(PT_LOOS + 0x6)\n++#define PT_HP_CORE_STACK\t(PT_LOOS + 0x7)\n++#define PT_HP_CORE_SHM\t\t(PT_LOOS + 0x8)\n++#define PT_HP_CORE_MMF\t\t(PT_LOOS + 0x9)\n++#define PT_HP_PARALLEL\t\t(PT_LOOS + 0x10)\n++#define PT_HP_FASTBIND\t\t(PT_LOOS + 0x11)\n++#define PT_HP_OPT_ANNOT\t\t(PT_LOOS + 0x12)\n++#define PT_HP_HSL_ANNOT\t\t(PT_LOOS + 0x13)\n++#define PT_HP_STACK\t\t(PT_LOOS + 0x14)\n++\n++#define PT_PARISC_ARCHEXT\t0x70000000\n++#define PT_PARISC_UNWIND\t0x70000001\n++\n++/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */\n++\n++#define PF_PARISC_SBP\t\t0x08000000\n++\n++#define PF_HP_PAGE_SIZE\t\t0x00100000\n++#define PF_HP_FAR_SHARED\t0x00200000\n++#define PF_HP_NEAR_SHARED\t0x00400000\n++#define PF_HP_CODE\t\t0x01000000\n++#define PF_HP_MODIFY\t\t0x02000000\n++#define PF_HP_LAZYSWAP\t\t0x04000000\n++#define PF_HP_SBP\t\t0x08000000\n++\n++\n++/* Alpha specific definitions.  */\n++\n++/* Legal values for e_flags field of Elf64_Ehdr.  */\n++\n++#define EF_ALPHA_32BIT\t\t1\t/* All addresses must be < 2GB.  */\n++#define EF_ALPHA_CANRELAX\t2\t/* Relocations for relaxing exist.  */\n++\n++/* Legal values for sh_type field of Elf64_Shdr.  */\n++\n++/* These two are primerily concerned with ECOFF debugging info.  */\n++#define SHT_ALPHA_DEBUG\t\t0x70000001\n++#define SHT_ALPHA_REGINFO\t0x70000002\n++\n++/* Legal values for sh_flags field of Elf64_Shdr.  */\n++\n++#define SHF_ALPHA_GPREL\t\t0x10000000\n++\n++/* Legal values for st_other field of Elf64_Sym.  */\n++#define STO_ALPHA_NOPV\t\t0x80\t/* No PV required.  */\n++#define STO_ALPHA_STD_GPLOAD\t0x88\t/* PV only used for initial ldgp.  */\n++\n++/* Alpha relocs.  */\n++\n++#define R_ALPHA_NONE\t\t0\t/* No reloc */\n++#define R_ALPHA_REFLONG\t\t1\t/* Direct 32 bit */\n++#define R_ALPHA_REFQUAD\t\t2\t/* Direct 64 bit */\n++#define R_ALPHA_GPREL32\t\t3\t/* GP relative 32 bit */\n++#define R_ALPHA_LITERAL\t\t4\t/* GP relative 16 bit w/optimization */\n++#define R_ALPHA_LITUSE\t\t5\t/* Optimization hint for LITERAL */\n++#define R_ALPHA_GPDISP\t\t6\t/* Add displacement to GP */\n++#define R_ALPHA_BRADDR\t\t7\t/* PC+4 relative 23 bit shifted */\n++#define R_ALPHA_HINT\t\t8\t/* PC+4 relative 16 bit shifted */\n++#define R_ALPHA_SREL16\t\t9\t/* PC relative 16 bit */\n++#define R_ALPHA_SREL32\t\t10\t/* PC relative 32 bit */\n++#define R_ALPHA_SREL64\t\t11\t/* PC relative 64 bit */\n++#define R_ALPHA_GPRELHIGH\t17\t/* GP relative 32 bit, high 16 bits */\n++#define R_ALPHA_GPRELLOW\t18\t/* GP relative 32 bit, low 16 bits */\n++#define R_ALPHA_GPREL16\t\t19\t/* GP relative 16 bit */\n++#define R_ALPHA_COPY\t\t24\t/* Copy symbol at runtime */\n++#define R_ALPHA_GLOB_DAT\t25\t/* Create GOT entry */\n++#define R_ALPHA_JMP_SLOT\t26\t/* Create PLT entry */\n++#define R_ALPHA_RELATIVE\t27\t/* Adjust by program base */\n++#define R_ALPHA_TLS_GD_HI\t28\n++#define R_ALPHA_TLSGD\t\t29\n++#define R_ALPHA_TLS_LDM\t\t30\n++#define R_ALPHA_DTPMOD64\t31\n++#define R_ALPHA_GOTDTPREL\t32\n++#define R_ALPHA_DTPREL64\t33\n++#define R_ALPHA_DTPRELHI\t34\n++#define R_ALPHA_DTPRELLO\t35\n++#define R_ALPHA_DTPREL16\t36\n++#define R_ALPHA_GOTTPREL\t37\n++#define R_ALPHA_TPREL64\t\t38\n++#define R_ALPHA_TPRELHI\t\t39\n++#define R_ALPHA_TPRELLO\t\t40\n++#define R_ALPHA_TPREL16\t\t41\n++/* Keep this the last entry.  */\n++#define R_ALPHA_NUM\t\t46\n++\n++/* Magic values of the LITUSE relocation addend.  */\n++#define LITUSE_ALPHA_ADDR\t0\n++#define LITUSE_ALPHA_BASE\t1\n++#define LITUSE_ALPHA_BYTOFF\t2\n++#define LITUSE_ALPHA_JSR\t3\n++#define LITUSE_ALPHA_TLS_GD\t4\n++#define LITUSE_ALPHA_TLS_LDM\t5\n++\n++/* Legal values for d_tag of Elf64_Dyn.  */\n++#define DT_ALPHA_PLTRO\t\t(DT_LOPROC + 0)\n++#define DT_ALPHA_NUM\t\t1\n++\n++/* PowerPC specific declarations */\n++\n++/* Values for Elf32/64_Ehdr.e_flags.  */\n++#define EF_PPC_EMB\t\t0x80000000\t/* PowerPC embedded flag */\n++\n++/* Cygnus local bits below */\n++#define EF_PPC_RELOCATABLE\t0x00010000\t/* PowerPC -mrelocatable flag*/\n++#define EF_PPC_RELOCATABLE_LIB\t0x00008000\t/* PowerPC -mrelocatable-lib\n++\t\t\t\t\t\t   flag */\n++\n++/* PowerPC relocations defined by the ABIs */\n++#define R_PPC_NONE\t\t0\n++#define R_PPC_ADDR32\t\t1\t/* 32bit absolute address */\n++#define R_PPC_ADDR24\t\t2\t/* 26bit address, 2 bits ignored.  */\n++#define R_PPC_ADDR16\t\t3\t/* 16bit absolute address */\n++#define R_PPC_ADDR16_LO\t\t4\t/* lower 16bit of absolute address */\n++#define R_PPC_ADDR16_HI\t\t5\t/* high 16bit of absolute address */\n++#define R_PPC_ADDR16_HA\t\t6\t/* adjusted high 16bit */\n++#define R_PPC_ADDR14\t\t7\t/* 16bit address, 2 bits ignored */\n++#define R_PPC_ADDR14_BRTAKEN\t8\n++#define R_PPC_ADDR14_BRNTAKEN\t9\n++#define R_PPC_REL24\t\t10\t/* PC relative 26 bit */\n++#define R_PPC_REL14\t\t11\t/* PC relative 16 bit */\n++#define R_PPC_REL14_BRTAKEN\t12\n++#define R_PPC_REL14_BRNTAKEN\t13\n++#define R_PPC_GOT16\t\t14\n++#define R_PPC_GOT16_LO\t\t15\n++#define R_PPC_GOT16_HI\t\t16\n++#define R_PPC_GOT16_HA\t\t17\n++#define R_PPC_PLTREL24\t\t18\n++#define R_PPC_COPY\t\t19\n++#define R_PPC_GLOB_DAT\t\t20\n++#define R_PPC_JMP_SLOT\t\t21\n++#define R_PPC_RELATIVE\t\t22\n++#define R_PPC_LOCAL24PC\t\t23\n++#define R_PPC_UADDR32\t\t24\n++#define R_PPC_UADDR16\t\t25\n++#define R_PPC_REL32\t\t26\n++#define R_PPC_PLT32\t\t27\n++#define R_PPC_PLTREL32\t\t28\n++#define R_PPC_PLT16_LO\t\t29\n++#define R_PPC_PLT16_HI\t\t30\n++#define R_PPC_PLT16_HA\t\t31\n++#define R_PPC_SDAREL16\t\t32\n++#define R_PPC_SECTOFF\t\t33\n++#define R_PPC_SECTOFF_LO\t34\n++#define R_PPC_SECTOFF_HI\t35\n++#define R_PPC_SECTOFF_HA\t36\n++\n++/* PowerPC relocations defined for the TLS access ABI.  */\n++#define R_PPC_TLS\t\t67 /* none\t(sym+add)@tls */\n++#define R_PPC_DTPMOD32\t\t68 /* word32\t(sym+add)@dtpmod */\n++#define R_PPC_TPREL16\t\t69 /* half16*\t(sym+add)@tprel */\n++#define R_PPC_TPREL16_LO\t70 /* half16\t(sym+add)@tprel@l */\n++#define R_PPC_TPREL16_HI\t71 /* half16\t(sym+add)@tprel@h */\n++#define R_PPC_TPREL16_HA\t72 /* half16\t(sym+add)@tprel@ha */\n++#define R_PPC_TPREL32\t\t73 /* word32\t(sym+add)@tprel */\n++#define R_PPC_DTPREL16\t\t74 /* half16*\t(sym+add)@dtprel */\n++#define R_PPC_DTPREL16_LO\t75 /* half16\t(sym+add)@dtprel@l */\n++#define R_PPC_DTPREL16_HI\t76 /* half16\t(sym+add)@dtprel@h */\n++#define R_PPC_DTPREL16_HA\t77 /* half16\t(sym+add)@dtprel@ha */\n++#define R_PPC_DTPREL32\t\t78 /* word32\t(sym+add)@dtprel */\n++#define R_PPC_GOT_TLSGD16\t79 /* half16*\t(sym+add)@got@tlsgd */\n++#define R_PPC_GOT_TLSGD16_LO\t80 /* half16\t(sym+add)@got@tlsgd@l */\n++#define R_PPC_GOT_TLSGD16_HI\t81 /* half16\t(sym+add)@got@tlsgd@h */\n++#define R_PPC_GOT_TLSGD16_HA\t82 /* half16\t(sym+add)@got@tlsgd@ha */\n++#define R_PPC_GOT_TLSLD16\t83 /* half16*\t(sym+add)@got@tlsld */\n++#define R_PPC_GOT_TLSLD16_LO\t84 /* half16\t(sym+add)@got@tlsld@l */\n++#define R_PPC_GOT_TLSLD16_HI\t85 /* half16\t(sym+add)@got@tlsld@h */\n++#define R_PPC_GOT_TLSLD16_HA\t86 /* half16\t(sym+add)@got@tlsld@ha */\n++#define R_PPC_GOT_TPREL16\t87 /* half16*\t(sym+add)@got@tprel */\n++#define R_PPC_GOT_TPREL16_LO\t88 /* half16\t(sym+add)@got@tprel@l */\n++#define R_PPC_GOT_TPREL16_HI\t89 /* half16\t(sym+add)@got@tprel@h */\n++#define R_PPC_GOT_TPREL16_HA\t90 /* half16\t(sym+add)@got@tprel@ha */\n++#define R_PPC_GOT_DTPREL16\t91 /* half16*\t(sym+add)@got@dtprel */\n++#define R_PPC_GOT_DTPREL16_LO\t92 /* half16*\t(sym+add)@got@dtprel@l */\n++#define R_PPC_GOT_DTPREL16_HI\t93 /* half16*\t(sym+add)@got@dtprel@h */\n++#define R_PPC_GOT_DTPREL16_HA\t94 /* half16*\t(sym+add)@got@dtprel@ha */\n++\n++/* The remaining relocs are from the Embedded ELF ABI, and are not\n++   in the SVR4 ELF ABI.  */\n++#define R_PPC_EMB_NADDR32\t101\n++#define R_PPC_EMB_NADDR16\t102\n++#define R_PPC_EMB_NADDR16_LO\t103\n++#define R_PPC_EMB_NADDR16_HI\t104\n++#define R_PPC_EMB_NADDR16_HA\t105\n++#define R_PPC_EMB_SDAI16\t106\n++#define R_PPC_EMB_SDA2I16\t107\n++#define R_PPC_EMB_SDA2REL\t108\n++#define R_PPC_EMB_SDA21\t\t109\t/* 16 bit offset in SDA */\n++#define R_PPC_EMB_MRKREF\t110\n++#define R_PPC_EMB_RELSEC16\t111\n++#define R_PPC_EMB_RELST_LO\t112\n++#define R_PPC_EMB_RELST_HI\t113\n++#define R_PPC_EMB_RELST_HA\t114\n++#define R_PPC_EMB_BIT_FLD\t115\n++#define R_PPC_EMB_RELSDA\t116\t/* 16 bit relative offset in SDA */\n++\n++/* Diab tool relocations.  */\n++#define R_PPC_DIAB_SDA21_LO\t180\t/* like EMB_SDA21, but lower 16 bit */\n++#define R_PPC_DIAB_SDA21_HI\t181\t/* like EMB_SDA21, but high 16 bit */\n++#define R_PPC_DIAB_SDA21_HA\t182\t/* like EMB_SDA21, adjusted high 16 */\n++#define R_PPC_DIAB_RELSDA_LO\t183\t/* like EMB_RELSDA, but lower 16 bit */\n++#define R_PPC_DIAB_RELSDA_HI\t184\t/* like EMB_RELSDA, but high 16 bit */\n++#define R_PPC_DIAB_RELSDA_HA\t185\t/* like EMB_RELSDA, adjusted high 16 */\n++\n++/* GNU extension to support local ifunc.  */\n++#define R_PPC_IRELATIVE\t\t248\n++\n++/* GNU relocs used in PIC code sequences.  */\n++#define R_PPC_REL16\t\t249\t/* half16   (sym+add-.) */\n++#define R_PPC_REL16_LO\t\t250\t/* half16   (sym+add-.)@l */\n++#define R_PPC_REL16_HI\t\t251\t/* half16   (sym+add-.)@h */\n++#define R_PPC_REL16_HA\t\t252\t/* half16   (sym+add-.)@ha */\n++\n++/* This is a phony reloc to handle any old fashioned TOC16 references\n++   that may still be in object files.  */\n++#define R_PPC_TOC16\t\t255\n++\n++/* PowerPC specific values for the Dyn d_tag field.  */\n++#define DT_PPC_GOT\t\t(DT_LOPROC + 0)\n++#define DT_PPC_NUM\t\t1\n++\n++/* PowerPC64 relocations defined by the ABIs */\n++#define R_PPC64_NONE\t\tR_PPC_NONE\n++#define R_PPC64_ADDR32\t\tR_PPC_ADDR32 /* 32bit absolute address */\n++#define R_PPC64_ADDR24\t\tR_PPC_ADDR24 /* 26bit address, word aligned */\n++#define R_PPC64_ADDR16\t\tR_PPC_ADDR16 /* 16bit absolute address */\n++#define R_PPC64_ADDR16_LO\tR_PPC_ADDR16_LO\t/* lower 16bits of address */\n++#define R_PPC64_ADDR16_HI\tR_PPC_ADDR16_HI\t/* high 16bits of address. */\n++#define R_PPC64_ADDR16_HA\tR_PPC_ADDR16_HA /* adjusted high 16bits.  */\n++#define R_PPC64_ADDR14\t\tR_PPC_ADDR14 /* 16bit address, word aligned */\n++#define R_PPC64_ADDR14_BRTAKEN\tR_PPC_ADDR14_BRTAKEN\n++#define R_PPC64_ADDR14_BRNTAKEN\tR_PPC_ADDR14_BRNTAKEN\n++#define R_PPC64_REL24\t\tR_PPC_REL24 /* PC-rel. 26 bit, word aligned */\n++#define R_PPC64_REL14\t\tR_PPC_REL14 /* PC relative 16 bit */\n++#define R_PPC64_REL14_BRTAKEN\tR_PPC_REL14_BRTAKEN\n++#define R_PPC64_REL14_BRNTAKEN\tR_PPC_REL14_BRNTAKEN\n++#define R_PPC64_GOT16\t\tR_PPC_GOT16\n++#define R_PPC64_GOT16_LO\tR_PPC_GOT16_LO\n++#define R_PPC64_GOT16_HI\tR_PPC_GOT16_HI\n++#define R_PPC64_GOT16_HA\tR_PPC_GOT16_HA\n++\n++#define R_PPC64_COPY\t\tR_PPC_COPY\n++#define R_PPC64_GLOB_DAT\tR_PPC_GLOB_DAT\n++#define R_PPC64_JMP_SLOT\tR_PPC_JMP_SLOT\n++#define R_PPC64_RELATIVE\tR_PPC_RELATIVE\n++\n++#define R_PPC64_UADDR32\t\tR_PPC_UADDR32\n++#define R_PPC64_UADDR16\t\tR_PPC_UADDR16\n++#define R_PPC64_REL32\t\tR_PPC_REL32\n++#define R_PPC64_PLT32\t\tR_PPC_PLT32\n++#define R_PPC64_PLTREL32\tR_PPC_PLTREL32\n++#define R_PPC64_PLT16_LO\tR_PPC_PLT16_LO\n++#define R_PPC64_PLT16_HI\tR_PPC_PLT16_HI\n++#define R_PPC64_PLT16_HA\tR_PPC_PLT16_HA\n++\n++#define R_PPC64_SECTOFF\t\tR_PPC_SECTOFF\n++#define R_PPC64_SECTOFF_LO\tR_PPC_SECTOFF_LO\n++#define R_PPC64_SECTOFF_HI\tR_PPC_SECTOFF_HI\n++#define R_PPC64_SECTOFF_HA\tR_PPC_SECTOFF_HA\n++#define R_PPC64_ADDR30\t\t37 /* word30 (S + A - P) >> 2 */\n++#define R_PPC64_ADDR64\t\t38 /* doubleword64 S + A */\n++#define R_PPC64_ADDR16_HIGHER\t39 /* half16 #higher(S + A) */\n++#define R_PPC64_ADDR16_HIGHERA\t40 /* half16 #highera(S + A) */\n++#define R_PPC64_ADDR16_HIGHEST\t41 /* half16 #highest(S + A) */\n++#define R_PPC64_ADDR16_HIGHESTA\t42 /* half16 #highesta(S + A) */\n++#define R_PPC64_UADDR64\t\t43 /* doubleword64 S + A */\n++#define R_PPC64_REL64\t\t44 /* doubleword64 S + A - P */\n++#define R_PPC64_PLT64\t\t45 /* doubleword64 L + A */\n++#define R_PPC64_PLTREL64\t46 /* doubleword64 L + A - P */\n++#define R_PPC64_TOC16\t\t47 /* half16* S + A - .TOC */\n++#define R_PPC64_TOC16_LO\t48 /* half16 #lo(S + A - .TOC.) */\n++#define R_PPC64_TOC16_HI\t49 /* half16 #hi(S + A - .TOC.) */\n++#define R_PPC64_TOC16_HA\t50 /* half16 #ha(S + A - .TOC.) */\n++#define R_PPC64_TOC\t\t51 /* doubleword64 .TOC */\n++#define R_PPC64_PLTGOT16\t52 /* half16* M + A */\n++#define R_PPC64_PLTGOT16_LO\t53 /* half16 #lo(M + A) */\n++#define R_PPC64_PLTGOT16_HI\t54 /* half16 #hi(M + A) */\n++#define R_PPC64_PLTGOT16_HA\t55 /* half16 #ha(M + A) */\n++\n++#define R_PPC64_ADDR16_DS\t56 /* half16ds* (S + A) >> 2 */\n++#define R_PPC64_ADDR16_LO_DS\t57 /* half16ds  #lo(S + A) >> 2 */\n++#define R_PPC64_GOT16_DS\t58 /* half16ds* (G + A) >> 2 */\n++#define R_PPC64_GOT16_LO_DS\t59 /* half16ds  #lo(G + A) >> 2 */\n++#define R_PPC64_PLT16_LO_DS\t60 /* half16ds  #lo(L + A) >> 2 */\n++#define R_PPC64_SECTOFF_DS\t61 /* half16ds* (R + A) >> 2 */\n++#define R_PPC64_SECTOFF_LO_DS\t62 /* half16ds  #lo(R + A) >> 2 */\n++#define R_PPC64_TOC16_DS\t63 /* half16ds* (S + A - .TOC.) >> 2 */\n++#define R_PPC64_TOC16_LO_DS\t64 /* half16ds  #lo(S + A - .TOC.) >> 2 */\n++#define R_PPC64_PLTGOT16_DS\t65 /* half16ds* (M + A) >> 2 */\n++#define R_PPC64_PLTGOT16_LO_DS\t66 /* half16ds  #lo(M + A) >> 2 */\n++\n++/* PowerPC64 relocations defined for the TLS access ABI.  */\n++#define R_PPC64_TLS\t\t67 /* none\t(sym+add)@tls */\n++#define R_PPC64_DTPMOD64\t68 /* doubleword64 (sym+add)@dtpmod */\n++#define R_PPC64_TPREL16\t\t69 /* half16*\t(sym+add)@tprel */\n++#define R_PPC64_TPREL16_LO\t70 /* half16\t(sym+add)@tprel@l */\n++#define R_PPC64_TPREL16_HI\t71 /* half16\t(sym+add)@tprel@h */\n++#define R_PPC64_TPREL16_HA\t72 /* half16\t(sym+add)@tprel@ha */\n++#define R_PPC64_TPREL64\t\t73 /* doubleword64 (sym+add)@tprel */\n++#define R_PPC64_DTPREL16\t74 /* half16*\t(sym+add)@dtprel */\n++#define R_PPC64_DTPREL16_LO\t75 /* half16\t(sym+add)@dtprel@l */\n++#define R_PPC64_DTPREL16_HI\t76 /* half16\t(sym+add)@dtprel@h */\n++#define R_PPC64_DTPREL16_HA\t77 /* half16\t(sym+add)@dtprel@ha */\n++#define R_PPC64_DTPREL64\t78 /* doubleword64 (sym+add)@dtprel */\n++#define R_PPC64_GOT_TLSGD16\t79 /* half16*\t(sym+add)@got@tlsgd */\n++#define R_PPC64_GOT_TLSGD16_LO\t80 /* half16\t(sym+add)@got@tlsgd@l */\n++#define R_PPC64_GOT_TLSGD16_HI\t81 /* half16\t(sym+add)@got@tlsgd@h */\n++#define R_PPC64_GOT_TLSGD16_HA\t82 /* half16\t(sym+add)@got@tlsgd@ha */\n++#define R_PPC64_GOT_TLSLD16\t83 /* half16*\t(sym+add)@got@tlsld */\n++#define R_PPC64_GOT_TLSLD16_LO\t84 /* half16\t(sym+add)@got@tlsld@l */\n++#define R_PPC64_GOT_TLSLD16_HI\t85 /* half16\t(sym+add)@got@tlsld@h */\n++#define R_PPC64_GOT_TLSLD16_HA\t86 /* half16\t(sym+add)@got@tlsld@ha */\n++#define R_PPC64_GOT_TPREL16_DS\t87 /* half16ds*\t(sym+add)@got@tprel */\n++#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */\n++#define R_PPC64_GOT_TPREL16_HI\t89 /* half16\t(sym+add)@got@tprel@h */\n++#define R_PPC64_GOT_TPREL16_HA\t90 /* half16\t(sym+add)@got@tprel@ha */\n++#define R_PPC64_GOT_DTPREL16_DS\t91 /* half16ds*\t(sym+add)@got@dtprel */\n++#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */\n++#define R_PPC64_GOT_DTPREL16_HI\t93 /* half16\t(sym+add)@got@dtprel@h */\n++#define R_PPC64_GOT_DTPREL16_HA\t94 /* half16\t(sym+add)@got@dtprel@ha */\n++#define R_PPC64_TPREL16_DS\t95 /* half16ds*\t(sym+add)@tprel */\n++#define R_PPC64_TPREL16_LO_DS\t96 /* half16ds\t(sym+add)@tprel@l */\n++#define R_PPC64_TPREL16_HIGHER\t97 /* half16\t(sym+add)@tprel@higher */\n++#define R_PPC64_TPREL16_HIGHERA\t98 /* half16\t(sym+add)@tprel@highera */\n++#define R_PPC64_TPREL16_HIGHEST\t99 /* half16\t(sym+add)@tprel@highest */\n++#define R_PPC64_TPREL16_HIGHESTA 100 /* half16\t(sym+add)@tprel@highesta */\n++#define R_PPC64_DTPREL16_DS\t101 /* half16ds* (sym+add)@dtprel */\n++#define R_PPC64_DTPREL16_LO_DS\t102 /* half16ds\t(sym+add)@dtprel@l */\n++#define R_PPC64_DTPREL16_HIGHER\t103 /* half16\t(sym+add)@dtprel@higher */\n++#define R_PPC64_DTPREL16_HIGHERA 104 /* half16\t(sym+add)@dtprel@highera */\n++#define R_PPC64_DTPREL16_HIGHEST 105 /* half16\t(sym+add)@dtprel@highest */\n++#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16\t(sym+add)@dtprel@highesta */\n++\n++/* GNU extension to support local ifunc.  */\n++#define R_PPC64_JMP_IREL\t247\n++#define R_PPC64_IRELATIVE\t248\n++#define R_PPC64_REL16\t\t249\t/* half16   (sym+add-.) */\n++#define R_PPC64_REL16_LO\t250\t/* half16   (sym+add-.)@l */\n++#define R_PPC64_REL16_HI\t251\t/* half16   (sym+add-.)@h */\n++#define R_PPC64_REL16_HA\t252\t/* half16   (sym+add-.)@ha */\n++\n++/* PowerPC64 specific values for the Dyn d_tag field.  */\n++#define DT_PPC64_GLINK  (DT_LOPROC + 0)\n++#define DT_PPC64_OPD\t(DT_LOPROC + 1)\n++#define DT_PPC64_OPDSZ\t(DT_LOPROC + 2)\n++#define DT_PPC64_NUM    3\n++\n++\n++/* ARM specific declarations */\n++\n++/* Processor specific flags for the ELF header e_flags field.  */\n++#define EF_ARM_RELEXEC\t\t0x01\n++#define EF_ARM_HASENTRY\t\t0x02\n++#define EF_ARM_INTERWORK\t0x04\n++#define EF_ARM_APCS_26\t\t0x08\n++#define EF_ARM_APCS_FLOAT\t0x10\n++#define EF_ARM_PIC\t\t0x20\n++#define EF_ARM_ALIGN8\t\t0x40 /* 8-bit structure alignment is in use */\n++#define EF_ARM_NEW_ABI\t\t0x80\n++#define EF_ARM_OLD_ABI\t\t0x100\n++#define EF_ARM_SOFT_FLOAT\t0x200\n++#define EF_ARM_VFP_FLOAT\t0x400\n++#define EF_ARM_MAVERICK_FLOAT\t0x800\n++\n++\n++/* Other constants defined in the ARM ELF spec. version B-01.  */\n++/* NB. These conflict with values defined above.  */\n++#define EF_ARM_SYMSARESORTED\t0x04\n++#define EF_ARM_DYNSYMSUSESEGIDX\t0x08\n++#define EF_ARM_MAPSYMSFIRST\t0x10\n++#define EF_ARM_EABIMASK\t\t0XFF000000\n++\n++/* Constants defined in AAELF.  */\n++#define EF_ARM_BE8\t    0x00800000\n++#define EF_ARM_LE8\t    0x00400000\n++\n++#define EF_ARM_EABI_VERSION(flags)\t((flags) & EF_ARM_EABIMASK)\n++#define EF_ARM_EABI_UNKNOWN\t0x00000000\n++#define EF_ARM_EABI_VER1\t0x01000000\n++#define EF_ARM_EABI_VER2\t0x02000000\n++#define EF_ARM_EABI_VER3\t0x03000000\n++#define EF_ARM_EABI_VER4\t0x04000000\n++#define EF_ARM_EABI_VER5\t0x05000000\n++\n++/* Additional symbol types for Thumb.  */\n++#define STT_ARM_TFUNC\t\tSTT_LOPROC /* A Thumb function.  */\n++#define STT_ARM_16BIT\t\tSTT_HIPROC /* A Thumb label.  */\n++\n++/* ARM-specific values for sh_flags */\n++#define SHF_ARM_ENTRYSECT\t0x10000000 /* Section contains an entry point */\n++#define SHF_ARM_COMDEF\t\t0x80000000 /* Section may be multiply defined\n++\t\t\t\t\t      in the input to a link step.  */\n++\n++/* ARM-specific program header flags */\n++#define PF_ARM_SB\t\t0x10000000 /* Segment contains the location\n++\t\t\t\t\t      addressed by the static base. */\n++#define PF_ARM_PI\t\t0x20000000 /* Position-independent segment.  */\n++#define PF_ARM_ABS\t\t0x40000000 /* Absolute segment.  */\n++\n++/* Processor specific values for the Phdr p_type field.  */\n++#define PT_ARM_EXIDX\t\t(PT_LOPROC + 1)\t/* ARM unwind segment.  */\n++\n++/* Processor specific values for the Shdr sh_type field.  */\n++#define SHT_ARM_EXIDX\t\t(SHT_LOPROC + 1) /* ARM unwind section.  */\n++#define SHT_ARM_PREEMPTMAP\t(SHT_LOPROC + 2) /* Preemption details.  */\n++#define SHT_ARM_ATTRIBUTES\t(SHT_LOPROC + 3) /* ARM attributes section.  */\n++\n++\n++/* ARM relocs.  */\n++\n++#define R_ARM_NONE\t\t0\t/* No reloc */\n++#define R_ARM_PC24\t\t1\t/* PC relative 26 bit branch */\n++#define R_ARM_ABS32\t\t2\t/* Direct 32 bit  */\n++#define R_ARM_REL32\t\t3\t/* PC relative 32 bit */\n++#define R_ARM_PC13\t\t4\n++#define R_ARM_ABS16\t\t5\t/* Direct 16 bit */\n++#define R_ARM_ABS12\t\t6\t/* Direct 12 bit */\n++#define R_ARM_THM_ABS5\t\t7\n++#define R_ARM_ABS8\t\t8\t/* Direct 8 bit */\n++#define R_ARM_SBREL32\t\t9\n++#define R_ARM_THM_PC22\t\t10\n++#define R_ARM_THM_PC8\t\t11\n++#define R_ARM_AMP_VCALL9\t12\n++#define R_ARM_SWI24\t\t13\t/* Obsolete static relocation.  */\n++#define R_ARM_TLS_DESC\t\t13      /* Dynamic relocation.  */\n++#define R_ARM_THM_SWI8\t\t14\n++#define R_ARM_XPC25\t\t15\n++#define R_ARM_THM_XPC22\t\t16\n++#define R_ARM_TLS_DTPMOD32\t17\t/* ID of module containing symbol */\n++#define R_ARM_TLS_DTPOFF32\t18\t/* Offset in TLS block */\n++#define R_ARM_TLS_TPOFF32\t19\t/* Offset in static TLS block */\n++#define R_ARM_COPY\t\t20\t/* Copy symbol at runtime */\n++#define R_ARM_GLOB_DAT\t\t21\t/* Create GOT entry */\n++#define R_ARM_JUMP_SLOT\t\t22\t/* Create PLT entry */\n++#define R_ARM_RELATIVE\t\t23\t/* Adjust by program base */\n++#define R_ARM_GOTOFF\t\t24\t/* 32 bit offset to GOT */\n++#define R_ARM_GOTPC\t\t25\t/* 32 bit PC relative offset to GOT */\n++#define R_ARM_GOT32\t\t26\t/* 32 bit GOT entry */\n++#define R_ARM_PLT32\t\t27\t/* 32 bit PLT address */\n++#define R_ARM_ALU_PCREL_7_0\t32\n++#define R_ARM_ALU_PCREL_15_8\t33\n++#define R_ARM_ALU_PCREL_23_15\t34\n++#define R_ARM_LDR_SBREL_11_0\t35\n++#define R_ARM_ALU_SBREL_19_12\t36\n++#define R_ARM_ALU_SBREL_27_20\t37\n++#define R_ARM_TLS_GOTDESC\t90\n++#define R_ARM_TLS_CALL\t\t91\n++#define R_ARM_TLS_DESCSEQ\t92\n++#define R_ARM_THM_TLS_CALL\t93\n++#define R_ARM_GNU_VTENTRY\t100\n++#define R_ARM_GNU_VTINHERIT\t101\n++#define R_ARM_THM_PC11\t\t102\t/* thumb unconditional branch */\n++#define R_ARM_THM_PC9\t\t103\t/* thumb conditional branch */\n++#define R_ARM_TLS_GD32\t\t104\t/* PC-rel 32 bit for global dynamic\n++\t\t\t\t\t   thread local data */\n++#define R_ARM_TLS_LDM32\t\t105\t/* PC-rel 32 bit for local dynamic\n++\t\t\t\t\t   thread local data */\n++#define R_ARM_TLS_LDO32\t\t106\t/* 32 bit offset relative to TLS\n++\t\t\t\t\t   block */\n++#define R_ARM_TLS_IE32\t\t107\t/* PC-rel 32 bit for GOT entry of\n++\t\t\t\t\t   static TLS block offset */\n++#define R_ARM_TLS_LE32\t\t108\t/* 32 bit offset relative to static\n++\t\t\t\t\t   TLS block */\n++#define\tR_ARM_THM_TLS_DESCSEQ\t129\n++#define R_ARM_IRELATIVE\t\t160\n++#define R_ARM_RXPC25\t\t249\n++#define R_ARM_RSBREL32\t\t250\n++#define R_ARM_THM_RPC22\t\t251\n++#define R_ARM_RREL32\t\t252\n++#define R_ARM_RABS22\t\t253\n++#define R_ARM_RPC24\t\t254\n++#define R_ARM_RBASE\t\t255\n++/* Keep this the last entry.  */\n++#define R_ARM_NUM\t\t256\n++\n++/* IA-64 specific declarations.  */\n++\n++/* Processor specific flags for the Ehdr e_flags field.  */\n++#define EF_IA_64_MASKOS\t\t0x0000000f\t/* os-specific flags */\n++#define EF_IA_64_ABI64\t\t0x00000010\t/* 64-bit ABI */\n++#define EF_IA_64_ARCH\t\t0xff000000\t/* arch. version mask */\n++\n++/* Processor specific values for the Phdr p_type field.  */\n++#define PT_IA_64_ARCHEXT\t(PT_LOPROC + 0)\t/* arch extension bits */\n++#define PT_IA_64_UNWIND\t\t(PT_LOPROC + 1)\t/* ia64 unwind bits */\n++#define PT_IA_64_HP_OPT_ANOT\t(PT_LOOS + 0x12)\n++#define PT_IA_64_HP_HSL_ANOT\t(PT_LOOS + 0x13)\n++#define PT_IA_64_HP_STACK\t(PT_LOOS + 0x14)\n++\n++/* Processor specific flags for the Phdr p_flags field.  */\n++#define PF_IA_64_NORECOV\t0x80000000\t/* spec insns w/o recovery */\n++\n++/* Processor specific values for the Shdr sh_type field.  */\n++#define SHT_IA_64_EXT\t\t(SHT_LOPROC + 0) /* extension bits */\n++#define SHT_IA_64_UNWIND\t(SHT_LOPROC + 1) /* unwind bits */\n++\n++/* Processor specific flags for the Shdr sh_flags field.  */\n++#define SHF_IA_64_SHORT\t\t0x10000000\t/* section near gp */\n++#define SHF_IA_64_NORECOV\t0x20000000\t/* spec insns w/o recovery */\n++\n++/* Processor specific values for the Dyn d_tag field.  */\n++#define DT_IA_64_PLT_RESERVE\t(DT_LOPROC + 0)\n++#define DT_IA_64_NUM\t\t1\n++\n++/* IA-64 relocations.  */\n++#define R_IA64_NONE\t\t0x00\t/* none */\n++#define R_IA64_IMM14\t\t0x21\t/* symbol + addend, add imm14 */\n++#define R_IA64_IMM22\t\t0x22\t/* symbol + addend, add imm22 */\n++#define R_IA64_IMM64\t\t0x23\t/* symbol + addend, mov imm64 */\n++#define R_IA64_DIR32MSB\t\t0x24\t/* symbol + addend, data4 MSB */\n++#define R_IA64_DIR32LSB\t\t0x25\t/* symbol + addend, data4 LSB */\n++#define R_IA64_DIR64MSB\t\t0x26\t/* symbol + addend, data8 MSB */\n++#define R_IA64_DIR64LSB\t\t0x27\t/* symbol + addend, data8 LSB */\n++#define R_IA64_GPREL22\t\t0x2a\t/* @gprel(sym + add), add imm22 */\n++#define R_IA64_GPREL64I\t\t0x2b\t/* @gprel(sym + add), mov imm64 */\n++#define R_IA64_GPREL32MSB\t0x2c\t/* @gprel(sym + add), data4 MSB */\n++#define R_IA64_GPREL32LSB\t0x2d\t/* @gprel(sym + add), data4 LSB */\n++#define R_IA64_GPREL64MSB\t0x2e\t/* @gprel(sym + add), data8 MSB */\n++#define R_IA64_GPREL64LSB\t0x2f\t/* @gprel(sym + add), data8 LSB */\n++#define R_IA64_LTOFF22\t\t0x32\t/* @ltoff(sym + add), add imm22 */\n++#define R_IA64_LTOFF64I\t\t0x33\t/* @ltoff(sym + add), mov imm64 */\n++#define R_IA64_PLTOFF22\t\t0x3a\t/* @pltoff(sym + add), add imm22 */\n++#define R_IA64_PLTOFF64I\t0x3b\t/* @pltoff(sym + add), mov imm64 */\n++#define R_IA64_PLTOFF64MSB\t0x3e\t/* @pltoff(sym + add), data8 MSB */\n++#define R_IA64_PLTOFF64LSB\t0x3f\t/* @pltoff(sym + add), data8 LSB */\n++#define R_IA64_FPTR64I\t\t0x43\t/* @fptr(sym + add), mov imm64 */\n++#define R_IA64_FPTR32MSB\t0x44\t/* @fptr(sym + add), data4 MSB */\n++#define R_IA64_FPTR32LSB\t0x45\t/* @fptr(sym + add), data4 LSB */\n++#define R_IA64_FPTR64MSB\t0x46\t/* @fptr(sym + add), data8 MSB */\n++#define R_IA64_FPTR64LSB\t0x47\t/* @fptr(sym + add), data8 LSB */\n++#define R_IA64_PCREL60B\t\t0x48\t/* @pcrel(sym + add), brl */\n++#define R_IA64_PCREL21B\t\t0x49\t/* @pcrel(sym + add), ptb, call */\n++#define R_IA64_PCREL21M\t\t0x4a\t/* @pcrel(sym + add), chk.s */\n++#define R_IA64_PCREL21F\t\t0x4b\t/* @pcrel(sym + add), fchkf */\n++#define R_IA64_PCREL32MSB\t0x4c\t/* @pcrel(sym + add), data4 MSB */\n++#define R_IA64_PCREL32LSB\t0x4d\t/* @pcrel(sym + add), data4 LSB */\n++#define R_IA64_PCREL64MSB\t0x4e\t/* @pcrel(sym + add), data8 MSB */\n++#define R_IA64_PCREL64LSB\t0x4f\t/* @pcrel(sym + add), data8 LSB */\n++#define R_IA64_LTOFF_FPTR22\t0x52\t/* @ltoff(@fptr(s+a)), imm22 */\n++#define R_IA64_LTOFF_FPTR64I\t0x53\t/* @ltoff(@fptr(s+a)), imm64 */\n++#define R_IA64_LTOFF_FPTR32MSB\t0x54\t/* @ltoff(@fptr(s+a)), data4 MSB */\n++#define R_IA64_LTOFF_FPTR32LSB\t0x55\t/* @ltoff(@fptr(s+a)), data4 LSB */\n++#define R_IA64_LTOFF_FPTR64MSB\t0x56\t/* @ltoff(@fptr(s+a)), data8 MSB */\n++#define R_IA64_LTOFF_FPTR64LSB\t0x57\t/* @ltoff(@fptr(s+a)), data8 LSB */\n++#define R_IA64_SEGREL32MSB\t0x5c\t/* @segrel(sym + add), data4 MSB */\n++#define R_IA64_SEGREL32LSB\t0x5d\t/* @segrel(sym + add), data4 LSB */\n++#define R_IA64_SEGREL64MSB\t0x5e\t/* @segrel(sym + add), data8 MSB */\n++#define R_IA64_SEGREL64LSB\t0x5f\t/* @segrel(sym + add), data8 LSB */\n++#define R_IA64_SECREL32MSB\t0x64\t/* @secrel(sym + add), data4 MSB */\n++#define R_IA64_SECREL32LSB\t0x65\t/* @secrel(sym + add), data4 LSB */\n++#define R_IA64_SECREL64MSB\t0x66\t/* @secrel(sym + add), data8 MSB */\n++#define R_IA64_SECREL64LSB\t0x67\t/* @secrel(sym + add), data8 LSB */\n++#define R_IA64_REL32MSB\t\t0x6c\t/* data 4 + REL */\n++#define R_IA64_REL32LSB\t\t0x6d\t/* data 4 + REL */\n++#define R_IA64_REL64MSB\t\t0x6e\t/* data 8 + REL */\n++#define R_IA64_REL64LSB\t\t0x6f\t/* data 8 + REL */\n++#define R_IA64_LTV32MSB\t\t0x74\t/* symbol + addend, data4 MSB */\n++#define R_IA64_LTV32LSB\t\t0x75\t/* symbol + addend, data4 LSB */\n++#define R_IA64_LTV64MSB\t\t0x76\t/* symbol + addend, data8 MSB */\n++#define R_IA64_LTV64LSB\t\t0x77\t/* symbol + addend, data8 LSB */\n++#define R_IA64_PCREL21BI\t0x79\t/* @pcrel(sym + add), 21bit inst */\n++#define R_IA64_PCREL22\t\t0x7a\t/* @pcrel(sym + add), 22bit inst */\n++#define R_IA64_PCREL64I\t\t0x7b\t/* @pcrel(sym + add), 64bit inst */\n++#define R_IA64_IPLTMSB\t\t0x80\t/* dynamic reloc, imported PLT, MSB */\n++#define R_IA64_IPLTLSB\t\t0x81\t/* dynamic reloc, imported PLT, LSB */\n++#define R_IA64_COPY\t\t0x84\t/* copy relocation */\n++#define R_IA64_SUB\t\t0x85\t/* Addend and symbol difference */\n++#define R_IA64_LTOFF22X\t\t0x86\t/* LTOFF22, relaxable.  */\n++#define R_IA64_LDXMOV\t\t0x87\t/* Use of LTOFF22X.  */\n++#define R_IA64_TPREL14\t\t0x91\t/* @tprel(sym + add), imm14 */\n++#define R_IA64_TPREL22\t\t0x92\t/* @tprel(sym + add), imm22 */\n++#define R_IA64_TPREL64I\t\t0x93\t/* @tprel(sym + add), imm64 */\n++#define R_IA64_TPREL64MSB\t0x96\t/* @tprel(sym + add), data8 MSB */\n++#define R_IA64_TPREL64LSB\t0x97\t/* @tprel(sym + add), data8 LSB */\n++#define R_IA64_LTOFF_TPREL22\t0x9a\t/* @ltoff(@tprel(s+a)), imm2 */\n++#define R_IA64_DTPMOD64MSB\t0xa6\t/* @dtpmod(sym + add), data8 MSB */\n++#define R_IA64_DTPMOD64LSB\t0xa7\t/* @dtpmod(sym + add), data8 LSB */\n++#define R_IA64_LTOFF_DTPMOD22\t0xaa\t/* @ltoff(@dtpmod(sym + add)), imm22 */\n++#define R_IA64_DTPREL14\t\t0xb1\t/* @dtprel(sym + add), imm14 */\n++#define R_IA64_DTPREL22\t\t0xb2\t/* @dtprel(sym + add), imm22 */\n++#define R_IA64_DTPREL64I\t0xb3\t/* @dtprel(sym + add), imm64 */\n++#define R_IA64_DTPREL32MSB\t0xb4\t/* @dtprel(sym + add), data4 MSB */\n++#define R_IA64_DTPREL32LSB\t0xb5\t/* @dtprel(sym + add), data4 LSB */\n++#define R_IA64_DTPREL64MSB\t0xb6\t/* @dtprel(sym + add), data8 MSB */\n++#define R_IA64_DTPREL64LSB\t0xb7\t/* @dtprel(sym + add), data8 LSB */\n++#define R_IA64_LTOFF_DTPREL22\t0xba\t/* @ltoff(@dtprel(s+a)), imm22 */\n++\n++/* SH specific declarations */\n++\n++/* Processor specific flags for the ELF header e_flags field.  */\n++#define EF_SH_MACH_MASK\t\t0x1f\n++#define EF_SH_UNKNOWN\t\t0x0\n++#define EF_SH1\t\t\t0x1\n++#define EF_SH2\t\t\t0x2\n++#define EF_SH3\t\t\t0x3\n++#define EF_SH_DSP\t\t0x4\n++#define EF_SH3_DSP\t\t0x5\n++#define EF_SH4AL_DSP\t\t0x6\n++#define EF_SH3E\t\t\t0x8\n++#define EF_SH4\t\t\t0x9\n++#define EF_SH2E\t\t\t0xb\n++#define EF_SH4A\t\t\t0xc\n++#define EF_SH2A\t\t\t0xd\n++#define EF_SH4_NOFPU\t\t0x10\n++#define EF_SH4A_NOFPU\t\t0x11\n++#define EF_SH4_NOMMU_NOFPU\t0x12\n++#define EF_SH2A_NOFPU\t\t0x13\n++#define EF_SH3_NOMMU\t\t0x14\n++#define EF_SH2A_SH4_NOFPU\t0x15\n++#define EF_SH2A_SH3_NOFPU\t0x16\n++#define EF_SH2A_SH4\t\t0x17\n++#define EF_SH2A_SH3E\t\t0x18\n++\n++/* SH relocs.  */\n++#define\tR_SH_NONE\t\t0\n++#define\tR_SH_DIR32\t\t1\n++#define\tR_SH_REL32\t\t2\n++#define\tR_SH_DIR8WPN\t\t3\n++#define\tR_SH_IND12W\t\t4\n++#define\tR_SH_DIR8WPL\t\t5\n++#define\tR_SH_DIR8WPZ\t\t6\n++#define\tR_SH_DIR8BP\t\t7\n++#define\tR_SH_DIR8W\t\t8\n++#define\tR_SH_DIR8L\t\t9\n++#define\tR_SH_SWITCH16\t\t25\n++#define\tR_SH_SWITCH32\t\t26\n++#define\tR_SH_USES\t\t27\n++#define\tR_SH_COUNT\t\t28\n++#define\tR_SH_ALIGN\t\t29\n++#define\tR_SH_CODE\t\t30\n++#define\tR_SH_DATA\t\t31\n++#define\tR_SH_LABEL\t\t32\n++#define\tR_SH_SWITCH8\t\t33\n++#define\tR_SH_GNU_VTINHERIT\t34\n++#define\tR_SH_GNU_VTENTRY\t35\n++#define\tR_SH_TLS_GD_32\t\t144\n++#define\tR_SH_TLS_LD_32\t\t145\n++#define\tR_SH_TLS_LDO_32\t\t146\n++#define\tR_SH_TLS_IE_32\t\t147\n++#define\tR_SH_TLS_LE_32\t\t148\n++#define\tR_SH_TLS_DTPMOD32\t149\n++#define\tR_SH_TLS_DTPOFF32\t150\n++#define\tR_SH_TLS_TPOFF32\t151\n++#define\tR_SH_GOT32\t\t160\n++#define\tR_SH_PLT32\t\t161\n++#define\tR_SH_COPY\t\t162\n++#define\tR_SH_GLOB_DAT\t\t163\n++#define\tR_SH_JMP_SLOT\t\t164\n++#define\tR_SH_RELATIVE\t\t165\n++#define\tR_SH_GOTOFF\t\t166\n++#define\tR_SH_GOTPC\t\t167\n++/* Keep this the last entry.  */\n++#define\tR_SH_NUM\t\t256\n++\n++/* S/390 specific definitions.  */\n++\n++/* Valid values for the e_flags field.  */\n++\n++#define EF_S390_HIGH_GPRS    0x00000001  /* High GPRs kernel facility needed.  */\n++\n++/* Additional s390 relocs */\n++\n++#define R_390_NONE\t\t0\t/* No reloc.  */\n++#define R_390_8\t\t\t1\t/* Direct 8 bit.  */\n++#define R_390_12\t\t2\t/* Direct 12 bit.  */\n++#define R_390_16\t\t3\t/* Direct 16 bit.  */\n++#define R_390_32\t\t4\t/* Direct 32 bit.  */\n++#define R_390_PC32\t\t5\t/* PC relative 32 bit.\t*/\n++#define R_390_GOT12\t\t6\t/* 12 bit GOT offset.  */\n++#define R_390_GOT32\t\t7\t/* 32 bit GOT offset.  */\n++#define R_390_PLT32\t\t8\t/* 32 bit PC relative PLT address.  */\n++#define R_390_COPY\t\t9\t/* Copy symbol at runtime.  */\n++#define R_390_GLOB_DAT\t\t10\t/* Create GOT entry.  */\n++#define R_390_JMP_SLOT\t\t11\t/* Create PLT entry.  */\n++#define R_390_RELATIVE\t\t12\t/* Adjust by program base.  */\n++#define R_390_GOTOFF32\t\t13\t/* 32 bit offset to GOT.\t */\n++#define R_390_GOTPC\t\t14\t/* 32 bit PC relative offset to GOT.  */\n++#define R_390_GOT16\t\t15\t/* 16 bit GOT offset.  */\n++#define R_390_PC16\t\t16\t/* PC relative 16 bit.\t*/\n++#define R_390_PC16DBL\t\t17\t/* PC relative 16 bit shifted by 1.  */\n++#define R_390_PLT16DBL\t\t18\t/* 16 bit PC rel. PLT shifted by 1.  */\n++#define R_390_PC32DBL\t\t19\t/* PC relative 32 bit shifted by 1.  */\n++#define R_390_PLT32DBL\t\t20\t/* 32 bit PC rel. PLT shifted by 1.  */\n++#define R_390_GOTPCDBL\t\t21\t/* 32 bit PC rel. GOT shifted by 1.  */\n++#define R_390_64\t\t22\t/* Direct 64 bit.  */\n++#define R_390_PC64\t\t23\t/* PC relative 64 bit.\t*/\n++#define R_390_GOT64\t\t24\t/* 64 bit GOT offset.  */\n++#define R_390_PLT64\t\t25\t/* 64 bit PC relative PLT address.  */\n++#define R_390_GOTENT\t\t26\t/* 32 bit PC rel. to GOT entry >> 1. */\n++#define R_390_GOTOFF16\t\t27\t/* 16 bit offset to GOT. */\n++#define R_390_GOTOFF64\t\t28\t/* 64 bit offset to GOT. */\n++#define R_390_GOTPLT12\t\t29\t/* 12 bit offset to jump slot.\t*/\n++#define R_390_GOTPLT16\t\t30\t/* 16 bit offset to jump slot.\t*/\n++#define R_390_GOTPLT32\t\t31\t/* 32 bit offset to jump slot.\t*/\n++#define R_390_GOTPLT64\t\t32\t/* 64 bit offset to jump slot.\t*/\n++#define R_390_GOTPLTENT\t\t33\t/* 32 bit rel. offset to jump slot.  */\n++#define R_390_PLTOFF16\t\t34\t/* 16 bit offset from GOT to PLT. */\n++#define R_390_PLTOFF32\t\t35\t/* 32 bit offset from GOT to PLT. */\n++#define R_390_PLTOFF64\t\t36\t/* 16 bit offset from GOT to PLT. */\n++#define R_390_TLS_LOAD\t\t37\t/* Tag for load insn in TLS code.  */\n++#define R_390_TLS_GDCALL\t38\t/* Tag for function call in general\n++\t\t\t\t\t   dynamic TLS code. */\n++#define R_390_TLS_LDCALL\t39\t/* Tag for function call in local\n++\t\t\t\t\t   dynamic TLS code. */\n++#define R_390_TLS_GD32\t\t40\t/* Direct 32 bit for general dynamic\n++\t\t\t\t\t   thread local data.  */\n++#define R_390_TLS_GD64\t\t41\t/* Direct 64 bit for general dynamic\n++\t\t\t\t\t  thread local data.  */\n++#define R_390_TLS_GOTIE12\t42\t/* 12 bit GOT offset for static TLS\n++\t\t\t\t\t   block offset.  */\n++#define R_390_TLS_GOTIE32\t43\t/* 32 bit GOT offset for static TLS\n++\t\t\t\t\t   block offset.  */\n++#define R_390_TLS_GOTIE64\t44\t/* 64 bit GOT offset for static TLS\n++\t\t\t\t\t   block offset. */\n++#define R_390_TLS_LDM32\t\t45\t/* Direct 32 bit for local dynamic\n++\t\t\t\t\t   thread local data in LE code.  */\n++#define R_390_TLS_LDM64\t\t46\t/* Direct 64 bit for local dynamic\n++\t\t\t\t\t   thread local data in LE code.  */\n++#define R_390_TLS_IE32\t\t47\t/* 32 bit address of GOT entry for\n++\t\t\t\t\t   negated static TLS block offset.  */\n++#define R_390_TLS_IE64\t\t48\t/* 64 bit address of GOT entry for\n++\t\t\t\t\t   negated static TLS block offset.  */\n++#define R_390_TLS_IEENT\t\t49\t/* 32 bit rel. offset to GOT entry for\n++\t\t\t\t\t   negated static TLS block offset.  */\n++#define R_390_TLS_LE32\t\t50\t/* 32 bit negated offset relative to\n++\t\t\t\t\t   static TLS block.  */\n++#define R_390_TLS_LE64\t\t51\t/* 64 bit negated offset relative to\n++\t\t\t\t\t   static TLS block.  */\n++#define R_390_TLS_LDO32\t\t52\t/* 32 bit offset relative to TLS\n++\t\t\t\t\t   block.  */\n++#define R_390_TLS_LDO64\t\t53\t/* 64 bit offset relative to TLS\n++\t\t\t\t\t   block.  */\n++#define R_390_TLS_DTPMOD\t54\t/* ID of module containing symbol.  */\n++#define R_390_TLS_DTPOFF\t55\t/* Offset in TLS block.\t */\n++#define R_390_TLS_TPOFF\t\t56\t/* Negated offset in static TLS\n++\t\t\t\t\t   block.  */\n++#define R_390_20\t\t57\t/* Direct 20 bit.  */\n++#define R_390_GOT20\t\t58\t/* 20 bit GOT offset.  */\n++#define R_390_GOTPLT20\t\t59\t/* 20 bit offset to jump slot.  */\n++#define R_390_TLS_GOTIE20\t60\t/* 20 bit GOT offset for static TLS\n++\t\t\t\t\t   block offset.  */\n++#define R_390_IRELATIVE         61      /* STT_GNU_IFUNC relocation.  */\n++/* Keep this the last entry.  */\n++#define R_390_NUM\t\t62\n++\n++\n++/* CRIS relocations.  */\n++#define R_CRIS_NONE\t\t0\n++#define R_CRIS_8\t\t1\n++#define R_CRIS_16\t\t2\n++#define R_CRIS_32\t\t3\n++#define R_CRIS_8_PCREL\t\t4\n++#define R_CRIS_16_PCREL\t\t5\n++#define R_CRIS_32_PCREL\t\t6\n++#define R_CRIS_GNU_VTINHERIT\t7\n++#define R_CRIS_GNU_VTENTRY\t8\n++#define R_CRIS_COPY\t\t9\n++#define R_CRIS_GLOB_DAT\t\t10\n++#define R_CRIS_JUMP_SLOT\t11\n++#define R_CRIS_RELATIVE\t\t12\n++#define R_CRIS_16_GOT\t\t13\n++#define R_CRIS_32_GOT\t\t14\n++#define R_CRIS_16_GOTPLT\t15\n++#define R_CRIS_32_GOTPLT\t16\n++#define R_CRIS_32_GOTREL\t17\n++#define R_CRIS_32_PLT_GOTREL\t18\n++#define R_CRIS_32_PLT_PCREL\t19\n++\n++#define R_CRIS_NUM\t\t20\n++\n++\n++/* AMD x86-64 relocations.  */\n++#define R_X86_64_NONE\t\t0\t/* No reloc */\n++#define R_X86_64_64\t\t1\t/* Direct 64 bit  */\n++#define R_X86_64_PC32\t\t2\t/* PC relative 32 bit signed */\n++#define R_X86_64_GOT32\t\t3\t/* 32 bit GOT entry */\n++#define R_X86_64_PLT32\t\t4\t/* 32 bit PLT address */\n++#define R_X86_64_COPY\t\t5\t/* Copy symbol at runtime */\n++#define R_X86_64_GLOB_DAT\t6\t/* Create GOT entry */\n++#define R_X86_64_JUMP_SLOT\t7\t/* Create PLT entry */\n++#define R_X86_64_RELATIVE\t8\t/* Adjust by program base */\n++#define R_X86_64_GOTPCREL\t9\t/* 32 bit signed PC relative\n++\t\t\t\t\t   offset to GOT */\n++#define R_X86_64_32\t\t10\t/* Direct 32 bit zero extended */\n++#define R_X86_64_32S\t\t11\t/* Direct 32 bit sign extended */\n++#define R_X86_64_16\t\t12\t/* Direct 16 bit zero extended */\n++#define R_X86_64_PC16\t\t13\t/* 16 bit sign extended pc relative */\n++#define R_X86_64_8\t\t14\t/* Direct 8 bit sign extended  */\n++#define R_X86_64_PC8\t\t15\t/* 8 bit sign extended pc relative */\n++#define R_X86_64_DTPMOD64\t16\t/* ID of module containing symbol */\n++#define R_X86_64_DTPOFF64\t17\t/* Offset in module's TLS block */\n++#define R_X86_64_TPOFF64\t18\t/* Offset in initial TLS block */\n++#define R_X86_64_TLSGD\t\t19\t/* 32 bit signed PC relative offset\n++\t\t\t\t\t   to two GOT entries for GD symbol */\n++#define R_X86_64_TLSLD\t\t20\t/* 32 bit signed PC relative offset\n++\t\t\t\t\t   to two GOT entries for LD symbol */\n++#define R_X86_64_DTPOFF32\t21\t/* Offset in TLS block */\n++#define R_X86_64_GOTTPOFF\t22\t/* 32 bit signed PC relative offset\n++\t\t\t\t\t   to GOT entry for IE symbol */\n++#define R_X86_64_TPOFF32\t23\t/* Offset in initial TLS block */\n++#define R_X86_64_PC64\t\t24\t/* PC relative 64 bit */\n++#define R_X86_64_GOTOFF64\t25\t/* 64 bit offset to GOT */\n++#define R_X86_64_GOTPC32\t26\t/* 32 bit signed pc relative\n++\t\t\t\t\t   offset to GOT */\n++#define R_X86_64_GOT64\t\t27\t/* 64-bit GOT entry offset */\n++#define R_X86_64_GOTPCREL64\t28\t/* 64-bit PC relative offset\n++\t\t\t\t\t   to GOT entry */\n++#define R_X86_64_GOTPC64\t29\t/* 64-bit PC relative offset to GOT */\n++#define R_X86_64_GOTPLT64\t30 \t/* like GOT64, says PLT entry needed */\n++#define R_X86_64_PLTOFF64\t31\t/* 64-bit GOT relative offset\n++\t\t\t\t\t   to PLT entry */\n++#define R_X86_64_SIZE32\t\t32\t/* Size of symbol plus 32-bit addend */\n++#define R_X86_64_SIZE64\t\t33\t/* Size of symbol plus 64-bit addend */\n++#define R_X86_64_GOTPC32_TLSDESC 34\t/* GOT offset for TLS descriptor.  */\n++#define R_X86_64_TLSDESC_CALL   35\t/* Marker for call through TLS\n++\t\t\t\t\t   descriptor.  */\n++#define R_X86_64_TLSDESC        36\t/* TLS descriptor.  */\n++#define R_X86_64_IRELATIVE\t37\t/* Adjust indirectly by program base */\n++#define R_X86_64_RELATIVE64\t38\t/* 64-bit adjust by program base */\n++\n++#define R_X86_64_NUM\t\t39\n++\n++\n++/* AM33 relocations.  */\n++#define R_MN10300_NONE\t\t0\t/* No reloc.  */\n++#define R_MN10300_32\t\t1\t/* Direct 32 bit.  */\n++#define R_MN10300_16\t\t2\t/* Direct 16 bit.  */\n++#define R_MN10300_8\t\t3\t/* Direct 8 bit.  */\n++#define R_MN10300_PCREL32\t4\t/* PC-relative 32-bit.  */\n++#define R_MN10300_PCREL16\t5\t/* PC-relative 16-bit signed.  */\n++#define R_MN10300_PCREL8\t6\t/* PC-relative 8-bit signed.  */\n++#define R_MN10300_GNU_VTINHERIT\t7\t/* Ancient C++ vtable garbage... */\n++#define R_MN10300_GNU_VTENTRY\t8\t/* ... collection annotation.  */\n++#define R_MN10300_24\t\t9\t/* Direct 24 bit.  */\n++#define R_MN10300_GOTPC32\t10\t/* 32-bit PCrel offset to GOT.  */\n++#define R_MN10300_GOTPC16\t11\t/* 16-bit PCrel offset to GOT.  */\n++#define R_MN10300_GOTOFF32\t12\t/* 32-bit offset from GOT.  */\n++#define R_MN10300_GOTOFF24\t13\t/* 24-bit offset from GOT.  */\n++#define R_MN10300_GOTOFF16\t14\t/* 16-bit offset from GOT.  */\n++#define R_MN10300_PLT32\t\t15\t/* 32-bit PCrel to PLT entry.  */\n++#define R_MN10300_PLT16\t\t16\t/* 16-bit PCrel to PLT entry.  */\n++#define R_MN10300_GOT32\t\t17\t/* 32-bit offset to GOT entry.  */\n++#define R_MN10300_GOT24\t\t18\t/* 24-bit offset to GOT entry.  */\n++#define R_MN10300_GOT16\t\t19\t/* 16-bit offset to GOT entry.  */\n++#define R_MN10300_COPY\t\t20\t/* Copy symbol at runtime.  */\n++#define R_MN10300_GLOB_DAT\t21\t/* Create GOT entry.  */\n++#define R_MN10300_JMP_SLOT\t22\t/* Create PLT entry.  */\n++#define R_MN10300_RELATIVE\t23\t/* Adjust by program base.  */\n++\n++#define R_MN10300_NUM\t\t24\n++\n++\n++/* M32R relocs.  */\n++#define R_M32R_NONE\t\t0\t/* No reloc. */\n++#define R_M32R_16\t\t1\t/* Direct 16 bit. */\n++#define R_M32R_32\t\t2\t/* Direct 32 bit. */\n++#define R_M32R_24\t\t3\t/* Direct 24 bit. */\n++#define R_M32R_10_PCREL\t\t4\t/* PC relative 10 bit shifted. */\n++#define R_M32R_18_PCREL\t\t5\t/* PC relative 18 bit shifted. */\n++#define R_M32R_26_PCREL\t\t6\t/* PC relative 26 bit shifted. */\n++#define R_M32R_HI16_ULO\t\t7\t/* High 16 bit with unsigned low. */\n++#define R_M32R_HI16_SLO\t\t8\t/* High 16 bit with signed low. */\n++#define R_M32R_LO16\t\t9\t/* Low 16 bit. */\n++#define R_M32R_SDA16\t\t10\t/* 16 bit offset in SDA. */\n++#define R_M32R_GNU_VTINHERIT\t11\n++#define R_M32R_GNU_VTENTRY\t12\n++/* M32R relocs use SHT_RELA.  */\n++#define R_M32R_16_RELA\t\t33\t/* Direct 16 bit. */\n++#define R_M32R_32_RELA\t\t34\t/* Direct 32 bit. */\n++#define R_M32R_24_RELA\t\t35\t/* Direct 24 bit. */\n++#define R_M32R_10_PCREL_RELA\t36\t/* PC relative 10 bit shifted. */\n++#define R_M32R_18_PCREL_RELA\t37\t/* PC relative 18 bit shifted. */\n++#define R_M32R_26_PCREL_RELA\t38\t/* PC relative 26 bit shifted. */\n++#define R_M32R_HI16_ULO_RELA\t39\t/* High 16 bit with unsigned low */\n++#define R_M32R_HI16_SLO_RELA\t40\t/* High 16 bit with signed low */\n++#define R_M32R_LO16_RELA\t41\t/* Low 16 bit */\n++#define R_M32R_SDA16_RELA\t42\t/* 16 bit offset in SDA */\n++#define R_M32R_RELA_GNU_VTINHERIT\t43\n++#define R_M32R_RELA_GNU_VTENTRY\t44\n++#define R_M32R_REL32\t\t45\t/* PC relative 32 bit.  */\n++\n++#define R_M32R_GOT24\t\t48\t/* 24 bit GOT entry */\n++#define R_M32R_26_PLTREL\t49\t/* 26 bit PC relative to PLT shifted */\n++#define R_M32R_COPY\t\t50\t/* Copy symbol at runtime */\n++#define R_M32R_GLOB_DAT\t\t51\t/* Create GOT entry */\n++#define R_M32R_JMP_SLOT\t\t52\t/* Create PLT entry */\n++#define R_M32R_RELATIVE\t\t53\t/* Adjust by program base */\n++#define R_M32R_GOTOFF\t\t54\t/* 24 bit offset to GOT */\n++#define R_M32R_GOTPC24\t\t55\t/* 24 bit PC relative offset to GOT */\n++#define R_M32R_GOT16_HI_ULO\t56\t/* High 16 bit GOT entry with unsigned\n++\t\t\t\t\t   low */\n++#define R_M32R_GOT16_HI_SLO\t57\t/* High 16 bit GOT entry with signed\n++\t\t\t\t\t   low */\n++#define R_M32R_GOT16_LO\t\t58\t/* Low 16 bit GOT entry */\n++#define R_M32R_GOTPC_HI_ULO\t59\t/* High 16 bit PC relative offset to\n++\t\t\t\t\t   GOT with unsigned low */\n++#define R_M32R_GOTPC_HI_SLO\t60\t/* High 16 bit PC relative offset to\n++\t\t\t\t\t   GOT with signed low */\n++#define R_M32R_GOTPC_LO\t\t61\t/* Low 16 bit PC relative offset to\n++\t\t\t\t\t   GOT */\n++#define R_M32R_GOTOFF_HI_ULO\t62\t/* High 16 bit offset to GOT\n++\t\t\t\t\t   with unsigned low */\n++#define R_M32R_GOTOFF_HI_SLO\t63\t/* High 16 bit offset to GOT\n++\t\t\t\t\t   with signed low */\n++#define R_M32R_GOTOFF_LO\t64\t/* Low 16 bit offset to GOT */\n++#define R_M32R_NUM\t\t256\t/* Keep this the last entry. */\n++\n++\n++/* TILEPro relocations.  */\n++#define R_TILEPRO_NONE\t\t0\t/* No reloc */\n++#define R_TILEPRO_32\t\t1\t/* Direct 32 bit */\n++#define R_TILEPRO_16\t\t2\t/* Direct 16 bit */\n++#define R_TILEPRO_8\t\t3\t/* Direct 8 bit */\n++#define R_TILEPRO_32_PCREL\t4\t/* PC relative 32 bit */\n++#define R_TILEPRO_16_PCREL\t5\t/* PC relative 16 bit */\n++#define R_TILEPRO_8_PCREL\t6\t/* PC relative 8 bit */\n++#define R_TILEPRO_LO16\t\t7\t/* Low 16 bit */\n++#define R_TILEPRO_HI16\t\t8\t/* High 16 bit */\n++#define R_TILEPRO_HA16\t\t9\t/* High 16 bit, adjusted */\n++#define R_TILEPRO_COPY\t\t10\t/* Copy relocation */\n++#define R_TILEPRO_GLOB_DAT\t11\t/* Create GOT entry */\n++#define R_TILEPRO_JMP_SLOT\t12\t/* Create PLT entry */\n++#define R_TILEPRO_RELATIVE\t13\t/* Adjust by program base */\n++#define R_TILEPRO_BROFF_X1\t14\t/* X1 pipe branch offset */\n++#define R_TILEPRO_JOFFLONG_X1\t15\t/* X1 pipe jump offset */\n++#define R_TILEPRO_JOFFLONG_X1_PLT 16\t/* X1 pipe jump offset to PLT */\n++#define R_TILEPRO_IMM8_X0\t17\t/* X0 pipe 8-bit */\n++#define R_TILEPRO_IMM8_Y0\t18\t/* Y0 pipe 8-bit */\n++#define R_TILEPRO_IMM8_X1\t19\t/* X1 pipe 8-bit */\n++#define R_TILEPRO_IMM8_Y1\t20\t/* Y1 pipe 8-bit */\n++#define R_TILEPRO_MT_IMM15_X1\t21\t/* X1 pipe mtspr */\n++#define R_TILEPRO_MF_IMM15_X1\t22\t/* X1 pipe mfspr */\n++#define R_TILEPRO_IMM16_X0\t23\t/* X0 pipe 16-bit */\n++#define R_TILEPRO_IMM16_X1\t24\t/* X1 pipe 16-bit */\n++#define R_TILEPRO_IMM16_X0_LO\t25\t/* X0 pipe low 16-bit */\n++#define R_TILEPRO_IMM16_X1_LO\t26\t/* X1 pipe low 16-bit */\n++#define R_TILEPRO_IMM16_X0_HI\t27\t/* X0 pipe high 16-bit */\n++#define R_TILEPRO_IMM16_X1_HI\t28\t/* X1 pipe high 16-bit */\n++#define R_TILEPRO_IMM16_X0_HA\t29\t/* X0 pipe high 16-bit, adjusted */\n++#define R_TILEPRO_IMM16_X1_HA\t30\t/* X1 pipe high 16-bit, adjusted */\n++#define R_TILEPRO_IMM16_X0_PCREL 31\t/* X0 pipe PC relative 16 bit */\n++#define R_TILEPRO_IMM16_X1_PCREL 32\t/* X1 pipe PC relative 16 bit */\n++#define R_TILEPRO_IMM16_X0_LO_PCREL 33\t/* X0 pipe PC relative low 16 bit */\n++#define R_TILEPRO_IMM16_X1_LO_PCREL 34\t/* X1 pipe PC relative low 16 bit */\n++#define R_TILEPRO_IMM16_X0_HI_PCREL 35\t/* X0 pipe PC relative high 16 bit */\n++#define R_TILEPRO_IMM16_X1_HI_PCREL 36\t/* X1 pipe PC relative high 16 bit */\n++#define R_TILEPRO_IMM16_X0_HA_PCREL 37\t/* X0 pipe PC relative ha() 16 bit */\n++#define R_TILEPRO_IMM16_X1_HA_PCREL 38\t/* X1 pipe PC relative ha() 16 bit */\n++#define R_TILEPRO_IMM16_X0_GOT\t39\t/* X0 pipe 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X1_GOT\t40\t/* X1 pipe 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X0_GOT_LO 41\t/* X0 pipe low 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X1_GOT_LO 42\t/* X1 pipe low 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X0_GOT_HI 43\t/* X0 pipe high 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X1_GOT_HI 44\t/* X1 pipe high 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X0_GOT_HA 45\t/* X0 pipe ha() 16-bit GOT offset */\n++#define R_TILEPRO_IMM16_X1_GOT_HA 46\t/* X1 pipe ha() 16-bit GOT offset */\n++#define R_TILEPRO_MMSTART_X0\t47\t/* X0 pipe mm \"start\" */\n++#define R_TILEPRO_MMEND_X0\t48\t/* X0 pipe mm \"end\" */\n++#define R_TILEPRO_MMSTART_X1\t49\t/* X1 pipe mm \"start\" */\n++#define R_TILEPRO_MMEND_X1\t50\t/* X1 pipe mm \"end\" */\n++#define R_TILEPRO_SHAMT_X0\t51\t/* X0 pipe shift amount */\n++#define R_TILEPRO_SHAMT_X1\t52\t/* X1 pipe shift amount */\n++#define R_TILEPRO_SHAMT_Y0\t53\t/* Y0 pipe shift amount */\n++#define R_TILEPRO_SHAMT_Y1\t54\t/* Y1 pipe shift amount */\n++#define R_TILEPRO_DEST_IMM8_X1\t55\t/* X1 pipe destination 8-bit */\n++/* Relocs 56-59 are currently not defined.  */\n++#define R_TILEPRO_TLS_GD_CALL\t60\t/* \"jal\" for TLS GD */\n++#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61\t/* X0 pipe \"addi\" for TLS GD */\n++#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62\t/* X1 pipe \"addi\" for TLS GD */\n++#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63\t/* Y0 pipe \"addi\" for TLS GD */\n++#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64\t/* Y1 pipe \"addi\" for TLS GD */\n++#define R_TILEPRO_TLS_IE_LOAD\t65\t/* \"lw_tls\" for TLS IE */\n++#define R_TILEPRO_IMM16_X0_TLS_GD 66\t/* X0 pipe 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X1_TLS_GD 67\t/* X1 pipe 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68\t/* X0 pipe low 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69\t/* X1 pipe low 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70\t/* X0 pipe high 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71\t/* X1 pipe high 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72\t/* X0 pipe ha() 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73\t/* X1 pipe ha() 16-bit TLS GD offset */\n++#define R_TILEPRO_IMM16_X0_TLS_IE 74\t/* X0 pipe 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_IE 75\t/* X1 pipe 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76\t/* X0 pipe low 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77\t/* X1 pipe low 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78\t/* X0 pipe high 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79\t/* X1 pipe high 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80\t/* X0 pipe ha() 16-bit TLS IE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81\t/* X1 pipe ha() 16-bit TLS IE offset */\n++#define R_TILEPRO_TLS_DTPMOD32\t82\t/* ID of module containing symbol */\n++#define R_TILEPRO_TLS_DTPOFF32\t83\t/* Offset in TLS block */\n++#define R_TILEPRO_TLS_TPOFF32\t84\t/* Offset in static TLS block */\n++#define R_TILEPRO_IMM16_X0_TLS_LE 85\t/* X0 pipe 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_LE 86\t/* X1 pipe 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87\t/* X0 pipe low 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88\t/* X1 pipe low 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89\t/* X0 pipe high 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90\t/* X1 pipe high 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91\t/* X0 pipe ha() 16-bit TLS LE offset */\n++#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92\t/* X1 pipe ha() 16-bit TLS LE offset */\n++\n++#define R_TILEPRO_GNU_VTINHERIT\t128\t/* GNU C++ vtable hierarchy */\n++#define R_TILEPRO_GNU_VTENTRY\t129\t/* GNU C++ vtable member usage */\n++\n++#define R_TILEPRO_NUM\t\t130\n++\n++\n++/* TILE-Gx relocations.  */\n++#define R_TILEGX_NONE\t\t0\t/* No reloc */\n++#define R_TILEGX_64\t\t1\t/* Direct 64 bit */\n++#define R_TILEGX_32\t\t2\t/* Direct 32 bit */\n++#define R_TILEGX_16\t\t3\t/* Direct 16 bit */\n++#define R_TILEGX_8\t\t4\t/* Direct 8 bit */\n++#define R_TILEGX_64_PCREL\t5\t/* PC relative 64 bit */\n++#define R_TILEGX_32_PCREL\t6\t/* PC relative 32 bit */\n++#define R_TILEGX_16_PCREL\t7\t/* PC relative 16 bit */\n++#define R_TILEGX_8_PCREL\t8\t/* PC relative 8 bit */\n++#define R_TILEGX_HW0\t\t9\t/* hword 0 16-bit */\n++#define R_TILEGX_HW1\t\t10\t/* hword 1 16-bit */\n++#define R_TILEGX_HW2\t\t11\t/* hword 2 16-bit */\n++#define R_TILEGX_HW3\t\t12\t/* hword 3 16-bit */\n++#define R_TILEGX_HW0_LAST\t13\t/* last hword 0 16-bit */\n++#define R_TILEGX_HW1_LAST\t14\t/* last hword 1 16-bit */\n++#define R_TILEGX_HW2_LAST\t15\t/* last hword 2 16-bit */\n++#define R_TILEGX_COPY\t\t16\t/* Copy relocation */\n++#define R_TILEGX_GLOB_DAT\t17\t/* Create GOT entry */\n++#define R_TILEGX_JMP_SLOT\t18\t/* Create PLT entry */\n++#define R_TILEGX_RELATIVE\t19\t/* Adjust by program base */\n++#define R_TILEGX_BROFF_X1\t20\t/* X1 pipe branch offset */\n++#define R_TILEGX_JUMPOFF_X1\t21\t/* X1 pipe jump offset */\n++#define R_TILEGX_JUMPOFF_X1_PLT\t22\t/* X1 pipe jump offset to PLT */\n++#define R_TILEGX_IMM8_X0\t23\t/* X0 pipe 8-bit */\n++#define R_TILEGX_IMM8_Y0\t24\t/* Y0 pipe 8-bit */\n++#define R_TILEGX_IMM8_X1\t25\t/* X1 pipe 8-bit */\n++#define R_TILEGX_IMM8_Y1\t26\t/* Y1 pipe 8-bit */\n++#define R_TILEGX_DEST_IMM8_X1\t27\t/* X1 pipe destination 8-bit */\n++#define R_TILEGX_MT_IMM14_X1\t28\t/* X1 pipe mtspr */\n++#define R_TILEGX_MF_IMM14_X1\t29\t/* X1 pipe mfspr */\n++#define R_TILEGX_MMSTART_X0\t30\t/* X0 pipe mm \"start\" */\n++#define R_TILEGX_MMEND_X0\t31\t/* X0 pipe mm \"end\" */\n++#define R_TILEGX_SHAMT_X0\t32\t/* X0 pipe shift amount */\n++#define R_TILEGX_SHAMT_X1\t33\t/* X1 pipe shift amount */\n++#define R_TILEGX_SHAMT_Y0\t34\t/* Y0 pipe shift amount */\n++#define R_TILEGX_SHAMT_Y1\t35\t/* Y1 pipe shift amount */\n++#define R_TILEGX_IMM16_X0_HW0\t36\t/* X0 pipe hword 0 */\n++#define R_TILEGX_IMM16_X1_HW0\t37\t/* X1 pipe hword 0 */\n++#define R_TILEGX_IMM16_X0_HW1\t38\t/* X0 pipe hword 1 */\n++#define R_TILEGX_IMM16_X1_HW1\t39\t/* X1 pipe hword 1 */\n++#define R_TILEGX_IMM16_X0_HW2\t40\t/* X0 pipe hword 2 */\n++#define R_TILEGX_IMM16_X1_HW2\t41\t/* X1 pipe hword 2 */\n++#define R_TILEGX_IMM16_X0_HW3\t42\t/* X0 pipe hword 3 */\n++#define R_TILEGX_IMM16_X1_HW3\t43\t/* X1 pipe hword 3 */\n++#define R_TILEGX_IMM16_X0_HW0_LAST 44\t/* X0 pipe last hword 0 */\n++#define R_TILEGX_IMM16_X1_HW0_LAST 45\t/* X1 pipe last hword 0 */\n++#define R_TILEGX_IMM16_X0_HW1_LAST 46\t/* X0 pipe last hword 1 */\n++#define R_TILEGX_IMM16_X1_HW1_LAST 47\t/* X1 pipe last hword 1 */\n++#define R_TILEGX_IMM16_X0_HW2_LAST 48\t/* X0 pipe last hword 2 */\n++#define R_TILEGX_IMM16_X1_HW2_LAST 49\t/* X1 pipe last hword 2 */\n++#define R_TILEGX_IMM16_X0_HW0_PCREL 50\t/* X0 pipe PC relative hword 0 */\n++#define R_TILEGX_IMM16_X1_HW0_PCREL 51\t/* X1 pipe PC relative hword 0 */\n++#define R_TILEGX_IMM16_X0_HW1_PCREL 52\t/* X0 pipe PC relative hword 1 */\n++#define R_TILEGX_IMM16_X1_HW1_PCREL 53\t/* X1 pipe PC relative hword 1 */\n++#define R_TILEGX_IMM16_X0_HW2_PCREL 54\t/* X0 pipe PC relative hword 2 */\n++#define R_TILEGX_IMM16_X1_HW2_PCREL 55\t/* X1 pipe PC relative hword 2 */\n++#define R_TILEGX_IMM16_X0_HW3_PCREL 56\t/* X0 pipe PC relative hword 3 */\n++#define R_TILEGX_IMM16_X1_HW3_PCREL 57\t/* X1 pipe PC relative hword 3 */\n++#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */\n++#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */\n++#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */\n++#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */\n++#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */\n++#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */\n++#define R_TILEGX_IMM16_X0_HW0_GOT 64\t/* X0 pipe hword 0 GOT offset */\n++#define R_TILEGX_IMM16_X1_HW0_GOT 65\t/* X1 pipe hword 0 GOT offset */\n++/* Relocs 66-71 are currently not defined.  */\n++#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */\n++#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */\n++#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */\n++#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */\n++/* Relocs 76-77 are currently not defined.  */\n++#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78\t/* X0 pipe hword 0 TLS GD offset */\n++#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79\t/* X1 pipe hword 0 TLS GD offset */\n++#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80\t/* X0 pipe hword 0 TLS LE offset */\n++#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81\t/* X1 pipe hword 0 TLS LE offset */\n++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */\n++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */\n++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */\n++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */\n++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */\n++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */\n++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */\n++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */\n++/* Relocs 90-91 are currently not defined.  */\n++#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92\t/* X0 pipe hword 0 TLS IE offset */\n++#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93\t/* X1 pipe hword 0 TLS IE offset */\n++/* Relocs 94-99 are currently not defined.  */\n++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */\n++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */\n++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */\n++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */\n++/* Relocs 104-105 are currently not defined.  */\n++#define R_TILEGX_TLS_DTPMOD64\t106\t/* 64-bit ID of symbol's module */\n++#define R_TILEGX_TLS_DTPOFF64\t107\t/* 64-bit offset in TLS block */\n++#define R_TILEGX_TLS_TPOFF64\t108\t/* 64-bit offset in static TLS block */\n++#define R_TILEGX_TLS_DTPMOD32\t109\t/* 32-bit ID of symbol's module */\n++#define R_TILEGX_TLS_DTPOFF32\t110\t/* 32-bit offset in TLS block */\n++#define R_TILEGX_TLS_TPOFF32\t111\t/* 32-bit offset in static TLS block */\n++#define R_TILEGX_TLS_GD_CALL\t112\t/* \"jal\" for TLS GD */\n++#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113\t/* X0 pipe \"addi\" for TLS GD */\n++#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114\t/* X1 pipe \"addi\" for TLS GD */\n++#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115\t/* Y0 pipe \"addi\" for TLS GD */\n++#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116\t/* Y1 pipe \"addi\" for TLS GD */\n++#define R_TILEGX_TLS_IE_LOAD\t117\t/* \"ld_tls\" for TLS IE */\n++#define R_TILEGX_IMM8_X0_TLS_ADD 118\t/* X0 pipe \"addi\" for TLS GD/IE */\n++#define R_TILEGX_IMM8_X1_TLS_ADD 119\t/* X1 pipe \"addi\" for TLS GD/IE */\n++#define R_TILEGX_IMM8_Y0_TLS_ADD 120\t/* Y0 pipe \"addi\" for TLS GD/IE */\n++#define R_TILEGX_IMM8_Y1_TLS_ADD 121\t/* Y1 pipe \"addi\" for TLS GD/IE */\n++\n++#define R_TILEGX_GNU_VTINHERIT\t128\t/* GNU C++ vtable hierarchy */\n++#define R_TILEGX_GNU_VTENTRY\t129\t/* GNU C++ vtable member usage */\n++\n++#define R_TILEGX_NUM\t\t130\n++\n++#endif\t/* elf.h */\n+--- a/scripts/mod/mk_elfconfig.c\n++++ b/scripts/mod/mk_elfconfig.c\n+@@ -2,7 +2,11 @@\n+ #include <stdio.h>\n+ #include <stdlib.h>\n+ #include <string.h>\n++#ifndef __APPLE__\n+ #include <elf.h>\n++#else\n++#include \"elf.h\"\n++#endif\n+ \n+ int\n+ main(int argc, char **argv)\n+--- a/scripts/mod/modpost.h\n++++ b/scripts/mod/modpost.h\n+@@ -9,7 +9,11 @@\n+ #include <sys/mman.h>\n+ #include <fcntl.h>\n+ #include <unistd.h>\n++#if !(defined(__APPLE__) || defined(__CYGWIN__))\n+ #include <elf.h>\n++#else\n++#include \"elf.h\"\n++#endif\n+ \n+ #include \"elfconfig.h\"\n+ \ndiff --git a/target/linux/generic/hack-5.14/211-darwin-uuid-typedef-clash.patch b/target/linux/generic/hack-5.14/211-darwin-uuid-typedef-clash.patch\nnew file mode 100644\nindex 0000000000..50a6227148\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/211-darwin-uuid-typedef-clash.patch\n@@ -0,0 +1,22 @@\n+From e44fc2af1ddc452b6659d08c16973d65c73b7d0a Mon Sep 17 00:00:00 2001\n+From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>\n+Date: Wed, 5 Feb 2020 18:36:43 +0000\n+Subject: [PATCH] file2alias: build on macos\n+\n+Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>\n+---\n+ scripts/mod/file2alias.c | 3 +++\n+ 1 file changed, 3 insertions(+)\n+\n+--- a/scripts/mod/file2alias.c\n++++ b/scripts/mod/file2alias.c\n+@@ -38,6 +38,9 @@ typedef struct {\n+ \t__u8 b[16];\n+ } guid_t;\n+ \n++#ifdef __APPLE__\n++#define uuid_t compat_uuid_t\n++#endif\n+ /* backwards compatibility, don't use in new code */\n+ typedef struct {\n+ \t__u8 b[16];\ndiff --git a/target/linux/generic/hack-5.14/212-tools_portability.patch b/target/linux/generic/hack-5.14/212-tools_portability.patch\nnew file mode 100644\nindex 0000000000..ffbb7d149b\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/212-tools_portability.patch\n@@ -0,0 +1,114 @@\n+From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:03:16 +0200\n+Subject: fix portability of some includes files in tools/ used on the host\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ tools/include/tools/be_byteshift.h |  4 ++++\n+ tools/include/tools/le_byteshift.h |  4 ++++\n+ tools/include/tools/linux_types.h  | 22 ++++++++++++++++++++++\n+ 3 files changed, 30 insertions(+)\n+ create mode 100644 tools/include/tools/linux_types.h\n+\n+--- a/tools/include/tools/be_byteshift.h\n++++ b/tools/include/tools/be_byteshift.h\n+@@ -2,6 +2,10 @@\n+ #ifndef _TOOLS_BE_BYTESHIFT_H\n+ #define _TOOLS_BE_BYTESHIFT_H\n+ \n++#ifndef __linux__\n++#include \"linux_types.h\"\n++#endif\n++\n+ #include <stdint.h>\n+ \n+ static inline uint16_t __get_unaligned_be16(const uint8_t *p)\n+--- a/tools/include/tools/le_byteshift.h\n++++ b/tools/include/tools/le_byteshift.h\n+@@ -2,6 +2,10 @@\n+ #ifndef _TOOLS_LE_BYTESHIFT_H\n+ #define _TOOLS_LE_BYTESHIFT_H\n+ \n++#ifndef __linux__\n++#include \"linux_types.h\"\n++#endif\n++\n+ #include <stdint.h>\n+ \n+ static inline uint16_t __get_unaligned_le16(const uint8_t *p)\n+--- /dev/null\n++++ b/tools/include/tools/linux_types.h\n+@@ -0,0 +1,26 @@\n++#ifndef __LINUX_TYPES_H\n++#define __LINUX_TYPES_H\n++\n++#include <stdint.h>\n++\n++typedef int8_t __s8;\n++typedef uint8_t __u8;\n++typedef uint8_t __be8;\n++typedef uint8_t __le8;\n++\n++typedef int16_t __s16;\n++typedef uint16_t __u16;\n++typedef uint16_t __be16;\n++typedef uint16_t __le16;\n++\n++typedef int32_t __s32;\n++typedef uint32_t __u32;\n++typedef uint32_t __be32;\n++typedef uint32_t __le32;\n++\n++typedef int64_t __s64;\n++typedef uint64_t __u64;\n++typedef uint64_t __be64;\n++typedef uint64_t __le64;\n++\n++#endif\n+--- a/tools/include/linux/types.h\n++++ b/tools/include/linux/types.h\n+@@ -6,12 +6,13 @@\n+ #include <stddef.h>\n+ #include <stdint.h>\n+ \n+-#ifndef __SANE_USERSPACE_TYPES__\n+ #define __SANE_USERSPACE_TYPES__\t/* For PPC64, to get LL64 types */\n+-#endif\n+-\n++#ifndef __linux__\n++#include <tools/linux_types.h>\n++#else\n+ #include <asm/types.h>\n+ #include <asm/posix_types.h>\n++#endif\n+ \n+ struct page;\n+ struct kmem_cache;\n+--- a/tools/perf/pmu-events/jevents.c\n++++ b/tools/perf/pmu-events/jevents.c\n+@@ -1,4 +1,6 @@\n++#ifdef __linux__\n+ #define  _XOPEN_SOURCE 500\t/* needed for nftw() */\n++#endif\n+ #define  _GNU_SOURCE\t\t/* needed for asprintf() */\n+ \n+ /* Parse event JSON files */\n+@@ -35,6 +37,7 @@\n+ #include <stdlib.h>\n+ #include <errno.h>\n+ #include <string.h>\n++#include <strings.h>\n+ #include <ctype.h>\n+ #include <unistd.h>\n+ #include <stdarg.h>\n+--- a/tools/perf/pmu-events/json.c\n++++ b/tools/perf/pmu-events/json.c\n+@@ -38,7 +38,6 @@\n+ #include <unistd.h>\n+ #include \"jsmn.h\"\n+ #include \"json.h\"\n+-#include <linux/kernel.h>\n+ \n+ \n+ static char *mapfile(const char *fn, size_t *size)\ndiff --git a/target/linux/generic/hack-5.14/214-spidev_h_portability.patch b/target/linux/generic/hack-5.14/214-spidev_h_portability.patch\nnew file mode 100644\nindex 0000000000..db754a2903\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/214-spidev_h_portability.patch\n@@ -0,0 +1,24 @@\n+From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:04:08 +0200\n+Subject: kernel: fix linux/spi/spidev.h portability issues with musl\n+\n+Felix will try to get this define included into musl\n+\n+lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/uapi/linux/spi/spidev.h | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/include/uapi/linux/spi/spidev.h\n++++ b/include/uapi/linux/spi/spidev.h\n+@@ -93,7 +93,7 @@ struct spi_ioc_transfer {\n+ \n+ /* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */\n+ #define SPI_MSGSIZE(N) \\\n+-\t((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \\\n++\t((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \\\n+ \t\t? ((N)*(sizeof (struct spi_ioc_transfer))) : 0)\n+ #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)])\n+ \ndiff --git a/target/linux/generic/hack-5.14/220-gc_sections.patch b/target/linux/generic/hack-5.14/220-gc_sections.patch\nnew file mode 100644\nindex 0000000000..216c3ee129\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/220-gc_sections.patch\n@@ -0,0 +1,120 @@\n+From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 15 Jul 2017 23:42:36 +0200\n+Subject: use -ffunction-sections, -fdata-sections and --gc-sections\n+\n+In combination with kernel symbol export stripping this significantly reduces\n+the kernel image size. Used on both ARM and MIPS architectures.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+Signed-off-by: Jonas Gorski <jogo@openwrt.org>\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+---\n+--- a/arch/arm/Kconfig\n++++ b/arch/arm/Kconfig\n+@@ -118,6 +118,7 @@ config ARM\n+ \tselect HAVE_UID16\n+ \tselect HAVE_VIRT_CPU_ACCOUNTING_GEN\n+ \tselect IRQ_FORCED_THREADING\n++\tselect HAVE_LD_DEAD_CODE_DATA_ELIMINATION\n+ \tselect MODULES_USE_ELF_REL\n+ \tselect NEED_DMA_MAP_STATE\n+ \tselect OF_EARLY_FLATTREE if OF\n+--- a/arch/arm/boot/compressed/Makefile\n++++ b/arch/arm/boot/compressed/Makefile\n+@@ -90,6 +90,7 @@ endif\n+ ifeq ($(CONFIG_USE_OF),y)\n+ OBJS\t+= $(libfdt_objs) fdt_check_mem_start.o\n+ endif\n++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))\n+ \n+ # -fstack-protector-strong triggers protection checks in this code,\n+ # but it is being used too early to link to meaningful stack_chk logic.\n+--- a/arch/arm/kernel/vmlinux.lds.S\n++++ b/arch/arm/kernel/vmlinux.lds.S\n+@@ -100,24 +100,24 @@ SECTIONS\n+ \t}\n+ \t.init.arch.info : {\n+ \t\t__arch_info_begin = .;\n+-\t\t*(.arch.info.init)\n++\t\tKEEP(*(.arch.info.init))\n+ \t\t__arch_info_end = .;\n+ \t}\n+ \t.init.tagtable : {\n+ \t\t__tagtable_begin = .;\n+-\t\t*(.taglist.init)\n++\t\tKEEP(*(.taglist.init))\n+ \t\t__tagtable_end = .;\n+ \t}\n+ #ifdef CONFIG_SMP_ON_UP\n+ \t.init.smpalt : {\n+ \t\t__smpalt_begin = .;\n+-\t\t*(.alt.smp.init)\n++\t\tKEEP(*(.alt.smp.init))\n+ \t\t__smpalt_end = .;\n+ \t}\n+ #endif\n+ \t.init.pv_table : {\n+ \t\t__pv_table_begin = .;\n+-\t\t*(.pv_table)\n++\t\tKEEP(*(.pv_table))\n+ \t\t__pv_table_end = .;\n+ \t}\n+ \n+--- a/arch/arm/include/asm/vmlinux.lds.h\n++++ b/arch/arm/include/asm/vmlinux.lds.h\n+@@ -23,19 +23,19 @@\n+ #define ARM_MMU_DISCARD(x)\n+ #else\n+ #define ARM_MMU_KEEP(x)\n+-#define ARM_MMU_DISCARD(x)\tx\n++#define ARM_MMU_DISCARD(x)\tKEEP(x)\n+ #endif\n+ \n+ #define PROC_INFO\t\t\t\t\t\t\t\\\n+ \t\t. = ALIGN(4);\t\t\t\t\t\t\\\n+ \t\t__proc_info_begin = .;\t\t\t\t\t\\\n+-\t\t*(.proc.info.init)\t\t\t\t\t\\\n++\t\tKEEP(*(.proc.info.init))\t\t\t\t\\\n+ \t\t__proc_info_end = .;\n+ \n+ #define IDMAP_TEXT\t\t\t\t\t\t\t\\\n+ \t\tALIGN_FUNCTION();\t\t\t\t\t\\\n+ \t\t__idmap_text_start = .;\t\t\t\t\t\\\n+-\t\t*(.idmap.text)\t\t\t\t\t\t\\\n++\t\tKEEP(*(.idmap.text))\t\t\t\t\t\\\n+ \t\t__idmap_text_end = .;\t\t\t\t\t\\\n+ \n+ #define ARM_DISCARD\t\t\t\t\t\t\t\\\n+@@ -96,12 +96,12 @@\n+ \t. = ALIGN(8);\t\t\t\t\t\t\t\\\n+ \t.ARM.unwind_idx : {\t\t\t\t\t\t\\\n+ \t\t__start_unwind_idx = .;\t\t\t\t\t\\\n+-\t\t*(.ARM.exidx*)\t\t\t\t\t\t\\\n++\t\tKEEP(*(.ARM.exidx*))\t\t\t\t\t\\\n+ \t\t__stop_unwind_idx = .;\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t.ARM.unwind_tab : {\t\t\t\t\t\t\\\n+ \t\t__start_unwind_tab = .;\t\t\t\t\t\\\n+-\t\t*(.ARM.extab*)\t\t\t\t\t\t\\\n++\t\tKEEP(*(.ARM.extab*))\t\t\t\t\t\\\n+ \t\t__stop_unwind_tab = .;\t\t\t\t\t\\\n+ \t}\n+ \n+@@ -112,14 +112,14 @@\n+ #define ARM_VECTORS\t\t\t\t\t\t\t\\\n+ \t__vectors_start = .;\t\t\t\t\t\t\\\n+ \t.vectors 0xffff0000 : AT(__vectors_start) {\t\t\t\\\n+-\t\t*(.vectors)\t\t\t\t\t\t\\\n++\t\tKEEP(*(.vectors))\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t. = __vectors_start + SIZEOF(.vectors);\t\t\t\t\\\n+ \t__vectors_end = .;\t\t\t\t\t\t\\\n+ \t\t\t\t\t\t\t\t\t\\\n+ \t__stubs_start = .;\t\t\t\t\t\t\\\n+ \t.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {\t\t\\\n+-\t\t*(.stubs)\t\t\t\t\t\t\\\n++\t\tKEEP(*(.stubs))\t\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t. = __stubs_start + SIZEOF(.stubs);\t\t\t\t\\\n+ \t__stubs_end = .;\t\t\t\t\t\t\\\ndiff --git a/target/linux/generic/hack-5.14/221-module_exports.patch b/target/linux/generic/hack-5.14/221-module_exports.patch\nnew file mode 100644\nindex 0000000000..2640020218\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/221-module_exports.patch\n@@ -0,0 +1,102 @@\n+From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:05:53 +0200\n+Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image\n+\n+lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++---\n+ include/linux/export.h            |  9 ++++++++-\n+ scripts/Makefile.build            |  2 +-\n+ 3 files changed, 24 insertions(+), 5 deletions(-)\n+\n+--- a/include/asm-generic/vmlinux.lds.h\n++++ b/include/asm-generic/vmlinux.lds.h\n+@@ -81,6 +81,16 @@\n+ #define RO_EXCEPTION_TABLE\n+ #endif\n+ \n++#ifndef SYMTAB_KEEP\n++#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*)))\n++#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*)))\n++#endif\n++\n++#ifndef SYMTAB_DISCARD\n++#define SYMTAB_DISCARD\n++#define SYMTAB_DISCARD_GPL\n++#endif\n++\n+ /* Align . to a 8 byte boundary equals to maximum function alignment. */\n+ #define ALIGN_FUNCTION()  . = ALIGN(8)\n+ \n+@@ -486,14 +496,14 @@\n+ \t/* Kernel symbol table: Normal symbols */\t\t\t\\\n+ \t__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {\t\t\\\n+ \t\t__start___ksymtab = .;\t\t\t\t\t\\\n+-\t\tKEEP(*(SORT(___ksymtab+*)))\t\t\t\t\\\n++\t\tSYMTAB_KEEP\t\t\t\t\t\t\\\n+ \t\t__stop___ksymtab = .;\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t\t\t\t\t\t\t\t\t\\\n+ \t/* Kernel symbol table: GPL-only symbols */\t\t\t\\\n+ \t__ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {\t\\\n+ \t\t__start___ksymtab_gpl = .;\t\t\t\t\\\n+-\t\tKEEP(*(SORT(___ksymtab_gpl+*)))\t\t\t\t\\\n++\t\tSYMTAB_KEEP_GPL\t\t\t\t\t\t\\\n+ \t\t__stop___ksymtab_gpl = .;\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t\t\t\t\t\t\t\t\t\\\n+@@ -513,7 +523,7 @@\n+ \t\t\t\t\t\t\t\t\t\\\n+ \t/* Kernel symbol table: strings */\t\t\t\t\\\n+         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {\t\\\n+-\t\t*(__ksymtab_strings)\t\t\t\t\t\\\n++\t\t*(__ksymtab_strings+*)\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ \t\t\t\t\t\t\t\t\t\\\n+ \t/* __*init sections */\t\t\t\t\t\t\\\n+@@ -1008,6 +1018,8 @@\n+ \n+ #define COMMON_DISCARDS\t\t\t\t\t\t\t\\\n+ \tSANITIZER_DISCARDS\t\t\t\t\t\t\\\n++\tSYMTAB_DISCARD\t\t\t\t\t\t\t\\\n++\tSYMTAB_DISCARD_GPL\t\t\t\t\t\t\\\n+ \t*(.discard)\t\t\t\t\t\t\t\\\n+ \t*(.discard.*)\t\t\t\t\t\t\t\\\n+ \t*(.modinfo)\t\t\t\t\t\t\t\\\n+--- a/include/linux/export.h\n++++ b/include/linux/export.h\n+@@ -82,6 +82,12 @@ struct kernel_symbol {\n+ \n+ #else\n+ \n++#ifdef MODULE\n++#define __EXPORT_SUFFIX(sym)\n++#else\n++#define __EXPORT_SUFFIX(sym) \"+\" #sym\n++#endif\n++\n+ /*\n+  * For every exported symbol, do the following:\n+  *\n+@@ -99,7 +105,7 @@ struct kernel_symbol {\n+ \textern const char __kstrtab_##sym[];\t\t\t\t\t\\\n+ \textern const char __kstrtabns_##sym[];\t\t\t\t\t\\\n+ \t__CRC_SYMBOL(sym, sec);\t\t\t\t\t\t\t\\\n+-\tasm(\"\t.section \\\"__ksymtab_strings\\\",\\\"aMS\\\",%progbits,1\t\\n\"\t\\\n++\tasm(\"\t.section \\\"__ksymtab_strings\" __EXPORT_SUFFIX(sym) \"\\\",\\\"aMS\\\",%progbits,1\t\\n\"\t\\\n+ \t    \"__kstrtab_\" #sym \":\t\t\t\t\t\\n\"\t\\\n+ \t    \"\t.asciz \t\\\"\" #sym \"\\\"\t\t\t\t\t\\n\"\t\\\n+ \t    \"__kstrtabns_\" #sym \":\t\t\t\t\t\\n\"\t\\\n+--- a/scripts/Makefile.build\n++++ b/scripts/Makefile.build\n+@@ -358,7 +358,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa\n+ # Linker scripts preprocessor (.lds.S -> .lds)\n+ # ---------------------------------------------------------------------------\n+ quiet_cmd_cpp_lds_S = LDS     $@\n+-      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \\\n++      cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \\\n+ \t                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<\n+ \n+ $(obj)/%.lds: $(src)/%.lds.S FORCE\ndiff --git a/target/linux/generic/hack-5.14/230-openwrt_lzma_options.patch b/target/linux/generic/hack-5.14/230-openwrt_lzma_options.patch\nnew file mode 100644\nindex 0000000000..6bc5d1de84\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/230-openwrt_lzma_options.patch\n@@ -0,0 +1,34 @@\n+From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001\n+From: Imre Kaloz <kaloz@openwrt.org>\n+Date: Fri, 7 Jul 2017 17:06:55 +0200\n+Subject: use the openwrt lzma options for now\n+\n+lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c\n+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>\n+---\n+ lib/decompress.c              |  1 +\n+ scripts/Makefile.lib          |  2 +-\n+ usr/gen_initramfs_list.sh | 10 +++++-----\n+ 3 files changed, 7 insertions(+), 6 deletions(-)\n+\n+--- a/lib/decompress.c\n++++ b/lib/decompress.c\n+@@ -53,6 +53,7 @@ static const struct compress_format comp\n+ \t{ {0x1f, 0x9e}, \"gzip\", gunzip },\n+ \t{ {0x42, 0x5a}, \"bzip2\", bunzip2 },\n+ \t{ {0x5d, 0x00}, \"lzma\", unlzma },\n++\t{ {0x6d, 0x00}, \"lzma-openwrt\", unlzma },\n+ \t{ {0xfd, 0x37}, \"xz\", unxz },\n+ \t{ {0x89, 0x4c}, \"lzo\", unlzo },\n+ \t{ {0x02, 0x21}, \"lz4\", unlz4 },\n+--- a/scripts/Makefile.lib\n++++ b/scripts/Makefile.lib\n+@@ -408,7 +408,7 @@ quiet_cmd_bzip2 = BZIP2   $@\n+ # ---------------------------------------------------------------------------\n+ \n+ quiet_cmd_lzma = LZMA    $@\n+-      cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@\n++      cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@\n+ \n+ quiet_cmd_lzo = LZO     $@\n+       cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@\ndiff --git a/target/linux/generic/hack-5.14/249-udp-tunnel-selection.patch b/target/linux/generic/hack-5.14/249-udp-tunnel-selection.patch\nnew file mode 100644\nindex 0000000000..2c74298dfe\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/249-udp-tunnel-selection.patch\n@@ -0,0 +1,11 @@\n+--- a/net/ipv4/Kconfig\n++++ b/net/ipv4/Kconfig\n+@@ -315,7 +315,7 @@ config NET_IPVTI\n+ \t  on top.\n+ \n+ config NET_UDP_TUNNEL\n+-\ttristate\n++\ttristate \"IP: UDP tunneling support\"\n+ \tselect NET_IP_TUNNEL\n+ \tdefault n\n+ \ndiff --git a/target/linux/generic/hack-5.14/250-netfilter_depends.patch b/target/linux/generic/hack-5.14/250-netfilter_depends.patch\nnew file mode 100644\nindex 0000000000..495c73ffa8\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/250-netfilter_depends.patch\n@@ -0,0 +1,27 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: hack: net: remove bogus netfilter dependencies\n+\n+lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/netfilter/Kconfig | 2 --\n+ 1 file changed, 2 deletions(-)\n+\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -243,7 +243,6 @@ config NF_CONNTRACK_FTP\n+ \n+ config NF_CONNTRACK_H323\n+ \ttristate \"H.323 protocol support\"\n+-\tdepends on IPV6 || IPV6=n\n+ \tdepends on NETFILTER_ADVANCED\n+ \thelp\n+ \t  H.323 is a VoIP signalling protocol from ITU-T. As one of the most\n+@@ -1106,7 +1105,6 @@ config NETFILTER_XT_TARGET_SECMARK\n+ \n+ config NETFILTER_XT_TARGET_TCPMSS\n+ \ttristate '\"TCPMSS\" target support'\n+-\tdepends on IPV6 || IPV6=n\n+ \tdefault m if NETFILTER_ADVANCED=n\n+ \thelp\n+ \t  This option adds a `TCPMSS' target, which allows you to alter the\ndiff --git a/target/linux/generic/hack-5.14/251-kconfig.patch b/target/linux/generic/hack-5.14/251-kconfig.patch\nnew file mode 100644\nindex 0000000000..004f18c047\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/251-kconfig.patch\n@@ -0,0 +1,199 @@\n+From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001\n+From: John Crispin <john@phrozen.org>\n+Date: Fri, 7 Jul 2017 17:09:21 +0200\n+Subject: kconfig: owrt specifc dependencies\n+\n+Signed-off-by: John Crispin <john@phrozen.org>\n+---\n+ crypto/Kconfig        | 10 +++++-----\n+ drivers/bcma/Kconfig  |  1 +\n+ drivers/ssb/Kconfig   |  3 ++-\n+ lib/Kconfig           |  8 ++++----\n+ net/netfilter/Kconfig |  2 +-\n+ net/wireless/Kconfig  | 17 ++++++++++-------\n+ sound/core/Kconfig    |  4 ++--\n+ 7 files changed, 25 insertions(+), 20 deletions(-)\n+\n+--- a/crypto/Kconfig\n++++ b/crypto/Kconfig\n+@@ -33,7 +33,7 @@ config CRYPTO_FIPS\n+ \t  this is.\n+ \n+ config CRYPTO_ALGAPI\n+-\ttristate\n++\ttristate \"ALGAPI\"\n+ \tselect CRYPTO_ALGAPI2\n+ \thelp\n+ \t  This option provides the API for cryptographic algorithms.\n+@@ -42,7 +42,7 @@ config CRYPTO_ALGAPI2\n+ \ttristate\n+ \n+ config CRYPTO_AEAD\n+-\ttristate\n++\ttristate \"AEAD\"\n+ \tselect CRYPTO_AEAD2\n+ \tselect CRYPTO_ALGAPI\n+ \n+@@ -53,7 +53,7 @@ config CRYPTO_AEAD2\n+ \tselect CRYPTO_RNG2\n+ \n+ config CRYPTO_SKCIPHER\n+-\ttristate\n++\ttristate \"SKCIPHER\"\n+ \tselect CRYPTO_SKCIPHER2\n+ \tselect CRYPTO_ALGAPI\n+ \n+@@ -63,7 +63,7 @@ config CRYPTO_SKCIPHER2\n+ \tselect CRYPTO_RNG2\n+ \n+ config CRYPTO_HASH\n+-\ttristate\n++\ttristate \"HASH\"\n+ \tselect CRYPTO_HASH2\n+ \tselect CRYPTO_ALGAPI\n+ \n+@@ -72,7 +72,7 @@ config CRYPTO_HASH2\n+ \tselect CRYPTO_ALGAPI2\n+ \n+ config CRYPTO_RNG\n+-\ttristate\n++\ttristate \"RNG\"\n+ \tselect CRYPTO_RNG2\n+ \tselect CRYPTO_ALGAPI\n+ \n+--- a/drivers/bcma/Kconfig\n++++ b/drivers/bcma/Kconfig\n+@@ -16,6 +16,7 @@ if BCMA\n+ # Support for Block-I/O. SELECT this from the driver that needs it.\n+ config BCMA_BLOCKIO\n+ \tbool\n++\tdefault y\n+ \n+ config BCMA_HOST_PCI_POSSIBLE\n+ \tbool\n+--- a/drivers/ssb/Kconfig\n++++ b/drivers/ssb/Kconfig\n+@@ -29,6 +29,7 @@ config SSB_SPROM\n+ config SSB_BLOCKIO\n+ \tbool\n+ \tdepends on SSB\n++\tdefault y\n+ \n+ config SSB_PCIHOST_POSSIBLE\n+ \tbool\n+@@ -49,7 +50,7 @@ config SSB_PCIHOST\n+ config SSB_B43_PCI_BRIDGE\n+ \tbool\n+ \tdepends on SSB_PCIHOST\n+-\tdefault n\n++\tdefault y\n+ \n+ config SSB_PCMCIAHOST_POSSIBLE\n+ \tbool\n+--- a/lib/Kconfig\n++++ b/lib/Kconfig\n+@@ -433,16 +433,16 @@ config BCH_CONST_T\n+ # Textsearch support is select'ed if needed\n+ #\n+ config TEXTSEARCH\n+-\tbool\n++\tbool \"Textsearch support\"\n+ \n+ config TEXTSEARCH_KMP\n+-\ttristate\n++\ttristate \"Textsearch KMP\"\n+ \n+ config TEXTSEARCH_BM\n+-\ttristate\n++\ttristate \"Textsearch BM\"\n+ \n+ config TEXTSEARCH_FSM\n+-\ttristate\n++\ttristate \"Textsearch FSM\"\n+ \n+ config BTREE\n+ \tbool\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -11,7 +11,7 @@ config NETFILTER_INGRESS\n+ \t  infrastructure.\n+ \n+ config NETFILTER_NETLINK\n+-\ttristate\n++\ttristate \"Netfilter NFNETLINK interface\"\n+ \n+ config NETFILTER_FAMILY_BRIDGE\n+ \tbool\n+--- a/net/wireless/Kconfig\n++++ b/net/wireless/Kconfig\n+@@ -1,6 +1,6 @@\n+ # SPDX-License-Identifier: GPL-2.0-only\n+ config WIRELESS_EXT\n+-\tbool\n++\tbool \"Wireless extensions\"\n+ \n+ config WEXT_CORE\n+ \tdef_bool y\n+@@ -12,10 +12,10 @@ config WEXT_PROC\n+ \tdepends on WEXT_CORE\n+ \n+ config WEXT_SPY\n+-\tbool\n++\tbool \"WEXT_SPY\"\n+ \n+ config WEXT_PRIV\n+-\tbool\n++\tbool \"WEXT_PRIV\"\n+ \n+ config CFG80211\n+ \ttristate \"cfg80211 - wireless configuration API\"\n+@@ -204,7 +204,7 @@ config CFG80211_WEXT_EXPORT\n+ endif # CFG80211\n+ \n+ config LIB80211\n+-\ttristate\n++\ttristate \"LIB80211\"\n+ \tdefault n\n+ \thelp\n+ \t  This options enables a library of common routines used\n+@@ -213,17 +213,17 @@ config LIB80211\n+ \t  Drivers should select this themselves if needed.\n+ \n+ config LIB80211_CRYPT_WEP\n+-\ttristate\n++\ttristate \"LIB80211_CRYPT_WEP\"\n+ \tselect CRYPTO_LIB_ARC4\n+ \n+ config LIB80211_CRYPT_CCMP\n+-\ttristate\n++\ttristate \"LIB80211_CRYPT_CCMP\"\n+ \tselect CRYPTO\n+ \tselect CRYPTO_AES\n+ \tselect CRYPTO_CCM\n+ \n+ config LIB80211_CRYPT_TKIP\n+-\ttristate\n++\ttristate \"LIB80211_CRYPT_TKIP\"\n+ \tselect CRYPTO_LIB_ARC4\n+ \n+ config LIB80211_DEBUG\n+--- a/sound/core/Kconfig\n++++ b/sound/core/Kconfig\n+@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM\n+ \ttristate\n+ \n+ config SND_HWDEP\n+-\ttristate\n++\ttristate \"Sound hardware support\"\n+ \n+ config SND_SEQ_DEVICE\n+ \ttristate\n+@@ -27,7 +27,7 @@ config SND_RAWMIDI\n+ \tselect SND_SEQ_DEVICE if SND_SEQUENCER != n\n+ \n+ config SND_COMPRESS_OFFLOAD\n+-\ttristate\n++\ttristate \"Compression offloading support\"\n+ \n+ config SND_JACK\n+ \tbool\ndiff --git a/target/linux/generic/hack-5.14/260-crypto_test_dependencies.patch b/target/linux/generic/hack-5.14/260-crypto_test_dependencies.patch\nnew file mode 100644\nindex 0000000000..c73a1f1f64\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/260-crypto_test_dependencies.patch\n@@ -0,0 +1,52 @@\n+From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:12:51 +0200\n+Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run\n+\n+Reduces kernel size after LZMA by about 5k on MIPS\n+\n+lede-commit: 044c316167e076479a344c59905e5b435b84a77f\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ crypto/Kconfig   | 13 ++++++-------\n+ crypto/algboss.c |  4 ++++\n+ 2 files changed, 10 insertions(+), 7 deletions(-)\n+\n+--- a/crypto/Kconfig\n++++ b/crypto/Kconfig\n+@@ -120,13 +120,13 @@ config CRYPTO_MANAGER\n+ \t  cbc(aes).\n+ \n+ config CRYPTO_MANAGER2\n+-\tdef_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y)\n+-\tselect CRYPTO_AEAD2\n+-\tselect CRYPTO_HASH2\n+-\tselect CRYPTO_SKCIPHER2\n+-\tselect CRYPTO_AKCIPHER2\n+-\tselect CRYPTO_KPP2\n+-\tselect CRYPTO_ACOMP2\n++\tdef_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS)\n++\tselect CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS\n++\tselect CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS\n++\tselect CRYPTO_SKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS\n++\tselect CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS\n++\tselect CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS\n++\tselect CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS\n+ \n+ config CRYPTO_USER\n+ \ttristate \"Userspace cryptographic algorithm configuration\"\n+--- a/crypto/algboss.c\n++++ b/crypto/algboss.c\n+@@ -211,8 +211,12 @@ static int cryptomgr_schedule_test(struc\n+ \ttype = alg->cra_flags;\n+ \n+ \t/* Do not test internal algorithms. */\n++#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS\n++\ttype |= CRYPTO_ALG_TESTED;\n++#else\n+ \tif (type & CRYPTO_ALG_INTERNAL)\n+ \t\ttype |= CRYPTO_ALG_TESTED;\n++#endif\n+ \n+ \tparam->type = type;\n+ \ndiff --git a/target/linux/generic/hack-5.14/261-lib-arc4-unhide.patch b/target/linux/generic/hack-5.14/261-lib-arc4-unhide.patch\nnew file mode 100644\nindex 0000000000..a7668acfad\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/261-lib-arc4-unhide.patch\n@@ -0,0 +1,15 @@\n+This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We \n+need this to be able to compile this into the kernel and make use of it \n+from backports.\n+\n+--- a/lib/crypto/Kconfig\n++++ b/lib/crypto/Kconfig\n+@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES\n+ \ttristate\n+ \n+ config CRYPTO_LIB_ARC4\n+-\ttristate\n++\ttristate \"ARC4 cipher library\"\n+ \n+ config CRYPTO_ARCH_HAVE_LIB_BLAKE2S\n+ \ttristate\ndiff --git a/target/linux/generic/hack-5.14/280-rfkill-stubs.patch b/target/linux/generic/hack-5.14/280-rfkill-stubs.patch\nnew file mode 100644\nindex 0000000000..7a650d132e\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/280-rfkill-stubs.patch\n@@ -0,0 +1,84 @@\n+From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001\n+From: John Crispin <john@phrozen.org>\n+Date: Fri, 7 Jul 2017 17:13:44 +0200\n+Subject: rfkill: add fake rfkill support\n+\n+allow building of modules depending on RFKILL even if RFKILL is not enabled.\n+\n+Signed-off-by: John Crispin <john@phrozen.org>\n+---\n+ include/linux/rfkill.h |  2 +-\n+ net/Makefile           |  2 +-\n+ net/rfkill/Kconfig     | 14 +++++++++-----\n+ net/rfkill/Makefile    |  2 +-\n+ 4 files changed, 12 insertions(+), 8 deletions(-)\n+\n+--- a/include/linux/rfkill.h\n++++ b/include/linux/rfkill.h\n+@@ -64,7 +64,7 @@ struct rfkill_ops {\n+ \tint\t(*set_block)(void *data, bool blocked);\n+ };\n+ \n+-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)\n++#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE)\n+ /**\n+  * rfkill_alloc - Allocate rfkill structure\n+  * @name: name of the struct -- the string is not copied internally\n+--- a/net/Makefile\n++++ b/net/Makefile\n+@@ -52,7 +52,7 @@ obj-$(CONFIG_TIPC)\t\t+= tipc/\n+ obj-$(CONFIG_NETLABEL)\t\t+= netlabel/\n+ obj-$(CONFIG_IUCV)\t\t+= iucv/\n+ obj-$(CONFIG_SMC)\t\t+= smc/\n+-obj-$(CONFIG_RFKILL)\t\t+= rfkill/\n++obj-$(CONFIG_RFKILL_FULL)\t+= rfkill/\n+ obj-$(CONFIG_NET_9P)\t\t+= 9p/\n+ obj-$(CONFIG_CAIF)\t\t+= caif/\n+ obj-$(CONFIG_DCB)\t\t+= dcb/\n+--- a/net/rfkill/Kconfig\n++++ b/net/rfkill/Kconfig\n+@@ -2,7 +2,11 @@\n+ #\n+ # RF switch subsystem configuration\n+ #\n+-menuconfig RFKILL\n++config RFKILL\n++\tbool\n++\tdefault y\n++\n++menuconfig RFKILL_FULL\n+ \ttristate \"RF switch subsystem support\"\n+ \thelp\n+ \t  Say Y here if you want to have control over RF switches\n+@@ -14,19 +18,19 @@ menuconfig RFKILL\n+ # LED trigger support\n+ config RFKILL_LEDS\n+ \tbool\n+-\tdepends on RFKILL\n++\tdepends on RFKILL_FULL\n+ \tdepends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS\n+ \tdefault y\n+ \n+ config RFKILL_INPUT\n+ \tbool \"RF switch input support\" if EXPERT\n+-\tdepends on RFKILL\n++\tdepends on RFKILL_FULL\n+ \tdepends on INPUT = y || RFKILL = INPUT\n+ \tdefault y if !EXPERT\n+ \n+ config RFKILL_GPIO\n+ \ttristate \"GPIO RFKILL driver\"\n+-\tdepends on RFKILL\n++\tdepends on RFKILL_FULL\n+ \tdepends on GPIOLIB || COMPILE_TEST\n+ \tdefault n\n+ \thelp\n+--- a/net/rfkill/Makefile\n++++ b/net/rfkill/Makefile\n+@@ -5,5 +5,5 @@\n+ \n+ rfkill-y\t\t\t+= core.o\n+ rfkill-$(CONFIG_RFKILL_INPUT)\t+= input.o\n+-obj-$(CONFIG_RFKILL)\t\t+= rfkill.o\n++obj-$(CONFIG_RFKILL_FULL)\t+= rfkill.o\n+ obj-$(CONFIG_RFKILL_GPIO)\t+= rfkill-gpio.o\ndiff --git a/target/linux/generic/hack-5.14/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-5.14/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch\nnew file mode 100644\nindex 0000000000..f21f200136\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch\n@@ -0,0 +1,64 @@\n+From: Ben Menchaca <ben.menchaca@qca.qualcomm.com>\n+Date: Fri, 7 Jun 2013 18:35:22 -0500\n+Subject: MIPS: r4k_cache: use more efficient cache blast\n+\n+Optimize the compiler output for larger cache blast cases that are\n+common for DMA-based networking.\n+\n+Signed-off-by: Ben Menchaca <ben.menchaca@qca.qualcomm.com>\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+--- a/arch/mips/include/asm/r4kcache.h\n++++ b/arch/mips/include/asm/r4kcache.h\n+@@ -286,14 +286,46 @@ static inline void prot##extra##blast_##\n+ \t\t\t\t\t\t    unsigned long end)\t\\\n+ {\t\t\t\t\t\t\t\t\t\\\n+ \tunsigned long lsize = cpu_##desc##_line_size();\t\t\t\\\n++\tunsigned long lsize_2 = lsize * 2;\t\t\t\t\\\n++\tunsigned long lsize_3 = lsize * 3;\t\t\t\t\\\n++\tunsigned long lsize_4 = lsize * 4;\t\t\t\t\\\n++\tunsigned long lsize_5 = lsize * 5;\t\t\t\t\\\n++\tunsigned long lsize_6 = lsize * 6;\t\t\t\t\\\n++\tunsigned long lsize_7 = lsize * 7;\t\t\t\t\\\n++\tunsigned long lsize_8 = lsize * 8;\t\t\t\t\\\n+ \tunsigned long addr = start & ~(lsize - 1);\t\t\t\\\n+-\tunsigned long aend = (end - 1) & ~(lsize - 1);\t\t\t\\\n++\tunsigned long aend = (end + lsize - 1) & ~(lsize - 1);\t\t\\\n++\tint lines = (aend - addr) / lsize;\t\t\t\t\\\n+ \t\t\t\t\t\t\t\t\t\\\n+-\twhile (1) {\t\t\t\t\t\t\t\\\n++\twhile (lines >= 8) {\t\t\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr);\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_2);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_3);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_4);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_5);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_6);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_7);\t\t\t\\\n++\t\taddr += lsize_8;\t\t\t\t\t\\\n++\t\tlines -= 8;\t\t\t\t\t\t\\\n++\t}\t\t\t\t\t\t\t\t\\\n++\t\t\t\t\t\t\t\t\t\\\n++\tif (lines & 0x4) {\t\t\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr);\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_2);\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize_3);\t\t\t\\\n++\t\taddr += lsize_4;\t\t\t\t\t\\\n++\t}\t\t\t\t\t\t\t\t\\\n++\t\t\t\t\t\t\t\t\t\\\n++\tif (lines & 0x2) {\t\t\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr);\t\t\t\t\\\n++\t\tprot##cache_op(hitop, addr + lsize);\t\t\t\\\n++\t\taddr += lsize_2;\t\t\t\t\t\\\n++\t}\t\t\t\t\t\t\t\t\\\n++\t\t\t\t\t\t\t\t\t\\\n++\tif (lines & 0x1) {\t\t\t\t\t\t\\\n+ \t\tprot##cache_op(hitop, addr);\t\t\t\t\\\n+-\t\tif (addr == aend)\t\t\t\t\t\\\n+-\t\t\tbreak;\t\t\t\t\t\t\\\n+-\t\taddr += lsize;\t\t\t\t\t\t\\\n+ \t}\t\t\t\t\t\t\t\t\\\n+ }\n+ \ndiff --git a/target/linux/generic/hack-5.14/301-mips_image_cmdline_hack.patch b/target/linux/generic/hack-5.14/301-mips_image_cmdline_hack.patch\nnew file mode 100644\nindex 0000000000..98af300bbc\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/301-mips_image_cmdline_hack.patch\n@@ -0,0 +1,38 @@\n+From: John Crispin <john@phrozen.org>\n+Subject: hack: kernel: add generic image_cmdline hack to MIPS targets\n+\n+lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+---\n+ arch/mips/Kconfig       | 4 ++++\n+ arch/mips/kernel/head.S | 6 ++++++\n+ 2 files changed, 10 insertions(+)\n+\n+--- a/arch/mips/Kconfig\n++++ b/arch/mips/Kconfig\n+@@ -1203,6 +1203,10 @@ config MIPS_MSC\n+ config SYNC_R4K\n+ \tbool\n+ \n++config IMAGE_CMDLINE_HACK\n++\tbool \"OpenWrt specific image command line hack\"\n++\tdefault n\n++\n+ config NO_IOPORT_MAP\n+ \tdef_bool n\n+ \n+--- a/arch/mips/kernel/head.S\n++++ b/arch/mips/kernel/head.S\n+@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)\n+ \tj\tkernel_entry\n+ #endif /* CONFIG_BOOT_RAW */\n+ \n++#ifdef CONFIG_IMAGE_CMDLINE_HACK\n++\t.ascii\t\"CMDLINE:\"\n++EXPORT(__image_cmdline)\n++\t.fill\t0x400\n++#endif /* CONFIG_IMAGE_CMDLINE_HACK */\n++\n+ \t__REF\n+ \n+ NESTED(kernel_entry, 16, sp)\t\t\t# kernel entry point\ndiff --git a/target/linux/generic/hack-5.14/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch b/target/linux/generic/hack-5.14/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\nnew file mode 100644\nindex 0000000000..70cfadca9c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/312-arm64-cpuinfo-Add-model-name-in-proc-cpuinfo-for-64bit-ta.patch\n@@ -0,0 +1,38 @@\n+From: Sumit Gupta <sumitg@nvidia.com>\n+To: <catalin.marinas@arm.com>, <linux-arm-kernel@lists.infradead.org>,\n+\t<linux-kernel@vger.kernel.org>\n+Cc: <will.deacon@arm.com>, <suzuki.poulose@arm.com>,\n+\t<james.morse@arm.com>, <mark.rutland@arm.com>,\n+\t<yang.shi@linaro.org>, <julien.grall@arm.com>,\n+\t<steve.capper@linaro.org>, <bbasu@nvidia.com>,\n+\t<linux-tegra@vger.kernel.org>, Sumit Gupta <sumitg@nvidia.com>\n+Subject: [PATCH] arm64: cpuinfo: Add \"model name\" in /proc/cpuinfo for 64bit tasks also\n+Date: Mon, 29 Aug 2016 14:32:25 +0530\n+Message-ID: <1472461345-28219-1-git-send-email-sumitg@nvidia.com> (raw)\n+\n+Removed restriction of displaying model name for 32 bit tasks only.\n+Because of this Processor details were not displayed in\n+\"System setting -> Details\" in Ubuntu model name display is generic\n+and can be printed for 64 bit also.\n+\n+model name : ARMv8 Processor rev X (v8l)\n+\n+Signed-off-by: Sumit Gupta <sumitg@nvidia.com>\n+---\n+ arch/arm64/kernel/cpuinfo.c | 3 +--\n+ 1 file changed, 1 insertion(+), 2 deletions(-)\n+\n+--- a/arch/arm64/kernel/cpuinfo.c\n++++ b/arch/arm64/kernel/cpuinfo.c\n+@@ -148,9 +148,8 @@ static int c_show(struct seq_file *m, vo\n+ \t\t * \"processor\".  Give glibc what it expects.\n+ \t\t */\n+ \t\tseq_printf(m, \"processor\\t: %d\\n\", i);\n+-\t\tif (compat)\n+-\t\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n+-\t\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n++\t\tseq_printf(m, \"model name\\t: ARMv8 Processor rev %d (%s)\\n\",\n++\t\t\t   MIDR_REVISION(midr), COMPAT_ELF_PLATFORM);\n+ \n+ \t\tseq_printf(m, \"BogoMIPS\\t: %lu.%02lu\\n\",\n+ \t\t\t   loops_per_jiffy / (500000UL/HZ),\ndiff --git a/target/linux/generic/hack-5.14/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-5.14/321-powerpc_crtsavres_prereq.patch\nnew file mode 100644\nindex 0000000000..215528a90c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/321-powerpc_crtsavres_prereq.patch\n@@ -0,0 +1,38 @@\n+From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001\n+From: \"Alexandros C. Couloumbis\" <alex@ozo.com>\n+Date: Fri, 7 Jul 2017 17:14:51 +0200\n+Subject: hack: arch: powerpc: drop register save/restore library from modules\n+\n+Upstream GCC uses a libgcc function for saving/restoring registers. This\n+makes the code bigger, and upstream kernels need to carry that function\n+for every single kernel module. Our GCC is patched to avoid those\n+references, so we can drop the extra bloat for modules.\n+\n+lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec\n+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>\n+---\n+ arch/powerpc/Makefile | 1 -\n+ 1 file changed, 1 deletion(-)\n+\n+--- a/arch/powerpc/Makefile\n++++ b/arch/powerpc/Makefile\n+@@ -61,19 +61,6 @@ machine-$(CONFIG_PPC64) += 64\n+ machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le\n+ UTS_MACHINE := $(subst $(space),,$(machine-y))\n+ \n+-# XXX This needs to be before we override LD below\n+-ifdef CONFIG_PPC32\n+-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o\n+-else\n+-ifeq ($(call ld-ifversion, -ge, 22500, y),y)\n+-# Have the linker provide sfpr if possible.\n+-# There is a corresponding test in arch/powerpc/lib/Makefile\n+-KBUILD_LDFLAGS_MODULE += --save-restore-funcs\n+-else\n+-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o\n+-endif\n+-endif\n+-\n+ ifdef CONFIG_CPU_LITTLE_ENDIAN\n+ KBUILD_CFLAGS\t+= -mlittle-endian\n+ KBUILD_LDFLAGS\t+= -EL\ndiff --git a/target/linux/generic/hack-5.14/531-debloat_lzma.patch b/target/linux/generic/hack-5.14/531-debloat_lzma.patch\nnew file mode 100644\nindex 0000000000..2f70eee3e9\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/531-debloat_lzma.patch\n@@ -0,0 +1,1040 @@\n+From 3fd297761ac246c54d7723c57fca95c112b99465 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 15 Jul 2017 21:15:44 +0200\n+Subject: lzma: de-bloat the lzma library used by jffs2\n+\n+lede-commit: 3fd1dd08fbcbb78b34efefd32c3032e5c99108d6\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/lzma/LzFind.h  |  17 ---\n+ include/linux/lzma/LzmaDec.h | 101 ---------------\n+ include/linux/lzma/LzmaEnc.h |  20 ---\n+ lib/lzma/LzFind.c            | 287 ++++---------------------------------------\n+ lib/lzma/LzmaDec.c           |  86 +------------\n+ lib/lzma/LzmaEnc.c           | 172 ++------------------------\n+ 6 files changed, 42 insertions(+), 641 deletions(-)\n+\n+--- a/include/linux/lzma/LzFind.h\n++++ b/include/linux/lzma/LzFind.h\n+@@ -55,11 +55,6 @@ typedef struct _CMatchFinder\n+ \n+ #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)\n+ \n+-int MatchFinder_NeedMove(CMatchFinder *p);\n+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);\n+-void MatchFinder_MoveBlock(CMatchFinder *p);\n+-void MatchFinder_ReadIfRequired(CMatchFinder *p);\n+-\n+ void MatchFinder_Construct(CMatchFinder *p);\n+ \n+ /* Conditions:\n+@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,\n+     UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,\n+     ISzAlloc *alloc);\n+ void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);\n+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);\n+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);\n+-\n+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,\n+-    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,\n+-    UInt32 *distances, UInt32 maxLen);\n+ \n+ /*\n+ Conditions:\n+@@ -102,12 +91,6 @@ typedef struct _IMatchFinder\n+ \n+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);\n+ \n+-void MatchFinder_Init(CMatchFinder *p);\n+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\n+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\n+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\n+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\n+-\n+ #ifdef __cplusplus\n+ }\n+ #endif\n+--- a/include/linux/lzma/LzmaDec.h\n++++ b/include/linux/lzma/LzmaDec.h\n+@@ -31,14 +31,6 @@ typedef struct _CLzmaProps\n+   UInt32 dicSize;\n+ } CLzmaProps;\n+ \n+-/* LzmaProps_Decode - decodes properties\n+-Returns:\n+-  SZ_OK\n+-  SZ_ERROR_UNSUPPORTED - Unsupported properties\n+-*/\n+-\n+-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n+-\n+ \n+ /* ---------- LZMA Decoder state ---------- */\n+ \n+@@ -70,8 +62,6 @@ typedef struct\n+ \n+ #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }\n+ \n+-void LzmaDec_Init(CLzmaDec *p);\n+-\n+ /* There are two types of LZMA streams:\n+      0) Stream with end mark. That end mark adds about 6 bytes to compressed size.\n+      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n+@@ -108,97 +98,6 @@ typedef enum\n+ \n+ /* ELzmaStatus is used only as output value for function call */\n+ \n+-\n+-/* ---------- Interfaces ---------- */\n+-\n+-/* There are 3 levels of interfaces:\n+-     1) Dictionary Interface\n+-     2) Buffer Interface\n+-     3) One Call Interface\n+-   You can select any of these interfaces, but don't mix functions from different\n+-   groups for same object. */\n+-\n+-\n+-/* There are two variants to allocate state for Dictionary Interface:\n+-     1) LzmaDec_Allocate / LzmaDec_Free\n+-     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs\n+-   You can use variant 2, if you set dictionary buffer manually.\n+-   For Buffer Interface you must always use variant 1.\n+-\n+-LzmaDec_Allocate* can return:\n+-  SZ_OK\n+-  SZ_ERROR_MEM         - Memory allocation error\n+-  SZ_ERROR_UNSUPPORTED - Unsupported properties\n+-*/\n+-\n+-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);\n+-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);\n+-\n+-SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);\n+-void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);\n+-\n+-/* ---------- Dictionary Interface ---------- */\n+-\n+-/* You can use it, if you want to eliminate the overhead for data copying from\n+-   dictionary to some other external buffer.\n+-   You must work with CLzmaDec variables directly in this interface.\n+-\n+-   STEPS:\n+-     LzmaDec_Constr()\n+-     LzmaDec_Allocate()\n+-     for (each new stream)\n+-     {\n+-       LzmaDec_Init()\n+-       while (it needs more decompression)\n+-       {\n+-         LzmaDec_DecodeToDic()\n+-         use data from CLzmaDec::dic and update CLzmaDec::dicPos\n+-       }\n+-     }\n+-     LzmaDec_Free()\n+-*/\n+-\n+-/* LzmaDec_DecodeToDic\n+-\n+-   The decoding to internal dictionary buffer (CLzmaDec::dic).\n+-   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!\n+-\n+-finishMode:\n+-  It has meaning only if the decoding reaches output limit (dicLimit).\n+-  LZMA_FINISH_ANY - Decode just dicLimit bytes.\n+-  LZMA_FINISH_END - Stream must be finished after dicLimit.\n+-\n+-Returns:\n+-  SZ_OK\n+-    status:\n+-      LZMA_STATUS_FINISHED_WITH_MARK\n+-      LZMA_STATUS_NOT_FINISHED\n+-      LZMA_STATUS_NEEDS_MORE_INPUT\n+-      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n+-  SZ_ERROR_DATA - Data error\n+-*/\n+-\n+-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,\n+-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n+-\n+-\n+-/* ---------- Buffer Interface ---------- */\n+-\n+-/* It's zlib-like interface.\n+-   See LzmaDec_DecodeToDic description for information about STEPS and return results,\n+-   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need\n+-   to work with CLzmaDec variables manually.\n+-\n+-finishMode:\n+-  It has meaning only if the decoding reaches output limit (*destLen).\n+-  LZMA_FINISH_ANY - Decode just destLen bytes.\n+-  LZMA_FINISH_END - Stream must be finished after (*destLen).\n+-*/\n+-\n+-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,\n+-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n+-\n+-\n+ /* ---------- One Call Interface ---------- */\n+ \n+ /* LzmaDecode\n+--- a/include/linux/lzma/LzmaEnc.h\n++++ b/include/linux/lzma/LzmaEnc.h\n+@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps\n+ } CLzmaEncProps;\n+ \n+ void LzmaEncProps_Init(CLzmaEncProps *p);\n+-void LzmaEncProps_Normalize(CLzmaEncProps *p);\n+-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);\n+-\n+ \n+ /* ---------- CLzmaEncHandle Interface ---------- */\n+ \n+@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *\n+ void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);\n+ SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);\n+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);\n+-SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,\n+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n+ SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n+     int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n+ \n+-/* ---------- One Call Interface ---------- */\n+-\n+-/* LzmaEncode\n+-Return code:\n+-  SZ_OK               - OK\n+-  SZ_ERROR_MEM        - Memory allocation error\n+-  SZ_ERROR_PARAM      - Incorrect paramater\n+-  SZ_ERROR_OUTPUT_EOF - output buffer overflow\n+-  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)\n+-*/\n+-\n+-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n+-    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n+-\n+ #ifdef __cplusplus\n+ }\n+ #endif\n+--- a/lib/lzma/LzFind.c\n++++ b/lib/lzma/LzFind.c\n+@@ -14,9 +14,15 @@\n+ \n+ #define kStartMaxLen 3\n+ \n++#if 0\n++#define DIRECT_INPUT\tp->directInput\n++#else\n++#define DIRECT_INPUT\t1\n++#endif\n++\n+ static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)\n+ {\n+-  if (!p->directInput)\n++  if (!DIRECT_INPUT)\n+   {\n+     alloc->Free(alloc, p->bufferBase);\n+     p->bufferBase = 0;\n+@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder\n+ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)\n+ {\n+   UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;\n+-  if (p->directInput)\n++  if (DIRECT_INPUT)\n+   {\n+     p->blockSize = blockSize;\n+     return 1;\n+@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinde\n+   return (p->bufferBase != 0);\n+ }\n+ \n+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }\n+-Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }\n++static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }\n++static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }\n+ \n+-UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }\n++static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }\n+ \n+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)\n++static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)\n+ {\n+   p->posLimit -= subValue;\n+   p->pos -= subValue;\n+@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatch\n+ {\n+   if (p->streamEndWasReached || p->result != SZ_OK)\n+     return;\n+-  if (p->directInput)\n++  if (DIRECT_INPUT)\n+   {\n+     UInt32 curSize = 0xFFFFFFFF - p->streamPos;\n+     if (curSize > p->directInputRem)\n+@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatch\n+   }\n+ }\n+ \n+-void MatchFinder_MoveBlock(CMatchFinder *p)\n++static void MatchFinder_MoveBlock(CMatchFinder *p)\n+ {\n+   memmove(p->bufferBase,\n+     p->buffer - p->keepSizeBefore,\n+@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder\n+   p->buffer = p->bufferBase + p->keepSizeBefore;\n+ }\n+ \n+-int MatchFinder_NeedMove(CMatchFinder *p)\n++static int MatchFinder_NeedMove(CMatchFinder *p)\n+ {\n+-  if (p->directInput)\n++  if (DIRECT_INPUT)\n+     return 0;\n+   /* if (p->streamEndWasReached) return 0; */\n+   return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);\n+ }\n+ \n+-void MatchFinder_ReadIfRequired(CMatchFinder *p)\n+-{\n+-  if (p->streamEndWasReached)\n+-    return;\n+-  if (p->keepSizeAfter >= p->streamPos - p->pos)\n+-    MatchFinder_ReadBlock(p);\n+-}\n+-\n+ static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)\n+ {\n+   if (MatchFinder_NeedMove(p))\n+@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatch\n+   p->posLimit = p->pos + limit;\n+ }\n+ \n+-void MatchFinder_Init(CMatchFinder *p)\n++static void MatchFinder_Init(CMatchFinder *p)\n+ {\n+   UInt32 i;\n+   for (i = 0; i < p->hashSizeSum; i++)\n+@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CM\n+   return (p->pos - p->historySize - 1) & kNormalizeMask;\n+ }\n+ \n+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)\n++static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)\n+ {\n+   UInt32 i;\n+   for (i = 0; i < numItems; i++)\n+@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMat\n+   MatchFinder_SetLimits(p);\n+ }\n+ \n+-static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n+-    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n+-    UInt32 *distances, UInt32 maxLen)\n+-{\n+-  son[_cyclicBufferPos] = curMatch;\n+-  for (;;)\n+-  {\n+-    UInt32 delta = pos - curMatch;\n+-    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n+-      return distances;\n+-    {\n+-      const Byte *pb = cur - delta;\n+-      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];\n+-      if (pb[maxLen] == cur[maxLen] && *pb == *cur)\n+-      {\n+-        UInt32 len = 0;\n+-        while (++len != lenLimit)\n+-          if (pb[len] != cur[len])\n+-            break;\n+-        if (maxLen < len)\n+-        {\n+-          *distances++ = maxLen = len;\n+-          *distances++ = delta - 1;\n+-          if (len == lenLimit)\n+-            return distances;\n+-        }\n+-      }\n+-    }\n+-  }\n+-}\n+-\n+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n++static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n+     UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n+     UInt32 *distances, UInt32 maxLen)\n+ {\n+@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLi\n+   p->buffer++; \\\n+   if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);\n+ \n+-#define MOVE_POS_RET MOVE_POS return offset;\n+-\n+ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }\n+ \n++#define MOVE_POS_RET MatchFinder_MovePos(p); return offset;\n++\n+ #define GET_MATCHES_HEADER2(minLen, ret_op) \\\n+   UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \\\n+   lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \\\n+@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFi\n+   distances + offset, maxLen) - distances); MOVE_POS_RET;\n+ \n+ #define SKIP_FOOTER \\\n+-  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;\n+-\n+-static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+-{\n+-  UInt32 offset;\n+-  GET_MATCHES_HEADER(2)\n+-  HASH2_CALC;\n+-  curMatch = p->hash[hashValue];\n+-  p->hash[hashValue] = p->pos;\n+-  offset = 0;\n+-  GET_MATCHES_FOOTER(offset, 1)\n+-}\n+-\n+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+-{\n+-  UInt32 offset;\n+-  GET_MATCHES_HEADER(3)\n+-  HASH_ZIP_CALC;\n+-  curMatch = p->hash[hashValue];\n+-  p->hash[hashValue] = p->pos;\n+-  offset = 0;\n+-  GET_MATCHES_FOOTER(offset, 2)\n+-}\n+-\n+-static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+-{\n+-  UInt32 hash2Value, delta2, maxLen, offset;\n+-  GET_MATCHES_HEADER(3)\n+-\n+-  HASH3_CALC;\n+-\n+-  delta2 = p->pos - p->hash[hash2Value];\n+-  curMatch = p->hash[kFix3HashSize + hashValue];\n+-\n+-  p->hash[hash2Value] =\n+-  p->hash[kFix3HashSize + hashValue] = p->pos;\n+-\n+-\n+-  maxLen = 2;\n+-  offset = 0;\n+-  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n+-  {\n+-    for (; maxLen != lenLimit; maxLen++)\n+-      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n+-        break;\n+-    distances[0] = maxLen;\n+-    distances[1] = delta2 - 1;\n+-    offset = 2;\n+-    if (maxLen == lenLimit)\n+-    {\n+-      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));\n+-      MOVE_POS_RET;\n+-    }\n+-  }\n+-  GET_MATCHES_FOOTER(offset, maxLen)\n+-}\n++  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p);\n+ \n+ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+ {\n+@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches\n+   GET_MATCHES_FOOTER(offset, maxLen)\n+ }\n+ \n+-static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+-{\n+-  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;\n+-  GET_MATCHES_HEADER(4)\n+-\n+-  HASH4_CALC;\n+-\n+-  delta2 = p->pos - p->hash[                hash2Value];\n+-  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];\n+-  curMatch = p->hash[kFix4HashSize + hashValue];\n+-\n+-  p->hash[                hash2Value] =\n+-  p->hash[kFix3HashSize + hash3Value] =\n+-  p->hash[kFix4HashSize + hashValue] = p->pos;\n+-\n+-  maxLen = 1;\n+-  offset = 0;\n+-  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n+-  {\n+-    distances[0] = maxLen = 2;\n+-    distances[1] = delta2 - 1;\n+-    offset = 2;\n+-  }\n+-  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)\n+-  {\n+-    maxLen = 3;\n+-    distances[offset + 1] = delta3 - 1;\n+-    offset += 2;\n+-    delta2 = delta3;\n+-  }\n+-  if (offset != 0)\n+-  {\n+-    for (; maxLen != lenLimit; maxLen++)\n+-      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n+-        break;\n+-    distances[offset - 2] = maxLen;\n+-    if (maxLen == lenLimit)\n+-    {\n+-      p->son[p->cyclicBufferPos] = curMatch;\n+-      MOVE_POS_RET;\n+-    }\n+-  }\n+-  if (maxLen < 3)\n+-    maxLen = 3;\n+-  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n+-    distances + offset, maxLen) - (distances));\n+-  MOVE_POS_RET\n+-}\n+-\n+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n+-{\n+-  UInt32 offset;\n+-  GET_MATCHES_HEADER(3)\n+-  HASH_ZIP_CALC;\n+-  curMatch = p->hash[hashValue];\n+-  p->hash[hashValue] = p->pos;\n+-  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n+-    distances, 2) - (distances));\n+-  MOVE_POS_RET\n+-}\n+-\n+-static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+-{\n+-  do\n+-  {\n+-    SKIP_HEADER(2)\n+-    HASH2_CALC;\n+-    curMatch = p->hash[hashValue];\n+-    p->hash[hashValue] = p->pos;\n+-    SKIP_FOOTER\n+-  }\n+-  while (--num != 0);\n+-}\n+-\n+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+-{\n+-  do\n+-  {\n+-    SKIP_HEADER(3)\n+-    HASH_ZIP_CALC;\n+-    curMatch = p->hash[hashValue];\n+-    p->hash[hashValue] = p->pos;\n+-    SKIP_FOOTER\n+-  }\n+-  while (--num != 0);\n+-}\n+-\n+-static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+-{\n+-  do\n+-  {\n+-    UInt32 hash2Value;\n+-    SKIP_HEADER(3)\n+-    HASH3_CALC;\n+-    curMatch = p->hash[kFix3HashSize + hashValue];\n+-    p->hash[hash2Value] =\n+-    p->hash[kFix3HashSize + hashValue] = p->pos;\n+-    SKIP_FOOTER\n+-  }\n+-  while (--num != 0);\n+-}\n+-\n+ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+ {\n+   do\n+@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchF\n+   while (--num != 0);\n+ }\n+ \n+-static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+-{\n+-  do\n+-  {\n+-    UInt32 hash2Value, hash3Value;\n+-    SKIP_HEADER(4)\n+-    HASH4_CALC;\n+-    curMatch = p->hash[kFix4HashSize + hashValue];\n+-    p->hash[                hash2Value] =\n+-    p->hash[kFix3HashSize + hash3Value] =\n+-    p->hash[kFix4HashSize + hashValue] = p->pos;\n+-    p->son[p->cyclicBufferPos] = curMatch;\n+-    MOVE_POS\n+-  }\n+-  while (--num != 0);\n+-}\n+-\n+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n+-{\n+-  do\n+-  {\n+-    SKIP_HEADER(3)\n+-    HASH_ZIP_CALC;\n+-    curMatch = p->hash[hashValue];\n+-    p->hash[hashValue] = p->pos;\n+-    p->son[p->cyclicBufferPos] = curMatch;\n+-    MOVE_POS\n+-  }\n+-  while (--num != 0);\n+-}\n+-\n+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)\n+ {\n+   vTable->Init = (Mf_Init_Func)MatchFinder_Init;\n+   vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;\n+   vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;\n+   vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;\n+-  if (!p->btMode)\n+-  {\n+-    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;\n+-    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;\n+-  }\n+-  else if (p->numHashBytes == 2)\n+-  {\n+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;\n+-    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;\n+-  }\n+-  else if (p->numHashBytes == 3)\n+-  {\n+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;\n+-    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;\n+-  }\n+-  else\n+-  {\n+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;\n+-    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;\n+-  }\n++  vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;\n++  vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;\n+ }\n+--- a/lib/lzma/LzmaDec.c\n++++ b/lib/lzma/LzmaDec.c\n+@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,\n+   p->needFlush = 0;\n+ }\n+ \n+-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n++static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n+ {\n+   p->needFlush = 1;\n+   p->remainLen = 0;\n+@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p\n+     p->needInitState = 1;\n+ }\n+ \n+-void LzmaDec_Init(CLzmaDec *p)\n++static void LzmaDec_Init(CLzmaDec *p)\n+ {\n+   p->dicPos = 0;\n+   LzmaDec_InitDicAndState(p, True, True);\n+@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD\n+   p->needInitState = 0;\n+ }\n+ \n+-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n++static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n+     ELzmaFinishMode finishMode, ELzmaStatus *status)\n+ {\n+   SizeT inSize = *srcLen;\n+@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si\n+   return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;\n+ }\n+ \n+-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)\n+-{\n+-  SizeT outSize = *destLen;\n+-  SizeT inSize = *srcLen;\n+-  *srcLen = *destLen = 0;\n+-  for (;;)\n+-  {\n+-    SizeT inSizeCur = inSize, outSizeCur, dicPos;\n+-    ELzmaFinishMode curFinishMode;\n+-    SRes res;\n+-    if (p->dicPos == p->dicBufSize)\n+-      p->dicPos = 0;\n+-    dicPos = p->dicPos;\n+-    if (outSize > p->dicBufSize - dicPos)\n+-    {\n+-      outSizeCur = p->dicBufSize;\n+-      curFinishMode = LZMA_FINISH_ANY;\n+-    }\n+-    else\n+-    {\n+-      outSizeCur = dicPos + outSize;\n+-      curFinishMode = finishMode;\n+-    }\n+-\n+-    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);\n+-    src += inSizeCur;\n+-    inSize -= inSizeCur;\n+-    *srcLen += inSizeCur;\n+-    outSizeCur = p->dicPos - dicPos;\n+-    memcpy(dest, p->dic + dicPos, outSizeCur);\n+-    dest += outSizeCur;\n+-    outSize -= outSizeCur;\n+-    *destLen += outSizeCur;\n+-    if (res != 0)\n+-      return res;\n+-    if (outSizeCur == 0 || outSize == 0)\n+-      return SZ_OK;\n+-  }\n+-}\n+-\n+-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n++static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n+ {\n+   alloc->Free(alloc, p->probs);\n+   p->probs = 0;\n+ }\n+ \n+-static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)\n+-{\n+-  alloc->Free(alloc, p->dic);\n+-  p->dic = 0;\n+-}\n+-\n+-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)\n+-{\n+-  LzmaDec_FreeProbs(p, alloc);\n+-  LzmaDec_FreeDict(p, alloc);\n+-}\n+-\n+-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n++static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n+ {\n+   UInt32 dicSize;\n+   Byte d;\n+@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma\n+   return SZ_OK;\n+ }\n+ \n+-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n++static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n+ {\n+   CLzmaProps propNew;\n+   RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n+@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,\n+   p->prop = propNew;\n+   return SZ_OK;\n+ }\n+-\n+-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n+-{\n+-  CLzmaProps propNew;\n+-  SizeT dicBufSize;\n+-  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n+-  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n+-  dicBufSize = propNew.dicSize;\n+-  if (p->dic == 0 || dicBufSize != p->dicBufSize)\n+-  {\n+-    LzmaDec_FreeDict(p, alloc);\n+-    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);\n+-    if (p->dic == 0)\n+-    {\n+-      LzmaDec_FreeProbs(p, alloc);\n+-      return SZ_ERROR_MEM;\n+-    }\n+-  }\n+-  p->dicBufSize = dicBufSize;\n+-  p->prop = propNew;\n+-  return SZ_OK;\n+-}\n+ \n+ SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n+     const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n+--- a/lib/lzma/LzmaEnc.c\n++++ b/lib/lzma/LzmaEnc.c\n+@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)\n+   p->writeEndMark = 0;\n+ }\n+ \n+-void LzmaEncProps_Normalize(CLzmaEncProps *p)\n++static void LzmaEncProps_Normalize(CLzmaEncProps *p)\n+ {\n+   int level = p->level;\n+   if (level < 0) level = 5;\n+@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp\n+       #endif\n+ }\n+ \n+-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)\n++static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)\n+ {\n+   CLzmaEncProps props = *props2;\n+   LzmaEncProps_Normalize(&props);\n+@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL\n+ \n+ #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }\n+ \n+-UInt32 GetPosSlot1(UInt32 pos)\n++static UInt32 GetPosSlot1(UInt32 pos)\n+ {\n+   UInt32 res;\n+   BSR2_RET(pos, res);\n+@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)\n+ #define kNumLogBits (9 + (int)sizeof(size_t) / 2)\n+ #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)\n+ \n+-void LzmaEnc_FastPosInit(Byte *g_FastPos)\n++static void LzmaEnc_FastPosInit(Byte *g_FastPos)\n+ {\n+   int c = 2, slotFast;\n+   g_FastPos[0] = 0;\n+@@ -339,58 +339,6 @@ typedef struct\n+   CSaveState saveState;\n+ } CLzmaEnc;\n+ \n+-void LzmaEnc_SaveState(CLzmaEncHandle pp)\n+-{\n+-  CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  CSaveState *dest = &p->saveState;\n+-  int i;\n+-  dest->lenEnc = p->lenEnc;\n+-  dest->repLenEnc = p->repLenEnc;\n+-  dest->state = p->state;\n+-\n+-  for (i = 0; i < kNumStates; i++)\n+-  {\n+-    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n+-    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n+-  }\n+-  for (i = 0; i < kNumLenToPosStates; i++)\n+-    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n+-  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n+-  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n+-  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n+-  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n+-  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n+-  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n+-  memcpy(dest->reps, p->reps, sizeof(p->reps));\n+-  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));\n+-}\n+-\n+-void LzmaEnc_RestoreState(CLzmaEncHandle pp)\n+-{\n+-  CLzmaEnc *dest = (CLzmaEnc *)pp;\n+-  const CSaveState *p = &dest->saveState;\n+-  int i;\n+-  dest->lenEnc = p->lenEnc;\n+-  dest->repLenEnc = p->repLenEnc;\n+-  dest->state = p->state;\n+-\n+-  for (i = 0; i < kNumStates; i++)\n+-  {\n+-    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n+-    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n+-  }\n+-  for (i = 0; i < kNumLenToPosStates; i++)\n+-    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n+-  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n+-  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n+-  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n+-  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n+-  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n+-  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n+-  memcpy(dest->reps, p->reps, sizeof(p->reps));\n+-  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));\n+-}\n+-\n+ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)\n+ {\n+   CLzmaEnc *p = (CLzmaEnc *)pp;\n+@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeE\n+   while (symbol < 0x10000);\n+ }\n+ \n+-void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)\n++static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)\n+ {\n+   UInt32 i;\n+   for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))\n+@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc\n+   p->matchPriceCount = 0;\n+ }\n+ \n+-void LzmaEnc_Construct(CLzmaEnc *p)\n++static void LzmaEnc_Construct(CLzmaEnc *p)\n+ {\n+   RangeEnc_Construct(&p->rc);\n+   MatchFinder_Construct(&p->matchFinderBase);\n+@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *\n+   return p;\n+ }\n+ \n+-void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)\n++static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)\n+ {\n+   alloc->Free(alloc, p->litProbs);\n+   alloc->Free(alloc, p->saveState.litProbs);\n+@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAl\n+   p->saveState.litProbs = 0;\n+ }\n+ \n+-void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)\n++static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)\n+ {\n+   #ifndef _7ZIP_ST\n+   MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);\n+@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, U\n+   return SZ_OK;\n+ }\n+ \n+-void LzmaEnc_Init(CLzmaEnc *p)\n++static void LzmaEnc_Init(CLzmaEnc *p)\n+ {\n+   UInt32 i;\n+   p->state = 0;\n+@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p)\n+   p->lpMask = (1 << p->lp) - 1;\n+ }\n+ \n+-void LzmaEnc_InitPrices(CLzmaEnc *p)\n++static void LzmaEnc_InitPrices(CLzmaEnc *p)\n+ {\n+   if (!p->fastMode)\n+   {\n+@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEn\n+   return SZ_OK;\n+ }\n+ \n+-static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,\n+-    ISzAlloc *alloc, ISzAlloc *allocBig)\n+-{\n+-  CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  p->matchFinderBase.stream = inStream;\n+-  p->needInit = 1;\n+-  p->rc.outStream = outStream;\n+-  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);\n+-}\n+-\n+-SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,\n+-    ISeqInStream *inStream, UInt32 keepWindowSize,\n+-    ISzAlloc *alloc, ISzAlloc *allocBig)\n+-{\n+-  CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  p->matchFinderBase.stream = inStream;\n+-  p->needInit = 1;\n+-  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n+-}\n+-\n+ static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)\n+ {\n+   p->matchFinderBase.directInput = 1;\n+@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc\n+   p->matchFinderBase.directInputRem = srcLen;\n+ }\n+ \n+-SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,\n++static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,\n+     UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n+ {\n+   CLzmaEnc *p = (CLzmaEnc *)pp;\n+@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p\n+   return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n+ }\n+ \n+-void LzmaEnc_Finish(CLzmaEncHandle pp)\n++static void LzmaEnc_Finish(CLzmaEncHandle pp)\n+ {\n+   #ifndef _7ZIP_ST\n+   CLzmaEnc *p = (CLzmaEnc *)pp;\n+@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const vo\n+   return size;\n+ }\n+ \n+-\n+-UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)\n+-{\n+-  const CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);\n+-}\n+-\n+-const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)\n+-{\n+-  const CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;\n+-}\n+-\n+-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,\n+-    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)\n+-{\n+-  CLzmaEnc *p = (CLzmaEnc *)pp;\n+-  UInt64 nowPos64;\n+-  SRes res;\n+-  CSeqOutStreamBuf outStream;\n+-\n+-  outStream.funcTable.Write = MyWrite;\n+-  outStream.data = dest;\n+-  outStream.rem = *destLen;\n+-  outStream.overflow = False;\n+-\n+-  p->writeEndMark = False;\n+-  p->finished = False;\n+-  p->result = SZ_OK;\n+-\n+-  if (reInit)\n+-    LzmaEnc_Init(p);\n+-  LzmaEnc_InitPrices(p);\n+-  nowPos64 = p->nowPos64;\n+-  RangeEnc_Init(&p->rc);\n+-  p->rc.outStream = &outStream.funcTable;\n+-\n+-  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);\n+-\n+-  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);\n+-  *destLen -= outStream.rem;\n+-  if (outStream.overflow)\n+-    return SZ_ERROR_OUTPUT_EOF;\n+-\n+-  return res;\n+-}\n+-\n+ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)\n+ {\n+   SRes res = SZ_OK;\n+@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p,\n+   return res;\n+ }\n+ \n+-SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,\n+-    ISzAlloc *alloc, ISzAlloc *allocBig)\n+-{\n+-  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));\n+-  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);\n+-}\n+-\n+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)\n+ {\n+   CLzmaEnc *p = (CLzmaEnc *)pp;\n+@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp\n+     return SZ_ERROR_OUTPUT_EOF;\n+   return res;\n+ }\n+-\n+-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n+-    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)\n+-{\n+-  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);\n+-  SRes res;\n+-  if (p == 0)\n+-    return SZ_ERROR_MEM;\n+-\n+-  res = LzmaEnc_SetProps(p, props);\n+-  if (res == SZ_OK)\n+-  {\n+-    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);\n+-    if (res == SZ_OK)\n+-      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,\n+-          writeEndMark, progress, alloc, allocBig);\n+-  }\n+-\n+-  LzmaEnc_Destroy(p, alloc, allocBig);\n+-  return res;\n+-}\ndiff --git a/target/linux/generic/hack-5.14/640-bridge-only-accept-EAP-locally.patch b/target/linux/generic/hack-5.14/640-bridge-only-accept-EAP-locally.patch\nnew file mode 100644\nindex 0000000000..29a4f7f3a0\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/640-bridge-only-accept-EAP-locally.patch\n@@ -0,0 +1,41 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:18:54 +0200\n+Subject: bridge: only accept EAP locally\n+\n+When bridging, do not forward EAP frames to other ports, only deliver\n+them locally, regardless of the state.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+[add disable_eap_hack sysfs attribute]\n+Signed-off-by: Etienne Champetier <champetier.etienne@gmail.com>\n+---\n+\n+--- a/net/bridge/br_input.c\n++++ b/net/bridge/br_input.c\n+@@ -103,10 +103,14 @@ int br_handle_frame_finish(struct net *n\n+ \t\t}\n+ \t}\n+ \n++\tBR_INPUT_SKB_CB(skb)->brdev = br->dev;\n++\n++\tif (skb->protocol == htons(ETH_P_PAE) && !br->disable_eap_hack)\n++\t\treturn br_pass_frame_up(skb);\n++\n+ \tif (state == BR_STATE_LEARNING)\n+ \t\tgoto drop;\n+ \n+-\tBR_INPUT_SKB_CB(skb)->brdev = br->dev;\n+ \tBR_INPUT_SKB_CB(skb)->src_port_isolated = !!(p->flags & BR_ISOLATED);\n+ \n+ \tif (IS_ENABLED(CONFIG_INET) &&\n+--- a/net/bridge/br_private.h\n++++ b/net/bridge/br_private.h\n+@@ -402,6 +402,8 @@ struct net_bridge {\n+ \tu16\t\t\t\tgroup_fwd_mask;\n+ \tu16\t\t\t\tgroup_fwd_mask_required;\n+ \n++\tbool\t\t\t\tdisable_eap_hack;\n++\n+ \t/* STP */\n+ \tbridge_id\t\t\tdesignated_root;\n+ \tbridge_id\t\t\tbridge_id;\ndiff --git a/target/linux/generic/hack-5.14/645-netfilter-connmark-introduce-set-dscpmark.patch b/target/linux/generic/hack-5.14/645-netfilter-connmark-introduce-set-dscpmark.patch\nnew file mode 100644\nindex 0000000000..2d3fe01a75\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/645-netfilter-connmark-introduce-set-dscpmark.patch\n@@ -0,0 +1,212 @@\n+From eda40b8c8c82e0f2789d6bc8bf63846dce2e8f32 Mon Sep 17 00:00:00 2001\n+From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>\n+Date: Sat, 23 Mar 2019 09:29:49 +0000\n+Subject: [PATCH] netfilter: connmark: introduce set-dscpmark\n+\n+set-dscpmark is a method of storing the DSCP of an ip packet into\n+conntrack mark.  In combination with a suitable tc filter action\n+(act_ctinfo) DSCP values are able to be stored in the mark on egress and\n+restored on ingress across links that otherwise alter or bleach DSCP.\n+\n+This is useful for qdiscs such as CAKE which are able to shape according\n+to policies based on DSCP.\n+\n+Ingress classification is traditionally a challenging task since\n+iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT\n+lookups, hence are unable to see internal IPv4 addresses as used on the\n+typical home masquerading gateway.\n+\n+x_tables CONNMARK set-dscpmark target solves the problem of storing the\n+DSCP to the conntrack mark in a way suitable for the new act_ctinfo tc\n+action to restore.\n+\n+The set-dscpmark option accepts 2 parameters, a 32bit 'dscpmask' and a\n+32bit 'statemask'.  The dscp mask must be 6 contiguous bits and\n+represents the area where the DSCP will be stored in the connmark.  The\n+state mask is a minimum 1 bit length mask that must not overlap with the\n+dscpmask.  It represents a flag which is set when the DSCP has been\n+stored in the conntrack mark. This is useful to implement a 'one shot'\n+iptables based classification where the 'complicated' iptables rules are\n+only run once to classify the connection on initial (egress) packet and\n+subsequent packets are all marked/restored with the same DSCP.  A state\n+mask of zero disables the setting of a status bit/s.\n+\n+example syntax with a suitably modified iptables user space application:\n+\n+iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000\n+\n+Would store the DSCP in the top 6 bits of the 32bit mark field, and use\n+the LSB of the top byte as the 'DSCP has been stored' marker.\n+\n+|----0xFC----conntrack mark----000000---|\n+| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|\n+| DSCP       | unused | flag  |unused   |\n+|-----------------------0x01---000000---|\n+      ^                   ^\n+      |                   |\n+      ---|             Conditional flag\n+         |             set this when dscp\n+|-ip diffserv-|        stored in mark\n+| 6 bits      |\n+|-------------|\n+\n+an identically configured tc action to restore looks like:\n+\n+tc filter show dev eth0 ingress\n+filter parent ffff: protocol all pref 10 u32 chain 0\n+filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1\n+filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1: not_in_hw\n+  match 00000000/00000000 at 0\n+\taction order 1: ctinfo zone 0 pipe\n+\t index 2 ref 1 bind 1 dscp 0xfc000000/0x1000000\n+\n+\taction order 2: mirred (Egress Redirect to device ifb4eth0) stolen\n+\tindex 1 ref 1 bind 1\n+\n+|----0xFC----conntrack mark----000000---|\n+| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|\n+| DSCP       | unused | flag  |unused   |\n+|-----------------------0x01---000000---|\n+      |                   |\n+      |                   |\n+      ---|             Conditional flag\n+         v             only restore if set\n+|-ip diffserv-|\n+| 6 bits      |\n+|-------------|\n+\n+Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>\n+---\n+ include/uapi/linux/netfilter/xt_connmark.h | 10 ++++\n+ net/netfilter/xt_connmark.c                | 55 ++++++++++++++++++----\n+ 2 files changed, 57 insertions(+), 8 deletions(-)\n+\n+--- a/include/uapi/linux/netfilter/xt_connmark.h\n++++ b/include/uapi/linux/netfilter/xt_connmark.h\n+@@ -20,6 +20,11 @@ enum {\n+ };\n+ \n+ enum {\n++\tXT_CONNMARK_VALUE =\t(1 << 0),\n++\tXT_CONNMARK_DSCP = \t(1 << 1)\n++};\n++\n++enum {\n+ \tD_SHIFT_LEFT = 0,\n+ \tD_SHIFT_RIGHT,\n+ };\n+@@ -34,6 +39,11 @@ struct xt_connmark_tginfo2 {\n+ \t__u8 shift_dir, shift_bits, mode;\n+ };\n+ \n++struct xt_connmark_tginfo3 {\n++\t__u32 ctmark, ctmask, nfmask;\n++\t__u8 shift_dir, shift_bits, mode, func;\n++};\n++\n+ struct xt_connmark_mtinfo1 {\n+ \t__u32 mark, mask;\n+ \t__u8 invert;\n+--- a/net/netfilter/xt_connmark.c\n++++ b/net/netfilter/xt_connmark.c\n+@@ -24,12 +24,13 @@ MODULE_ALIAS(\"ipt_connmark\");\n+ MODULE_ALIAS(\"ip6t_connmark\");\n+ \n+ static unsigned int\n+-connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo2 *info)\n++connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo3 *info)\n+ {\n+ \tenum ip_conntrack_info ctinfo;\n+ \tu_int32_t new_targetmark;\n+ \tstruct nf_conn *ct;\n+ \tu_int32_t newmark;\n++\tu_int8_t dscp;\n+ \n+ \tct = nf_ct_get(skb, &ctinfo);\n+ \tif (ct == NULL)\n+@@ -37,12 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c\n+ \n+ \tswitch (info->mode) {\n+ \tcase XT_CONNMARK_SET:\n+-\t\tnewmark = (ct->mark & ~info->ctmask) ^ info->ctmark;\n+-\t\tif (info->shift_dir == D_SHIFT_RIGHT)\n+-\t\t\tnewmark >>= info->shift_bits;\n+-\t\telse\n+-\t\t\tnewmark <<= info->shift_bits;\n++\t\tnewmark = ct->mark;\n++\t\tif (info->func & XT_CONNMARK_VALUE) {\n++\t\t\tnewmark = (newmark & ~info->ctmask) ^ info->ctmark;\n++\t\t\tif (info->shift_dir == D_SHIFT_RIGHT)\n++\t\t\t\tnewmark >>= info->shift_bits;\n++\t\t\telse\n++\t\t\t\tnewmark <<= info->shift_bits;\n++\t\t} else if (info->func & XT_CONNMARK_DSCP) {\n++\t\t\tif (skb->protocol == htons(ETH_P_IP))\n++\t\t\t\tdscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2;\n++\t\t\telse if (skb->protocol == htons(ETH_P_IPV6))\n++\t\t\t\tdscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2;\n++\t\t\telse\t/* protocol doesn't have diffserv */\n++\t\t\t\tbreak;\n+ \n++\t\t\tnewmark = (newmark & ~info->ctmark) |\n++\t\t\t\t  (info->ctmask | (dscp << info->shift_bits));\n++\t\t}\n+ \t\tif (ct->mark != newmark) {\n+ \t\t\tct->mark = newmark;\n+ \t\t\tnf_conntrack_event_cache(IPCT_MARK, ct);\n+@@ -81,20 +94,36 @@ static unsigned int\n+ connmark_tg(struct sk_buff *skb, const struct xt_action_param *par)\n+ {\n+ \tconst struct xt_connmark_tginfo1 *info = par->targinfo;\n+-\tconst struct xt_connmark_tginfo2 info2 = {\n++\tconst struct xt_connmark_tginfo3 info3 = {\n+ \t\t.ctmark\t= info->ctmark,\n+ \t\t.ctmask\t= info->ctmask,\n+ \t\t.nfmask\t= info->nfmask,\n+ \t\t.mode\t= info->mode,\n++\t\t.func\t= XT_CONNMARK_VALUE\n+ \t};\n+ \n+-\treturn connmark_tg_shift(skb, &info2);\n++\treturn connmark_tg_shift(skb, &info3);\n+ }\n+ \n+ static unsigned int\n+ connmark_tg_v2(struct sk_buff *skb, const struct xt_action_param *par)\n+ {\n+ \tconst struct xt_connmark_tginfo2 *info = par->targinfo;\n++\tconst struct xt_connmark_tginfo3 info3 = {\n++\t\t.ctmark\t= info->ctmark,\n++\t\t.ctmask\t= info->ctmask,\n++\t\t.nfmask\t= info->nfmask,\n++\t\t.mode\t= info->mode,\n++\t\t.func\t= XT_CONNMARK_VALUE\n++\t};\n++\n++\treturn connmark_tg_shift(skb, &info3);\n++}\n++\n++static unsigned int\n++connmark_tg_v3(struct sk_buff *skb, const struct xt_action_param *par)\n++{\n++\tconst struct xt_connmark_tginfo3 *info = par->targinfo;\n+ \n+ \treturn connmark_tg_shift(skb, info);\n+ }\n+@@ -165,6 +194,16 @@ static struct xt_target connmark_tg_reg[\n+ \t\t.targetsize     = sizeof(struct xt_connmark_tginfo2),\n+ \t\t.destroy        = connmark_tg_destroy,\n+ \t\t.me             = THIS_MODULE,\n++\t},\n++\t{\n++\t\t.name           = \"CONNMARK\",\n++\t\t.revision       = 3,\n++\t\t.family         = NFPROTO_UNSPEC,\n++\t\t.checkentry     = connmark_tg_check,\n++\t\t.target         = connmark_tg_v3,\n++\t\t.targetsize     = sizeof(struct xt_connmark_tginfo3),\n++\t\t.destroy        = connmark_tg_destroy,\n++\t\t.me             = THIS_MODULE,\n+ \t}\n+ };\n+ \ndiff --git a/target/linux/generic/hack-5.14/650-netfilter-add-xt_FLOWOFFLOAD-target.patch b/target/linux/generic/hack-5.14/650-netfilter-add-xt_FLOWOFFLOAD-target.patch\nnew file mode 100644\nindex 0000000000..9f6179892c\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/650-netfilter-add-xt_FLOWOFFLOAD-target.patch\n@@ -0,0 +1,820 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Tue, 20 Feb 2018 15:56:02 +0100\n+Subject: [PATCH] netfilter: add xt_FLOWOFFLOAD target\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ create mode 100644 net/netfilter/xt_OFFLOAD.c\n+\n+--- a/net/ipv4/netfilter/Kconfig\n++++ b/net/ipv4/netfilter/Kconfig\n+@@ -56,8 +56,6 @@ config NF_TABLES_ARP\n+ \thelp\n+ \t  This option enables the ARP support for nf_tables.\n+ \n+-endif # NF_TABLES\n+-\n+ config NF_FLOW_TABLE_IPV4\n+ \ttristate \"Netfilter flow table IPv4 module\"\n+ \tdepends on NF_FLOW_TABLE\n+@@ -66,6 +64,8 @@ config NF_FLOW_TABLE_IPV4\n+ \n+ \t  To compile it as a module, choose M here.\n+ \n++endif # NF_TABLES\n++\n+ config NF_DUP_IPV4\n+ \ttristate \"Netfilter IPv4 packet duplication to alternate destination\"\n+ \tdepends on !NF_CONNTRACK || NF_CONNTRACK\n+--- a/net/ipv6/netfilter/Kconfig\n++++ b/net/ipv6/netfilter/Kconfig\n+@@ -45,7 +45,6 @@ config NFT_FIB_IPV6\n+ \t  multicast or blackhole.\n+ \n+ endif # NF_TABLES_IPV6\n+-endif # NF_TABLES\n+ \n+ config NF_FLOW_TABLE_IPV6\n+ \ttristate \"Netfilter flow table IPv6 module\"\n+@@ -55,6 +54,8 @@ config NF_FLOW_TABLE_IPV6\n+ \n+ \t  To compile it as a module, choose M here.\n+ \n++endif # NF_TABLES\n++\n+ config NF_DUP_IPV6\n+ \ttristate \"Netfilter IPv6 packet duplication to alternate destination\"\n+ \tdepends on !NF_CONNTRACK || NF_CONNTRACK\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -708,8 +708,6 @@ config NFT_REJECT_NETDEV\n+ \n+ endif # NF_TABLES_NETDEV\n+ \n+-endif # NF_TABLES\n+-\n+ config NF_FLOW_TABLE_INET\n+ \ttristate \"Netfilter flow table mixed IPv4/IPv6 module\"\n+ \tdepends on NF_FLOW_TABLE\n+@@ -718,11 +716,12 @@ config NF_FLOW_TABLE_INET\n+ \n+ \t  To compile it as a module, choose M here.\n+ \n++endif # NF_TABLES\n++\n+ config NF_FLOW_TABLE\n+ \ttristate \"Netfilter flow table module\"\n+ \tdepends on NETFILTER_INGRESS\n+ \tdepends on NF_CONNTRACK\n+-\tdepends on NF_TABLES\n+ \thelp\n+ \t  This option adds the flow table core infrastructure.\n+ \n+@@ -1011,6 +1010,15 @@ config NETFILTER_XT_TARGET_NOTRACK\n+ \tdepends on NETFILTER_ADVANCED\n+ \tselect NETFILTER_XT_TARGET_CT\n+ \n++config NETFILTER_XT_TARGET_FLOWOFFLOAD\n++\ttristate '\"FLOWOFFLOAD\" target support'\n++\tdepends on NF_FLOW_TABLE\n++\tdepends on NETFILTER_INGRESS\n++\thelp\n++\t  This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload\n++\t  module to speed up processing of packets by bypassing the usual\n++\t  netfilter chains\n++\n+ config NETFILTER_XT_TARGET_RATEEST\n+ \ttristate '\"RATEEST\" target support'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/Makefile\n++++ b/net/netfilter/Makefile\n+@@ -143,6 +143,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o\n++obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o\n+ obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o\n+--- /dev/null\n++++ b/net/netfilter/xt_FLOWOFFLOAD.c\n+@@ -0,0 +1,658 @@\n++/*\n++ * Copyright (C) 2018-2021 Felix Fietkau <nbd@nbd.name>\n++ *\n++ * This program is free software; you can redistribute it and/or modify\n++ * it under the terms of the GNU General Public License version 2 as\n++ * published by the Free Software Foundation.\n++ */\n++#include <linux/module.h>\n++#include <linux/init.h>\n++#include <linux/netfilter.h>\n++#include <linux/netfilter/xt_FLOWOFFLOAD.h>\n++#include <net/ip.h>\n++#include <net/netfilter/nf_conntrack.h>\n++#include <net/netfilter/nf_conntrack_extend.h>\n++#include <net/netfilter/nf_conntrack_helper.h>\n++#include <net/netfilter/nf_flow_table.h>\n++\n++struct xt_flowoffload_hook {\n++\tstruct hlist_node list;\n++\tstruct nf_hook_ops ops;\n++\tstruct net *net;\n++\tbool registered;\n++\tbool used;\n++};\n++\n++struct xt_flowoffload_table {\n++\tstruct nf_flowtable ft;\n++\tstruct hlist_head hooks;\n++\tstruct delayed_work work;\n++};\n++\n++static DEFINE_SPINLOCK(hooks_lock);\n++\n++struct xt_flowoffload_table flowtable[2];\n++\n++static unsigned int\n++xt_flowoffload_net_hook(void *priv, struct sk_buff *skb,\n++\t\t\tconst struct nf_hook_state *state)\n++{\n++\tstruct nf_flowtable *ft = priv;\n++\n++\tif (!atomic_read(&ft->rhashtable.nelems))\n++\t\treturn NF_ACCEPT;\n++\n++\tswitch (skb->protocol) {\n++\tcase htons(ETH_P_IP):\n++\t\treturn nf_flow_offload_ip_hook(priv, skb, state);\n++\tcase htons(ETH_P_IPV6):\n++\t\treturn nf_flow_offload_ipv6_hook(priv, skb, state);\n++\t}\n++\n++\treturn NF_ACCEPT;\n++}\n++\n++static int\n++xt_flowoffload_create_hook(struct xt_flowoffload_table *table,\n++\t\t\t   struct net_device *dev)\n++{\n++\tstruct xt_flowoffload_hook *hook;\n++\tstruct nf_hook_ops *ops;\n++\n++\thook = kzalloc(sizeof(*hook), GFP_ATOMIC);\n++\tif (!hook)\n++\t\treturn -ENOMEM;\n++\n++\tops = &hook->ops;\n++\tops->pf = NFPROTO_NETDEV;\n++\tops->hooknum = NF_NETDEV_INGRESS;\n++\tops->priority = 10;\n++\tops->priv = &table->ft;\n++\tops->hook = xt_flowoffload_net_hook;\n++\tops->dev = dev;\n++\n++\thlist_add_head(&hook->list, &table->hooks);\n++\tmod_delayed_work(system_power_efficient_wq, &table->work, 0);\n++\n++\treturn 0;\n++}\n++\n++static struct xt_flowoffload_hook *\n++flow_offload_lookup_hook(struct xt_flowoffload_table *table,\n++\t\t\t struct net_device *dev)\n++{\n++\tstruct xt_flowoffload_hook *hook;\n++\n++\thlist_for_each_entry(hook, &table->hooks, list) {\n++\t\tif (hook->ops.dev == dev)\n++\t\t\treturn hook;\n++\t}\n++\n++\treturn NULL;\n++}\n++\n++static void\n++xt_flowoffload_check_device(struct xt_flowoffload_table *table,\n++\t\t\t    struct net_device *dev)\n++{\n++\tstruct xt_flowoffload_hook *hook;\n++\n++\tif (!dev)\n++\t\treturn;\n++\n++\tspin_lock_bh(&hooks_lock);\n++\thook = flow_offload_lookup_hook(table, dev);\n++\tif (hook)\n++\t\thook->used = true;\n++\telse\n++\t\txt_flowoffload_create_hook(table, dev);\n++\tspin_unlock_bh(&hooks_lock);\n++}\n++\n++static void\n++xt_flowoffload_register_hooks(struct xt_flowoffload_table *table)\n++{\n++\tstruct xt_flowoffload_hook *hook;\n++\n++restart:\n++\thlist_for_each_entry(hook, &table->hooks, list) {\n++\t\tif (hook->registered)\n++\t\t\tcontinue;\n++\n++\t\thook->registered = true;\n++\t\thook->net = dev_net(hook->ops.dev);\n++\t\tspin_unlock_bh(&hooks_lock);\n++\t\tnf_register_net_hook(hook->net, &hook->ops);\n++\t\tif (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD)\n++\t\t\ttable->ft.type->setup(&table->ft, hook->ops.dev,\n++\t\t\t\t\t      FLOW_BLOCK_BIND);\n++\t\tspin_lock_bh(&hooks_lock);\n++\t\tgoto restart;\n++\t}\n++\n++}\n++\n++static bool\n++xt_flowoffload_cleanup_hooks(struct xt_flowoffload_table *table)\n++{\n++\tstruct xt_flowoffload_hook *hook;\n++\tbool active = false;\n++\n++restart:\n++\tspin_lock_bh(&hooks_lock);\n++\thlist_for_each_entry(hook, &table->hooks, list) {\n++\t\tif (hook->used || !hook->registered) {\n++\t\t\tactive = true;\n++\t\t\tcontinue;\n++\t\t}\n++\n++\t\thlist_del(&hook->list);\n++\t\tspin_unlock_bh(&hooks_lock);\n++\t\tif (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD)\n++\t\t\ttable->ft.type->setup(&table->ft, hook->ops.dev,\n++\t\t\t\t\t      FLOW_BLOCK_UNBIND);\n++\t\tnf_unregister_net_hook(hook->net, &hook->ops);\n++\t\tkfree(hook);\n++\t\tgoto restart;\n++\t}\n++\tspin_unlock_bh(&hooks_lock);\n++\n++\treturn active;\n++}\n++\n++static void\n++xt_flowoffload_check_hook(struct flow_offload *flow, void *data)\n++{\n++\tstruct xt_flowoffload_table *table = data;\n++\tstruct flow_offload_tuple *tuple0 = &flow->tuplehash[0].tuple;\n++\tstruct flow_offload_tuple *tuple1 = &flow->tuplehash[1].tuple;\n++\tstruct xt_flowoffload_hook *hook;\n++\n++\tspin_lock_bh(&hooks_lock);\n++\thlist_for_each_entry(hook, &table->hooks, list) {\n++\t\tif (hook->ops.dev->ifindex != tuple0->iifidx &&\n++\t\t    hook->ops.dev->ifindex != tuple1->iifidx)\n++\t\t\tcontinue;\n++\n++\t\thook->used = true;\n++\t}\n++\tspin_unlock_bh(&hooks_lock);\n++\n++\tcond_resched();\n++}\n++\n++static void\n++xt_flowoffload_hook_work(struct work_struct *work)\n++{\n++\tstruct xt_flowoffload_table *table;\n++\tstruct xt_flowoffload_hook *hook;\n++\tint err;\n++\n++\ttable = container_of(work, struct xt_flowoffload_table, work.work);\n++\n++\tspin_lock_bh(&hooks_lock);\n++\txt_flowoffload_register_hooks(table);\n++\thlist_for_each_entry(hook, &table->hooks, list)\n++\t\thook->used = false;\n++\tspin_unlock_bh(&hooks_lock);\n++\n++\terr = nf_flow_table_iterate(&table->ft, xt_flowoffload_check_hook,\n++\t\t\t\t    table);\n++\tif (err && err != -EAGAIN)\n++\t\tgoto out;\n++\n++\tif (!xt_flowoffload_cleanup_hooks(table))\n++\t\treturn;\n++\n++out:\n++\tqueue_delayed_work(system_power_efficient_wq, &table->work, HZ);\n++}\n++\n++static bool\n++xt_flowoffload_skip(struct sk_buff *skb, int family)\n++{\n++\tif (skb_sec_path(skb))\n++\t\treturn true;\n++\n++\tif (family == NFPROTO_IPV4) {\n++\t\tconst struct ip_options *opt = &(IPCB(skb)->opt);\n++\n++\t\tif (unlikely(opt->optlen))\n++\t\t\treturn true;\n++\t}\n++\n++\treturn false;\n++}\n++\n++static bool flow_is_valid_ether_device(const struct net_device *dev)\n++{\n++\tif (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER ||\n++\t    dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr))\n++\t\treturn false;\n++\n++\treturn true;\n++}\n++\n++static void\n++xt_flowoffload_route_check_path(struct nf_flow_route *route,\n++\t\t\t\tconst struct nf_conn *ct,\n++\t\t\t\tenum ip_conntrack_dir dir,\n++\t\t\t\tstruct net_device **out_dev)\n++{\n++\tconst struct dst_entry *dst = route->tuple[dir].dst;\n++\tconst void *daddr = &ct->tuplehash[!dir].tuple.src.u3;\n++\tstruct net_device_path_stack stack;\n++\tenum net_device_path_type prev_type;\n++\tstruct net_device *dev = dst->dev;\n++\tstruct neighbour *n;\n++\tbool last = false;\n++\tu8 nud_state;\n++\tint i;\n++\n++\troute->tuple[!dir].in.ifindex = dev->ifindex;\n++\troute->tuple[dir].out.ifindex = dev->ifindex;\n++\n++\tif (route->tuple[dir].xmit_type == FLOW_OFFLOAD_XMIT_XFRM)\n++\t\treturn;\n++\n++\tif ((dev->flags & IFF_LOOPBACK) ||\n++\t    dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||\n++\t    !is_valid_ether_addr(dev->dev_addr))\n++\t\treturn;\n++\n++\tn = dst_neigh_lookup(dst, daddr);\n++\tif (!n)\n++\t\treturn;\n++\n++\tread_lock_bh(&n->lock);\n++\tnud_state = n->nud_state;\n++\tmemcpy(route->tuple[dir].out.h_dest, n->ha, ETH_ALEN);\n++\tread_unlock_bh(&n->lock);\n++\tneigh_release(n);\n++\n++\tif (!(nud_state & NUD_VALID))\n++\t\treturn;\n++\n++\tif (dev_fill_forward_path(dev, route->tuple[dir].out.h_dest, &stack) ||\n++\t    !stack.num_paths)\n++\t\treturn;\n++\n++\tprev_type = DEV_PATH_ETHERNET;\n++\tfor (i = 0; i <= stack.num_paths; i++) {\n++\t\tconst struct net_device_path *path = &stack.path[i];\n++\t\tint n_encaps = route->tuple[!dir].in.num_encaps;\n++\n++\t\tdev = (struct net_device *)path->dev;\n++\t\tif (flow_is_valid_ether_device(dev)) {\n++\t\t\tif (route->tuple[dir].xmit_type != FLOW_OFFLOAD_XMIT_DIRECT) {\n++\t\t\t\tmemcpy(route->tuple[dir].out.h_source,\n++\t\t\t\t       dev->dev_addr, ETH_ALEN);\n++\t\t\t\troute->tuple[dir].out.ifindex = dev->ifindex;\n++\t\t\t}\n++\t\t\troute->tuple[dir].xmit_type = FLOW_OFFLOAD_XMIT_DIRECT;\n++\t\t}\n++\n++\t\tswitch (path->type) {\n++\t\tcase DEV_PATH_PPPOE:\n++\t\tcase DEV_PATH_VLAN:\n++\t\t\tif (n_encaps >= NF_FLOW_TABLE_ENCAP_MAX ||\n++\t\t\t    i == stack.num_paths) {\n++\t\t\t\tlast = true;\n++\t\t\t\tbreak;\n++\t\t\t}\n++\n++\t\t\troute->tuple[!dir].in.num_encaps++;\n++\t\t\troute->tuple[!dir].in.encap[n_encaps].id = path->encap.id;\n++\t\t\troute->tuple[!dir].in.encap[n_encaps].proto = path->encap.proto;\n++\t\t\tif (path->type == DEV_PATH_PPPOE)\n++\t\t\t\tmemcpy(route->tuple[dir].out.h_dest,\n++\t\t\t\t       path->encap.h_dest, ETH_ALEN);\n++\t\t\tbreak;\n++\t\tcase DEV_PATH_BRIDGE:\n++\t\t\tswitch (path->bridge.vlan_mode) {\n++\t\t\tcase DEV_PATH_BR_VLAN_TAG:\n++\t\t\t\tif (n_encaps >= NF_FLOW_TABLE_ENCAP_MAX ||\n++\t\t\t\t    i == stack.num_paths) {\n++\t\t\t\t\tlast = true;\n++\t\t\t\t\tbreak;\n++\t\t\t\t}\n++\n++\t\t\t\troute->tuple[!dir].in.num_encaps++;\n++\t\t\t\troute->tuple[!dir].in.encap[n_encaps].id =\n++\t\t\t\t\tpath->bridge.vlan_id;\n++\t\t\t\troute->tuple[!dir].in.encap[n_encaps].proto =\n++\t\t\t\t\tpath->bridge.vlan_proto;\n++\t\t\t\tbreak;\n++\t\t\tcase DEV_PATH_BR_VLAN_UNTAG:\n++\t\t\t\troute->tuple[!dir].in.num_encaps--;\n++\t\t\t\tbreak;\n++\t\t\tcase DEV_PATH_BR_VLAN_UNTAG_HW:\n++\t\t\t\troute->tuple[!dir].in.ingress_vlans |= BIT(n_encaps - 1);\n++\t\t\t\tbreak;\n++\t\t\tcase DEV_PATH_BR_VLAN_KEEP:\n++\t\t\t\tbreak;\n++\t\t\t}\n++\t\t\tbreak;\n++\t\tdefault:\n++\t\t\tlast = true;\n++\t\t\tbreak;\n++\t\t}\n++\n++\t\tif (last)\n++\t\t\tbreak;\n++\t}\n++\n++\t*out_dev = dev;\n++\troute->tuple[dir].out.hw_ifindex = dev->ifindex;\n++\troute->tuple[!dir].in.ifindex = dev->ifindex;\n++}\n++\n++static int\n++xt_flowoffload_route_dir(struct nf_flow_route *route, const struct nf_conn *ct,\n++\t\t\t enum ip_conntrack_dir dir,\n++\t\t\t const struct xt_action_param *par, int ifindex)\n++{\n++\tstruct dst_entry *dst = NULL;\n++\tstruct flowi fl;\n++\n++\tmemset(&fl, 0, sizeof(fl));\n++\tswitch (xt_family(par)) {\n++\tcase NFPROTO_IPV4:\n++\t\tfl.u.ip4.daddr = ct->tuplehash[!dir].tuple.src.u3.ip;\n++\t\tfl.u.ip4.flowi4_oif = ifindex;\n++\t\tbreak;\n++\tcase NFPROTO_IPV6:\n++\t\tfl.u.ip6.saddr = ct->tuplehash[!dir].tuple.dst.u3.in6;\n++\t\tfl.u.ip6.daddr = ct->tuplehash[!dir].tuple.src.u3.in6;\n++\t\tfl.u.ip6.flowi6_oif = ifindex;\n++\t\tbreak;\n++\t}\n++\n++\tnf_route(xt_net(par), &dst, &fl, false, xt_family(par));\n++\tif (!dst)\n++\t\treturn -ENOENT;\n++\n++\troute->tuple[dir].dst = dst;\n++\tif (dst_xfrm(dst))\n++\t\troute->tuple[dir].xmit_type = FLOW_OFFLOAD_XMIT_XFRM;\n++\telse\n++\t\troute->tuple[dir].xmit_type = FLOW_OFFLOAD_XMIT_NEIGH;\n++\n++\treturn 0;\n++}\n++\n++static int\n++xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct,\n++\t\t     const struct xt_action_param *par,\n++\t\t     struct nf_flow_route *route, enum ip_conntrack_dir dir,\n++\t\t     struct net_device **dev)\n++{\n++\tint ret;\n++\n++\tret = xt_flowoffload_route_dir(route, ct, dir, par,\n++\t\t\t\t       dev[dir]->ifindex);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = xt_flowoffload_route_dir(route, ct, !dir, par,\n++\t\t\t\t       dev[!dir]->ifindex);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\txt_flowoffload_route_check_path(route, ct, dir, &dev[!dir]);\n++\txt_flowoffload_route_check_path(route, ct, !dir, &dev[dir]);\n++\n++\treturn 0;\n++}\n++\n++static unsigned int\n++flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par)\n++{\n++\tstruct xt_flowoffload_table *table;\n++\tconst struct xt_flowoffload_target_info *info = par->targinfo;\n++\tstruct tcphdr _tcph, *tcph = NULL;\n++\tenum ip_conntrack_info ctinfo;\n++\tenum ip_conntrack_dir dir;\n++\tstruct nf_flow_route route = {};\n++\tstruct flow_offload *flow = NULL;\n++\tstruct net_device *devs[2] = {};\n++\tstruct nf_conn *ct;\n++\tstruct net *net;\n++\n++\tif (xt_flowoffload_skip(skb, xt_family(par)))\n++\t\treturn XT_CONTINUE;\n++\n++\tct = nf_ct_get(skb, &ctinfo);\n++\tif (ct == NULL)\n++\t\treturn XT_CONTINUE;\n++\n++\tswitch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) {\n++\tcase IPPROTO_TCP:\n++\t\tif (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED)\n++\t\t\treturn XT_CONTINUE;\n++\n++\t\ttcph = skb_header_pointer(skb, par->thoff,\n++\t\t\t\t\t  sizeof(_tcph), &_tcph);\n++\t\tif (unlikely(!tcph || tcph->fin || tcph->rst))\n++\t\t\treturn XT_CONTINUE;\n++\t\tbreak;\n++\tcase IPPROTO_UDP:\n++\t\tbreak;\n++\tdefault:\n++\t\treturn XT_CONTINUE;\n++\t}\n++\n++\tif (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) ||\n++\t    ct->status & IPS_SEQ_ADJUST)\n++\t\treturn XT_CONTINUE;\n++\n++\tif (!nf_ct_is_confirmed(ct))\n++\t\treturn XT_CONTINUE;\n++\n++\tdevs[dir] = xt_out(par);\n++\tdevs[!dir] = xt_in(par);\n++\n++\tif (!devs[dir] || !devs[!dir])\n++\t\treturn XT_CONTINUE;\n++\n++\tif (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status))\n++\t\treturn XT_CONTINUE;\n++\n++\tdir = CTINFO2DIR(ctinfo);\n++\n++\tif (xt_flowoffload_route(skb, ct, par, &route, dir, devs) < 0)\n++\t\tgoto err_flow_route;\n++\n++\tflow = flow_offload_alloc(ct);\n++\tif (!flow)\n++\t\tgoto err_flow_alloc;\n++\n++\tif (flow_offload_route_init(flow, &route) < 0)\n++\t\tgoto err_flow_add;\n++\n++\tif (tcph) {\n++\t\tct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;\n++\t\tct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;\n++\t}\n++\n++\ttable = &flowtable[!!(info->flags & XT_FLOWOFFLOAD_HW)];\n++\tif (flow_offload_add(&table->ft, flow) < 0)\n++\t\tgoto err_flow_add;\n++\n++\txt_flowoffload_check_device(table, devs[0]);\n++\txt_flowoffload_check_device(table, devs[1]);\n++\n++\tnet = read_pnet(&table->ft.net);\n++\tif (!net)\n++\t\twrite_pnet(&table->ft.net, xt_net(par));\n++\n++\tdst_release(route.tuple[dir].dst);\n++\tdst_release(route.tuple[!dir].dst);\n++\n++\treturn XT_CONTINUE;\n++\n++err_flow_add:\n++\tflow_offload_free(flow);\n++err_flow_alloc:\n++\tdst_release(route.tuple[dir].dst);\n++\tdst_release(route.tuple[!dir].dst);\n++err_flow_route:\n++\tclear_bit(IPS_OFFLOAD_BIT, &ct->status);\n++\n++\treturn XT_CONTINUE;\n++}\n++\n++static int flowoffload_chk(const struct xt_tgchk_param *par)\n++{\n++\tstruct xt_flowoffload_target_info *info = par->targinfo;\n++\n++\tif (info->flags & ~XT_FLOWOFFLOAD_MASK)\n++\t\treturn -EINVAL;\n++\n++\treturn 0;\n++}\n++\n++static struct xt_target offload_tg_reg __read_mostly = {\n++\t.family\t\t= NFPROTO_UNSPEC,\n++\t.name\t\t= \"FLOWOFFLOAD\",\n++\t.revision\t= 0,\n++\t.targetsize\t= sizeof(struct xt_flowoffload_target_info),\n++\t.usersize\t= sizeof(struct xt_flowoffload_target_info),\n++\t.checkentry\t= flowoffload_chk,\n++\t.target\t\t= flowoffload_tg,\n++\t.me\t\t= THIS_MODULE,\n++};\n++\n++static int flow_offload_netdev_event(struct notifier_block *this,\n++\t\t\t\t     unsigned long event, void *ptr)\n++{\n++\tstruct xt_flowoffload_hook *hook0, *hook1;\n++\tstruct net_device *dev = netdev_notifier_info_to_dev(ptr);\n++\n++\tif (event != NETDEV_UNREGISTER)\n++\t\treturn NOTIFY_DONE;\n++\n++\tspin_lock_bh(&hooks_lock);\n++\thook0 = flow_offload_lookup_hook(&flowtable[0], dev);\n++\tif (hook0)\n++\t\thlist_del(&hook0->list);\n++\n++\thook1 = flow_offload_lookup_hook(&flowtable[1], dev);\n++\tif (hook1)\n++\t\thlist_del(&hook1->list);\n++\tspin_unlock_bh(&hooks_lock);\n++\n++\tif (hook0) {\n++\t\tnf_unregister_net_hook(hook0->net, &hook0->ops);\n++\t\tkfree(hook0);\n++\t}\n++\n++\tif (hook1) {\n++\t\tnf_unregister_net_hook(hook1->net, &hook1->ops);\n++\t\tkfree(hook1);\n++\t}\n++\n++\tnf_flow_table_cleanup(dev);\n++\n++\treturn NOTIFY_DONE;\n++}\n++\n++static struct notifier_block flow_offload_netdev_notifier = {\n++\t.notifier_call\t= flow_offload_netdev_event,\n++};\n++\n++static unsigned int\n++nf_flow_offload_inet_hook(void *priv, struct sk_buff *skb,\n++\t\t\t  const struct nf_hook_state *state)\n++{\n++\tswitch (skb->protocol) {\n++\tcase htons(ETH_P_IP):\n++\t\treturn nf_flow_offload_ip_hook(priv, skb, state);\n++\tcase htons(ETH_P_IPV6):\n++\t\treturn nf_flow_offload_ipv6_hook(priv, skb, state);\n++\t}\n++\n++\treturn NF_ACCEPT;\n++}\n++\n++static int nf_flow_rule_route_inet(struct net *net,\n++\t\t\t\t   const struct flow_offload *flow,\n++\t\t\t\t   enum flow_offload_tuple_dir dir,\n++\t\t\t\t   struct nf_flow_rule *flow_rule)\n++{\n++\tconst struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple;\n++\tint err;\n++\n++\tswitch (flow_tuple->l3proto) {\n++\tcase NFPROTO_IPV4:\n++\t\terr = nf_flow_rule_route_ipv4(net, flow, dir, flow_rule);\n++\t\tbreak;\n++\tcase NFPROTO_IPV6:\n++\t\terr = nf_flow_rule_route_ipv6(net, flow, dir, flow_rule);\n++\t\tbreak;\n++\tdefault:\n++\t\terr = -1;\n++\t\tbreak;\n++\t}\n++\n++\treturn err;\n++}\n++\n++static struct nf_flowtable_type flowtable_inet = {\n++\t.family\t\t= NFPROTO_INET,\n++\t.init\t\t= nf_flow_table_init,\n++\t.setup\t\t= nf_flow_table_offload_setup,\n++\t.action\t\t= nf_flow_rule_route_inet,\n++\t.free\t\t= nf_flow_table_free,\n++\t.hook\t\t= nf_flow_offload_inet_hook,\n++\t.owner\t\t= THIS_MODULE,\n++};\n++\n++static int init_flowtable(struct xt_flowoffload_table *tbl)\n++{\n++\tINIT_DELAYED_WORK(&tbl->work, xt_flowoffload_hook_work);\n++\ttbl->ft.type = &flowtable_inet;\n++\n++\treturn nf_flow_table_init(&tbl->ft);\n++}\n++\n++static int __init xt_flowoffload_tg_init(void)\n++{\n++\tint ret;\n++\n++\tregister_netdevice_notifier(&flow_offload_netdev_notifier);\n++\n++\tret = init_flowtable(&flowtable[0]);\n++\tif (ret)\n++\t\treturn ret;\n++\n++\tret = init_flowtable(&flowtable[1]);\n++\tif (ret)\n++\t\tgoto cleanup;\n++\n++\tflowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD;\n++\n++\tret = xt_register_target(&offload_tg_reg);\n++\tif (ret)\n++\t\tgoto cleanup2;\n++\n++\treturn 0;\n++\n++cleanup2:\n++\tnf_flow_table_free(&flowtable[1].ft);\n++cleanup:\n++\tnf_flow_table_free(&flowtable[0].ft);\n++\treturn ret;\n++}\n++\n++static void __exit xt_flowoffload_tg_exit(void)\n++{\n++\txt_unregister_target(&offload_tg_reg);\n++\tunregister_netdevice_notifier(&flow_offload_netdev_notifier);\n++\tnf_flow_table_free(&flowtable[0].ft);\n++\tnf_flow_table_free(&flowtable[1].ft);\n++}\n++\n++MODULE_LICENSE(\"GPL\");\n++module_init(xt_flowoffload_tg_init);\n++module_exit(xt_flowoffload_tg_exit);\n+--- a/net/netfilter/nf_flow_table_core.c\n++++ b/net/netfilter/nf_flow_table_core.c\n+@@ -7,7 +7,6 @@\n+ #include <linux/netdevice.h>\n+ #include <net/ip.h>\n+ #include <net/ip6_route.h>\n+-#include <net/netfilter/nf_tables.h>\n+ #include <net/netfilter/nf_flow_table.h>\n+ #include <net/netfilter/nf_conntrack.h>\n+ #include <net/netfilter/nf_conntrack_core.h>\n+@@ -398,8 +397,7 @@ flow_offload_lookup(struct nf_flowtable\n+ }\n+ EXPORT_SYMBOL_GPL(flow_offload_lookup);\n+ \n+-static int\n+-nf_flow_table_iterate(struct nf_flowtable *flow_table,\n++int nf_flow_table_iterate(struct nf_flowtable *flow_table,\n+ \t\t      void (*iter)(struct flow_offload *flow, void *data),\n+ \t\t      void *data)\n+ {\n+@@ -431,6 +429,7 @@ nf_flow_table_iterate(struct nf_flowtabl\n+ \n+ \treturn err;\n+ }\n++EXPORT_SYMBOL_GPL(nf_flow_table_iterate);\n+ \n+ static bool flow_offload_stale_dst(struct flow_offload_tuple *tuple)\n+ {\n+--- /dev/null\n++++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h\n+@@ -0,0 +1,17 @@\n++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */\n++#ifndef _XT_FLOWOFFLOAD_H\n++#define _XT_FLOWOFFLOAD_H\n++\n++#include <linux/types.h>\n++\n++enum {\n++\tXT_FLOWOFFLOAD_HW\t= 1 << 0,\n++\n++\tXT_FLOWOFFLOAD_MASK\t= XT_FLOWOFFLOAD_HW\n++};\n++\n++struct xt_flowoffload_target_info {\n++\t__u32 flags;\n++};\n++\n++#endif /* _XT_FLOWOFFLOAD_H */\n+--- a/include/net/netfilter/nf_flow_table.h\n++++ b/include/net/netfilter/nf_flow_table.h\n+@@ -273,6 +273,10 @@ void nf_flow_table_free(struct nf_flowta\n+ \n+ void flow_offload_teardown(struct flow_offload *flow);\n+ \n++int nf_flow_table_iterate(struct nf_flowtable *flow_table,\n++\t\t\t  void (*iter)(struct flow_offload *flow, void *data),\n++\t\t\t  void *data);\n++\n+ void nf_flow_snat_port(const struct flow_offload *flow,\n+ \t\t       struct sk_buff *skb, unsigned int thoff,\n+ \t\t       u8 protocol, enum flow_offload_tuple_dir dir);\ndiff --git a/target/linux/generic/hack-5.14/651-wireless_mesh_header.patch b/target/linux/generic/hack-5.14/651-wireless_mesh_header.patch\nnew file mode 100644\nindex 0000000000..0639ad4e48\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/651-wireless_mesh_header.patch\n@@ -0,0 +1,24 @@\n+From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001\n+From: Imre Kaloz <kaloz@openwrt.org>\n+Date: Fri, 7 Jul 2017 17:21:05 +0200\n+Subject: mac80211: increase wireless mesh header size\n+\n+lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1\n+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>\n+---\n+ include/linux/netdevice.h | 4 ++--\n+ 1 file changed, 2 insertions(+), 2 deletions(-)\n+\n+--- a/include/linux/netdevice.h\n++++ b/include/linux/netdevice.h\n+@@ -144,8 +144,8 @@ static inline bool dev_xmit_complete(int\n+ \n+ #if defined(CONFIG_HYPERV_NET)\n+ # define LL_MAX_HEADER 128\n+-#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)\n+-# if defined(CONFIG_MAC80211_MESH)\n++#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1\n++# if defined(CONFIG_MAC80211_MESH) || 1\n+ #  define LL_MAX_HEADER 128\n+ # else\n+ #  define LL_MAX_HEADER 96\ndiff --git a/target/linux/generic/hack-5.14/660-fq_codel_defaults.patch b/target/linux/generic/hack-5.14/660-fq_codel_defaults.patch\nnew file mode 100644\nindex 0000000000..5541c0bc89\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/660-fq_codel_defaults.patch\n@@ -0,0 +1,27 @@\n+From a6ccb238939b25851474a279b20367fd24a0e816 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:21:53 +0200\n+Subject:  hack: net: fq_codel: tune defaults for small devices\n+\n+Assume that x86_64 devices always have a big memory and do not need this \n+optimization compared to devices with only 32 MB or 64 MB RAM.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/sched/sch_fq_codel.c | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/net/sched/sch_fq_codel.c\n++++ b/net/sched/sch_fq_codel.c\n+@@ -469,7 +469,11 @@ static int fq_codel_init(struct Qdisc *s\n+ \n+ \tsch->limit = 10*1024;\n+ \tq->flows_cnt = 1024;\n++#ifdef CONFIG_X86_64\n+ \tq->memory_limit = 32 << 20; /* 32 MBytes */\n++#else\n++\tq->memory_limit = 4 << 20; /* 4 MBytes */\n++#endif\n+ \tq->drop_batch_size = 64;\n+ \tq->quantum = psched_mtu(qdisc_dev(sch));\n+ \tINIT_LIST_HEAD(&q->new_flows);\ndiff --git a/target/linux/generic/hack-5.14/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-5.14/661-use_fq_codel_by_default.patch\nnew file mode 100644\nindex 0000000000..c4168e2abd\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/661-use_fq_codel_by_default.patch\n@@ -0,0 +1,100 @@\n+From 1d418f7e88035ed7a94073f6354246c66e9193e9 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:22:58 +0200\n+Subject: fq_codel: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/net/sch_generic.h | 3 ++-\n+ net/sched/Kconfig         | 3 ++-\n+ net/sched/sch_api.c       | 2 +-\n+ net/sched/sch_fq_codel.c  | 3 ++-\n+ net/sched/sch_generic.c   | 4 ++--\n+ 5 files changed, 9 insertions(+), 6 deletions(-)\n+\n+--- a/include/net/sch_generic.h\n++++ b/include/net/sch_generic.h\n+@@ -624,12 +624,13 @@ extern struct Qdisc_ops noop_qdisc_ops;\n+ extern struct Qdisc_ops pfifo_fast_ops;\n+ extern struct Qdisc_ops mq_qdisc_ops;\n+ extern struct Qdisc_ops noqueue_qdisc_ops;\n++extern struct Qdisc_ops fq_codel_qdisc_ops;\n+ extern const struct Qdisc_ops *default_qdisc_ops;\n+ static inline const struct Qdisc_ops *\n+ get_default_qdisc_ops(const struct net_device *dev, int ntx)\n+ {\n+ \treturn ntx < dev->real_num_tx_queues ?\n+-\t\t\tdefault_qdisc_ops : &pfifo_fast_ops;\n++\t\t\tdefault_qdisc_ops : &fq_codel_qdisc_ops;\n+ }\n+ \n+ struct Qdisc_class_common {\n+--- a/net/sched/Kconfig\n++++ b/net/sched/Kconfig\n+@@ -4,8 +4,9 @@\n+ #\n+ \n+ menuconfig NET_SCHED\n+-\tbool \"QoS and/or fair queueing\"\n++\tdef_bool y\n+ \tselect NET_SCH_FIFO\n++\tselect NET_SCH_FQ_CODEL\n+ \thelp\n+ \t  When the kernel has several packets to send out over a network\n+ \t  device, it has to decide which ones to send first, which ones to\n+--- a/net/sched/sch_api.c\n++++ b/net/sched/sch_api.c\n+@@ -2283,7 +2283,7 @@ static int __init pktsched_init(void)\n+ \t\treturn err;\n+ \t}\n+ \n+-\tregister_qdisc(&pfifo_fast_ops);\n++\tregister_qdisc(&fq_codel_qdisc_ops);\n+ \tregister_qdisc(&pfifo_qdisc_ops);\n+ \tregister_qdisc(&bfifo_qdisc_ops);\n+ \tregister_qdisc(&pfifo_head_drop_qdisc_ops);\n+--- a/net/sched/sch_fq_codel.c\n++++ b/net/sched/sch_fq_codel.c\n+@@ -709,7 +709,7 @@ static const struct Qdisc_class_ops fq_c\n+ \t.walk\t\t=\tfq_codel_walk,\n+ };\n+ \n+-static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {\n++struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {\n+ \t.cl_ops\t\t=\t&fq_codel_class_ops,\n+ \t.id\t\t=\t\"fq_codel\",\n+ \t.priv_size\t=\tsizeof(struct fq_codel_sched_data),\n+@@ -724,6 +724,7 @@ static struct Qdisc_ops fq_codel_qdisc_o\n+ \t.dump_stats =\tfq_codel_dump_stats,\n+ \t.owner\t\t=\tTHIS_MODULE,\n+ };\n++EXPORT_SYMBOL(fq_codel_qdisc_ops);\n+ \n+ static int __init fq_codel_module_init(void)\n+ {\n+--- a/net/sched/sch_generic.c\n++++ b/net/sched/sch_generic.c\n+@@ -32,7 +32,7 @@\n+ #include <net/xfrm.h>\n+ \n+ /* Qdisc to use by default */\n+-const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops;\n++const struct Qdisc_ops *default_qdisc_ops = &fq_codel_qdisc_ops;\n+ EXPORT_SYMBOL(default_qdisc_ops);\n+ \n+ static void qdisc_maybe_clear_missed(struct Qdisc *q,\n+@@ -1088,12 +1088,12 @@ static void attach_one_default_qdisc(str\n+ \t\t\t\t     void *_unused)\n+ {\n+ \tstruct Qdisc *qdisc;\n+-\tconst struct Qdisc_ops *ops = default_qdisc_ops;\n++\tconst struct Qdisc_ops *ops = &fq_codel_qdisc_ops;\n+ \n+ \tif (dev->priv_flags & IFF_NO_QUEUE)\n+ \t\tops = &noqueue_qdisc_ops;\n+ \telse if(dev->type == ARPHRD_CAN)\n+-\t\tops = &pfifo_fast_ops;\n++\t\tops = &fq_codel_qdisc_ops;\n+ \n+ \tqdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL);\n+ \tif (!qdisc)\ndiff --git a/target/linux/generic/hack-5.14/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-5.14/700-swconfig_switch_drivers.patch\nnew file mode 100644\nindex 0000000000..560937a7c1\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/700-swconfig_switch_drivers.patch\n@@ -0,0 +1,129 @@\n+From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Fri, 7 Jul 2017 17:24:23 +0200\n+Subject: net: swconfig: adds openwrt switch layer\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/net/phy/Kconfig   | 83 +++++++++++++++++++++++++++++++++++++++++++++++\n+ drivers/net/phy/Makefile  | 15 +++++++++\n+ include/uapi/linux/Kbuild |  1 +\n+ 3 files changed, 99 insertions(+)\n+\n+--- a/drivers/net/phy/Kconfig\n++++ b/drivers/net/phy/Kconfig\n+@@ -61,6 +61,80 @@ config SFP\n+ \tdepends on HWMON || HWMON=n\n+ \tselect MDIO_I2C\n+ \n++comment \"Switch configuration API + drivers\"\n++\n++config SWCONFIG\n++\ttristate \"Switch configuration API\"\n++\thelp\n++\t  Switch configuration API using netlink. This allows\n++\t  you to configure the VLAN features of certain switches.\n++\n++config SWCONFIG_LEDS\n++\tbool \"Switch LED trigger support\"\n++\tdepends on (SWCONFIG && LEDS_TRIGGERS)\n++\n++config ADM6996_PHY\n++\ttristate \"Driver for ADM6996 switches\"\n++\tselect SWCONFIG\n++\thelp\n++\t  Currently supports the ADM6996FC and ADM6996M switches.\n++\t  Support for FC is very limited.\n++\n++config AR8216_PHY\n++\ttristate \"Driver for Atheros AR8216 switches\"\n++\tselect SWCONFIG\n++\n++config AR8216_PHY_LEDS\n++\tbool \"Atheros AR8216 switch LED support\"\n++\tdepends on (AR8216_PHY && LEDS_CLASS)\n++\n++source \"drivers/net/phy/b53/Kconfig\"\n++\n++config IP17XX_PHY\n++\ttristate \"Driver for IC+ IP17xx switches\"\n++\tselect SWCONFIG\n++\n++config PSB6970_PHY\n++\ttristate \"Lantiq XWAY Tantos (PSB6970) Ethernet switch\"\n++\tselect SWCONFIG\n++\tselect ETHERNET_PACKET_MANGLE\n++\n++config RTL8306_PHY\n++\ttristate \"Driver for Realtek RTL8306S switches\"\n++\tselect SWCONFIG\n++\n++config RTL8366_SMI\n++\ttristate \"Driver for the RTL8366 SMI interface\"\n++\tdepends on GPIOLIB\n++\thelp\n++\t  This module implements the SMI interface protocol which is used\n++\t  by some RTL8366 ethernet switch devices via the generic GPIO API.\n++\n++if RTL8366_SMI\n++\n++config RTL8366_SMI_DEBUG_FS\n++\tbool \"RTL8366 SMI interface debugfs support\"\n++        depends on DEBUG_FS\n++        default n\n++\n++config RTL8366S_PHY\n++\ttristate \"Driver for the Realtek RTL8366S switch\"\n++\tselect SWCONFIG\n++\n++config RTL8366RB_PHY\n++\ttristate \"Driver for the Realtek RTL8366RB switch\"\n++\tselect SWCONFIG\n++\n++config RTL8367_PHY\n++\ttristate \"Driver for the Realtek RTL8367R/M switches\"\n++\tselect SWCONFIG\n++\n++config RTL8367B_PHY\n++\ttristate \"Driver fot the Realtek RTL8367R-VB switch\"\n++\tselect SWCONFIG\n++\n++endif # RTL8366_SMI\n++\n+ comment \"MII PHY device drivers\"\n+ \n+ config AMD_PHY\n+--- a/drivers/net/phy/Makefile\n++++ b/drivers/net/phy/Makefile\n+@@ -24,6 +24,19 @@ libphy-$(CONFIG_LED_TRIGGER_PHY)\t+= phy_\n+ obj-$(CONFIG_PHYLINK)\t\t+= phylink.o\n+ obj-$(CONFIG_PHYLIB)\t\t+= libphy.o\n+ \n++obj-$(CONFIG_SWCONFIG)\t\t+= swconfig.o\n++obj-$(CONFIG_ADM6996_PHY)\t+= adm6996.o\n++obj-$(CONFIG_AR8216_PHY)\t+= ar8216.o ar8327.o\n++obj-$(CONFIG_SWCONFIG_B53)\t+= b53/\n++obj-$(CONFIG_IP17XX_PHY)\t+= ip17xx.o\n++obj-$(CONFIG_PSB6970_PHY)\t+= psb6970.o\n++obj-$(CONFIG_RTL8306_PHY)\t+= rtl8306.o\n++obj-$(CONFIG_RTL8366_SMI)\t+= rtl8366_smi.o\n++obj-$(CONFIG_RTL8366S_PHY)\t+= rtl8366s.o\n++obj-$(CONFIG_RTL8366RB_PHY)\t+= rtl8366rb.o\n++obj-$(CONFIG_RTL8367_PHY)\t+= rtl8367.o\n++obj-$(CONFIG_RTL8367B_PHY)\t+= rtl8367b.o\n++\n+ obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o\n+ \n+ obj-$(CONFIG_SFP)\t\t+= sfp.o\n+--- a/include/linux/platform_data/b53.h\n++++ b/include/linux/platform_data/b53.h\n+@@ -29,6 +29,9 @@ struct b53_platform_data {\n+ \tu32 chip_id;\n+ \tu16 enabled_ports;\n+ \n++\t/* allow to specify an ethX alias */\n++\tconst char *alias;\n++\n+ \t/* only used by MMAP'd driver */\n+ \tunsigned big_endian:1;\n+ \tvoid __iomem *regs;\ndiff --git a/target/linux/generic/hack-5.14/710-net-dsa-mv88e6xxx-default-VID-1.patch b/target/linux/generic/hack-5.14/710-net-dsa-mv88e6xxx-default-VID-1.patch\nnew file mode 100644\nindex 0000000000..3c5d1b1de2\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/710-net-dsa-mv88e6xxx-default-VID-1.patch\n@@ -0,0 +1,18 @@\n+--- a/drivers/net/dsa/mv88e6xxx/chip.c\n++++ b/drivers/net/dsa/mv88e6xxx/chip.c\n+@@ -2225,6 +2225,7 @@ static int mv88e6xxx_port_fdb_add(struct\n+ \tstruct mv88e6xxx_chip *chip = ds->priv;\n+ \tint err;\n+ \n++\tvid = vid ? : 1;\n+ \tmv88e6xxx_reg_lock(chip);\n+ \terr = mv88e6xxx_port_db_load_purge(chip, port, addr, vid,\n+ \t\t\t\t\t   MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC);\n+@@ -2239,6 +2240,7 @@ static int mv88e6xxx_port_fdb_del(struct\n+ \tstruct mv88e6xxx_chip *chip = ds->priv;\n+ \tint err;\n+ \n++\tvid = vid ? : 1;\n+ \tmv88e6xxx_reg_lock(chip);\n+ \terr = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, 0);\n+ \tmv88e6xxx_reg_unlock(chip);\ndiff --git a/target/linux/generic/hack-5.14/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch b/target/linux/generic/hack-5.14/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch\nnew file mode 100644\nindex 0000000000..95b3894b0a\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch\n@@ -0,0 +1,12 @@\n+--- a/drivers/net/dsa/mv88e6xxx/chip.c\n++++ b/drivers/net/dsa/mv88e6xxx/chip.c\n+@@ -2817,6 +2817,9 @@ static int mv88e6xxx_setup_port(struct m\n+ \telse\n+ \t\treg = 1 << port;\n+ \n++\t/* Disable ATU member violation interrupt */\n++\treg |= MV88E6XXX_PORT_ASSOC_VECTOR_IGNORE_WRONG;\n++\n+ \terr = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ASSOC_VECTOR,\n+ \t\t\t\t   reg);\n+ \tif (err)\ndiff --git a/target/linux/generic/hack-5.14/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-5.14/773-bgmac-add-srab-switch.patch\nnew file mode 100644\nindex 0000000000..cc6eddbf2d\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/773-bgmac-add-srab-switch.patch\n@@ -0,0 +1,98 @@\n+From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001\n+From: Hauke Mehrtens <hauke@hauke-m.de>\n+Date: Fri, 7 Jul 2017 17:26:01 +0200\n+Subject: bcm53xx: bgmac: use srab switch driver\n+\n+use the srab switch driver on these SoCs.\n+\n+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>\n+---\n+ drivers/net/ethernet/broadcom/bgmac-bcma.c |  1 +\n+ drivers/net/ethernet/broadcom/bgmac.c      | 24 ++++++++++++++++++++++++\n+ drivers/net/ethernet/broadcom/bgmac.h      |  4 ++++\n+ 3 files changed, 29 insertions(+)\n+\n+--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c\n++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c\n+@@ -268,6 +268,7 @@ static int bgmac_probe(struct bcma_devic\n+ \t\tbgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;\n+ \t\tbgmac->feature_flags |= BGMAC_FEAT_NO_RESET;\n+ \t\tbgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;\n++\t\tbgmac->feature_flags |= BGMAC_FEAT_SRAB;\n+ \t\tbreak;\n+ \tdefault:\n+ \t\tbgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;\n+--- a/drivers/net/ethernet/broadcom/bgmac.c\n++++ b/drivers/net/ethernet/broadcom/bgmac.c\n+@@ -12,6 +12,7 @@\n+ #include <linux/bcma/bcma.h>\n+ #include <linux/etherdevice.h>\n+ #include <linux/interrupt.h>\n++#include <linux/platform_data/b53.h>\n+ #include <linux/bcm47xx_nvram.h>\n+ #include <linux/phy.h>\n+ #include <linux/phy_fixed.h>\n+@@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et\n+ \t.set_link_ksettings     = phy_ethtool_set_link_ksettings,\n+ };\n+ \n++static struct b53_platform_data bgmac_b53_pdata = {\n++};\n++\n++static struct platform_device bgmac_b53_dev = {\n++\t.name\t\t= \"b53-srab-switch\",\n++\t.id\t\t= -1,\n++\t.dev\t\t= {\n++\t\t.platform_data = &bgmac_b53_pdata,\n++\t},\n++};\n++\n+ /**************************************************\n+  * MII\n+  **************************************************/\n+@@ -1542,6 +1554,14 @@ int bgmac_enet_probe(struct bgmac *bgmac\n+ \t/* Omit FCS from max MTU size */\n+ \tnet_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;\n+ \n++\tif ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) {\n++\t\tbgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000);\n++\n++\t\terr = platform_device_register(&bgmac_b53_dev);\n++\t\tif (!err)\n++\t\t\tbgmac->b53_device = &bgmac_b53_dev;\n++\t}\n++\n+ \terr = register_netdev(bgmac->net_dev);\n+ \tif (err) {\n+ \t\tdev_err(bgmac->dev, \"Cannot register net device\\n\");\n+@@ -1564,6 +1584,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);\n+ \n+ void bgmac_enet_remove(struct bgmac *bgmac)\n+ {\n++\tif (bgmac->b53_device)\n++\t\tplatform_device_unregister(&bgmac_b53_dev);\n++\tbgmac->b53_device = NULL;\n++\n+ \tunregister_netdev(bgmac->net_dev);\n+ \tphy_disconnect(bgmac->net_dev->phydev);\n+ \tnetif_napi_del(&bgmac->napi);\n+--- a/drivers/net/ethernet/broadcom/bgmac.h\n++++ b/drivers/net/ethernet/broadcom/bgmac.h\n+@@ -390,6 +390,7 @@\n+ #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII\tBIT(18)\n+ #define BGMAC_FEAT_CC7_IF_TYPE_RGMII\tBIT(19)\n+ #define BGMAC_FEAT_IDM_MASK\t\tBIT(20)\n++#define BGMAC_FEAT_SRAB\t\t\tBIT(21)\n+ \n+ struct bgmac_slot_info {\n+ \tunion {\n+@@ -495,6 +496,9 @@ struct bgmac {\n+ \tvoid (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,\n+ \t\t\t      u32 set);\n+ \tint (*phy_connect)(struct bgmac *bgmac);\n++\n++\t/* platform device for associated switch */\n++\tstruct platform_device *b53_device;\n+ };\n+ \n+ struct bgmac *bgmac_alloc(struct device *dev);\ndiff --git a/target/linux/generic/hack-5.14/901-debloat_sock_diag.patch b/target/linux/generic/hack-5.14/901-debloat_sock_diag.patch\nnew file mode 100644\nindex 0000000000..34e73831f1\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/901-debloat_sock_diag.patch\n@@ -0,0 +1,162 @@\n+From 3b6115d6b57a263bdc8c9b1df273bd4a7955eead Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 8 Jul 2017 08:16:31 +0200\n+Subject: debloat: add some debloat patches, strip down procfs and make O_DIRECT support optional, saves ~15K after lzma on MIPS\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/Kconfig         | 3 +++\n+ net/core/Makefile   | 3 ++-\n+ net/core/sock.c     | 2 ++\n+ net/ipv4/Kconfig    | 1 +\n+ net/netlink/Kconfig | 1 +\n+ net/packet/Kconfig  | 1 +\n+ net/unix/Kconfig    | 1 +\n+ 7 files changed, 11 insertions(+), 1 deletion(-)\n+\n+--- a/net/Kconfig\n++++ b/net/Kconfig\n+@@ -98,6 +98,9 @@ source \"net/mptcp/Kconfig\"\n+ \n+ endif # if INET\n+ \n++config SOCK_DIAG\n++\tbool\n++\n+ config NETWORK_SECMARK\n+ \tbool \"Security Marking\"\n+ \thelp\n+--- a/net/core/Makefile\n++++ b/net/core/Makefile\n+@@ -10,9 +10,10 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.\n+ \n+ obj-y\t\t     += dev.o dev_addr_lists.o dst.o netevent.o \\\n+ \t\t\tneighbour.o rtnetlink.o utils.o link_watch.o filter.o \\\n+-\t\t\tsock_diag.o dev_ioctl.o tso.o sock_reuseport.o \\\n++ \t\t\tdev_ioctl.o tso.o sock_reuseport.o \\\n+ \t\t\tfib_notifier.o xdp.o flow_offload.o\n+ \n++obj-$(CONFIG_SOCK_DIAG) += sock_diag.o\n+ obj-y += net-sysfs.o\n+ obj-$(CONFIG_PAGE_POOL) += page_pool.o\n+ obj-$(CONFIG_PROC_FS) += net-procfs.o\n+--- a/net/core/sock.c\n++++ b/net/core/sock.c\n+@@ -114,6 +114,7 @@\n+ #include <linux/memcontrol.h>\n+ #include <linux/prefetch.h>\n+ #include <linux/compat.h>\n++#include <linux/cookie.h>\n+ \n+ #include <linux/uaccess.h>\n+ \n+@@ -143,6 +144,7 @@\n+ \n+ static DEFINE_MUTEX(proto_list_mutex);\n+ static LIST_HEAD(proto_list);\n++DEFINE_COOKIE(sock_cookie);\n+ \n+ static void sock_inuse_add(struct net *net, int val);\n+ \n+@@ -544,6 +546,18 @@ discard_and_relse:\n+ }\n+ EXPORT_SYMBOL(__sk_receive_skb);\n+ \n++u64 __sock_gen_cookie(struct sock *sk)\n++{\n++\twhile (1) {\n++\t\tu64 res = atomic64_read(&sk->sk_cookie);\n++\n++\t\tif (res)\n++\t\t\treturn res;\n++\t\tres = gen_cookie_next(&sock_cookie);\n++\t\tatomic64_cmpxchg(&sk->sk_cookie, 0, res);\n++\t}\n++}\n++\n+ INDIRECT_CALLABLE_DECLARE(struct dst_entry *ip6_dst_check(struct dst_entry *,\n+ \t\t\t\t\t\t\t  u32));\n+ INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *,\n+@@ -1967,9 +1981,11 @@ static void __sk_free(struct sock *sk)\n+ \tif (likely(sk->sk_net_refcnt))\n+ \t\tsock_inuse_add(sock_net(sk), -1);\n+ \n++#ifdef CONFIG_SOCK_DIAG\n+ \tif (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk)))\n+ \t\tsock_diag_broadcast_destroy(sk);\n+ \telse\n++#endif\n+ \t\tsk_destruct(sk);\n+ }\n+ \n+--- a/net/core/sock_diag.c\n++++ b/net/core/sock_diag.c\n+@@ -11,7 +11,6 @@\n+ #include <linux/tcp.h>\n+ #include <linux/workqueue.h>\n+ #include <linux/nospec.h>\n+-#include <linux/cookie.h>\n+ #include <linux/inet_diag.h>\n+ #include <linux/sock_diag.h>\n+ \n+@@ -20,20 +19,6 @@ static int (*inet_rcv_compat)(struct sk_\n+ static DEFINE_MUTEX(sock_diag_table_mutex);\n+ static struct workqueue_struct *broadcast_wq;\n+ \n+-DEFINE_COOKIE(sock_cookie);\n+-\n+-u64 __sock_gen_cookie(struct sock *sk)\n+-{\n+-\twhile (1) {\n+-\t\tu64 res = atomic64_read(&sk->sk_cookie);\n+-\n+-\t\tif (res)\n+-\t\t\treturn res;\n+-\t\tres = gen_cookie_next(&sock_cookie);\n+-\t\tatomic64_cmpxchg(&sk->sk_cookie, 0, res);\n+-\t}\n+-}\n+-\n+ int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie)\n+ {\n+ \tu64 res;\n+--- a/net/ipv4/Kconfig\n++++ b/net/ipv4/Kconfig\n+@@ -414,6 +414,7 @@ config INET_TUNNEL\n+ \n+ config INET_DIAG\n+ \ttristate \"INET: socket monitoring interface\"\n++\tselect SOCK_DIAG\n+ \tdefault y\n+ \thelp\n+ \t  Support for INET (TCP, DCCP, etc) socket monitoring interface used by\n+--- a/net/netlink/Kconfig\n++++ b/net/netlink/Kconfig\n+@@ -5,6 +5,7 @@\n+ \n+ config NETLINK_DIAG\n+ \ttristate \"NETLINK: socket monitoring interface\"\n++\tselect SOCK_DIAG\n+ \tdefault n\n+ \thelp\n+ \t  Support for NETLINK socket monitoring interface used by the ss tool.\n+--- a/net/packet/Kconfig\n++++ b/net/packet/Kconfig\n+@@ -19,6 +19,7 @@ config PACKET\n+ config PACKET_DIAG\n+ \ttristate \"Packet: sockets monitoring interface\"\n+ \tdepends on PACKET\n++\tselect SOCK_DIAG\n+ \tdefault n\n+ \thelp\n+ \t  Support for PF_PACKET sockets monitoring interface used by the ss tool.\n+--- a/net/unix/Kconfig\n++++ b/net/unix/Kconfig\n+@@ -28,6 +28,7 @@ config UNIX_SCM\n+ config UNIX_DIAG\n+ \ttristate \"UNIX: socket monitoring interface\"\n+ \tdepends on UNIX\n++\tselect SOCK_DIAG\n+ \tdefault n\n+ \thelp\n+ \t  Support for UNIX socket monitoring interface used by the ss tool.\ndiff --git a/target/linux/generic/hack-5.14/902-debloat_proc.patch b/target/linux/generic/hack-5.14/902-debloat_proc.patch\nnew file mode 100644\nindex 0000000000..349a2c02b9\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/902-debloat_proc.patch\n@@ -0,0 +1,408 @@\n+From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 8 Jul 2017 08:20:09 +0200\n+Subject: debloat: procfs\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ fs/locks.c               |  2 ++\n+ fs/proc/Kconfig          |  5 +++++\n+ fs/proc/consoles.c       |  3 +++\n+ fs/proc/proc_tty.c       | 11 ++++++++++-\n+ include/net/snmp.h       | 18 +++++++++++++++++-\n+ ipc/msg.c                |  3 +++\n+ ipc/sem.c                |  2 ++\n+ ipc/shm.c                |  2 ++\n+ ipc/util.c               |  3 +++\n+ kernel/exec_domain.c     |  2 ++\n+ kernel/irq/proc.c        |  9 +++++++++\n+ kernel/time/timer_list.c |  2 ++\n+ mm/vmalloc.c             |  2 ++\n+ mm/vmstat.c              |  8 +++++---\n+ net/8021q/vlanproc.c     |  6 ++++++\n+ net/core/net-procfs.c    | 18 ++++++++++++------\n+ net/core/sock.c          |  2 ++\n+ net/ipv4/fib_trie.c      | 18 ++++++++++++------\n+ net/ipv4/proc.c          |  3 +++\n+ net/ipv4/route.c         |  3 +++\n+ 20 files changed, 105 insertions(+), 17 deletions(-)\n+\n+--- a/fs/locks.c\n++++ b/fs/locks.c\n+@@ -3044,6 +3044,8 @@ static const struct seq_operations locks\n+ \n+ static int __init proc_locks_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n+ \tproc_create_seq_private(\"locks\", 0, NULL, &locks_seq_operations,\n+ \t\t\tsizeof(struct locks_iterator), NULL);\n+ \treturn 0;\n+--- a/fs/proc/Kconfig\n++++ b/fs/proc/Kconfig\n+@@ -100,6 +100,11 @@ config PROC_CHILDREN\n+ \t  Say Y if you are running any user-space software which takes benefit from\n+ \t  this interface. For example, rkt is such a piece of software.\n+ \n++config PROC_STRIPPED\n++\tdefault n\n++\tdepends on EXPERT\n++\tbool \"Strip non-essential /proc functionality to reduce code size\"\n++\n+ config PROC_PID_ARCH_STATUS\n+ \tdef_bool n\n+ \tdepends on PROC_FS\n+--- a/fs/proc/consoles.c\n++++ b/fs/proc/consoles.c\n+@@ -92,6 +92,9 @@ static const struct seq_operations conso\n+ \n+ static int __init proc_consoles_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n++\n+ \tproc_create_seq(\"consoles\", 0, NULL, &consoles_op);\n+ \treturn 0;\n+ }\n+--- a/fs/proc/proc_tty.c\n++++ b/fs/proc/proc_tty.c\n+@@ -133,7 +133,10 @@ static const struct seq_operations tty_d\n+ void proc_tty_register_driver(struct tty_driver *driver)\n+ {\n+ \tstruct proc_dir_entry *ent;\n+-\t\t\n++\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tif (!driver->driver_name || driver->proc_entry ||\n+ \t    !driver->ops->proc_show)\n+ \t\treturn;\n+@@ -150,6 +153,9 @@ void proc_tty_unregister_driver(struct t\n+ {\n+ \tstruct proc_dir_entry *ent;\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tent = driver->proc_entry;\n+ \tif (!ent)\n+ \t\treturn;\n+@@ -164,6 +170,9 @@ void proc_tty_unregister_driver(struct t\n+  */\n+ void __init proc_tty_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tif (!proc_mkdir(\"tty\", NULL))\n+ \t\treturn;\n+ \tproc_mkdir(\"tty/ldisc\", NULL);\t/* Preserved: it's userspace visible */\n+--- a/include/net/snmp.h\n++++ b/include/net/snmp.h\n+@@ -124,6 +124,21 @@ struct linux_tls_mib {\n+ #define DECLARE_SNMP_STAT(type, name)\t\\\n+ \textern __typeof__(type) __percpu *name\n+ \n++#ifdef CONFIG_PROC_STRIPPED\n++#define __SNMP_STATS_DUMMY(mib)\t\\\n++\tdo { (void) mib->mibs[0]; } while(0)\n++\n++#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)\n++#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib)\n++#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)\n++#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)\n++#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)\n++#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)\n++#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)\n++#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)\n++\n++#else\n++\n+ #define __SNMP_INC_STATS(mib, field)\t\\\n+ \t\t\t__this_cpu_inc(mib->mibs[field])\n+ \n+@@ -154,8 +169,9 @@ struct linux_tls_mib {\n+ \t\t__this_cpu_add(ptr[basefield##OCTETS], addend);\t\\\n+ \t} while (0)\n+ \n++#endif\n+ \n+-#if BITS_PER_LONG==32\n++#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED)\n+ \n+ #define __SNMP_ADD_STATS64(mib, field, addend) \t\t\t\t\\\n+ \tdo {\t\t\t\t\t\t\t\t\\\n+--- a/ipc/msg.c\n++++ b/ipc/msg.c\n+@@ -1350,6 +1350,9 @@ void __init msg_init(void)\n+ {\n+ \tmsg_init_ns(&init_ipc_ns);\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tipc_init_proc_interface(\"sysvipc/msg\",\n+ \t\t\t\t\"       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime\\n\",\n+ \t\t\t\tIPC_MSG_IDS, sysvipc_msg_proc_show);\n+--- a/ipc/sem.c\n++++ b/ipc/sem.c\n+@@ -268,6 +268,8 @@ void sem_exit_ns(struct ipc_namespace *n\n+ void __init sem_init(void)\n+ {\n+ \tsem_init_ns(&init_ipc_ns);\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n+ \tipc_init_proc_interface(\"sysvipc/sem\",\n+ \t\t\t\t\"       key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime\\n\",\n+ \t\t\t\tIPC_SEM_IDS, sysvipc_sem_proc_show);\n+--- a/ipc/shm.c\n++++ b/ipc/shm.c\n+@@ -144,6 +144,8 @@ pure_initcall(ipc_ns_init);\n+ \n+ void __init shm_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n+ \tipc_init_proc_interface(\"sysvipc/shm\",\n+ #if BITS_PER_LONG <= 32\n+ \t\t\t\t\"       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime        rss       swap\\n\",\n+--- a/ipc/util.c\n++++ b/ipc/util.c\n+@@ -141,6 +141,9 @@ void __init ipc_init_proc_interface(cons\n+ \tstruct proc_dir_entry *pde;\n+ \tstruct ipc_proc_iface *iface;\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tiface = kmalloc(sizeof(*iface), GFP_KERNEL);\n+ \tif (!iface)\n+ \t\treturn;\n+--- a/kernel/exec_domain.c\n++++ b/kernel/exec_domain.c\n+@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct\n+ \n+ static int __init proc_execdomains_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n+ \tproc_create_single(\"execdomains\", 0, NULL, execdomains_proc_show);\n+ \treturn 0;\n+ }\n+--- a/kernel/irq/proc.c\n++++ b/kernel/irq/proc.c\n+@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq,\n+ \tvoid __maybe_unused *irqp = (void *)(unsigned long) irq;\n+ \tchar name [MAX_NAMELEN];\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))\n++\t\treturn;\n++\n+ \tif (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))\n+ \t\treturn;\n+ \n+@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir\n+ {\n+ \tchar name [MAX_NAMELEN];\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))\n++\t\treturn;\n++\n+ \tif (!root_irq_dir || !desc->dir)\n+ \t\treturn;\n+ #ifdef CONFIG_SMP\n+@@ -432,6 +438,9 @@ void init_irq_proc(void)\n+ \tunsigned int irq;\n+ \tstruct irq_desc *desc;\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))\n++\t\treturn;\n++\n+ \t/* create /proc/irq */\n+ \troot_irq_dir = proc_mkdir(\"irq\", NULL);\n+ \tif (!root_irq_dir)\n+--- a/kernel/time/timer_list.c\n++++ b/kernel/time/timer_list.c\n+@@ -350,6 +350,8 @@ static int __init init_timer_list_procfs\n+ {\n+ \tstruct proc_dir_entry *pe;\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n+ \tpe = proc_create_seq_private(\"timer_list\", 0400, NULL, &timer_list_sops,\n+ \t\t\tsizeof(struct timer_list_iter), NULL);\n+ \tif (!pe)\n+--- a/mm/vmalloc.c\n++++ b/mm/vmalloc.c\n+@@ -3899,6 +3899,8 @@ static const struct seq_operations vmall\n+ \n+ static int __init proc_vmalloc_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n+ \tif (IS_ENABLED(CONFIG_NUMA))\n+ \t\tproc_create_seq_private(\"vmallocinfo\", 0400, NULL,\n+ \t\t\t\t&vmalloc_op,\n+--- a/mm/vmstat.c\n++++ b/mm/vmstat.c\n+@@ -2044,10 +2044,12 @@ void __init init_mm_internals(void)\n+ \tstart_shepherd_timer();\n+ #endif\n+ #ifdef CONFIG_PROC_FS\n+-\tproc_create_seq(\"buddyinfo\", 0444, NULL, &fragmentation_op);\n+-\tproc_create_seq(\"pagetypeinfo\", 0400, NULL, &pagetypeinfo_op);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {\n++\t\tproc_create_seq(\"buddyinfo\", 0444, NULL, &fragmentation_op);\n++\t\tproc_create_seq(\"pagetypeinfo\", 0400, NULL, &pagetypeinfo_op);\n++\t\tproc_create_seq(\"zoneinfo\", 0444, NULL, &zoneinfo_op);\n++\t}\n+ \tproc_create_seq(\"vmstat\", 0444, NULL, &vmstat_op);\n+-\tproc_create_seq(\"zoneinfo\", 0444, NULL, &zoneinfo_op);\n+ #endif\n+ }\n+ \n+--- a/net/8021q/vlanproc.c\n++++ b/net/8021q/vlanproc.c\n+@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net)\n+ {\n+ \tstruct vlan_net *vn = net_generic(net, vlan_net_id);\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn;\n++\n+ \tif (vn->proc_vlan_conf)\n+ \t\tremove_proc_entry(name_conf, vn->proc_vlan_dir);\n+ \n+@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net\n+ {\n+ \tstruct vlan_net *vn = net_generic(net, vlan_net_id);\n+ \n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n++\n+ \tvn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net);\n+ \tif (!vn->proc_vlan_dir)\n+ \t\tgoto err;\n+--- a/net/core/net-procfs.c\n++++ b/net/core/net-procfs.c\n+@@ -287,10 +287,12 @@ static int __net_init dev_proc_net_init(\n+ \tif (!proc_create_net(\"dev\", 0444, net->proc_net, &dev_seq_ops,\n+ \t\t\tsizeof(struct seq_net_private)))\n+ \t\tgoto out;\n+-\tif (!proc_create_seq(\"softnet_stat\", 0444, net->proc_net,\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&\n++\t\t\t!proc_create_seq(\"softnet_stat\", 0444, net->proc_net,\n+ \t\t\t &softnet_seq_ops))\n+ \t\tgoto out_dev;\n+-\tif (!proc_create_net(\"ptype\", 0444, net->proc_net, &ptype_seq_ops,\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&\n++\t\t\t!proc_create_net(\"ptype\", 0444, net->proc_net, &ptype_seq_ops,\n+ \t\t\tsizeof(struct seq_net_private)))\n+ \t\tgoto out_softnet;\n+ \n+@@ -300,9 +302,11 @@ static int __net_init dev_proc_net_init(\n+ out:\n+ \treturn rc;\n+ out_ptype:\n+-\tremove_proc_entry(\"ptype\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\tremove_proc_entry(\"ptype\", net->proc_net);\n+ out_softnet:\n+-\tremove_proc_entry(\"softnet_stat\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\tremove_proc_entry(\"softnet_stat\", net->proc_net);\n+ out_dev:\n+ \tremove_proc_entry(\"dev\", net->proc_net);\n+ \tgoto out;\n+@@ -312,8 +316,10 @@ static void __net_exit dev_proc_net_exit\n+ {\n+ \twext_proc_exit(net);\n+ \n+-\tremove_proc_entry(\"ptype\", net->proc_net);\n+-\tremove_proc_entry(\"softnet_stat\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {\n++\t\tremove_proc_entry(\"ptype\", net->proc_net);\n++\t\tremove_proc_entry(\"softnet_stat\", net->proc_net);\n++\t}\n+ \tremove_proc_entry(\"dev\", net->proc_net);\n+ }\n+ \n+--- a/net/core/sock.c\n++++ b/net/core/sock.c\n+@@ -3839,6 +3839,8 @@ static __net_initdata struct pernet_oper\n+ \n+ static int __init proto_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n+ \treturn register_pernet_subsys(&proto_net_ops);\n+ }\n+ \n+--- a/net/ipv4/fib_trie.c\n++++ b/net/ipv4/fib_trie.c\n+@@ -3015,11 +3015,13 @@ static const struct seq_operations fib_r\n+ \n+ int __net_init fib_proc_init(struct net *net)\n+ {\n+-\tif (!proc_create_net(\"fib_trie\", 0444, net->proc_net, &fib_trie_seq_ops,\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&\n++\t\t\t!proc_create_net(\"fib_trie\", 0444, net->proc_net, &fib_trie_seq_ops,\n+ \t\t\tsizeof(struct fib_trie_iter)))\n+ \t\tgoto out1;\n+ \n+-\tif (!proc_create_net_single(\"fib_triestat\", 0444, net->proc_net,\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&\n++\t\t\t!proc_create_net_single(\"fib_triestat\", 0444, net->proc_net,\n+ \t\t\tfib_triestat_seq_show, NULL))\n+ \t\tgoto out2;\n+ \n+@@ -3030,17 +3032,21 @@ int __net_init fib_proc_init(struct net\n+ \treturn 0;\n+ \n+ out3:\n+-\tremove_proc_entry(\"fib_triestat\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\tremove_proc_entry(\"fib_triestat\", net->proc_net);\n+ out2:\n+-\tremove_proc_entry(\"fib_trie\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\tremove_proc_entry(\"fib_trie\", net->proc_net);\n+ out1:\n+ \treturn -ENOMEM;\n+ }\n+ \n+ void __net_exit fib_proc_exit(struct net *net)\n+ {\n+-\tremove_proc_entry(\"fib_trie\", net->proc_net);\n+-\tremove_proc_entry(\"fib_triestat\", net->proc_net);\n++\tif (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {\n++\t\tremove_proc_entry(\"fib_trie\", net->proc_net);\n++\t\tremove_proc_entry(\"fib_triestat\", net->proc_net);\n++\t}\n+ \tremove_proc_entry(\"route\", net->proc_net);\n+ }\n+ \n+--- a/net/ipv4/proc.c\n++++ b/net/ipv4/proc.c\n+@@ -553,5 +553,8 @@ static __net_initdata struct pernet_oper\n+ \n+ int __init ip_misc_proc_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n++\n+ \treturn register_pernet_subsys(&ip_proc_ops);\n+ }\n+--- a/net/ipv4/route.c\n++++ b/net/ipv4/route.c\n+@@ -386,6 +386,9 @@ static struct pernet_operations ip_rt_pr\n+ \n+ static int __init ip_rt_proc_init(void)\n+ {\n++\tif (IS_ENABLED(CONFIG_PROC_STRIPPED))\n++\t\treturn 0;\n++\n+ \treturn register_pernet_subsys(&ip_rt_proc_ops);\n+ }\n+ \ndiff --git a/target/linux/generic/hack-5.14/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.14/904-debloat_dma_buf.patch\nnew file mode 100644\nindex 0000000000..ad4e7bcb6b\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/904-debloat_dma_buf.patch\n@@ -0,0 +1,82 @@\n+From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 8 Jul 2017 08:20:43 +0200\n+Subject: debloat: dmabuf\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/base/Kconfig      |  2 +-\n+ drivers/dma-buf/Makefile  | 10 +++++++---\n+ drivers/dma-buf/dma-buf.c |  4 +++-\n+ kernel/sched/core.c       |  1 +\n+ 4 files changed, 12 insertions(+), 5 deletions(-)\n+\n+--- a/drivers/base/Kconfig\n++++ b/drivers/base/Kconfig\n+@@ -187,7 +187,7 @@ config SOC_BUS\n+ source \"drivers/base/regmap/Kconfig\"\n+ \n+ config DMA_SHARED_BUFFER\n+-\tbool\n++\ttristate\n+ \tdefault n\n+ \tselect IRQ_WORK\n+ \thelp\n+--- a/drivers/dma-buf/Makefile\n++++ b/drivers/dma-buf/Makefile\n+@@ -1,15 +1,19 @@\n+ # SPDX-License-Identifier: GPL-2.0-only\n+-obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \\\n++obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o\n++\n++dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \\\n+ \t dma-resv.o seqno-fence.o\n+-obj-$(CONFIG_DMABUF_HEAPS)\t+= dma-heap.o\n+-obj-$(CONFIG_DMABUF_HEAPS)\t+= heaps/\n+-obj-$(CONFIG_SYNC_FILE)\t\t+= sync_file.o\n+-obj-$(CONFIG_SW_SYNC)\t\t+= sw_sync.o sync_debug.o\n+-obj-$(CONFIG_UDMABUF)\t\t+= udmabuf.o\n++dma-buf-objs-$(CONFIG_DMABUF_HEAPS)\t+= dma-heap.o\n++dma-buf-objs-$(CONFIG_DMABUF_HEAPS)\t+= heaps/\n++dma-buf-objs-$(CONFIG_SYNC_FILE)\t\t+= sync_file.o\n++dma-buf-objs-$(CONFIG_SW_SYNC)\t\t+= sw_sync.o sync_debug.o\n++dma-buf-objs-$(CONFIG_UDMABUF)\t\t+= udmabuf.o\n+ \n+ dmabuf_selftests-y := \\\n+ \tselftest.o \\\n+ \tst-dma-fence.o \\\n+ \tst-dma-fence-chain.o\n+ \n+-obj-$(CONFIG_DMABUF_SELFTESTS)\t+= dmabuf_selftests.o\n++dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS)\t+= dmabuf_selftests.o\n++\n++dma-shared-buffer-objs :=  $(dma-buf-objs-y)\n+--- a/drivers/dma-buf/dma-buf.c\n++++ b/drivers/dma-buf/dma-buf.c\n+@@ -1485,4 +1485,5 @@ static void __exit dma_buf_deinit(void)\n+ \tdma_buf_uninit_debugfs();\n+ \tkern_unmount(dma_buf_mnt);\n+ }\n+-__exitcall(dma_buf_deinit);\n++module_exit(dma_buf_deinit);\n++MODULE_LICENSE(\"GPL\");\n+--- a/kernel/sched/core.c\n++++ b/kernel/sched/core.c\n+@@ -3939,6 +3939,7 @@ int wake_up_state(struct task_struct *p,\n+ {\n+ \treturn try_to_wake_up(p, state, 0);\n+ }\n++EXPORT_SYMBOL_GPL(wake_up_state);\n+ \n+ /*\n+  * Perform scheduler related setup for a newly forked process p.\n+--- a/fs/d_path.c\n++++ b/fs/d_path.c\n+@@ -283,6 +283,7 @@ char *dynamic_dname(struct dentry *dentr\n+ \tbuffer += buflen - sz;\n+ \treturn memcpy(buffer, temp, sz);\n+ }\n++EXPORT_SYMBOL_GPL(dynamic_dname);\n+ \n+ char *simple_dname(struct dentry *dentry, char *buffer, int buflen)\n+ {\ndiff --git a/target/linux/generic/hack-5.14/910-kobject_uevent.patch b/target/linux/generic/hack-5.14/910-kobject_uevent.patch\nnew file mode 100644\nindex 0000000000..c4c41ca400\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/910-kobject_uevent.patch\n@@ -0,0 +1,32 @@\n+From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sun, 16 Jul 2017 16:56:10 +0200\n+Subject: lib: add uevent_next_seqnum()\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/kobject.h |  5 +++++\n+ lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++\n+ 2 files changed, 42 insertions(+)\n+\n+--- a/lib/kobject_uevent.c\n++++ b/lib/kobject_uevent.c\n+@@ -179,6 +179,18 @@ out:\n+ \treturn r;\n+ }\n+ \n++u64 uevent_next_seqnum(void)\n++{\n++\tu64 seq;\n++\n++\tmutex_lock(&uevent_sock_mutex);\n++\tseq = ++uevent_seqnum;\n++\tmutex_unlock(&uevent_sock_mutex);\n++\n++\treturn seq;\n++}\n++EXPORT_SYMBOL_GPL(uevent_next_seqnum);\n++\n+ /**\n+  * kobject_synth_uevent - send synthetic uevent with arguments\n+  *\ndiff --git a/target/linux/generic/hack-5.14/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-5.14/911-kobject_add_broadcast_uevent.patch\nnew file mode 100644\nindex 0000000000..a487d55193\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/911-kobject_add_broadcast_uevent.patch\n@@ -0,0 +1,76 @@\n+From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sun, 16 Jul 2017 16:56:10 +0200\n+Subject: lib: add uevent_next_seqnum()\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/kobject.h |  5 +++++\n+ lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++\n+ 2 files changed, 42 insertions(+)\n+\n+--- a/include/linux/kobject.h\n++++ b/include/linux/kobject.h\n+@@ -32,6 +32,8 @@\n+ #define UEVENT_NUM_ENVP\t\t\t64\t/* number of env pointers */\n+ #define UEVENT_BUFFER_SIZE\t\t2048\t/* buffer for the variables */\n+ \n++struct sk_buff;\n++\n+ #ifdef CONFIG_UEVENT_HELPER\n+ /* path to the userspace helper executed on an event */\n+ extern char uevent_helper[];\n+@@ -244,4 +246,7 @@ int kobject_synth_uevent(struct kobject\n+ __printf(2, 3)\n+ int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);\n+ \n++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,\n++\t\t     gfp_t allocation);\n++\n+ #endif /* _KOBJECT_H_ */\n+--- a/lib/kobject_uevent.c\n++++ b/lib/kobject_uevent.c\n+@@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en\n+ EXPORT_SYMBOL_GPL(add_uevent_var);\n+ \n+ #if defined(CONFIG_NET)\n++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,\n++\t\t     gfp_t allocation)\n++{\n++\tstruct uevent_sock *ue_sk;\n++\tint err = 0;\n++\n++\t/* send netlink message */\n++\tmutex_lock(&uevent_sock_mutex);\n++\tlist_for_each_entry(ue_sk, &uevent_sock_list, list) {\n++\t\tstruct sock *uevent_sock = ue_sk->sk;\n++\t\tstruct sk_buff *skb2;\n++\n++\t\tskb2 = skb_clone(skb, allocation);\n++\t\tif (!skb2)\n++\t\t\tbreak;\n++\n++\t\terr = netlink_broadcast(uevent_sock, skb2, pid, group,\n++\t\t\t\t\tallocation);\n++\t\tif (err)\n++\t\t\tbreak;\n++\t}\n++\tmutex_unlock(&uevent_sock_mutex);\n++\n++\tkfree_skb(skb);\n++\treturn err;\n++}\n++#else\n++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,\n++\t\t     gfp_t allocation)\n++{\n++\tkfree_skb(skb);\n++\treturn 0;\n++}\n++#endif\n++EXPORT_SYMBOL_GPL(broadcast_uevent);\n++\n++#if defined(CONFIG_NET)\n+ static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb,\n+ \t\t\t\tstruct netlink_ext_ack *extack)\n+ {\ndiff --git a/target/linux/generic/hack-5.14/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.14/952-net-conntrack-events-support-multiple-registrant.patch\nnew file mode 100644\nindex 0000000000..c033088289\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/952-net-conntrack-events-support-multiple-registrant.patch\n@@ -0,0 +1,312 @@\n+From 42824d4b753f84ccf885eca602c5037338b546c8 Mon Sep 17 00:00:00 2001\n+From: Zhi Chen <zhichen@codeaurora.org>\n+Date: Tue, 13 Jan 2015 14:28:18 -0800\n+Subject: [PATCH 3/3] net: conntrack events, support multiple registrant\n+\n+Merging this patch from kernel 3.4:\n+This was supported by old (.28) kernel versions but removed\n+because of it's overhead.\n+But we need this feature for NA connection manager. Both ipv4\n+and ipv6 modules needs to register themselves to ct events.\n+\n+Change-Id: Iebfb254590fb594f5baf232f849d1b7ae45ef757\n+Signed-off-by: Zhi Chen <zhichen@codeaurora.org>\n+---\n+ include/net/netfilter/nf_conntrack_ecache.h | 42 ++++++++++++++++++-\n+ include/net/netns/conntrack.h               |  4 ++\n+ net/netfilter/Kconfig                       |  8 ++++\n+ net/netfilter/nf_conntrack_core.c           |  4 ++\n+ net/netfilter/nf_conntrack_ecache.c         | 63 +++++++++++++++++++++++++++++\n+ net/netfilter/nf_conntrack_netlink.c        | 17 ++++++++\n+ 6 files changed, 137 insertions(+), 1 deletion(-)\n+\n+--- a/include/net/netfilter/nf_conntrack_ecache.h\n++++ b/include/net/netfilter/nf_conntrack_ecache.h\n+@@ -72,6 +72,10 @@ struct nf_ct_event {\n+ \tint report;\n+ };\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);\n++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);\n++#else\n+ struct nf_ct_event_notifier {\n+ \tint (*fcn)(unsigned int events, struct nf_ct_event *item);\n+ };\n+@@ -80,6 +84,7 @@ int nf_conntrack_register_notifier(struc\n+ \t\t\t\t   struct nf_ct_event_notifier *nb);\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *nb);\n++#endif\n+ \n+ void nf_ct_deliver_cached_events(struct nf_conn *ct);\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+@@ -105,11 +110,13 @@ static inline void\n+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n+-\tstruct net *net = nf_ct_net(ct);\n+ \tstruct nf_conntrack_ecache *e;\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn;\n++#endif\n+ \n+ \te = nf_ct_ecache_find(ct);\n+ \tif (e == NULL)\n+@@ -124,10 +131,12 @@ nf_conntrack_event_report(enum ip_conntr\n+ \t\t\t  u32 portid, int report)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, portid, report);\n+ #else\n+@@ -139,10 +148,12 @@ static inline int\n+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)\n+ {\n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n+ \tconst struct net *net = nf_ct_net(ct);\n+ \n+ \tif (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))\n+ \t\treturn 0;\n++#endif\n+ \n+ \treturn nf_conntrack_eventmask_report(1 << event, ct, 0, 0);\n+ #else\n+--- a/include/net/netns/conntrack.h\n++++ b/include/net/netns/conntrack.h\n+@@ -113,7 +113,11 @@ struct netns_ct {\n+ \n+ \tstruct ct_pcpu __percpu *pcpu_lists;\n+ \tstruct ip_conntrack_stat __percpu *stat;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tstruct atomic_notifier_head nf_conntrack_chain;\n++#else\n+ \tstruct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;\n++#endif\n+ \tstruct nf_exp_event_notifier __rcu *nf_expect_event_cb;\n+ \tstruct nf_ip_net\tnf_ct_proto;\n+ #if defined(CONFIG_NF_CONNTRACK_LABELS)\n+--- a/net/netfilter/Kconfig\n++++ b/net/netfilter/Kconfig\n+@@ -151,6 +151,14 @@ config NF_CONNTRACK_EVENTS\n+ \n+ \t  If unsure, say `N'.\n+ \n++config NF_CONNTRACK_CHAIN_EVENTS\n++\tbool \"Register multiple callbacks to ct events\"\n++\tdepends on NF_CONNTRACK_EVENTS\n++\thelp\n++\t  Support multiple registrations.\n++\n++\t  If unsure, say `N'.\n++\n+ config NF_CONNTRACK_TIMEOUT\n+ \tbool  'Connection tracking timeout'\n+ \tdepends on NETFILTER_ADVANCED\n+--- a/net/netfilter/nf_conntrack_core.c\n++++ b/net/netfilter/nf_conntrack_core.c\n+@@ -2763,6 +2763,9 @@ int nf_conntrack_init_net(struct net *ne\n+ \tnf_conntrack_helper_pernet_init(net);\n+ \tnf_conntrack_proto_pernet_init(net);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++\tATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);\n++#endif\n+ \treturn 0;\n+ \n+ err_expect:\n+--- a/net/netfilter/nf_conntrack_ecache.c\n++++ b/net/netfilter/nf_conntrack_ecache.c\n+@@ -17,6 +17,9 @@\n+ #include <linux/stddef.h>\n+ #include <linux/err.h>\n+ #include <linux/percpu.h>\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++#include <linux/notifier.h>\n++#endif\n+ #include <linux/kernel.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/slab.h>\n+@@ -129,7 +132,35 @@ static void ecache_work(struct work_stru\n+ \tif (delay >= 0)\n+ \t\tschedule_delayed_work(&cnet->ecache_dwork, delay);\n+ }\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n++\t\t\t\t  u32 portid, int report)\n++{\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn 0;\n++\n++\tif (nf_ct_is_confirmed(ct)) {\n++\t\tstruct nf_ct_event item = {\n++\t\t\t.ct = ct,\n++\t\t\t.portid\t= e->portid ? e->portid : portid,\n++\t\t\t.report = report\n++\t\t};\n++\t\t/* This is a resent of a destroy event? If so, skip missed */\n++\t\tunsigned long missed = e->portid ? 0 : e->missed;\n++\n++\t\tif (!((eventmask | missed) & e->ctmask))\n++\t\t\treturn 0;\n+ \n++\t\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);\n++\t}\n++\n++\treturn 0;\n++}\n++#else\n+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,\n+ \t\t\t\t  u32 portid, int report)\n+ {\n+@@ -184,10 +215,52 @@ out_unlock:\n+ \trcu_read_unlock();\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);\n+ \n+ /* deliver cached events and clear cache entry - must be called with locally\n+  * disabled softirqs */\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++void nf_ct_deliver_cached_events(struct nf_conn *ct)\n++{\n++\tunsigned long events, missed;\n++\tstruct nf_conntrack_ecache *e;\n++\tstruct nf_ct_event item;\n++\tstruct net *net = nf_ct_net(ct);\n++\n++\te = nf_ct_ecache_find(ct);\n++\tif (e == NULL)\n++\t\treturn;\n++\n++\tevents = xchg(&e->cache, 0);\n++\n++\tif (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)\n++\t\treturn;\n++\n++\t/* We make a copy of the missed event cache without taking\n++\t * the lock, thus we may send missed events twice. However,\n++\t * this does not harm and it happens very rarely. */\n++\tmissed = e->missed;\n++\n++\tif (!((events | missed) & e->ctmask))\n++\t\treturn;\n++\n++\titem.ct = ct;\n++\titem.portid = 0;\n++\titem.report = 0;\n++\n++\tatomic_notifier_call_chain(&net->ct.nf_conntrack_chain,\n++\t\t\tevents | missed,\n++\t\t\t&item);\n++\n++\tif (likely(!missed))\n++\t\treturn;\n++\n++\tspin_lock_bh(&ct->lock);\n++\t\te->missed &= ~missed;\n++\tspin_unlock_bh(&ct->lock);\n++}\n++#else\n+ void nf_ct_deliver_cached_events(struct nf_conn *ct)\n+ {\n+ \tstruct net *net = nf_ct_net(ct);\n+@@ -238,6 +311,7 @@ void nf_ct_deliver_cached_events(struct\n+ out_unlock:\n+ \trcu_read_unlock();\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);\n+ \n+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,\n+@@ -270,6 +344,13 @@ out_unlock:\n+ \trcu_read_unlock();\n+ }\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_register_notifier(struct net *net,\n++\t\t\t\t   struct notifier_block *nb)\n++{\n++        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ int nf_conntrack_register_notifier(struct net *net,\n+ \t\t\t\t   struct nf_ct_event_notifier *new)\n+ {\n+@@ -290,8 +371,15 @@ out_unlock:\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \treturn ret;\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);\n+ \n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)\n++{\n++\treturn atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);\n++}\n++#else\n+ void nf_conntrack_unregister_notifier(struct net *net,\n+ \t\t\t\t      struct nf_ct_event_notifier *new)\n+ {\n+@@ -305,6 +393,7 @@ void nf_conntrack_unregister_notifier(st\n+ \tmutex_unlock(&nf_ct_ecache_mutex);\n+ \t/* synchronize_rcu() is called from ctnetlink_exit. */\n+ }\n++#endif\n+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);\n+ \n+ int nf_ct_expect_register_notifier(struct net *net,\n+--- a/net/netfilter/nf_conntrack_netlink.c\n++++ b/net/netfilter/nf_conntrack_netlink.c\n+@@ -703,12 +703,19 @@ static size_t ctnetlink_nlmsg_size(const\n+ }\n+ \n+ static int\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)\n++#else\n+ ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)\n++#endif\n+ {\n+ \tconst struct nf_conntrack_zone *zone;\n+ \tstruct net *net;\n+ \tstruct nlmsghdr *nlh;\n+ \tstruct nlattr *nest_parms;\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++       struct nf_ct_event *item = (struct nf_ct_event *)ptr;\n++#endif\n+ \tstruct nf_conn *ct = item->ct;\n+ \tstruct sk_buff *skb;\n+ \tunsigned int type;\n+@@ -3707,9 +3714,15 @@ static int ctnetlink_stat_exp_cpu(struct\n+ }\n+ \n+ #ifdef CONFIG_NF_CONNTRACK_EVENTS\n++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS\n++static struct notifier_block ctnl_notifier = {\n++\t.notifier_call = ctnetlink_conntrack_event,\n++};\n++#else\n+ static struct nf_ct_event_notifier ctnl_notifier = {\n+ \t.fcn = ctnetlink_conntrack_event,\n+ };\n++#endif\n+ \n+ static struct nf_exp_event_notifier ctnl_notifier_exp = {\n+ \t.fcn = ctnetlink_expect_event,\ndiff --git a/target/linux/generic/hack-5.14/992-add-ndo-do-ioctl.patch b/target/linux/generic/hack-5.14/992-add-ndo-do-ioctl.patch\nnew file mode 100644\nindex 0000000000..da206e4b46\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/992-add-ndo-do-ioctl.patch\n@@ -0,0 +1,12 @@\n+--- a/net/wireless/wext-core.c\n++++ b/net/wireless/wext-core.c\n+@@ -956,6 +956,9 @@ static int wireless_process_ioctl(struct\n+ \t\telse if (private)\n+ \t\t\treturn private(dev, iwr, cmd, info, handler);\n+ \t}\n++\t/* Old driver API : call driver ioctl handler */\n++\tif (dev->netdev_ops->ndo_do_ioctl)\n++\t\treturn dev->netdev_ops->ndo_do_ioctl(dev, (struct ifreq *) iwr, cmd);\n+ \treturn -EOPNOTSUPP;\n+ }\n+ \ndiff --git a/target/linux/generic/hack-5.14/993-usb-serial-option-add-u9300.patch b/target/linux/generic/hack-5.14/993-usb-serial-option-add-u9300.patch\nnew file mode 100644\nindex 0000000000..8dab4b9f2d\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/993-usb-serial-option-add-u9300.patch\n@@ -0,0 +1,46 @@\n+--- a/drivers/net/usb/qmi_wwan.c\n++++ b/drivers/net/usb/qmi_wwan.c\n+@@ -1398,6 +1398,7 @@ static const struct usb_device_id produc\n+ \t{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)},\t/* HP lt4120 Snapdragon X5 LTE */\n+ \t{QMI_FIXED_INTF(0x22de, 0x9061, 3)},\t/* WeTelecom WPD-600N */\n+ \t{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)},\t/* SIMCom 7100E, 7230E, 7600E ++ */\n++\t{QMI_FIXED_INTF(0x1c9e, 0x9b3c, 4)},\t/* LONGSUNG_U9300 */\n+ \t{QMI_QUIRK_SET_DTR(0x2c7c, 0x0121, 4)},\t/* Quectel EC21 Mini PCIe */\n+ \t{QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)},\t/* Quectel EG91 */\n+ \t{QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)},\t/* Quectel EG95 */\n+--- a/drivers/usb/serial/option.c\n++++ b/drivers/usb/serial/option.c\n+@@ -383,6 +383,7 @@ static void option_instat_callback(struc\n+  * Mobidata, etc sell under their own brand names.\n+  */\n+ #define LONGCHEER_VENDOR_ID\t\t\t0x1c9e\n++#define LONGSUNG_U9300_PRODUCT_ID\t\t0x9b3c\n+ \n+ /* 4G Systems products */\n+ /* This is the 4G XS Stick W14 a.k.a. Mobilcom Debitel Surf-Stick *\n+@@ -580,6 +581,16 @@ static void option_instat_callback(struc\n+ /* Device needs ZLP */\n+ #define ZLP\t\tBIT(17)\n+ \n++struct option_blacklist_info {\n++\t/* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */\n++\tconst unsigned long sendsetup;\n++\t/* bitfield of interface numbers for OPTION_BLACKLIST_RESERVED_IF */\n++\tconst unsigned long reserved;\n++};\n++\n++static const struct option_blacklist_info longsung_u9300_blacklist = {\n++\t.reserved = BIT(4),\n++};\n+ \n+ static const struct usb_device_id option_ids[] = {\n+ \t{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },\n+@@ -614,6 +625,8 @@ static const struct usb_device_id option\n+ \t{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) },\n+ \t{ USB_DEVICE(QUANTA_VENDOR_ID, 0xea42),\n+ \t  .driver_info = RSVD(4) },\n++\t{ USB_DEVICE(LONGCHEER_VENDOR_ID,LONGSUNG_U9300_PRODUCT_ID),\n++\t  .driver_info = (kernel_ulong_t)&longsung_u9300_blacklist},\n+ \t{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c05, USB_CLASS_COMM, 0x02, 0xff) },\n+ \t{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c1f, USB_CLASS_COMM, 0x02, 0xff) },\n+ \t{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) },\ndiff --git a/target/linux/generic/hack-5.14/999-make-phylink-tristate.patch b/target/linux/generic/hack-5.14/999-make-phylink-tristate.patch\nnew file mode 100644\nindex 0000000000..c72e149934\n--- /dev/null\n+++ b/target/linux/generic/hack-5.14/999-make-phylink-tristate.patch\n@@ -0,0 +1,11 @@\n+--- a/drivers/net/phy/Kconfig\n++++ b/drivers/net/phy/Kconfig\n+@@ -4,7 +4,7 @@\n+ #\n+ \n+ config PHYLINK\n+-\ttristate\n++\ttristate \"Phylink config support\"\n+ \tdepends on NETDEVICES\n+ \tselect PHYLIB\n+ \tselect SWPHY\ndiff --git a/target/linux/generic/pending-5.14/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch b/target/linux/generic/pending-5.14/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch\nnew file mode 100644\nindex 0000000000..c90806157a\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch\n@@ -0,0 +1,29 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Thu, 22 Oct 2020 22:00:03 +0200\n+Subject: [PATCH] compiler.h: only include asm/rwonce.h for kernel code\n+\n+This header file is not in uapi, which makes any user space code that includes\n+linux/compiler.h to fail with the error 'asm/rwonce.h: No such file or directory'\n+\n+Fixes: e506ea451254 (\"compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h\")\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+\n+--- a/include/linux/compiler.h\n++++ b/include/linux/compiler.h\n+@@ -231,6 +231,8 @@ void ftrace_likely_update(struct ftrace_\n+ #define function_nocfi(x) (x)\n+ #endif\n+ \n++#include <asm/rwonce.h>\n++\n+ #endif /* __KERNEL__ */\n+ \n+ /*\n+@@ -263,6 +265,4 @@ static inline void *offset_to_ptr(const\n+  */\n+ #define prevent_tail_call_optimization()\tmb()\n+ \n+-#include <asm/rwonce.h>\n+-\n+ #endif /* __LINUX_COMPILER_H */\ndiff --git a/target/linux/generic/pending-5.14/101-Use-stddefs.h-instead-of-compiler.h.patch b/target/linux/generic/pending-5.14/101-Use-stddefs.h-instead-of-compiler.h.patch\nnew file mode 100644\nindex 0000000000..824b9444ee\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/101-Use-stddefs.h-instead-of-compiler.h.patch\n@@ -0,0 +1,11 @@\n+--- a/include/uapi/linux/swab.h\n++++ b/include/uapi/linux/swab.h\n+@@ -3,7 +3,7 @@\n+ #define _UAPI_LINUX_SWAB_H\n+ \n+ #include <linux/types.h>\n+-#include <linux/compiler.h>\n++#include <linux/stddef.h>\n+ #include <asm/bitsperlong.h>\n+ #include <asm/swab.h>\n+ \ndiff --git a/target/linux/generic/pending-5.14/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-5.14/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch\nnew file mode 100644\nindex 0000000000..95a9656d26\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch\n@@ -0,0 +1,57 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Wed, 18 Apr 2018 10:50:05 +0200\n+Subject: [PATCH] MIPS: only process negative stack offsets on stack traces\n+\n+Fixes endless back traces in cases where the compiler emits a stack\n+pointer increase in a branch delay slot (probably for some form of\n+function return).\n+\n+[    3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low!\n+[    3.480070] turning off the locking correctness validator.\n+[    3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0\n+[    3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000\n+[    3.499764]         87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f\n+[    3.508059]         00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000\n+[    3.516353]         00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000\n+[    3.524648]         806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000\n+[    3.532942]         ...\n+[    3.535362] Call Trace:\n+[    3.537818] [<80010a48>] show_stack+0x58/0x100\n+[    3.542207] [<804c2f78>] dump_stack+0xe8/0x170\n+[    3.546613] [<80079f90>] save_trace+0xf0/0x110\n+[    3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c\n+[    3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08\n+[    3.560337] [<8007de60>] lock_acquire+0x64/0x8c\n+[    3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78\n+[    3.570186] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.579257] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.588329] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.597401] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.606473] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.615545] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.624619] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.633691] [<801b618c>] kernfs_notify+0x94/0xac\n+[    3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0\n+[    3.642763] [<801b618c>] kernfs_notify+0x94/0xac\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+\n+--- a/arch/mips/kernel/process.c\n++++ b/arch/mips/kernel/process.c\n+@@ -393,6 +393,8 @@ static inline int is_sp_move_ins(union m\n+ \n+ \tif (ip->i_format.opcode == addiu_op ||\n+ \t    ip->i_format.opcode == daddiu_op) {\n++\t\tif (ip->i_format.simmediate > 0)\n++\t\t\treturn 0;\n+ \t\t*frame_size = -ip->i_format.simmediate;\n+ \t\treturn 1;\n+ \t}\ndiff --git a/target/linux/generic/pending-5.14/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.14/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch\nnew file mode 100644\nindex 0000000000..53cb62382d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch\n@@ -0,0 +1,82 @@\n+From: Tobias Wolf <dev-NTEO@vplace.de>\n+Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation\n+\n+An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any\n+kernel beyond version 4.3 resulting in:\n+\n+BUG: Bad page state in process swapper  pfn:086ac\n+\n+bisect resulted in:\n+\n+a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit\n+commit a1c34a3bf00af2cede839879502e12dc68491ad5\n+Author: Laura Abbott <laura@labbott.name>\n+Date:   Thu Nov 5 18:48:46 2015 -0800\n+\n+    mm: Don't offset memmap for flatmem\n+\n+    Srinivas Kandagatla reported bad page messages when trying to remove the\n+    bottom 2MB on an ARM based IFC6410 board\n+\n+      BUG: Bad page state in process swapper  pfn:fffa8\n+      page:ef7fb500 count:0 mapcount:0 mapping:  (null) index:0x0\n+      flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked)\n+      page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set\n+      bad because of flags:\n+      flags: 0x200041(locked|active|mlocked)\n+      Modules linked in:\n+      CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty\n+#816\n+      Hardware name: Qualcomm (Flattened Device Tree)\n+        unwind_backtrace\n+        show_stack\n+        dump_stack\n+        bad_page\n+        free_pages_prepare\n+        free_hot_cold_page\n+        __free_pages\n+        free_highmem_page\n+        mem_init\n+        start_kernel\n+      Disabling lock debugging due to kernel taint\n+    [...]\n+:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4\n+0a8156f848733dfa21e16c196dfb6c0a76290709 M      mm\n+\n+This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by\n+page_to_pfn anymore.\n+\n+The following output was generated with two hacked in printk statements:\n+\n+printk(\"before %p vs. %p or %p\\n\", mem_map, mem_map - offset, mem_map -\n+(pgdat->node_start_pfn - ARCH_PFN_OFFSET));\n+\t\tif (page_to_pfn(mem_map) != pgdat->node_start_pfn)\n+\t\t\tmem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);\n+printk(\"after %p\\n\", mem_map);\n+\n+Output:\n+\n+[    0.000000] before 8861b280 vs. 8861b280 or 8851b280\n+[    0.000000] after 8851b280\n+\n+As seen in the first line mem_map with subtraction of offset does not equal the\n+mem_map after subtraction of ARCH_PFN_OFFSET.\n+\n+After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the\n+previously calculated offset is zero for the named platform it is able to boot\n+4.4 and 4.9-rc7 again.\n+\n+Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de>\n+---\n+\n+--- a/mm/page_alloc.c\n++++ b/mm/page_alloc.c\n+@@ -7540,7 +7540,7 @@ static void __ref alloc_node_mem_map(str\n+ \tif (pgdat == NODE_DATA(0)) {\n+ \t\tmem_map = NODE_DATA(0)->node_mem_map;\n+ \t\tif (page_to_pfn(mem_map) != pgdat->node_start_pfn)\n+-\t\t\tmem_map -= offset;\n++\t\t\tmem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);\n+ \t}\n+ #endif\n+ }\ndiff --git a/target/linux/generic/pending-5.14/130-add-linux-spidev-compatible-si3210.patch b/target/linux/generic/pending-5.14/130-add-linux-spidev-compatible-si3210.patch\nnew file mode 100644\nindex 0000000000..986149f4b1\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/130-add-linux-spidev-compatible-si3210.patch\n@@ -0,0 +1,18 @@\n+From: Giuseppe Lippolis <giu.lippolis@gmail.com>\n+Subject: Add the linux,spidev compatible in spidev Several device in ramips have this binding in the dts\n+\n+Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>\n+---\n+ drivers/spi/spidev.c | 1 +\n+ 1 file changed, 1 insertion(+)\n+\n+--- a/drivers/spi/spidev.c\n++++ b/drivers/spi/spidev.c\n+@@ -682,6 +682,7 @@ static const struct of_device_id spidev_\n+ \t{ .compatible = \"lwn,bk4\" },\n+ \t{ .compatible = \"dh,dhcom-board\" },\n+ \t{ .compatible = \"menlo,m53cpld\" },\n++\t{ .compatible = \"siliconlabs,si3210\" },\n+ \t{ .compatible = \"cisco,spi-petra\" },\n+ \t{ .compatible = \"micron,spi-authenta\" },\n+ \t{},\ndiff --git a/target/linux/generic/pending-5.14/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-5.14/150-bridge_allow_receiption_on_disabled_port.patch\nnew file mode 100644\nindex 0000000000..bf97e9870e\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/150-bridge_allow_receiption_on_disabled_port.patch\n@@ -0,0 +1,45 @@\n+From: Stephen Hemminger <stephen@networkplumber.org>\n+Subject: bridge: allow receiption on disabled port\n+\n+When an ethernet device is enslaved to a bridge, and the bridge STP\n+detects loss of carrier (or operational state down), then normally\n+packet receiption is blocked.\n+\n+This breaks control applications like WPA which maybe expecting to\n+receive packets to negotiate to bring link up. The bridge needs to\n+block forwarding packets from these disabled ports, but there is no\n+hard requirement to not allow local packet delivery.\n+\n+Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+\n+--- a/net/bridge/br_input.c\n++++ b/net/bridge/br_input.c\n+@@ -192,6 +192,9 @@ static void __br_handle_local_finish(str\n+ /* note: already called with rcu_read_lock */\n+ static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)\n+ {\n++\tstruct net_bridge_port *p = br_port_get_rcu(skb->dev);\n++\n++\tif (p->state != BR_STATE_DISABLED)\n+ \t__br_handle_local_finish(skb);\n+ \n+ \t/* return 1 to signal the okfn() was called so it's ok to use the skb */\n+@@ -360,6 +363,17 @@ static rx_handler_result_t br_handle_fra\n+ \n+ forward:\n+ \tswitch (p->state) {\n++\tcase BR_STATE_DISABLED:\n++\t\tif (ether_addr_equal(p->br->dev->dev_addr, dest))\n++\t\t\tskb->pkt_type = PACKET_HOST;\n++\n++\t\tif (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING,\n++\t\t\tdev_net(skb->dev), NULL, skb, skb->dev, NULL,\n++\t\t\tbr_handle_local_finish) == 1) {\n++\t\t\treturn RX_HANDLER_PASS;\n++\t\t}\n++\t\tbreak;\n++\n+ \tcase BR_STATE_FORWARDING:\n+ \tcase BR_STATE_LEARNING:\n+ \t\tif (ether_addr_equal(p->br->dev->dev_addr, dest))\ndiff --git a/target/linux/generic/pending-5.14/190-rtc-rs5c372-support_alarms_up_to_1_week.patch b/target/linux/generic/pending-5.14/190-rtc-rs5c372-support_alarms_up_to_1_week.patch\nnew file mode 100644\nindex 0000000000..13b79b5c09\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/190-rtc-rs5c372-support_alarms_up_to_1_week.patch\n@@ -0,0 +1,94 @@\n+From: Daniel González Cabanelas <dgcbueu@gmail.com>\n+Subject: [PATCH 1/2] rtc: rs5c372: support alarms up to 1 week\n+\n+The Ricoh R2221x, R2223x, RS5C372, RV5C387A chips can handle 1 week\n+alarms.\n+\n+Read the \"wday\" alarm register and convert it to a date to support up 1\n+week in our driver.\n+\n+Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>\n+---\n+ drivers/rtc/rtc-rs5c372.c | 48 ++++++++++++++++++++++++++++++++++-----\n+ 1 file changed, 42 insertions(+), 6 deletions(-)\n+\n+--- a/drivers/rtc/rtc-rs5c372.c\n++++ b/drivers/rtc/rtc-rs5c372.c\n+@@ -393,7 +393,9 @@ static int rs5c_read_alarm(struct device\n+ {\n+ \tstruct i2c_client\t*client = to_i2c_client(dev);\n+ \tstruct rs5c372\t\t*rs5c = i2c_get_clientdata(client);\n+-\tint\t\t\tstatus;\n++\tint\t\t\tstatus, wday_offs;\n++\tstruct rtc_time \trtc;\n++\tunsigned long \t\talarm_secs;\n+ \n+ \tstatus = rs5c_get_regs(rs5c);\n+ \tif (status < 0)\n+@@ -403,6 +405,30 @@ static int rs5c_read_alarm(struct device\n+ \tt->time.tm_sec = 0;\n+ \tt->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);\n+ \tt->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);\n++\tt->time.tm_wday = ffs(rs5c->regs[RS5C_REG_ALARM_A_WDAY] & 0x7f) - 1;\n++\n++\t/* determine the day, month and year based on alarm wday, taking as a\n++\t * reference the current time from the rtc\n++\t */\n++\tstatus = rs5c372_rtc_read_time(dev, &rtc);\n++\tif (status < 0)\n++\t\treturn status;\n++\n++\twday_offs = t->time.tm_wday - rtc.tm_wday;\n++\talarm_secs = mktime64(rtc.tm_year + 1900,\n++\t\t\t      rtc.tm_mon + 1,\n++\t\t\t      rtc.tm_mday + wday_offs,\n++\t\t\t      t->time.tm_hour,\n++\t\t\t      t->time.tm_min,\n++\t\t\t      t->time.tm_sec);\n++\n++\tif (wday_offs < 0 || (wday_offs == 0 &&\n++\t\t\t      (t->time.tm_hour < rtc.tm_hour ||\n++\t\t\t       (t->time.tm_hour == rtc.tm_hour &&\n++\t\t\t\tt->time.tm_min <= rtc.tm_min))))\n++\t\talarm_secs += 7 * 86400;\n++\n++\trtc_time64_to_tm(alarm_secs, &t->time);\n+ \n+ \t/* ... and status */\n+ \tt->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);\n+@@ -417,12 +443,20 @@ static int rs5c_set_alarm(struct device\n+ \tstruct rs5c372\t\t*rs5c = i2c_get_clientdata(client);\n+ \tint\t\t\tstatus, addr, i;\n+ \tunsigned char\t\tbuf[3];\n++\tstruct rtc_time \trtc_tm;\n++\tunsigned long \t\trtc_secs, alarm_secs;\n+ \n+-\t/* only handle up to 24 hours in the future, like RTC_ALM_SET */\n+-\tif (t->time.tm_mday != -1\n+-\t\t\t|| t->time.tm_mon != -1\n+-\t\t\t|| t->time.tm_year != -1)\n++\t/* chip only can handle alarms up to one week in the future*/\n++\tstatus = rs5c372_rtc_read_time(dev, &rtc_tm);\n++\tif (status)\n++\t\treturn status;\n++\trtc_secs = rtc_tm_to_time64(&rtc_tm);\n++\talarm_secs = rtc_tm_to_time64(&t->time);\n++\tif (alarm_secs >= rtc_secs + 7 * 86400) {\n++\t\tdev_err(dev, \"%s: alarm maximum is one week in the future (%d)\\n\",\n++\t\t\t__func__, status);\n+ \t\treturn -EINVAL;\n++\t}\n+ \n+ \t/* REVISIT: round up tm_sec */\n+ \n+@@ -443,7 +477,9 @@ static int rs5c_set_alarm(struct device\n+ \t/* set alarm */\n+ \tbuf[0] = bin2bcd(t->time.tm_min);\n+ \tbuf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour);\n+-\tbuf[2] = 0x7f;\t/* any/all days */\n++\t/* each bit is the day of the week, 0x7f means all days */\n++\tbuf[2] = (t->time.tm_wday >= 0 && t->time.tm_wday < 7) ?\n++\t\t  BIT(t->time.tm_wday) : 0x7f;\n+ \n+ \tfor (i = 0; i < sizeof(buf); i++) {\n+ \t\taddr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i);\ndiff --git a/target/linux/generic/pending-5.14/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch b/target/linux/generic/pending-5.14/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch\nnew file mode 100644\nindex 0000000000..7e9d0e66c0\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch\n@@ -0,0 +1,70 @@\n+From: Daniel González Cabanelas <dgcbueu@gmail.com>\n+Subject: [PATCH 2/2] rtc: rs5c372: let the alarm to be used as wakeup source\n+\n+Currently there is no use for the interrupts on the rs5c372 RTC and the\n+wakealarm isn't enabled. There are some devices like NASes which use this\n+RTC to wake up from the power off state when the INTR pin is activated by\n+the alarm clock.\n+\n+Enable the alarm and let to be used as a wakeup source.\n+\n+Tested on a Buffalo LS421DE NAS.\n+\n+Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>\n+---\n+ drivers/rtc/rtc-rs5c372.c | 16 ++++++++++++++++\n+ 1 file changed, 16 insertions(+)\n+\n+--- a/drivers/rtc/rtc-rs5c372.c\n++++ b/drivers/rtc/rtc-rs5c372.c\n+@@ -654,6 +654,7 @@ static int rs5c372_probe(struct i2c_clie\n+ \tint err = 0;\n+ \tint smbus_mode = 0;\n+ \tstruct rs5c372 *rs5c372;\n++\tbool rs5c372_can_wakeup_device = false;\n+ \n+ \tdev_dbg(&client->dev, \"%s\\n\", __func__);\n+ \n+@@ -689,6 +690,12 @@ static int rs5c372_probe(struct i2c_clie\n+ \telse\n+ \t\trs5c372->type = id->driver_data;\n+ \n++#ifdef CONFIG_OF\n++\tif(of_property_read_bool(client->dev.of_node,\n++\t\t\t\t\t      \"wakeup-source\"))\n++\t\trs5c372_can_wakeup_device = true;\n++#endif\n++\n+ \t/* we read registers 0x0f then 0x00-0x0f; skip the first one */\n+ \trs5c372->regs = &rs5c372->buf[1];\n+ \trs5c372->smbus = smbus_mode;\n+@@ -722,6 +729,8 @@ static int rs5c372_probe(struct i2c_clie\n+ \t\tgoto exit;\n+ \t}\n+ \n++\trs5c372->has_irq = 1;\n++\n+ \t/* if the oscillator lost power and no other software (like\n+ \t * the bootloader) set it up, do it here.\n+ \t *\n+@@ -748,6 +757,10 @@ static int rs5c372_probe(struct i2c_clie\n+ \t\t\t);\n+ \n+ \t/* REVISIT use client->irq to register alarm irq ... */\n++\tif (rs5c372_can_wakeup_device) {\n++\t\tdevice_init_wakeup(&client->dev, true);\n++\t}\n++\n+ \trs5c372->rtc = devm_rtc_device_register(&client->dev,\n+ \t\t\t\t\trs5c372_driver.driver.name,\n+ \t\t\t\t\t&rs5c372_rtc_ops, THIS_MODULE);\n+@@ -761,6 +774,9 @@ static int rs5c372_probe(struct i2c_clie\n+ \tif (err)\n+ \t\tgoto exit;\n+ \n++\t/* the rs5c372 alarm only supports a minute accuracy */\n++\trs5c372->rtc->uie_unsupported = 1;\n++\n+ \treturn 0;\n+ \n+ exit:\ndiff --git a/target/linux/generic/pending-5.14/201-extra_optimization.patch b/target/linux/generic/pending-5.14/201-extra_optimization.patch\nnew file mode 100644\nindex 0000000000..8643ddefe7\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/201-extra_optimization.patch\n@@ -0,0 +1,31 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: Upgrade to Linux 2.6.19\n+\n+- Includes large parts of the patch from #1021 by dpalffy\n+- Includes RB532 NAND driver changes by n0-1\n+\n+[john@phrozen.org: feix will add this to his upstream queue]\n+\n+lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ Makefile | 6 +++---\n+ 1 file changed, 3 insertions(+), 3 deletions(-)\n+\n+--- a/Makefile\n++++ b/Makefile\n+@@ -758,11 +758,11 @@ KBUILD_CFLAGS\t+= $(call cc-disable-warni\n+ KBUILD_CFLAGS\t+= $(call cc-disable-warning, address-of-packed-member)\n+ \n+ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE\n+-KBUILD_CFLAGS += -O2\n++KBUILD_CFLAGS += -O2 $(EXTRA_OPTIMIZATION)\n+ else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3\n+-KBUILD_CFLAGS += -O3\n++KBUILD_CFLAGS += -O3 $(EXTRA_OPTIMIZATION)\n+ else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE\n+-KBUILD_CFLAGS += -Os\n++KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)\n+ endif\n+ \n+ # Tell gcc to never replace conditional load with a non-conditional one\ndiff --git a/target/linux/generic/pending-5.14/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-5.14/203-kallsyms_uncompressed.patch\nnew file mode 100644\nindex 0000000000..6e8dea3eb8\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/203-kallsyms_uncompressed.patch\n@@ -0,0 +1,119 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx\n+\n+[john@phrozen.org: added to my upstream queue 30.12.2016]\n+lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ init/Kconfig            | 11 +++++++++++\n+ kernel/kallsyms.c       |  8 ++++++++\n+ scripts/kallsyms.c      | 12 ++++++++++++\n+ scripts/link-vmlinux.sh |  4 ++++\n+ 4 files changed, 35 insertions(+)\n+\n+--- a/init/Kconfig\n++++ b/init/Kconfig\n+@@ -1410,6 +1410,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW\n+ \t  the unaligned access emulation.\n+ \t  see arch/parisc/kernel/unaligned.c for reference\n+ \n++config KALLSYMS_UNCOMPRESSED\n++\tbool \"Keep kallsyms uncompressed\"\n++\tdepends on KALLSYMS\n++\thelp\n++\t\tNormally kallsyms contains compressed symbols (using a token table),\n++\t\treducing the uncompressed kernel image size. Keeping the symbol table\n++\t\tuncompressed significantly improves the size of this part in compressed\n++\t\tkernel images.\n++\n++\t\tSay N unless you need compressed kernel images to be small.\n++\n+ config HAVE_PCSPKR_PLATFORM\n+ \tbool\n+ \n+--- a/kernel/kallsyms.c\n++++ b/kernel/kallsyms.c\n+@@ -80,6 +80,11 @@ static unsigned int kallsyms_expand_symb\n+ \t * For every byte on the compressed symbol data, copy the table\n+ \t * entry for that byte.\n+ \t */\n++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED\n++\tmemcpy(result, data + 1, len - 1);\n++\tresult += len - 1;\n++\tlen = 0;\n++#endif\n+ \twhile (len) {\n+ \t\ttptr = &kallsyms_token_table[kallsyms_token_index[*data]];\n+ \t\tdata++;\n+@@ -112,6 +117,9 @@ tail:\n+  */\n+ static char kallsyms_get_symbol_type(unsigned int off)\n+ {\n++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED\n++\treturn kallsyms_names[off + 1];\n++#endif\n+ \t/*\n+ \t * Get just the first code, look it up in the token table,\n+ \t * and return the first char from this token.\n+--- a/scripts/kallsyms.c\n++++ b/scripts/kallsyms.c\n+@@ -58,6 +58,7 @@ static struct addr_range percpu_range =\n+ static struct sym_entry **table;\n+ static unsigned int table_size, table_cnt;\n+ static int all_symbols;\n++static int uncompressed;\n+ static int absolute_percpu;\n+ static int base_relative;\n+ \n+@@ -486,6 +487,9 @@ static void write_src(void)\n+ \n+ \tfree(markers);\n+ \n++\tif (uncompressed)\n++\t\treturn;\n++\n+ \toutput_label(\"kallsyms_token_table\");\n+ \toff = 0;\n+ \tfor (i = 0; i < 256; i++) {\n+@@ -537,6 +541,9 @@ static unsigned char *find_token(unsigne\n+ {\n+ \tint i;\n+ \n++\tif (uncompressed)\n++\t\treturn NULL;\n++\n+ \tfor (i = 0; i < len - 1; i++) {\n+ \t\tif (str[i] == token[0] && str[i+1] == token[1])\n+ \t\t\treturn &str[i];\n+@@ -609,6 +616,9 @@ static void optimize_result(void)\n+ {\n+ \tint i, best;\n+ \n++\tif (uncompressed)\n++\t\treturn;\n++\n+ \t/* using the '\\0' symbol last allows compress_symbols to use standard\n+ \t * fast string functions */\n+ \tfor (i = 255; i >= 0; i--) {\n+@@ -773,6 +783,8 @@ int main(int argc, char **argv)\n+ \t\t\t\tabsolute_percpu = 1;\n+ \t\t\telse if (strcmp(argv[i], \"--base-relative\") == 0)\n+ \t\t\t\tbase_relative = 1;\n++\t\t\telse if (strcmp(argv[i], \"--uncompressed\") == 0)\n++\t\t\t\tuncompressed = 1;\n+ \t\t\telse\n+ \t\t\t\tusage();\n+ \t\t}\n+--- a/scripts/link-vmlinux.sh\n++++ b/scripts/link-vmlinux.sh\n+@@ -273,6 +273,10 @@ kallsyms()\n+ \t\tkallsymopt=\"${kallsymopt} --base-relative\"\n+ \tfi\n+ \n++\tif [ -n \"${CONFIG_KALLSYMS_UNCOMPRESSED}\" ]; then\n++\t\tkallsymopt=\"${kallsymopt} --uncompressed\"\n++\tfi\n++\n+ \tinfo KSYMS ${2}\n+ \t${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}\n+ }\ndiff --git a/target/linux/generic/pending-5.14/205-backtrace_module_info.patch b/target/linux/generic/pending-5.14/205-backtrace_module_info.patch\nnew file mode 100644\nindex 0000000000..f10d863b8b\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/205-backtrace_module_info.patch\n@@ -0,0 +1,41 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries\n+\n+[john@phrozen.org: felix will add this to his upstream queue]\n+\n+lede-commit 53827cdc824556cda910b23ce5030c363b8f1461\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ lib/vsprintf.c | 15 +++++++++++----\n+ 1 file changed, 11 insertions(+), 4 deletions(-)\n+\n+--- a/lib/vsprintf.c\n++++ b/lib/vsprintf.c\n+@@ -984,8 +984,10 @@ char *symbol_string(char *buf, char *end\n+ \t\t    struct printf_spec spec, const char *fmt)\n+ {\n+ \tunsigned long value;\n+-#ifdef CONFIG_KALLSYMS\n+ \tchar sym[KSYM_SYMBOL_LEN];\n++#ifndef CONFIG_KALLSYMS\n++\tstruct module *mod;\n++\tint len;\n+ #endif\n+ \n+ \tif (fmt[1] == 'R')\n+@@ -1006,8 +1008,14 @@ char *symbol_string(char *buf, char *end\n+ \n+ \treturn string_nocheck(buf, end, sym, spec);\n+ #else\n+-\treturn special_hex_number(buf, end, value, sizeof(void *));\n++\tlen = snprintf(sym, sizeof(sym), \"0x%lx\", value);\n++\tmod = __module_address(value);\n++\tif (mod)\n++\t\tsnprintf(sym + len, sizeof(sym) - len, \" [%s@%p+0x%x]\",\n++\t\t\t mod->name, mod->core_layout.base,\n++\t\t\t mod->core_layout.size);\n+ #endif\n++\treturn string(buf, end, sym, spec);\n+ }\n+ \n+ static const struct printf_spec default_str_spec = {\ndiff --git a/target/linux/generic/pending-5.14/240-remove-unsane-filenames-from-deps_initramfs-list.patch b/target/linux/generic/pending-5.14/240-remove-unsane-filenames-from-deps_initramfs-list.patch\nnew file mode 100644\nindex 0000000000..29cfade716\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/240-remove-unsane-filenames-from-deps_initramfs-list.patch\n@@ -0,0 +1,30 @@\n+From: Gabor Juhos <juhosg@openwrt.org>\n+Subject: usr: sanitize deps_initramfs list\n+\n+If any filename in the intramfs dependency\n+list contains a colon, that causes a kernel\n+build error like this:\n+\n+/devel/openwrt/build_dir/linux-ar71xx_generic/linux-3.6.6/usr/Makefile:58: *** multiple target patterns.  Stop.\n+make[5]: *** [usr] Error 2\n+\n+Fix it by removing such filenames from the\n+deps_initramfs list.\n+\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ usr/Makefile | 8 +++++---\n+ 1 file changed, 5 insertions(+), 3 deletions(-)\n+\n+--- a/usr/Makefile\n++++ b/usr/Makefile\n+@@ -61,6 +61,8 @@ hostprogs := gen_init_cpio\n+ # The dependency list is generated by gen_initramfs.sh -l\n+ -include $(obj)/.initramfs_data.cpio.d\n+ \n++deps_initramfs := $(foreach v,$(deps_initramfs),$(if $(findstring :,$(v)),,$(v)))\n++\n+ # do not try to update files included in initramfs\n+ $(deps_initramfs): ;\n+ \ndiff --git a/target/linux/generic/pending-5.14/261-enable_wilink_platform_without_drivers.patch b/target/linux/generic/pending-5.14/261-enable_wilink_platform_without_drivers.patch\nnew file mode 100644\nindex 0000000000..cd31f9d934\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/261-enable_wilink_platform_without_drivers.patch\n@@ -0,0 +1,20 @@\n+From: Imre Kaloz <kaloz@openwrt.org>\n+Subject: [PATCH] hack: net: wireless: make the wl12xx glue code available with\n+ compat-wireless, too\n+\n+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>\n+---\n+ drivers/net/wireless/ti/Kconfig | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/drivers/net/wireless/ti/Kconfig\n++++ b/drivers/net/wireless/ti/Kconfig\n+@@ -20,7 +20,7 @@ source \"drivers/net/wireless/ti/wlcore/K\n+ \n+ config WILINK_PLATFORM_DATA\n+ \tbool \"TI WiLink platform data\"\n+-\tdepends on WLCORE_SDIO || WL1251_SDIO\n++\tdepends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS\n+ \tdefault y\n+ \thelp\n+ \tSmall platform data bit needed to pass data to the sdio modules.\ndiff --git a/target/linux/generic/pending-5.14/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-5.14/270-platform-mikrotik-build-bits.patch\nnew file mode 100644\nindex 0000000000..31f86f4aac\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/270-platform-mikrotik-build-bits.patch\n@@ -0,0 +1,35 @@\n+From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001\n+From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>\n+Date: Sat, 28 Mar 2020 12:11:50 +0100\n+Subject: [PATCH] generic: platform/mikrotik build bits (5.4)\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+This patch adds platform/mikrotik kernel build bits\n+\n+Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>\n+---\n+ drivers/platform/Kconfig  | 2 ++\n+ drivers/platform/Makefile | 1 +\n+ 2 files changed, 3 insertions(+)\n+\n+--- a/drivers/platform/Kconfig\n++++ b/drivers/platform/Kconfig\n+@@ -12,6 +12,8 @@ source \"drivers/platform/chrome/Kconfig\"\n+ \n+ source \"drivers/platform/mellanox/Kconfig\"\n+ \n++source \"drivers/platform/mikrotik/Kconfig\"\n++\n+ source \"drivers/platform/olpc/Kconfig\"\n+ \n+ source \"drivers/platform/surface/Kconfig\"\n+--- a/drivers/platform/Makefile\n++++ b/drivers/platform/Makefile\n+@@ -9,4 +9,5 @@ obj-$(CONFIG_MIPS)\t\t+= mips/\n+ obj-$(CONFIG_OLPC_EC)\t\t+= olpc/\n+ obj-$(CONFIG_GOLDFISH)\t\t+= goldfish/\n+ obj-$(CONFIG_CHROME_PLATFORMS)\t+= chrome/\n++obj-$(CONFIG_MIKROTIK)\t\t+= mikrotik/\n+ obj-$(CONFIG_SURFACE_PLATFORMS)\t+= surface/\ndiff --git a/target/linux/generic/pending-5.14/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-5.14/300-mips_expose_boot_raw.patch\nnew file mode 100644\nindex 0000000000..63d80ec916\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/300-mips_expose_boot_raw.patch\n@@ -0,0 +1,40 @@\n+From: Mark Miller <mark@mirell.org>\n+Subject: mips: expose CONFIG_BOOT_RAW\n+\n+This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on\n+certain Broadcom chipsets running CFE in order to load the kernel.\n+\n+Signed-off-by: Mark Miller <mark@mirell.org>\n+Acked-by: Rob Landley <rob@landley.net>\n+---\n+--- a/arch/mips/Kconfig\n++++ b/arch/mips/Kconfig\n+@@ -1123,9 +1123,6 @@ config FW_ARC\n+ config ARCH_MAY_HAVE_PC_FDC\n+ \tbool\n+ \n+-config BOOT_RAW\n+-\tbool\n+-\n+ config CEVT_BCM1480\n+ \tbool\n+ \n+@@ -3200,6 +3197,18 @@ choice\n+ \t\tbool \"Extend builtin kernel arguments with bootloader arguments\"\n+ endchoice\n+ \n++config BOOT_RAW\n++\tbool \"Enable the kernel to be executed from the load address\"\n++\tdefault n\n++\thelp\n++\t Allow the kernel to be executed from the load address for\n++\t bootloaders which cannot read the ELF format. This places\n++\t a jump to start_kernel at the load address.\n++\n++\t If unsure, say N.\n++\n++\n++\n+ endmenu\n+ \n+ config LOCKDEP_SUPPORT\ndiff --git a/target/linux/generic/pending-5.14/302-mips_no_branch_likely.patch b/target/linux/generic/pending-5.14/302-mips_no_branch_likely.patch\nnew file mode 100644\nindex 0000000000..271923fca8\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/302-mips_no_branch_likely.patch\n@@ -0,0 +1,22 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: mips: use -mno-branch-likely for kernel and userspace\n+\n+saves ~11k kernel size after lzma and ~12k squashfs size in the\n+\n+lede-commit: 41a039f46450ffae9483d6216422098669da2900\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ arch/mips/Makefile | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/arch/mips/Makefile\n++++ b/arch/mips/Makefile\n+@@ -95,7 +95,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin\n+ # machines may also.  Since BFD is incredibly buggy with respect to\n+ # crossformat linking we rely on the elf2ecoff tool for format conversion.\n+ #\n+-cflags-y\t\t\t+= -G 0 -mno-abicalls -fno-pic -pipe\n++cflags-y\t\t\t+= -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely\n+ cflags-y\t\t\t+= -msoft-float\n+ LDFLAGS_vmlinux\t\t\t+= -G 0 -static -n -nostdlib\n+ KBUILD_AFLAGS_MODULE\t\t+= -mlong-calls\ndiff --git a/target/linux/generic/pending-5.14/305-mips_module_reloc.patch b/target/linux/generic/pending-5.14/305-mips_module_reloc.patch\nnew file mode 100644\nindex 0000000000..13cd2d7724\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/305-mips_module_reloc.patch\n@@ -0,0 +1,370 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to\n+\n+lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ arch/mips/Makefile             |   5 +\n+ arch/mips/include/asm/module.h |   5 +\n+ arch/mips/kernel/module.c      | 279 ++++++++++++++++++++++++++++++++++++++++-\n+ 3 files changed, 284 insertions(+), 5 deletions(-)\n+\n+--- a/arch/mips/Makefile\n++++ b/arch/mips/Makefile\n+@@ -98,8 +98,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin\n+ cflags-y\t\t\t+= -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely\n+ cflags-y\t\t\t+= -msoft-float\n+ LDFLAGS_vmlinux\t\t\t+= -G 0 -static -n -nostdlib\n++ifdef CONFIG_64BIT\n+ KBUILD_AFLAGS_MODULE\t\t+= -mlong-calls\n+ KBUILD_CFLAGS_MODULE\t\t+= -mlong-calls\n++else\n++  ifdef CONFIG_DYNAMIC_FTRACE\n++    KBUILD_AFLAGS_MODULE\t+= -mlong-calls\n++    KBUILD_CFLAGS_MODULE\t+= -mlong-calls\n++  else\n++    KBUILD_AFLAGS_MODULE\t+= -mno-long-calls\n++    KBUILD_CFLAGS_MODULE\t+= -mno-long-calls\n++  endif\n++endif\n+ \n+ ifeq ($(CONFIG_RELOCATABLE),y)\n+ LDFLAGS_vmlinux\t\t\t+= --emit-relocs\n+--- a/arch/mips/include/asm/module.h\n++++ b/arch/mips/include/asm/module.h\n+@@ -12,6 +12,11 @@ struct mod_arch_specific {\n+ \tconst struct exception_table_entry *dbe_start;\n+ \tconst struct exception_table_entry *dbe_end;\n+ \tstruct mips_hi16 *r_mips_hi16_list;\n++\n++\tvoid *phys_plt_tbl;\n++\tvoid *virt_plt_tbl;\n++\tunsigned int phys_plt_offset;\n++\tunsigned int virt_plt_offset;\n+ };\n+ \n+ typedef uint8_t Elf64_Byte;\t\t/* Type for a 8-bit quantity.  */\n+--- a/arch/mips/kernel/module.c\n++++ b/arch/mips/kernel/module.c\n+@@ -31,23 +31,261 @@ struct mips_hi16 {\n+ static LIST_HEAD(dbe_list);\n+ static DEFINE_SPINLOCK(dbe_lock);\n+ \n+-#ifdef MODULE_START\n++/*\n++ * Get the potential max trampolines size required of the init and\n++ * non-init sections. Only used if we cannot find enough contiguous\n++ * physically mapped memory to put the module into.\n++ */\n++static unsigned int\n++get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,\n++             const char *secstrings, unsigned int symindex, bool is_init)\n++{\n++\tunsigned long ret = 0;\n++\tunsigned int i, j;\n++\tElf_Sym *syms;\n++\n++\t/* Everything marked ALLOC (this includes the exported symbols) */\n++\tfor (i = 1; i < hdr->e_shnum; ++i) {\n++\t\tunsigned int info = sechdrs[i].sh_info;\n++\n++\t\tif (sechdrs[i].sh_type != SHT_REL\n++\t\t    && sechdrs[i].sh_type != SHT_RELA)\n++\t\t\tcontinue;\n++\n++\t\t/* Not a valid relocation section? */\n++\t\tif (info >= hdr->e_shnum)\n++\t\t\tcontinue;\n++\n++\t\t/* Don't bother with non-allocated sections */\n++\t\tif (!(sechdrs[info].sh_flags & SHF_ALLOC))\n++\t\t\tcontinue;\n++\n++\t\t/* If it's called *.init*, and we're not init, we're\n++                   not interested */\n++\t\tif ((strstr(secstrings + sechdrs[i].sh_name, \".init\") != 0)\n++\t\t    != is_init)\n++\t\t\tcontinue;\n++\n++\t\tsyms = (Elf_Sym *) sechdrs[symindex].sh_addr;\n++\t\tif (sechdrs[i].sh_type == SHT_REL) {\n++\t\t\tElf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;\n++\t\t\tunsigned int size = sechdrs[i].sh_size / sizeof(*rel);\n++\n++\t\t\tfor (j = 0; j < size; ++j) {\n++\t\t\t\tElf_Sym *sym;\n++\n++\t\t\t\tif (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)\n++\t\t\t\t\tcontinue;\n++\n++\t\t\t\tsym = syms + ELF_MIPS_R_SYM(rel[j]);\n++\t\t\t\tif (!is_init && sym->st_shndx != SHN_UNDEF)\n++\t\t\t\t\tcontinue;\n++\n++\t\t\t\tret += 4 * sizeof(int);\n++\t\t\t}\n++\t\t} else {\n++\t\t\tElf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;\n++\t\t\tunsigned int size = sechdrs[i].sh_size / sizeof(*rela);\n++\n++\t\t\tfor (j = 0; j < size; ++j) {\n++\t\t\t\tElf_Sym *sym;\n++\n++\t\t\t\tif (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)\n++\t\t\t\t\tcontinue;\n++\n++\t\t\t\tsym = syms + ELF_MIPS_R_SYM(rela[j]);\n++\t\t\t\tif (!is_init && sym->st_shndx != SHN_UNDEF)\n++\t\t\t\t\tcontinue;\n++\n++\t\t\t\tret += 4 * sizeof(int);\n++\t\t\t}\n++\t\t}\n++\t}\n++\n++\treturn ret;\n++}\n++\n++#ifndef MODULE_START\n++static void *alloc_phys(unsigned long size)\n++{\n++\tunsigned order;\n++\tstruct page *page;\n++\tstruct page *p;\n++\n++\tsize = PAGE_ALIGN(size);\n++\torder = get_order(size);\n++\n++\tpage = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |\n++\t\t\t__GFP_THISNODE, order);\n++\tif (!page)\n++\t\treturn NULL;\n++\n++\tsplit_page(page, order);\n++\n++\t/* mark all pages except for the last one */\n++\tfor (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p)\n++\t\tset_bit(PG_owner_priv_1, &p->flags);\n++\n++\tfor (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)\n++\t\t__free_page(p);\n++\n++\treturn page_address(page);\n++}\n++#endif\n++\n++static void free_phys(void *ptr)\n++{\n++\tstruct page *page;\n++\tbool free;\n++\n++\tpage = virt_to_page(ptr);\n++\tdo {\n++\t\tfree = test_and_clear_bit(PG_owner_priv_1, &page->flags);\n++\t\t__free_page(page);\n++\t\tpage++;\n++\t} while (free);\n++}\n++\n+ void *module_alloc(unsigned long size)\n+ {\n++#ifdef MODULE_START\n+ \treturn __vmalloc_node_range(size, 1, MODULE_START, MODULE_END,\n+ \t\t\t\tGFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,\n+ \t\t\t\t__builtin_return_address(0));\n++#else\n++\tvoid *ptr;\n++\n++\tif (size == 0)\n++\t\treturn NULL;\n++\n++\tptr = alloc_phys(size);\n++\n++\t/* If we failed to allocate physically contiguous memory,\n++\t * fall back to regular vmalloc. The module loader code will\n++\t * create jump tables to handle long jumps */\n++\tif (!ptr)\n++\t\treturn vmalloc(size);\n++\n++\treturn ptr;\n++#endif\n+ }\n++\n++static inline bool is_phys_addr(void *ptr)\n++{\n++#ifdef CONFIG_64BIT\n++\treturn (KSEGX((unsigned long)ptr) == CKSEG0);\n++#else\n++\treturn (KSEGX(ptr) == KSEG0);\n+ #endif\n++}\n++\n++/* Free memory returned from module_alloc */\n++void module_memfree(void *module_region)\n++{\n++\tif (is_phys_addr(module_region))\n++\t\tfree_phys(module_region);\n++\telse\n++\t\tvfree(module_region);\n++}\n++\n++static void *__module_alloc(int size, bool phys)\n++{\n++\tvoid *ptr;\n++\n++\tif (phys)\n++\t\tptr = kmalloc(size, GFP_KERNEL);\n++\telse\n++\t\tptr = vmalloc(size);\n++\treturn ptr;\n++}\n++\n++static void __module_free(void *ptr)\n++{\n++\tif (is_phys_addr(ptr))\n++\t\tkfree(ptr);\n++\telse\n++\t\tvfree(ptr);\n++}\n++\n++int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,\n++\t\t\t      char *secstrings, struct module *mod)\n++{\n++\tunsigned int symindex = 0;\n++\tunsigned int core_size, init_size;\n++\tint i;\n++\n++\tmod->arch.phys_plt_offset = 0;\n++\tmod->arch.virt_plt_offset = 0;\n++\tmod->arch.phys_plt_tbl = NULL;\n++\tmod->arch.virt_plt_tbl = NULL;\n++\n++\tif (IS_ENABLED(CONFIG_64BIT))\n++\t\treturn 0;\n++\n++\tfor (i = 1; i < hdr->e_shnum; i++)\n++\t\tif (sechdrs[i].sh_type == SHT_SYMTAB)\n++\t\t\tsymindex = i;\n++\n++\tcore_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);\n++\tinit_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);\n++\n++\tif ((core_size + init_size) == 0)\n++\t\treturn 0;\n++\n++\tmod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);\n++\tif (!mod->arch.phys_plt_tbl)\n++\t\treturn -ENOMEM;\n++\n++\tmod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);\n++\tif (!mod->arch.virt_plt_tbl) {\n++\t\t__module_free(mod->arch.phys_plt_tbl);\n++\t\tmod->arch.phys_plt_tbl = NULL;\n++\t\treturn -ENOMEM;\n++\t}\n++\n++\treturn 0;\n++}\n+ \n+ static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v)\n+ {\n+ \t*location = base + v;\n+ }\n+ \n++static Elf_Addr add_plt_entry_to(unsigned *plt_offset,\n++\t\t\t\t void *start, Elf_Addr v)\n++{\n++\tunsigned *tramp = start + *plt_offset;\n++\t*plt_offset += 4 * sizeof(int);\n++\n++\t/* adjust carry for addiu */\n++\tif (v & 0x00008000)\n++\t\tv += 0x10000;\n++\n++\ttramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */\n++\ttramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */\n++\ttramp[2] = 0x03200008;                  /* jr t9 */\n++\ttramp[3] = 0x00000000;                  /* nop */\n++\n++\treturn (Elf_Addr) tramp;\n++}\n++\n++static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)\n++{\n++\tif (is_phys_addr(location))\n++\t\treturn add_plt_entry_to(&me->arch.phys_plt_offset,\n++\t\t\t\tme->arch.phys_plt_tbl, v);\n++\telse\n++\t\treturn add_plt_entry_to(&me->arch.virt_plt_offset,\n++\t\t\t\tme->arch.virt_plt_tbl, v);\n++\n++}\n++\n++\n+ static int apply_r_mips_26(struct module *me, u32 *location, u32 base,\n+ \t\t\t   Elf_Addr v)\n+ {\n++\tu32 ofs = base & 0x03ffffff;\n++\n+ \tif (v % 4) {\n+ \t\tpr_err(\"module %s: dangerous R_MIPS_26 relocation\\n\",\n+ \t\t       me->name);\n+@@ -55,13 +293,17 @@ static int apply_r_mips_26(struct module\n+ \t}\n+ \n+ \tif ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {\n+-\t\tpr_err(\"module %s: relocation overflow\\n\",\n+-\t\t       me->name);\n+-\t\treturn -ENOEXEC;\n++\t\tv = add_plt_entry(me, location, v + (ofs << 2));\n++\t\tif (!v) {\n++\t\t\tpr_err(\"module %s: relocation overflow\\n\",\n++\t\t\t       me->name);\n++\t\t\treturn -ENOEXEC;\n++\t\t}\n++\t\tofs = 0;\n+ \t}\n+ \n+ \t*location = (*location & ~0x03ffffff) |\n+-\t\t    ((base + (v >> 2)) & 0x03ffffff);\n++\t\t    ((ofs + (v >> 2)) & 0x03ffffff);\n+ \n+ \treturn 0;\n+ }\n+@@ -441,9 +683,36 @@ int module_finalize(const Elf_Ehdr *hdr,\n+ \t\tlist_add(&me->arch.dbe_list, &dbe_list);\n+ \t\tspin_unlock_irq(&dbe_lock);\n+ \t}\n++\n++\t/* Get rid of the fixup trampoline if we're running the module\n++\t * from physically mapped address space */\n++\tif (me->arch.phys_plt_offset == 0) {\n++\t\t__module_free(me->arch.phys_plt_tbl);\n++\t\tme->arch.phys_plt_tbl = NULL;\n++\t}\n++\tif (me->arch.virt_plt_offset == 0) {\n++\t\t__module_free(me->arch.virt_plt_tbl);\n++\t\tme->arch.virt_plt_tbl = NULL;\n++\t}\n++\n+ \treturn 0;\n+ }\n+ \n++void module_arch_freeing_init(struct module *mod)\n++{\n++\tif (mod->state == MODULE_STATE_LIVE)\n++\t\treturn;\n++\n++\tif (mod->arch.phys_plt_tbl) {\n++\t\t__module_free(mod->arch.phys_plt_tbl);\n++\t\tmod->arch.phys_plt_tbl = NULL;\n++\t}\n++\tif (mod->arch.virt_plt_tbl) {\n++\t\t__module_free(mod->arch.virt_plt_tbl);\n++\t\tmod->arch.virt_plt_tbl = NULL;\n++\t}\n++}\n++\n+ void module_arch_cleanup(struct module *mod)\n+ {\n+ \tspin_lock_irq(&dbe_lock);\ndiff --git a/target/linux/generic/pending-5.14/307-mips_highmem_offset.patch b/target/linux/generic/pending-5.14/307-mips_highmem_offset.patch\nnew file mode 100644\nindex 0000000000..0529b0c5c8\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/307-mips_highmem_offset.patch\n@@ -0,0 +1,19 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ arch/mips/include/asm/mach-generic/spaces.h | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/arch/mips/include/asm/mach-generic/spaces.h\n++++ b/arch/mips/include/asm/mach-generic/spaces.h\n+@@ -46,7 +46,7 @@\n+  * Memory above this physical address will be considered highmem.\n+  */\n+ #ifndef HIGHMEM_START\n+-#define HIGHMEM_START\t\t_AC(0x20000000, UL)\n++#define HIGHMEM_START\t\t_AC(0x10000000, UL)\n+ #endif\n+ \n+ #endif /* CONFIG_32BIT */\ndiff --git a/target/linux/generic/pending-5.14/308-mips32r2_tune.patch b/target/linux/generic/pending-5.14/308-mips32r2_tune.patch\nnew file mode 100644\nindex 0000000000..ef92a5dfb6\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/308-mips32r2_tune.patch\n@@ -0,0 +1,22 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2\n+\n+This provides a good tradeoff across at least 24Kc-74Kc, while also\n+producing smaller code.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ arch/mips/Makefile | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/arch/mips/Makefile\n++++ b/arch/mips/Makefile\n+@@ -175,7 +175,7 @@ cflags-$(CONFIG_CPU_VR41XX)\t+= -march=r4\n+ cflags-$(CONFIG_CPU_R4X00)\t+= -march=r4600 -Wa,--trap\n+ cflags-$(CONFIG_CPU_TX49XX)\t+= -march=r4600 -Wa,--trap\n+ cflags-$(CONFIG_CPU_MIPS32_R1)\t+= -march=mips32 -Wa,--trap\n+-cflags-$(CONFIG_CPU_MIPS32_R2)\t+= -march=mips32r2 -Wa,--trap\n++cflags-$(CONFIG_CPU_MIPS32_R2)\t+= -march=mips32r2 -mtune=34kc -Wa,--trap\n+ cflags-$(CONFIG_CPU_MIPS32_R5)\t+= -march=mips32r5 -Wa,--trap -modd-spreg\n+ cflags-$(CONFIG_CPU_MIPS32_R6)\t+= -march=mips32r6 -Wa,--trap -modd-spreg\n+ cflags-$(CONFIG_CPU_MIPS64_R1)\t+= -march=mips64 -Wa,--trap\ndiff --git a/target/linux/generic/pending-5.14/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch b/target/linux/generic/pending-5.14/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch\nnew file mode 100644\nindex 0000000000..794f027f18\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch\n@@ -0,0 +1,140 @@\n+From 87ec87c2ad615c1a177cd08ef5fa29fc739f6e50 Mon Sep 17 00:00:00 2001\n+From: Hauke Mehrtens <hauke@hauke-m.de>\n+Date: Sun, 23 Dec 2018 18:06:53 +0100\n+Subject: [PATCH] MIPS: Add CPU option reporting to /proc/cpuinfo\n+\n+Many MIPS CPUs have optional CPU features which are not activates for\n+all CPU cores. Print the CPU options which are implemented in the core\n+in /proc/cpuinfo. This makes it possible to see what features are\n+supported and which are not supported. This should cover all standard\n+MIPS extensions, before it only printed information about the main MIPS\n+ASEs.\n+\n+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>\n+---\n+ arch/mips/kernel/proc.c | 116 ++++++++++++++++++++++++++++++++++++++++\n+ 1 file changed, 116 insertions(+)\n+\n+--- a/arch/mips/kernel/proc.c\n++++ b/arch/mips/kernel/proc.c\n+@@ -138,6 +138,120 @@ static int show_cpuinfo(struct seq_file\n+ \t\tseq_printf(m, \"micromips kernel\\t: %s\\n\",\n+ \t\t      (read_c0_config3() & MIPS_CONF3_ISA_OE) ?  \"yes\" : \"no\");\n+ \t}\n++\n++\tseq_printf(m, \"Options implemented\\t:\");\n++\tif (cpu_has_tlb)\n++\t\tseq_printf(m, \"%s\", \" tlb\");\n++\tif (cpu_has_ftlb)\n++\t\tseq_printf(m, \"%s\", \" ftlb\");\n++\tif (cpu_has_tlbinv)\n++\t\tseq_printf(m, \"%s\", \" tlbinv\");\n++\tif (cpu_has_segments)\n++\t\tseq_printf(m, \"%s\", \" segments\");\n++\tif (cpu_has_rixiex)\n++\t\tseq_printf(m, \"%s\", \" rixiex\");\n++\tif (cpu_has_ldpte)\n++\t\tseq_printf(m, \"%s\", \" ldpte\");\n++\tif (cpu_has_maar)\n++\t\tseq_printf(m, \"%s\", \" maar\");\n++\tif (cpu_has_rw_llb)\n++\t\tseq_printf(m, \"%s\", \" rw_llb\");\n++\tif (cpu_has_4kex)\n++\t\tseq_printf(m, \"%s\", \" 4kex\");\n++\tif (cpu_has_3k_cache)\n++\t\tseq_printf(m, \"%s\", \" 3k_cache\");\n++\tif (cpu_has_4k_cache)\n++\t\tseq_printf(m, \"%s\", \" 4k_cache\");\n++\tif (cpu_has_6k_cache)\n++\t\tseq_printf(m, \"%s\", \" 6k_cache\");\n++\tif (cpu_has_8k_cache)\n++\t\tseq_printf(m, \"%s\", \" 8k_cache\");\n++\tif (cpu_has_tx39_cache)\n++\t\tseq_printf(m, \"%s\", \" tx39_cache\");\n++\tif (cpu_has_octeon_cache)\n++\t\tseq_printf(m, \"%s\", \" octeon_cache\");\n++\tif (cpu_has_fpu)\n++\t\tseq_printf(m, \"%s\", \" fpu\");\n++\tif (cpu_has_32fpr)\n++\t\tseq_printf(m, \"%s\", \" 32fpr\");\n++\tif (cpu_has_cache_cdex_p)\n++\t\tseq_printf(m, \"%s\", \" cache_cdex_p\");\n++\tif (cpu_has_cache_cdex_s)\n++\t\tseq_printf(m, \"%s\", \" cache_cdex_s\");\n++\tif (cpu_has_prefetch)\n++\t\tseq_printf(m, \"%s\", \" prefetch\");\n++\tif (cpu_has_mcheck)\n++\t\tseq_printf(m, \"%s\", \" mcheck\");\n++\tif (cpu_has_ejtag)\n++\t\tseq_printf(m, \"%s\", \" ejtag\");\n++\tif (cpu_has_llsc)\n++\t\tseq_printf(m, \"%s\", \" llsc\");\n++\tif (cpu_has_guestctl0ext)\n++\t\tseq_printf(m, \"%s\", \" guestctl0ext\");\n++\tif (cpu_has_guestctl1)\n++\t\tseq_printf(m, \"%s\", \" guestctl1\");\n++\tif (cpu_has_guestctl2)\n++\t\tseq_printf(m, \"%s\", \" guestctl2\");\n++\tif (cpu_has_guestid)\n++\t\tseq_printf(m, \"%s\", \" guestid\");\n++\tif (cpu_has_drg)\n++\t\tseq_printf(m, \"%s\", \" drg\");\n++\tif (cpu_has_rixi)\n++\t\tseq_printf(m, \"%s\", \" rixi\");\n++\tif (cpu_has_lpa)\n++\t\tseq_printf(m, \"%s\", \" lpa\");\n++\tif (cpu_has_mvh)\n++\t\tseq_printf(m, \"%s\", \" mvh\");\n++\tif (cpu_has_vtag_icache)\n++\t\tseq_printf(m, \"%s\", \" vtag_icache\");\n++\tif (cpu_has_dc_aliases)\n++\t\tseq_printf(m, \"%s\", \" dc_aliases\");\n++\tif (cpu_has_ic_fills_f_dc)\n++\t\tseq_printf(m, \"%s\", \" ic_fills_f_dc\");\n++\tif (cpu_has_pindexed_dcache)\n++\t\tseq_printf(m, \"%s\", \" pindexed_dcache\");\n++\tif (cpu_has_userlocal)\n++\t\tseq_printf(m, \"%s\", \" userlocal\");\n++\tif (cpu_has_nofpuex)\n++\t\tseq_printf(m, \"%s\", \" nofpuex\");\n++\tif (cpu_has_vint)\n++\t\tseq_printf(m, \"%s\", \" vint\");\n++\tif (cpu_has_veic)\n++\t\tseq_printf(m, \"%s\", \" veic\");\n++\tif (cpu_has_inclusive_pcaches)\n++\t\tseq_printf(m, \"%s\", \" inclusive_pcaches\");\n++\tif (cpu_has_perf_cntr_intr_bit)\n++\t\tseq_printf(m, \"%s\", \" perf_cntr_intr_bit\");\n++\tif (cpu_has_ufr)\n++\t\tseq_printf(m, \"%s\", \" ufr\");\n++\tif (cpu_has_fre)\n++\t\tseq_printf(m, \"%s\", \" fre\");\n++\tif (cpu_has_cdmm)\n++\t\tseq_printf(m, \"%s\", \" cdmm\");\n++\tif (cpu_has_small_pages)\n++\t\tseq_printf(m, \"%s\", \" small_pages\");\n++\tif (cpu_has_nan_legacy)\n++\t\tseq_printf(m, \"%s\", \" nan_legacy\");\n++\tif (cpu_has_nan_2008)\n++\t\tseq_printf(m, \"%s\", \" nan_2008\");\n++\tif (cpu_has_ebase_wg)\n++\t\tseq_printf(m, \"%s\", \" ebase_wg\");\n++\tif (cpu_has_badinstr)\n++\t\tseq_printf(m, \"%s\", \" badinstr\");\n++\tif (cpu_has_badinstrp)\n++\t\tseq_printf(m, \"%s\", \" badinstrp\");\n++\tif (cpu_has_contextconfig)\n++\t\tseq_printf(m, \"%s\", \" contextconfig\");\n++\tif (cpu_has_perf)\n++\t\tseq_printf(m, \"%s\", \" perf\");\n++\tif (cpu_has_shared_ftlb_ram)\n++\t\tseq_printf(m, \"%s\", \" shared_ftlb_ram\");\n++\tif (cpu_has_shared_ftlb_entries)\n++\t\tseq_printf(m, \"%s\", \" shared_ftlb_entries\");\n++\tif (cpu_has_mipsmt_pertccounters)\n++\t\tseq_printf(m, \"%s\", \" mipsmt_pertccounters\");\n++\tseq_printf(m, \"\\n\");\n++\n+ \tseq_printf(m, \"shadow register sets\\t: %d\\n\",\n+ \t\t      cpu_data[n].srsets);\n+ \tseq_printf(m, \"kscratch registers\\t: %d\\n\",\ndiff --git a/target/linux/generic/pending-5.14/310-arm_module_unresolved_weak_sym.patch b/target/linux/generic/pending-5.14/310-arm_module_unresolved_weak_sym.patch\nnew file mode 100644\nindex 0000000000..191dc6ac3c\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/310-arm_module_unresolved_weak_sym.patch\n@@ -0,0 +1,22 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: fix errors in unresolved weak symbols on arm\n+\n+lede-commit: 570699d4838a907c3ef9f2819bf19eb72997b32f\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ arch/arm/kernel/module.c | 4 ++++\n+ 1 file changed, 4 insertions(+)\n+\n+--- a/arch/arm/kernel/module.c\n++++ b/arch/arm/kernel/module.c\n+@@ -105,6 +105,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons\n+ \t\t\treturn -ENOEXEC;\n+ \t\t}\n+ \n++\t\tif ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&\n++\t\t    ELF_ST_BIND(sym->st_info) == STB_WEAK)\n++\t\t\tcontinue;\n++\n+ \t\tloc = dstsec->sh_addr + rel->r_offset;\n+ \n+ \t\tswitch (ELF32_R_TYPE(rel->r_info)) {\ndiff --git a/target/linux/generic/pending-5.14/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.14/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch\nnew file mode 100644\nindex 0000000000..da50880d75\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch\n@@ -0,0 +1,284 @@\n+From: Yousong Zhou <yszhou4tech@gmail.com>\n+Subject: MIPS: kexec: Accept command line parameters from userspace.\n+\n+Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>\n+---\n+ arch/mips/kernel/machine_kexec.c   |  153 +++++++++++++++++++++++++++++++-----\n+ arch/mips/kernel/machine_kexec.h   |   20 +++++\n+ arch/mips/kernel/relocate_kernel.S |   21 +++--\n+ 3 files changed, 167 insertions(+), 27 deletions(-)\n+ create mode 100644 arch/mips/kernel/machine_kexec.h\n+\n+--- a/arch/mips/kernel/machine_kexec.c\n++++ b/arch/mips/kernel/machine_kexec.c\n+@@ -9,14 +9,11 @@\n+ #include <linux/delay.h>\n+ #include <linux/libfdt.h>\n+ \n++#include <asm/bootinfo.h>\n+ #include <asm/cacheflush.h>\n+ #include <asm/page.h>\n+-\n+-extern const unsigned char relocate_new_kernel[];\n+-extern const size_t relocate_new_kernel_size;\n+-\n+-extern unsigned long kexec_start_address;\n+-extern unsigned long kexec_indirection_page;\n++#include <linux/uaccess.h>\n++#include \"machine_kexec.h\"\n+ \n+ static unsigned long reboot_code_buffer;\n+ \n+@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL\n+ void (*_machine_kexec_shutdown)(void) = NULL;\n+ void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL;\n+ \n++static void machine_kexec_print_args(void)\n++{\n++\tunsigned long argc = (int)kexec_args[0];\n++\tint i;\n++\n++\tpr_info(\"kexec_args[0] (argc): %lu\\n\", argc);\n++\tpr_info(\"kexec_args[1] (argv): %p\\n\", (void *)kexec_args[1]);\n++\tpr_info(\"kexec_args[2] (env ): %p\\n\", (void *)kexec_args[2]);\n++\tpr_info(\"kexec_args[3] (desc): %p\\n\", (void *)kexec_args[3]);\n++\n++\tfor (i = 0; i < argc; i++) {\n++\t\tpr_info(\"kexec_argv[%d] = %p, %s\\n\",\n++\t\t\t\ti, kexec_argv[i], kexec_argv[i]);\n++\t}\n++}\n++\n++static void machine_kexec_init_argv(struct kimage *image)\n++{\n++\tvoid __user *buf = NULL;\n++\tsize_t bufsz;\n++\tsize_t size;\n++\tint i;\n++\n++\tbufsz = 0;\n++\tfor (i = 0; i < image->nr_segments; i++) {\n++\t\tstruct kexec_segment *seg;\n++\n++\t\tseg = &image->segment[i];\n++\t\tif (seg->bufsz < 6)\n++\t\t\tcontinue;\n++\n++\t\tif (strncmp((char *) seg->buf, \"kexec \", 6))\n++\t\t\tcontinue;\n++\n++\t\tbuf = seg->buf;\n++\t\tbufsz = seg->bufsz;\n++\t\tbreak;\n++\t}\n++\n++\tif (!buf)\n++\t\treturn;\n++\n++\tsize = KEXEC_COMMAND_LINE_SIZE;\n++\tsize = min(size, bufsz);\n++\tif (size < bufsz)\n++\t\tpr_warn(\"kexec command line truncated to %zd bytes\\n\", size);\n++\n++\t/* Copy to kernel space */\n++\tif (copy_from_user(kexec_argv_buf, buf, size))\n++\t\tpr_warn(\"kexec command line copy to kernel space failed\\n\");\n++\n++\tkexec_argv_buf[size - 1] = 0;\n++}\n++\n++static void machine_kexec_parse_argv(struct kimage *image)\n++{\n++\tchar *reboot_code_buffer;\n++\tint reloc_delta;\n++\tchar *ptr;\n++\tint argc;\n++\tint i;\n++\n++\tptr = kexec_argv_buf;\n++\targc = 0;\n++\n++\t/*\n++\t * convert command line string to array of parameters\n++\t * (as bootloader does).\n++\t */\n++\twhile (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) {\n++\t\tif (*ptr == ' ') {\n++\t\t\t*ptr++ = '\\0';\n++\t\t\tcontinue;\n++\t\t}\n++\n++\t\tkexec_argv[argc++] = ptr;\n++\t\tptr = strchr(ptr, ' ');\n++\t}\n++\n++\tif (!argc)\n++\t\treturn;\n++\n++\tkexec_args[0] = argc;\n++\tkexec_args[1] = (unsigned long)kexec_argv;\n++\tkexec_args[2] = 0;\n++\tkexec_args[3] = 0;\n++\n++\treboot_code_buffer = page_address(image->control_code_page);\n++\treloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel;\n++\n++\tkexec_args[1] += reloc_delta;\n++\tfor (i = 0; i < argc; i++)\n++\t\tkexec_argv[i] += reloc_delta;\n++}\n++\n+ static void kexec_image_info(const struct kimage *kimage)\n+ {\n+ \tunsigned long i;\n+@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim\n+ #endif\n+ \n+ \tkexec_image_info(kimage);\n++\t/*\n++\t * Whenever arguments passed from kexec-tools, Init the arguments as\n++\t * the original ones to try avoiding booting failure.\n++\t */\n++\n++\tkexec_args[0] = fw_arg0;\n++\tkexec_args[1] = fw_arg1;\n++\tkexec_args[2] = fw_arg2;\n++\tkexec_args[3] = fw_arg3;\n++\n++\tmachine_kexec_init_argv(kimage);\n++\tmachine_kexec_parse_argv(kimage);\n+ \n+ \tif (_machine_kexec_prepare)\n+ \t\treturn _machine_kexec_prepare(kimage);\n+@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r\n+ void kexec_nonboot_cpu_jump(void)\n+ {\n+ \tlocal_flush_icache_range((unsigned long)relocated_kexec_smp_wait,\n+-\t\t\t\t reboot_code_buffer + relocate_new_kernel_size);\n++\t\t\t\t reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);\n+ \n+ \trelocated_kexec_smp_wait(NULL);\n+ }\n+@@ -199,7 +303,7 @@ void kexec_reboot(void)\n+ \t * machine_kexec() CPU.\n+ \t */\n+ \tlocal_flush_icache_range(reboot_code_buffer,\n+-\t\t\t\t reboot_code_buffer + relocate_new_kernel_size);\n++\t\t\t\t reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);\n+ \n+ \tdo_kexec = (void *)reboot_code_buffer;\n+ \tdo_kexec();\n+@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image)\n+ \tunsigned long *ptr;\n+ \n+ \treboot_code_buffer =\n+-\t  (unsigned long)page_address(image->control_code_page);\n++\t\t(unsigned long)page_address(image->control_code_page);\n++\tpr_info(\"reboot_code_buffer = %p\\n\", (void *)reboot_code_buffer);\n+ \n+ \tkexec_start_address =\n+ \t\t(unsigned long) phys_to_virt(image->start);\n++\tpr_info(\"kexec_start_address = %p\\n\", (void *)kexec_start_address);\n+ \n+ \tif (image->type == KEXEC_TYPE_DEFAULT) {\n+ \t\tkexec_indirection_page =\n+@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image)\n+ \t} else {\n+ \t\tkexec_indirection_page = (unsigned long)&image->head;\n+ \t}\n++\tpr_info(\"kexec_indirection_page = %p\\n\", (void *)kexec_indirection_page);\n+ \n+-\tmemcpy((void*)reboot_code_buffer, relocate_new_kernel,\n+-\t       relocate_new_kernel_size);\n++\tpr_info(\"Where is memcpy: %p\\n\", memcpy);\n++\tpr_info(\"kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\\n\",\n++\t\t(void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end);\n++\tpr_info(\"Copy %lu bytes from %p to %p\\n\", KEXEC_RELOCATE_NEW_KERNEL_SIZE,\n++\t\t(void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer);\n++\tmemcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel,\n++\t       KEXEC_RELOCATE_NEW_KERNEL_SIZE);\n++\n++\tpr_info(\"Before _print_args().\\n\");\n++\tmachine_kexec_print_args();\n++\tpr_info(\"Before eval loop.\\n\");\n+ \n+ \t/*\n+ \t * The generic kexec code builds a page list with physical\n+@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image)\n+ #ifdef CONFIG_SMP\n+ \t/* All secondary cpus now may jump to kexec_wait cycle */\n+ \trelocated_kexec_smp_wait = reboot_code_buffer +\n+-\t\t(void *)(kexec_smp_wait - relocate_new_kernel);\n++\t\t(void *)(kexec_smp_wait - kexec_relocate_new_kernel);\n+ \tsmp_wmb();\n+ \tatomic_set(&kexec_ready_to_reboot, 1);\n+ #endif\n+--- /dev/null\n++++ b/arch/mips/kernel/machine_kexec.h\n+@@ -0,0 +1,20 @@\n++#ifndef _MACHINE_KEXEC_H\n++#define _MACHINE_KEXEC_H\n++\n++#ifndef __ASSEMBLY__\n++extern const unsigned char kexec_relocate_new_kernel[];\n++extern unsigned long kexec_relocate_new_kernel_end;\n++extern unsigned long kexec_start_address;\n++extern unsigned long kexec_indirection_page;\n++\n++extern char kexec_argv_buf[];\n++extern char *kexec_argv[];\n++\n++#define KEXEC_RELOCATE_NEW_KERNEL_SIZE\t((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel)\n++#endif /* !__ASSEMBLY__ */\n++\n++#define KEXEC_COMMAND_LINE_SIZE\t\t256\n++#define KEXEC_ARGV_SIZE\t\t\t(KEXEC_COMMAND_LINE_SIZE / 16)\n++#define KEXEC_MAX_ARGC\t\t\t(KEXEC_ARGV_SIZE / sizeof(long))\n++\n++#endif\n+--- a/arch/mips/kernel/relocate_kernel.S\n++++ b/arch/mips/kernel/relocate_kernel.S\n+@@ -10,10 +10,12 @@\n+ #include <asm/mipsregs.h>\n+ #include <asm/stackframe.h>\n+ #include <asm/addrspace.h>\n++#include \"machine_kexec.h\"\n+ \n+ #include <kernel-entry-init.h>\n+ \n+-LEAF(relocate_new_kernel)\n++LEAF(kexec_relocate_new_kernel)\n++\n+ \tPTR_L a0,\targ0\n+ \tPTR_L a1,\targ1\n+ \tPTR_L a2,\targ2\n+@@ -98,7 +100,7 @@ done:\n+ #endif\n+ \t/* jump to kexec_start_address */\n+ \tj\t\ts1\n+-\tEND(relocate_new_kernel)\n++\tEND(kexec_relocate_new_kernel)\n+ \n+ #ifdef CONFIG_SMP\n+ /*\n+@@ -181,9 +183,15 @@ kexec_indirection_page:\n+ \tPTR\t\t0\n+ \t.size\t\tkexec_indirection_page, PTRSIZE\n+ \n+-relocate_new_kernel_end:\n++kexec_argv_buf:\n++\tEXPORT(kexec_argv_buf)\n++\t.skip\t\tKEXEC_COMMAND_LINE_SIZE\n++\t.size\t\tkexec_argv_buf, KEXEC_COMMAND_LINE_SIZE\n++\n++kexec_argv:\n++\tEXPORT(kexec_argv)\n++\t.skip\t\tKEXEC_ARGV_SIZE\n++\t.size\t\tkexec_argv, KEXEC_ARGV_SIZE\n+ \n+-relocate_new_kernel_size:\n+-\tEXPORT(relocate_new_kernel_size)\n+-\tPTR\t\trelocate_new_kernel_end - relocate_new_kernel\n+-\t.size\t\trelocate_new_kernel_size, PTRSIZE\n++kexec_relocate_new_kernel_end:\n++\tEXPORT(kexec_relocate_new_kernel_end)\ndiff --git a/target/linux/generic/pending-5.14/332-arc-add-OWRTDTB-section.patch b/target/linux/generic/pending-5.14/332-arc-add-OWRTDTB-section.patch\nnew file mode 100644\nindex 0000000000..30158cf399\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/332-arc-add-OWRTDTB-section.patch\n@@ -0,0 +1,84 @@\n+From bb0c3b0175240bf152fd7c644821a0cf9f77c37c Mon Sep 17 00:00:00 2001\n+From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>\n+Date: Fri, 15 Mar 2019 18:53:38 +0300\n+Subject: [PATCH] arc add OWRTDTB section\n+\n+This change allows OpenWRT to patch resulting kernel binary with\n+external .dtb.\n+\n+That allows us to re-use exactky the same vmlinux on different boards\n+given its ARC core configurations match (at least cache line sizes etc).\n+\n+\"\"patch-dtb\" searches for ASCII \"OWRTDTB:\" strign and copies external\n+.dtb right after it, keeping the string in place.\n+\n+Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>\n+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>\n+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>\n+---\n+ arch/arc/kernel/head.S        | 10 ++++++++++\n+ arch/arc/kernel/setup.c       |  4 +++-\n+ arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++\n+ 3 files changed, 26 insertions(+), 1 deletion(-)\n+\n+--- a/arch/arc/kernel/head.S\n++++ b/arch/arc/kernel/head.S\n+@@ -88,6 +88,16 @@\n+ \tDSP_EARLY_INIT\n+ .endm\n+ \n++\t; Here \"patch-dtb\" will embed external .dtb\n++\t; Note \"patch-dtb\" searches for ASCII \"OWRTDTB:\" string\n++\t; and pastes .dtb right after it, hense the string precedes\n++\t; __image_dtb symbol.\n++\t.section .owrt, \"aw\",@progbits\n++\t.ascii  \"OWRTDTB:\"\n++ENTRY(__image_dtb)\n++\t.fill   0x4000\n++END(__image_dtb)\n++\n+ \t.section .init.text, \"ax\",@progbits\n+ \n+ ;----------------------------------------------------------------\n+--- a/arch/arc/kernel/setup.c\n++++ b/arch/arc/kernel/setup.c\n+@@ -495,6 +495,8 @@ static inline bool uboot_arg_invalid(uns\n+ /* We always pass 0 as magic from U-boot */\n+ #define UBOOT_MAGIC_VALUE\t0\n+ \n++extern struct boot_param_header __image_dtb;\n++\n+ void __init handle_uboot_args(void)\n+ {\n+ \tbool use_embedded_dtb = true;\n+@@ -533,7 +535,7 @@ void __init handle_uboot_args(void)\n+ ignore_uboot_args:\n+ \n+ \tif (use_embedded_dtb) {\n+-\t\tmachine_desc = setup_machine_fdt(__dtb_start);\n++\t\tmachine_desc = setup_machine_fdt(&__image_dtb);\n+ \t\tif (!machine_desc)\n+ \t\t\tpanic(\"Embedded DT invalid\\n\");\n+ \t}\n+--- a/arch/arc/kernel/vmlinux.lds.S\n++++ b/arch/arc/kernel/vmlinux.lds.S\n+@@ -27,6 +27,19 @@ SECTIONS\n+ \n+ \t. = CONFIG_LINUX_LINK_BASE;\n+ \n++\t/*\n++\t* In OpenWRT we want to patch built binary embedding .dtb of choice.\n++\t* This is implemented with \"patch-dtb\" utility which searches for\n++\t* \"OWRTDTB:\" string in first 16k of image and if it is found\n++\t* copies .dtb right after mentioned string.\n++\t*\n++\t* Note: \"OWRTDTB:\" won't be overwritten with .dtb, .dtb will follow it.\n++\t*/\n++ \t.owrt : {\n++\t\t*(.owrt)\n++\t. = ALIGN(PAGE_SIZE);\n++\t}\n++\n+ \t_int_vec_base_lds = .;\n+ \t.vector : {\n+ \t\t*(.vector)\ndiff --git a/target/linux/generic/pending-5.14/333-arc-enable-unaligned-access-in-kernel-mode.patch b/target/linux/generic/pending-5.14/333-arc-enable-unaligned-access-in-kernel-mode.patch\nnew file mode 100644\nindex 0000000000..1848a84cc4\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/333-arc-enable-unaligned-access-in-kernel-mode.patch\n@@ -0,0 +1,24 @@\n+From: Alexey Brodkin <abrodkin@synopsys.com>\n+Subject: arc: enable unaligned access in kernel mode\n+\n+This enables misaligned access handling even in kernel mode.\n+Some wireless drivers (ath9k-htc and mt7601u) use misaligned accesses\n+here and there and to cope with that without fixing stuff in the drivers\n+we're just gracefully handling it on ARC.\n+\n+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>\n+---\n+ arch/arc/kernel/unaligned.c | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/arch/arc/kernel/unaligned.c\n++++ b/arch/arc/kernel/unaligned.c\n+@@ -202,7 +202,7 @@ int misaligned_fixup(unsigned long addre\n+ \tchar buf[TASK_COMM_LEN];\n+ \n+ \t/* handle user mode only and only if enabled by sysadmin */\n+-\tif (!user_mode(regs) || !unaligned_enabled)\n++\tif (!unaligned_enabled)\n+ \t\treturn 1;\n+ \n+ \tif (no_unaligned_warning) {\ndiff --git a/target/linux/generic/pending-5.14/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-5.14/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch\nnew file mode 100644\nindex 0000000000..1e598aeb47\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch\n@@ -0,0 +1,25 @@\n+From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001\n+From: Pawel Dembicki <paweldembicki@gmail.com>\n+Date: Fri, 24 May 2019 17:56:19 +0200\n+Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx\n+\n+Enable kernel XZ compression option on PPC_85xx. Tested with\n+simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor).\n+\n+Suggested-by: Christian Lamparter <chunkeey@gmail.com>\n+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>\n+---\n+ arch/powerpc/Kconfig | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/arch/powerpc/Kconfig\n++++ b/arch/powerpc/Kconfig\n+@@ -227,7 +227,7 @@ config PPC\n+ \tselect HAVE_KERNEL_GZIP\n+ \tselect HAVE_KERNEL_LZMA\t\t\tif DEFAULT_UIMAGE\n+ \tselect HAVE_KERNEL_LZO\t\t\tif DEFAULT_UIMAGE\n+-\tselect HAVE_KERNEL_XZ\t\t\tif PPC_BOOK3S || 44x\n++\tselect HAVE_KERNEL_XZ\t\t\tif PPC_BOOK3S || 44x || PPC_85xx\n+ \tselect HAVE_KPROBES\n+ \tselect HAVE_KPROBES_ON_FTRACE\n+ \tselect HAVE_KRETPROBES\ndiff --git a/target/linux/generic/pending-5.14/400-mtd-mtdsplit-support.patch b/target/linux/generic/pending-5.14/400-mtd-mtdsplit-support.patch\nnew file mode 100644\nindex 0000000000..18f26d9941\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/400-mtd-mtdsplit-support.patch\n@@ -0,0 +1,313 @@\n+--- a/drivers/mtd/Kconfig\n++++ b/drivers/mtd/Kconfig\n+@@ -12,6 +12,25 @@ menuconfig MTD\n+ \n+ if MTD\n+ \n++menu \"OpenWrt specific MTD options\"\n++\n++config MTD_ROOTFS_ROOT_DEV\n++\tbool \"Automatically set 'rootfs' partition to be root filesystem\"\n++\tdefault y\n++\n++config MTD_SPLIT_FIRMWARE\n++\tbool \"Automatically split firmware partition for kernel+rootfs\"\n++\tdefault y\n++\n++config MTD_SPLIT_FIRMWARE_NAME\n++\tstring \"Firmware partition name\"\n++\tdepends on MTD_SPLIT_FIRMWARE\n++\tdefault \"firmware\"\n++\n++source \"drivers/mtd/mtdsplit/Kconfig\"\n++\n++endmenu\n++\n+ config MTD_TESTS\n+ \ttristate \"MTD tests support (DANGEROUS)\"\n+ \tdepends on m\n+--- a/drivers/mtd/mtdpart.c\n++++ b/drivers/mtd/mtdpart.c\n+@@ -15,10 +15,12 @@\n+ #include <linux/kmod.h>\n+ #include <linux/mtd/mtd.h>\n+ #include <linux/mtd/partitions.h>\n++#include <linux/magic.h>\n+ #include <linux/err.h>\n+ #include <linux/of.h>\n+ \n+ #include \"mtdcore.h\"\n++#include \"mtdsplit/mtdsplit.h\"\n+ \n+ /*\n+  * MTD methods which simply translate the effective address and pass through\n+@@ -235,6 +237,146 @@ static int mtd_add_partition_attrs(struc\n+ \treturn ret;\n+ }\n+ \n++static DEFINE_SPINLOCK(part_parser_lock);\n++static LIST_HEAD(part_parsers);\n++\n++static struct mtd_part_parser *mtd_part_parser_get(const char *name)\n++{\n++\tstruct mtd_part_parser *p, *ret = NULL;\n++\n++\tspin_lock(&part_parser_lock);\n++\n++\tlist_for_each_entry(p, &part_parsers, list)\n++\t\tif (!strcmp(p->name, name) && try_module_get(p->owner)) {\n++\t\t\tret = p;\n++\t\t\tbreak;\n++\t\t}\n++\n++\tspin_unlock(&part_parser_lock);\n++\n++\treturn ret;\n++}\n++\n++static inline void mtd_part_parser_put(const struct mtd_part_parser *p)\n++{\n++\tmodule_put(p->owner);\n++}\n++\n++static struct mtd_part_parser *\n++get_partition_parser_by_type(enum mtd_parser_type type,\n++\t\t\t     struct mtd_part_parser *start)\n++{\n++\tstruct mtd_part_parser *p, *ret = NULL;\n++\n++\tspin_lock(&part_parser_lock);\n++\n++\tp = list_prepare_entry(start, &part_parsers, list);\n++\tif (start)\n++\t\tmtd_part_parser_put(start);\n++\n++\tlist_for_each_entry_continue(p, &part_parsers, list) {\n++\t\tif (p->type == type && try_module_get(p->owner)) {\n++\t\t\tret = p;\n++\t\t\tbreak;\n++\t\t}\n++\t}\n++\n++\tspin_unlock(&part_parser_lock);\n++\n++\treturn ret;\n++}\n++\n++static int parse_mtd_partitions_by_type(struct mtd_info *master,\n++\t\t\t\t\tenum mtd_parser_type type,\n++\t\t\t\t\tconst struct mtd_partition **pparts,\n++\t\t\t\t\tstruct mtd_part_parser_data *data)\n++{\n++\tstruct mtd_part_parser *prev = NULL;\n++\tint ret = 0;\n++\n++\twhile (1) {\n++\t\tstruct mtd_part_parser *parser;\n++\n++\t\tparser = get_partition_parser_by_type(type, prev);\n++\t\tif (!parser)\n++\t\t\tbreak;\n++\n++\t\tret = (*parser->parse_fn)(master, pparts, data);\n++\n++\t\tif (ret > 0) {\n++\t\t\tmtd_part_parser_put(parser);\n++\t\t\tprintk(KERN_NOTICE\n++\t\t\t       \"%d %s partitions found on MTD device %s\\n\",\n++\t\t\t       ret, parser->name, master->name);\n++\t\t\tbreak;\n++\t\t}\n++\n++\t\tprev = parser;\n++\t}\n++\n++\treturn ret;\n++}\n++\n++static int\n++run_parsers_by_type(struct mtd_info *child, enum mtd_parser_type type)\n++{\n++\tstruct mtd_partition *parts;\n++\tint nr_parts;\n++\tint i;\n++\n++\tnr_parts = parse_mtd_partitions_by_type(child, type, (const struct mtd_partition **)&parts,\n++\t\t\t\t\t\tNULL);\n++\tif (nr_parts <= 0)\n++\t\treturn nr_parts;\n++\n++\tif (WARN_ON(!parts))\n++\t\treturn 0;\n++\n++\tfor (i = 0; i < nr_parts; i++) {\n++\t\t/* adjust partition offsets */\n++\t\tparts[i].offset += child->part.offset;\n++\n++\t\tmtd_add_partition(child->parent,\n++\t\t\t\t  parts[i].name,\n++\t\t\t\t  parts[i].offset,\n++\t\t\t\t  parts[i].size);\n++\t}\n++\n++\tkfree(parts);\n++\n++\treturn nr_parts;\n++}\n++\n++#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME\n++#define SPLIT_FIRMWARE_NAME\tCONFIG_MTD_SPLIT_FIRMWARE_NAME\n++#else\n++#define SPLIT_FIRMWARE_NAME\t\"unused\"\n++#endif\n++\n++static void split_firmware(struct mtd_info *master, struct mtd_info *part)\n++{\n++\trun_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);\n++}\n++\n++static void mtd_partition_split(struct mtd_info *master, struct mtd_info *part)\n++{\n++\tstatic int rootfs_found = 0;\n++\n++\tif (rootfs_found)\n++\t\treturn;\n++\n++\tif (!strcmp(part->name, \"rootfs\")) {\n++\t\trun_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);\n++\n++\t\trootfs_found = 1;\n++\t}\n++\n++\tif (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&\n++\t    !strcmp(part->name, SPLIT_FIRMWARE_NAME) &&\n++\t    !of_find_property(mtd_get_of_node(part), \"compatible\", NULL))\n++\t\tsplit_firmware(master, part);\n++}\n++\n+ int mtd_add_partition(struct mtd_info *parent, const char *name,\n+ \t\t      long long offset, long long length)\n+ {\n+@@ -273,6 +415,7 @@ int mtd_add_partition(struct mtd_info *p\n+ \tif (ret)\n+ \t\tgoto err_remove_part;\n+ \n++\tmtd_partition_split(parent, child);\n+ \tmtd_add_partition_attrs(child);\n+ \n+ \treturn 0;\n+@@ -421,6 +564,7 @@ int add_mtd_partitions(struct mtd_info *\n+ \t\t\tgoto err_del_partitions;\n+ \t\t}\n+ \n++\t\tmtd_partition_split(master, child);\n+ \t\tmtd_add_partition_attrs(child);\n+ \n+ \t\t/* Look for subpartitions */\n+@@ -437,31 +581,6 @@ err_del_partitions:\n+ \treturn ret;\n+ }\n+ \n+-static DEFINE_SPINLOCK(part_parser_lock);\n+-static LIST_HEAD(part_parsers);\n+-\n+-static struct mtd_part_parser *mtd_part_parser_get(const char *name)\n+-{\n+-\tstruct mtd_part_parser *p, *ret = NULL;\n+-\n+-\tspin_lock(&part_parser_lock);\n+-\n+-\tlist_for_each_entry(p, &part_parsers, list)\n+-\t\tif (!strcmp(p->name, name) && try_module_get(p->owner)) {\n+-\t\t\tret = p;\n+-\t\t\tbreak;\n+-\t\t}\n+-\n+-\tspin_unlock(&part_parser_lock);\n+-\n+-\treturn ret;\n+-}\n+-\n+-static inline void mtd_part_parser_put(const struct mtd_part_parser *p)\n+-{\n+-\tmodule_put(p->owner);\n+-}\n+-\n+ /*\n+  * Many partition parsers just expected the core to kfree() all their data in\n+  * one chunk. Do that by default.\n+--- a/include/linux/mtd/partitions.h\n++++ b/include/linux/mtd/partitions.h\n+@@ -75,6 +75,12 @@ struct mtd_part_parser_data {\n+  * Functions dealing with the various ways of partitioning the space\n+  */\n+ \n++enum mtd_parser_type {\n++\tMTD_PARSER_TYPE_DEVICE = 0,\n++\tMTD_PARSER_TYPE_ROOTFS,\n++\tMTD_PARSER_TYPE_FIRMWARE,\n++};\n++\n+ struct mtd_part_parser {\n+ \tstruct list_head list;\n+ \tstruct module *owner;\n+@@ -83,6 +89,7 @@ struct mtd_part_parser {\n+ \tint (*parse_fn)(struct mtd_info *, const struct mtd_partition **,\n+ \t\t\tstruct mtd_part_parser_data *);\n+ \tvoid (*cleanup)(const struct mtd_partition *pparts, int nr_parts);\n++\tenum mtd_parser_type type;\n+ };\n+ \n+ /* Container for passing around a set of parsed partitions */\n+--- a/drivers/mtd/Makefile\n++++ b/drivers/mtd/Makefile\n+@@ -9,6 +9,8 @@ mtd-y\t\t\t\t:= mtdcore.o mtdsuper.o mtdconc\n+ \n+ obj-y\t\t\t\t+= parsers/\n+ \n++obj-$(CONFIG_MTD_SPLIT)\t\t+= mtdsplit/\n++\n+ # 'Users' - code which presents functionality to userspace.\n+ obj-$(CONFIG_MTD_BLKDEVS)\t+= mtd_blkdevs.o\n+ obj-$(CONFIG_MTD_BLOCK)\t\t+= mtdblock.o\n+--- a/include/linux/mtd/mtd.h\n++++ b/include/linux/mtd/mtd.h\n+@@ -615,6 +615,24 @@ static inline void mtd_align_erase_req(s\n+ \t\treq->len += mtd->erasesize - mod;\n+ }\n+ \n++static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)\n++{\n++\tif (mtd_mod_by_eb(sz, mtd) == 0)\n++\t\treturn sz;\n++\n++\t/* Round up to next erase block */\n++\treturn (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;\n++}\n++\n++static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)\n++{\n++\tif (mtd_mod_by_eb(sz, mtd) == 0)\n++\t\treturn sz;\n++\n++\t/* Round down to the start of the current erase block */\n++\treturn (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;\n++}\n++\n+ static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)\n+ {\n+ \tif (mtd->writesize_shift)\n+@@ -687,6 +705,13 @@ extern void __put_mtd_device(struct mtd_\n+ extern struct mtd_info *get_mtd_device_nm(const char *name);\n+ extern void put_mtd_device(struct mtd_info *mtd);\n+ \n++static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd)\n++{\n++\tif (!mtd_is_partition(mtd))\n++\t\treturn 0;\n++\n++\treturn mtd->part.offset;\n++}\n+ \n+ struct mtd_notifier {\n+ \tvoid (*add)(struct mtd_info *mtd);\ndiff --git a/target/linux/generic/pending-5.14/419-mtd-redboot-add-of_match_table-with-DT-binding.patch b/target/linux/generic/pending-5.14/419-mtd-redboot-add-of_match_table-with-DT-binding.patch\nnew file mode 100644\nindex 0000000000..3d176f8563\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/419-mtd-redboot-add-of_match_table-with-DT-binding.patch\n@@ -0,0 +1,22 @@\n+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>\n+Subject: [PATCH] mtd: redboot: add of_match_table with DT binding\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+This allows parsing RedBoot compatible partitions for properly described\n+flash device in DT.\n+\n+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>\n+---\n+\n+--- a/drivers/mtd/parsers/redboot.c\n++++ b/drivers/mtd/parsers/redboot.c\n+@@ -304,6 +304,7 @@ nogood:\n+ \n+ static const struct of_device_id mtd_parser_redboot_of_match_table[] = {\n+ \t{ .compatible = \"redboot-fis\" },\n++\t{ .compatible = \"ecoscentric,redboot-fis-partitions\" },\n+ \t{},\n+ };\n+ MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table);\ndiff --git a/target/linux/generic/pending-5.14/430-mtd-add-myloader-partition-parser.patch b/target/linux/generic/pending-5.14/430-mtd-add-myloader-partition-parser.patch\nnew file mode 100644\nindex 0000000000..0889c9a343\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/430-mtd-add-myloader-partition-parser.patch\n@@ -0,0 +1,229 @@\n+From: Florian Fainelli <f.fainelli@gmail.com>\n+Subject: Add myloader partition table parser\n+\n+[john@phozen.org: shoud be upstreamable]\n+\n+lede-commit: d8bf22859b51faa09d22c056fe221a45d2f7a3b8\n+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>\n+[adjust for kernel 5.4, add myloader.c to patch]\n+Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>\n+\n+--- a/drivers/mtd/parsers/Kconfig\n++++ b/drivers/mtd/parsers/Kconfig\n+@@ -57,6 +57,22 @@ config MTD_CMDLINE_PARTS\n+ \n+ \t  If unsure, say 'N'.\n+ \n++config MTD_MYLOADER_PARTS\n++\ttristate \"MyLoader partition parsing\"\n++\tdepends on ADM5120 || ATH25 || ATH79\n++\thelp\n++\t  MyLoader is a bootloader which allows the user to define partitions\n++\t  in flash devices, by putting a table in the second erase block\n++\t  on the device, similar to a partition table. This table gives the \n++\t  offsets and lengths of the user defined partitions.\n++\n++\t  If you need code which can detect and parse these tables, and\n++\t  register MTD 'partitions' corresponding to each image detected,\n++\t  enable this option.\n++\n++\t  You will still need the parsing functions to be called by the driver\n++\t  for your particular device. It won't happen automatically.\n++\n+ config MTD_OF_PARTS\n+ \ttristate \"OpenFirmware (device tree) partitioning parser\"\n+ \tdefault y\n+--- a/drivers/mtd/parsers/Makefile\n++++ b/drivers/mtd/parsers/Makefile\n+@@ -3,6 +3,7 @@ obj-$(CONFIG_MTD_AR7_PARTS)\t\t+= ar7part.\n+ obj-$(CONFIG_MTD_BCM47XX_PARTS)\t\t+= bcm47xxpart.o\n+ obj-$(CONFIG_MTD_BCM63XX_PARTS)\t\t+= bcm63xxpart.o\n+ obj-$(CONFIG_MTD_CMDLINE_PARTS)\t\t+= cmdlinepart.o\n++obj-$(CONFIG_MTD_MYLOADER_PARTS)\t\t+= myloader.o\n+ obj-$(CONFIG_MTD_OF_PARTS)\t\t+= ofpart.o\n+ ofpart-y\t\t\t\t+= ofpart_core.o\n+ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908)\t+= ofpart_bcm4908.o\n+--- /dev/null\n++++ b/drivers/mtd/parsers/myloader.c\n+@@ -0,0 +1,181 @@\n++/*\n++ *  Parse MyLoader-style flash partition tables and produce a Linux partition\n++ *  array to match.\n++ *\n++ *  Copyright (C) 2007-2009 Gabor Juhos <juhosg@openwrt.org>\n++ *\n++ *  This file was based on drivers/mtd/redboot.c\n++ *  Author: Red Hat, Inc. - David Woodhouse <dwmw2@cambridge.redhat.com>\n++ *\n++ *  This program is free software; you can redistribute it and/or modify it\n++ *  under the terms of the GNU General Public License version 2 as published\n++ *  by the Free Software Foundation.\n++ */\n++\n++#include <linux/kernel.h>\n++#include <linux/module.h>\n++#include <linux/version.h>\n++#include <linux/slab.h>\n++#include <linux/init.h>\n++#include <linux/vmalloc.h>\n++#include <linux/mtd/mtd.h>\n++#include <linux/mtd/partitions.h>\n++#include <linux/byteorder/generic.h>\n++#include <linux/myloader.h>\n++\n++#define BLOCK_LEN_MIN\t\t0x10000\n++#define PART_NAME_LEN\t\t32\n++\n++struct part_data {\n++\tstruct mylo_partition_table\ttab;\n++\tchar names[MYLO_MAX_PARTITIONS][PART_NAME_LEN];\n++};\n++\n++static int myloader_parse_partitions(struct mtd_info *master,\n++\t\t\t\t     const struct mtd_partition **pparts,\n++\t\t\t\t     struct mtd_part_parser_data *data)\n++{\n++\tstruct part_data *buf;\n++\tstruct mylo_partition_table *tab;\n++\tstruct mylo_partition *part;\n++\tstruct mtd_partition *mtd_parts;\n++\tstruct mtd_partition *mtd_part;\n++\tint num_parts;\n++\tint ret, i;\n++\tsize_t retlen;\n++\tchar *names;\n++\tunsigned long offset;\n++\tunsigned long blocklen;\n++\n++\tbuf = vmalloc(sizeof(*buf));\n++\tif (!buf) {\n++\t\treturn -ENOMEM;\n++\t\tgoto out;\n++\t}\n++\ttab = &buf->tab;\n++\n++\tblocklen = master->erasesize;\n++\tif (blocklen < BLOCK_LEN_MIN)\n++\t\tblocklen = BLOCK_LEN_MIN;\n++\n++\toffset = blocklen;\n++\n++\t/* Find the partition table */\n++\tfor (i = 0; i < 4; i++, offset += blocklen) {\n++\t\tprintk(KERN_DEBUG \"%s: searching for MyLoader partition table\"\n++\t\t\t\t\" at offset 0x%lx\\n\", master->name, offset);\n++\n++\t\tret = mtd_read(master, offset, sizeof(*buf), &retlen,\n++\t\t\t       (void *)buf);\n++\t\tif (ret)\n++\t\t\tgoto out_free_buf;\n++\n++\t\tif (retlen != sizeof(*buf)) {\n++\t\t\tret = -EIO;\n++\t\t\tgoto out_free_buf;\n++\t\t}\n++\n++\t\t/* Check for Partition Table magic number */\n++\t\tif (tab->magic == le32_to_cpu(MYLO_MAGIC_PARTITIONS))\n++\t\t\tbreak;\n++\n++\t}\n++\n++\tif (tab->magic != le32_to_cpu(MYLO_MAGIC_PARTITIONS)) {\n++\t\tprintk(KERN_DEBUG \"%s: no MyLoader partition table found\\n\",\n++\t\t\tmaster->name);\n++\t\tret = 0;\n++\t\tgoto out_free_buf;\n++\t}\n++\n++\t/* The MyLoader and the Partition Table is always present */\n++\tnum_parts = 2;\n++\n++\t/* Detect number of used partitions */\n++\tfor (i = 0; i < MYLO_MAX_PARTITIONS; i++) {\n++\t\tpart = &tab->partitions[i];\n++\n++\t\tif (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)\n++\t\t\tcontinue;\n++\n++\t\tnum_parts++;\n++\t}\n++\n++\tmtd_parts = kzalloc((num_parts * sizeof(*mtd_part) +\n++\t\t\t\tnum_parts * PART_NAME_LEN), GFP_KERNEL);\n++\n++\tif (!mtd_parts) {\n++\t\tret = -ENOMEM;\n++\t\tgoto out_free_buf;\n++\t}\n++\n++\tmtd_part = mtd_parts;\n++\tnames = (char *)&mtd_parts[num_parts];\n++\n++\tstrncpy(names, \"myloader\", PART_NAME_LEN);\n++\tmtd_part->name = names;\n++\tmtd_part->offset = 0;\n++\tmtd_part->size = offset;\n++\tmtd_part->mask_flags = MTD_WRITEABLE;\n++\tmtd_part++;\n++\tnames += PART_NAME_LEN;\n++\n++\tstrncpy(names, \"partition_table\", PART_NAME_LEN);\n++\tmtd_part->name = names;\n++\tmtd_part->offset = offset;\n++\tmtd_part->size = blocklen;\n++\tmtd_part->mask_flags = MTD_WRITEABLE;\n++\tmtd_part++;\n++\tnames += PART_NAME_LEN;\n++\n++\tfor (i = 0; i < MYLO_MAX_PARTITIONS; i++) {\n++\t\tpart = &tab->partitions[i];\n++\n++\t\tif (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)\n++\t\t\tcontinue;\n++\n++\t\tif ((buf->names[i][0]) && (buf->names[i][0] != '\\xff'))\n++\t\t\tstrncpy(names, buf->names[i], PART_NAME_LEN);\n++\t\telse\n++\t\t\tsnprintf(names, PART_NAME_LEN, \"partition%d\", i);\n++\n++\t\tmtd_part->offset = le32_to_cpu(part->addr);\n++\t\tmtd_part->size = le32_to_cpu(part->size);\n++\t\tmtd_part->name = names;\n++\t\tmtd_part++;\n++\t\tnames += PART_NAME_LEN;\n++\t}\n++\n++\t*pparts = mtd_parts;\n++\tret = num_parts;\n++\n++ out_free_buf:\n++\tvfree(buf);\n++ out:\n++\treturn ret;\n++}\n++\n++static struct mtd_part_parser myloader_mtd_parser = {\n++\t.owner\t\t= THIS_MODULE,\n++\t.parse_fn\t= myloader_parse_partitions,\n++\t.name\t\t= \"MyLoader\",\n++};\n++\n++static int __init myloader_mtd_parser_init(void)\n++{\n++\tregister_mtd_parser(&myloader_mtd_parser);\n++\n++\treturn 0;\n++}\n++\n++static void __exit myloader_mtd_parser_exit(void)\n++{\n++\tderegister_mtd_parser(&myloader_mtd_parser);\n++}\n++\n++module_init(myloader_mtd_parser_init);\n++module_exit(myloader_mtd_parser_exit);\n++\n++MODULE_AUTHOR(\"Gabor Juhos <juhosg@openwrt.org>\");\n++MODULE_DESCRIPTION(\"Parsing code for MyLoader partition tables\");\n++MODULE_LICENSE(\"GPL v2\");\ndiff --git a/target/linux/generic/pending-5.14/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/pending-5.14/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch\nnew file mode 100644\nindex 0000000000..bcea45d009\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch\n@@ -0,0 +1,68 @@\n+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>\n+Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating offsets\n+\n+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>\n+---\n+\n+--- a/drivers/mtd/parsers/parser_trx.c\n++++ b/drivers/mtd/parsers/parser_trx.c\n+@@ -25,6 +25,33 @@ struct trx_header {\n+ \tuint32_t offset[3];\n+ } __packed;\n+ \n++/*\n++ * Calculate real end offset (address) for a given amount of data. It checks\n++ * all blocks skipping bad ones.\n++ */\n++static size_t parser_trx_real_offset(struct mtd_info *mtd, size_t bytes)\n++{\n++\tsize_t real_offset = 0;\n++\n++\tif (mtd_block_isbad(mtd, real_offset))\n++\t\tpr_warn(\"Base offset shouldn't be at bad block\");\n++\n++\twhile (bytes >= mtd->erasesize) {\n++\t\tbytes -= mtd->erasesize;\n++\t\treal_offset += mtd->erasesize;\n++\t\twhile (mtd_block_isbad(mtd, real_offset)) {\n++\t\t\treal_offset += mtd->erasesize;\n++\n++\t\t\tif (real_offset >= mtd->size)\n++\t\t\t\treturn real_offset - mtd->erasesize;\n++\t\t}\n++\t}\n++\n++\treal_offset += bytes;\n++\n++\treturn real_offset;\n++}\n++\n+ static const char *parser_trx_data_part_name(struct mtd_info *master,\n+ \t\t\t\t\t     size_t offset)\n+ {\n+@@ -86,21 +113,21 @@ static int parser_trx_parse(struct mtd_i\n+ \tif (trx.offset[2]) {\n+ \t\tpart = &parts[curr_part++];\n+ \t\tpart->name = \"loader\";\n+-\t\tpart->offset = trx.offset[i];\n++\t\tpart->offset = parser_trx_real_offset(mtd, trx.offset[i]);\n+ \t\ti++;\n+ \t}\n+ \n+ \tif (trx.offset[i]) {\n+ \t\tpart = &parts[curr_part++];\n+ \t\tpart->name = \"linux\";\n+-\t\tpart->offset = trx.offset[i];\n++\t\tpart->offset = parser_trx_real_offset(mtd, trx.offset[i]);\n+ \t\ti++;\n+ \t}\n+ \n+ \tif (trx.offset[i]) {\n+ \t\tpart = &parts[curr_part++];\n+-\t\tpart->name = parser_trx_data_part_name(mtd, trx.offset[i]);\n+-\t\tpart->offset = trx.offset[i];\n++\t\tpart->offset = parser_trx_real_offset(mtd, trx.offset[i]);\n++\t\tpart->name = parser_trx_data_part_name(mtd, part->offset);\n+ \t\ti++;\n+ \t}\n+ \ndiff --git a/target/linux/generic/pending-5.14/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/pending-5.14/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch\nnew file mode 100644\nindex 0000000000..852654d924\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch\n@@ -0,0 +1,37 @@\n+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>\n+Subject: mtd: bcm47xxpart: detect T_Meter partition\n+\n+It can be found on many Netgear devices. It consists of many 0x30 blocks\n+starting with 4D 54.\n+\n+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>\n+---\n+ drivers/mtd/bcm47xxpart.c | 10 ++++++++++\n+ 1 file changed, 10 insertions(+)\n+\n+--- a/drivers/mtd/parsers/bcm47xxpart.c\n++++ b/drivers/mtd/parsers/bcm47xxpart.c\n+@@ -35,6 +35,7 @@\n+ #define NVRAM_HEADER\t\t\t0x48534C46\t/* FLSH */\n+ #define POT_MAGIC1\t\t\t0x54544f50\t/* POTT */\n+ #define POT_MAGIC2\t\t\t0x504f\t\t/* OP */\n++#define T_METER_MAGIC\t\t\t0x4D540000\t/* MT */\n+ #define ML_MAGIC1\t\t\t0x39685a42\n+ #define ML_MAGIC2\t\t\t0x26594131\n+ #define TRX_MAGIC\t\t\t0x30524448\n+@@ -178,6 +179,15 @@ static int bcm47xxpart_parse(struct mtd_\n+ \t\t\t\t\t     MTD_WRITEABLE);\n+ \t\t\tcontinue;\n+ \t\t}\n++\n++\t\t/* T_Meter */\n++\t\tif ((le32_to_cpu(buf[0x000 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&\n++\t\t    (le32_to_cpu(buf[0x030 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&\n++\t\t    (le32_to_cpu(buf[0x060 / 4]) & 0xFFFF0000) == T_METER_MAGIC) {\n++\t\t\tbcm47xxpart_add_part(&parts[curr_part++], \"T_Meter\", offset,\n++\t\t\t\t\t     MTD_WRITEABLE);\n++\t\t\tcontinue;\n++\t\t}\n+ \n+ \t\t/* TRX */\n+ \t\tif (buf[0x000 / 4] == TRX_MAGIC) {\ndiff --git a/target/linux/generic/pending-5.14/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-5.14/435-mtd-add-routerbootpart-parser-config.patch\nnew file mode 100644\nindex 0000000000..b5384673b0\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/435-mtd-add-routerbootpart-parser-config.patch\n@@ -0,0 +1,42 @@\n+From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001\n+From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>\n+Date: Tue, 24 Mar 2020 11:45:07 +0100\n+Subject: [PATCH] generic: routerboot partition build bits (5.4)\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+This patch adds routerbootpart kernel build bits\n+\n+Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>\n+---\n+ drivers/mtd/parsers/Kconfig  | 9 +++++++++\n+ drivers/mtd/parsers/Makefile | 1 +\n+ 2 files changed, 10 insertions(+)\n+\n+--- a/drivers/mtd/parsers/Kconfig\n++++ b/drivers/mtd/parsers/Kconfig\n+@@ -196,6 +196,15 @@ config MTD_REDBOOT_PARTS_READONLY\n+ \n+ endif # MTD_REDBOOT_PARTS\n+ \n++config MTD_ROUTERBOOT_PARTS\n++\ttristate \"RouterBoot flash partition parser\"\n++\tdepends on MTD && OF\n++\thelp\n++\t MikroTik RouterBoot is implemented as a multi segment system on the\n++\t flash, some of which are fixed and some of which are located at\n++\t variable offsets. This parser handles both cases via properly\n++\t formatted DTS.\n++\n+ config MTD_QCOMSMEM_PARTS\n+ \ttristate \"Qualcomm SMEM flash partition parser\"\n+ \tdepends on QCOM_SMEM\n+--- a/drivers/mtd/parsers/Makefile\n++++ b/drivers/mtd/parsers/Makefile\n+@@ -13,4 +13,5 @@ obj-$(CONFIG_MTD_AFS_PARTS)\t\t+= afs.o\n+ obj-$(CONFIG_MTD_PARSER_TRX)\t\t+= parser_trx.o\n+ obj-$(CONFIG_MTD_SHARPSL_PARTS)\t\t+= sharpslpart.o\n+ obj-$(CONFIG_MTD_REDBOOT_PARTS)\t\t+= redboot.o\n++obj-$(CONFIG_MTD_ROUTERBOOT_PARTS)\t\t+= routerbootpart.o\n+ obj-$(CONFIG_MTD_QCOMSMEM_PARTS)\t+= qcomsmempart.o\ndiff --git a/target/linux/generic/pending-5.14/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-5.14/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch\nnew file mode 100644\nindex 0000000000..cb7768a5e7\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch\n@@ -0,0 +1,25 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: disable cfi cmdset 0002 erase suspend\n+\n+on some platforms, erase suspend leads to data corruption and lockups when write\n+ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh.\n+rather than play whack-a-mole with a hard to reproduce issue on a variety of devices,\n+simply disable erase suspend, as it will usually not produce any useful gain on\n+the small filesystems used on embedded hardware.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/mtd/chips/cfi_cmdset_0002.c | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/drivers/mtd/chips/cfi_cmdset_0002.c\n++++ b/drivers/mtd/chips/cfi_cmdset_0002.c\n+@@ -914,7 +914,7 @@ static int get_chip(struct map_info *map\n+ \t\treturn 0;\n+ \n+ \tcase FL_ERASING:\n+-\t\tif (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||\n++\t\tif (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||\n+ \t\t    !(mode == FL_READY || mode == FL_POINT ||\n+ \t\t    (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))\n+ \t\t\tgoto sleep;\ndiff --git a/target/linux/generic/pending-5.14/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-5.14/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch\nnew file mode 100644\nindex 0000000000..bedd53ccba\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch\n@@ -0,0 +1,17 @@\n+From: George Kashperko <george@znau.edu.ua>\n+Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data.\n+\n+Signed-off-by: George Kashperko <george@znau.edu.ua>\n+---\n+ drivers/mtd/chips/cfi_cmdset_0002.c |    1 +\n+ 1 file changed, 1 insertion(+)\n+--- a/drivers/mtd/chips/cfi_cmdset_0002.c\n++++ b/drivers/mtd/chips/cfi_cmdset_0002.c\n+@@ -2058,6 +2058,7 @@ static int __xipram do_write_buffer(stru\n+ \n+ \t/* Write Buffer Load */\n+ \tmap_write(map, CMD(0x25), cmd_adr);\n++\t(void) map_read(map, cmd_adr);\n+ \n+ \tchip->state = FL_WRITING_TO_BUFFER;\n+ \ndiff --git a/target/linux/generic/pending-5.14/465-m25p80-mx-disable-software-protection.patch b/target/linux/generic/pending-5.14/465-m25p80-mx-disable-software-protection.patch\nnew file mode 100644\nindex 0000000000..f58d5452ab\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/465-m25p80-mx-disable-software-protection.patch\n@@ -0,0 +1,18 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: Disable software protection bits for Macronix flashes.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/mtd/spi-nor/spi-nor.c | 1 +\n+ 1 file changed, 1 insertion(+)\n+\n+--- a/drivers/mtd/spi-nor/macronix.c\n++++ b/drivers/mtd/spi-nor/macronix.c\n+@@ -93,6 +93,7 @@ static void macronix_default_init(struct\n+ {\n+ \tnor->params->quad_enable = spi_nor_sr1_bit6_quad_enable;\n+ \tnor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode;\n++\tnor->flags |= SNOR_F_HAS_LOCK;\n+ }\n+ \n+ static const struct spi_nor_fixups macronix_fixups = {\ndiff --git a/target/linux/generic/pending-5.14/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch b/target/linux/generic/pending-5.14/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch\nnew file mode 100644\nindex 0000000000..71bb24ae8f\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch\n@@ -0,0 +1,71 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Sat, 4 Nov 2017 07:40:23 +0100\n+Subject: [PATCH] mtd: spi-nor: support limiting 4K sectors support based on\n+ flash size\n+\n+Some devices need 4K sectors to be able to deal with small flash chips.\n+For instance, w25x05 is 64 KiB in size, and without 4K sectors, the\n+entire chip is just one erase block.\n+On bigger flash chip sizes, using 4K sectors can significantly slow down\n+many operations, including using a writable filesystem. There are several\n+platforms where it makes sense to use a single kernel on both kinds of\n+devices.\n+\n+To support this properly, allow configuring an upper flash chip size\n+limit for 4K sectors support.\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+\n+--- a/drivers/mtd/spi-nor/Kconfig\n++++ b/drivers/mtd/spi-nor/Kconfig\n+@@ -68,6 +68,17 @@ config MTD_SPI_NOR_SWP_KEEP\n+ \n+ endchoice\n+ \n++config MTD_SPI_NOR_USE_4K_SECTORS_LIMIT\n++\tint \"Maximum flash chip size to use 4K sectors on (in KiB)\"\n++\tdepends on MTD_SPI_NOR_USE_4K_SECTORS\n++\tdefault \"4096\"\n++\thelp\n++\t  There are many flash chips that support 4K sectors, but are so large\n++\t  that using them significantly slows down writing large amounts of\n++\t  data or using a writable filesystem.\n++\t  Any flash chip larger than the size specified in this option will\n++\t  not use 4K sectors.\n++\n+ source \"drivers/mtd/spi-nor/controllers/Kconfig\"\n+ \n+ endif # MTD_SPI_NOR\n+--- a/drivers/mtd/spi-nor/core.c\n++++ b/drivers/mtd/spi-nor/core.c\n+@@ -2625,6 +2625,21 @@ static void spi_nor_info_init_params(str\n+ \t */\n+ \terase_mask = 0;\n+ \ti = 0;\n++#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS\n++\tif ((info->flags & SECT_4K_PMC) && (params->size <=\n++\t\t   CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {\n++\t\terase_mask |= BIT(i);\n++\t\tspi_nor_set_erase_type(&map->erase_type[i], 4096u,\n++\t\t\t\t       SPINOR_OP_BE_4K_PMC);\n++\t\ti++;\n++\t} else if ((info->flags & SECT_4K) && (params->size <=\n++\t    CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {\n++\t\terase_mask |= BIT(i);\n++\t\tspi_nor_set_erase_type(&map->erase_type[i], 4096u,\n++\t\t\t\t       SPINOR_OP_BE_4K);\n++\t\ti++;\n++\t}\n++#else\n+ \tif (info->flags & SECT_4K_PMC) {\n+ \t\terase_mask |= BIT(i);\n+ \t\tspi_nor_set_erase_type(&map->erase_type[i], 4096u,\n+@@ -2636,6 +2651,7 @@ static void spi_nor_info_init_params(str\n+ \t\t\t\t       SPINOR_OP_BE_4K);\n+ \t\ti++;\n+ \t}\n++#endif\n+ \terase_mask |= BIT(i);\n+ \tspi_nor_set_erase_type(&map->erase_type[i], info->sector_size,\n+ \t\t\t       SPINOR_OP_SE);\ndiff --git a/target/linux/generic/pending-5.14/476-mtd-spi-nor-add-eon-en25q128.patch b/target/linux/generic/pending-5.14/476-mtd-spi-nor-add-eon-en25q128.patch\nnew file mode 100644\nindex 0000000000..325fca62f3\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/476-mtd-spi-nor-add-eon-en25q128.patch\n@@ -0,0 +1,18 @@\n+From: Piotr Dymacz <pepe2k@gmail.com>\n+Subject: kernel/mtd: add support for EON EN25Q128\n+\n+Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>\n+---\n+ drivers/mtd/spi-nor/spi-nor.c | 1 +\n+ 1 file changed, 1 insertion(+)\n+\n+--- a/drivers/mtd/spi-nor/eon.c\n++++ b/drivers/mtd/spi-nor/eon.c\n+@@ -15,6 +15,7 @@ static const struct flash_info eon_parts\n+ \t{ \"en25q32b\",   INFO(0x1c3016, 0, 64 * 1024,   64, 0) },\n+ \t{ \"en25p64\",    INFO(0x1c2017, 0, 64 * 1024,  128, 0) },\n+ \t{ \"en25q64\",    INFO(0x1c3017, 0, 64 * 1024,  128, SECT_4K) },\n++\t{ \"en25q128\",   INFO(0x1c3018, 0, 64 * 1024,  256, SECT_4K) },\n+ \t{ \"en25q80a\",   INFO(0x1c3014, 0, 64 * 1024,   16,\n+ \t\t\t     SECT_4K | SPI_NOR_DUAL_READ) },\n+ \t{ \"en25qh16\",   INFO(0x1c7015, 0, 64 * 1024,   32,\ndiff --git a/target/linux/generic/pending-5.14/479-mtd-spi-nor-add-xtx-xt25f128b.patch b/target/linux/generic/pending-5.14/479-mtd-spi-nor-add-xtx-xt25f128b.patch\nnew file mode 100644\nindex 0000000000..f842ee1e5d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/479-mtd-spi-nor-add-xtx-xt25f128b.patch\n@@ -0,0 +1,79 @@\n+From patchwork Thu Feb  6 17:19:41 2020\n+Content-Type: text/plain; charset=\"utf-8\"\n+MIME-Version: 1.0\n+Content-Transfer-Encoding: 7bit\n+X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>\n+X-Patchwork-Id: 1234465\n+Date: Thu, 6 Feb 2020 19:19:41 +0200\n+From: Daniel Golle <daniel@makrotopia.org>\n+To: linux-mtd@lists.infradead.org\n+Subject: [PATCH v2] mtd: spi-nor: Add support for xt25f128b chip\n+Message-ID: <20200206171941.GA2398@makrotopia.org>\n+MIME-Version: 1.0\n+Content-Disposition: inline\n+List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-mtd>,\n+ <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>\n+Cc: Eitan Cohen <eitan@neot-semadar.com>, Piotr Dymacz <pepe2k@gmail.com>,\n+ Tudor Ambarus <tudor.ambarus@microchip.com>\n+Sender: \"linux-mtd\" <linux-mtd-bounces@lists.infradead.org>\n+Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org\n+\n+Add XT25F128B made by XTX Technology (Shenzhen) Limited.\n+This chip supports dual and quad read and uniform 4K-byte erase.\n+Verified on Teltonika RUT955 which comes with XT25F128B in recent\n+versions of the device.\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/mtd/spi-nor/spi-nor.c | 4 ++++\n+ 1 file changed, 4 insertions(+)\n+\n+--- a/drivers/mtd/spi-nor/Makefile\n++++ b/drivers/mtd/spi-nor/Makefile\n+@@ -17,6 +17,7 @@ spi-nor-objs\t\t\t+= sst.o\n+ spi-nor-objs\t\t\t+= winbond.o\n+ spi-nor-objs\t\t\t+= xilinx.o\n+ spi-nor-objs\t\t\t+= xmc.o\n++spi-nor-objs\t\t\t+= xtx.o\n+ obj-$(CONFIG_MTD_SPI_NOR)\t+= spi-nor.o\n+ \n+ obj-$(CONFIG_MTD_SPI_NOR)\t+= controllers/\n+--- /dev/null\n++++ b/drivers/mtd/spi-nor/xtx.c\n+@@ -0,0 +1,15 @@\n++// SPDX-License-Identifier: GPL-2.0\n++#include <linux/mtd/spi-nor.h>\n++\n++#include \"core.h\"\n++\n++static const struct flash_info xtx_parts[] = {\n++\t/* XTX Technology (Shenzhen) Limited */\n++\t{ \"xt25f128b\", INFO(0x0B4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },\n++};\n++\n++const struct spi_nor_manufacturer spi_nor_xtx = {\n++\t.name = \"xtx\",\n++\t.parts = xtx_parts,\n++\t.nparts = ARRAY_SIZE(xtx_parts),\n++};\n+--- a/drivers/mtd/spi-nor/core.c\n++++ b/drivers/mtd/spi-nor/core.c\n+@@ -1846,6 +1846,7 @@ static const struct spi_nor_manufacturer\n+ \t&spi_nor_winbond,\n+ \t&spi_nor_xilinx,\n+ \t&spi_nor_xmc,\n++\t&spi_nor_xtx,\n+ };\n+ \n+ static const struct flash_info *\n+--- a/drivers/mtd/spi-nor/core.h\n++++ b/drivers/mtd/spi-nor/core.h\n+@@ -489,6 +489,7 @@ extern const struct spi_nor_manufacturer\n+ extern const struct spi_nor_manufacturer spi_nor_winbond;\n+ extern const struct spi_nor_manufacturer spi_nor_xilinx;\n+ extern const struct spi_nor_manufacturer spi_nor_xmc;\n++extern const struct spi_nor_manufacturer spi_nor_xtx;\n+ \n+ extern const struct attribute_group *spi_nor_sysfs_groups[];\n+ \ndiff --git a/target/linux/generic/pending-5.14/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch b/target/linux/generic/pending-5.14/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch\nnew file mode 100644\nindex 0000000000..c32cde559d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch\n@@ -0,0 +1,22 @@\n+From d68b4aa22e8c625685bfad642dd7337948dc0ad1 Mon Sep 17 00:00:00 2001\n+From: Koen Vandeputte <koen.vandeputte@ncentric.com>\n+Date: Mon, 6 Jan 2020 13:07:56 +0100\n+Subject: [PATCH] mtd: spi-nor: add support for Gigadevice GD25D05\n+\n+Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>\n+---\n+ drivers/mtd/spi-nor/spi-nor.c | 5 +++++\n+ 1 file changed, 5 insertions(+)\n+\n+--- a/drivers/mtd/spi-nor/gigadevice.c\n++++ b/drivers/mtd/spi-nor/gigadevice.c\n+@@ -24,6 +24,9 @@ static struct spi_nor_fixups gd25q256_fi\n+ };\n+ \n+ static const struct flash_info gigadevice_parts[] = {\n++\t{ \"gd25q05\", INFO(0xc84010, 0, 64 * 1024,  1,\n++\t\t\t  SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |\n++\t\t\t  SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) },\n+ \t{ \"gd25q16\", INFO(0xc84015, 0, 64 * 1024,  32,\n+ \t\t\t  SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |\n+ \t\t\t  SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) },\ndiff --git a/target/linux/generic/pending-5.14/483-mtd-spi-nor-add-gd25q512.patch b/target/linux/generic/pending-5.14/483-mtd-spi-nor-add-gd25q512.patch\nnew file mode 100644\nindex 0000000000..6f41546964\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/483-mtd-spi-nor-add-gd25q512.patch\n@@ -0,0 +1,12 @@\n+--- a/drivers/mtd/spi-nor/gigadevice.c\n++++ b/drivers/mtd/spi-nor/gigadevice.c\n+@@ -53,6 +53,9 @@ static const struct flash_info gigadevic\n+ \t\t\t   SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK |\n+ \t\t\t   SPI_NOR_HAS_TB | SPI_NOR_TB_SR_BIT6)\n+ \t\t.fixups = &gd25q256_fixups },\n++\t{ \"gd25q512\", INFO(0xc84020, 0, 64 * 1024, 1024,\n++\t\t\t   SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |\n++\t\t\t   SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB | SPI_NOR_4B_OPCODES) },\n+ };\n+ \n+ const struct spi_nor_manufacturer spi_nor_gigadevice = {\ndiff --git a/target/linux/generic/pending-5.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-5.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch\nnew file mode 100644\nindex 0000000000..393308f717\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch\n@@ -0,0 +1,97 @@\n+From: Daniel Golle <daniel@makrotopia.org>\n+Subject: ubi: auto-attach mtd device named \"ubi\" or \"data\" on boot\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+---\n+ drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++\n+ 1 file changed, 36 insertions(+)\n+\n+--- a/drivers/mtd/ubi/build.c\n++++ b/drivers/mtd/ubi/build.c\n+@@ -1191,6 +1191,73 @@ static struct mtd_info * __init open_mtd\n+ \treturn mtd;\n+ }\n+ \n++/*\n++ * This function tries attaching mtd partitions named either \"ubi\" or \"data\"\n++ * during boot.\n++ */\n++static void __init ubi_auto_attach(void)\n++{\n++\tint err;\n++\tstruct mtd_info *mtd;\n++\tloff_t offset = 0;\n++\tsize_t len;\n++\tchar magic[4];\n++\n++\t/* try attaching mtd device named \"ubi\" or \"data\" */\n++\tmtd = open_mtd_device(\"ubi\");\n++\tif (IS_ERR(mtd))\n++\t\tmtd = open_mtd_device(\"data\");\n++\n++\tif (IS_ERR(mtd))\n++\t\treturn;\n++\n++\t/* get the first not bad block */\n++\tif (mtd_can_have_bb(mtd))\n++\t\twhile (mtd_block_isbad(mtd, offset)) {\n++\t\t\toffset += mtd->erasesize;\n++\n++\t\t\tif (offset > mtd->size) {\n++\t\t\t\tpr_err(\"UBI error: Failed to find a non-bad \"\n++\t\t\t\t       \"block on mtd%d\\n\", mtd->index);\n++\t\t\t\tgoto cleanup;\n++\t\t\t}\n++\t\t}\n++\n++\t/* check if the read from flash was successful */\n++\terr = mtd_read(mtd, offset, 4, &len, (void *) magic);\n++\tif ((err && !mtd_is_bitflip(err)) || len != 4) {\n++\t\tpr_err(\"UBI error: unable to read from mtd%d\\n\", mtd->index);\n++\t\tgoto cleanup;\n++\t}\n++\n++\t/* check for a valid ubi magic */\n++\tif (strncmp(magic, \"UBI#\", 4)) {\n++\t\tpr_err(\"UBI error: no valid UBI magic found inside mtd%d\\n\", mtd->index);\n++\t\tgoto cleanup;\n++\t}\n++\n++\t/* don't auto-add media types where UBI doesn't makes sense */\n++\tif (mtd->type != MTD_NANDFLASH &&\n++\t    mtd->type != MTD_NORFLASH &&\n++\t    mtd->type != MTD_DATAFLASH &&\n++\t    mtd->type != MTD_MLCNANDFLASH)\n++\t\tgoto cleanup;\n++\n++\tmutex_lock(&ubi_devices_mutex);\n++\tpr_notice(\"UBI: auto-attach mtd%d\\n\", mtd->index);\n++\terr = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);\n++\tmutex_unlock(&ubi_devices_mutex);\n++\tif (err < 0) {\n++\t\tpr_err(\"UBI error: cannot attach mtd%d\\n\", mtd->index);\n++\t\tgoto cleanup;\n++\t}\n++\n++\treturn;\n++\n++cleanup:\n++\tput_mtd_device(mtd);\n++}\n++\n+ static int __init ubi_init(void)\n+ {\n+ \tint err, i, k;\n+@@ -1274,6 +1341,12 @@ static int __init ubi_init(void)\n+ \t\t}\n+ \t}\n+ \n++\t/* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd\n++\t * parameter was given */\n++\tif (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&\n++\t    !ubi_is_module() && !mtd_devs)\n++\t\tubi_auto_attach();\n++\n+ \terr = ubiblock_init();\n+ \tif (err) {\n+ \t\tpr_err(\"UBI error: block: cannot initialize, error %d\\n\", err);\ndiff --git a/target/linux/generic/pending-5.14/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-5.14/491-ubi-auto-create-ubiblock-device-for-rootfs.patch\nnew file mode 100644\nindex 0000000000..ae53770c11\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/491-ubi-auto-create-ubiblock-device-for-rootfs.patch\n@@ -0,0 +1,69 @@\n+From: Daniel Golle <daniel@makrotopia.org>\n+Subject: ubi: auto-create ubiblock device for rootfs\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+---\n+ drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++\n+ 1 file changed, 42 insertions(+)\n+\n+--- a/drivers/mtd/ubi/block.c\n++++ b/drivers/mtd/ubi/block.c\n+@@ -642,6 +642,47 @@ static void __init ubiblock_create_from_\n+ \t}\n+ }\n+ \n++#define UBIFS_NODE_MAGIC  0x06101831\n++static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc)\n++{\n++\tint ret;\n++\tuint32_t magic_of, magic;\n++\tret = ubi_read(desc, 0, (char *)&magic_of, 0, 4);\n++\tif (ret)\n++\t\treturn 0;\n++\tmagic = le32_to_cpu(magic_of);\n++\treturn magic == UBIFS_NODE_MAGIC;\n++}\n++\n++static void __init ubiblock_create_auto_rootfs(void)\n++{\n++\tint ubi_num, ret, is_ubifs;\n++\tstruct ubi_volume_desc *desc;\n++\tstruct ubi_volume_info vi;\n++\n++\tfor (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) {\n++\t\tdesc = ubi_open_volume_nm(ubi_num, \"rootfs\", UBI_READONLY);\n++\t\tif (IS_ERR(desc))\n++\t\t\tdesc = ubi_open_volume_nm(ubi_num, \"fit\", UBI_READONLY);;\n++\n++\t\tif (IS_ERR(desc))\n++\t\t\tcontinue;\n++\n++\t\tubi_get_volume_info(desc, &vi);\n++\t\tis_ubifs = ubi_vol_is_ubifs(desc);\n++\t\tubi_close_volume(desc);\n++\t\tif (is_ubifs)\n++\t\t\tbreak;\n++\n++\t\tret = ubiblock_create(&vi);\n++\t\tif (ret)\n++\t\t\tpr_err(\"UBI error: block: can't add '%s' volume, err=%d\\n\",\n++\t\t\t\tvi.name, ret);\n++\t\t/* always break if we get here */\n++\t\tbreak;\n++\t}\n++}\n++\n+ static void ubiblock_remove_all(void)\n+ {\n+ \tstruct ubiblock *next;\n+@@ -674,6 +715,10 @@ int __init ubiblock_init(void)\n+ \t */\n+ \tubiblock_create_from_param();\n+ \n++\t/* auto-attach \"rootfs\" volume if existing and non-ubifs */\n++\tif (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV))\n++\t\tubiblock_create_auto_rootfs();\n++\n+ \t/*\n+ \t * Block devices are only created upon user requests, so we ignore\n+ \t * existing volumes.\ndiff --git a/target/linux/generic/pending-5.14/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-5.14/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch\nnew file mode 100644\nindex 0000000000..64dc232e58\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch\n@@ -0,0 +1,51 @@\n+From: Daniel Golle <daniel@makrotopia.org>\n+Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+---\n+ init/do_mounts.c | 26 +++++++++++++++++++++++++-\n+ 1 file changed, 25 insertions(+), 1 deletion(-)\n+\n+--- a/init/do_mounts.c\n++++ b/init/do_mounts.c\n+@@ -453,7 +453,28 @@ retry:\n+ out:\n+ \tput_page(page);\n+ }\n+- \n++\n++static int __init mount_ubi_rootfs(void)\n++{\n++\tint flags = MS_SILENT;\n++\tint err, tried = 0;\n++\n++\twhile (tried < 2) {\n++\t\terr = do_mount_root(\"ubi0:rootfs\", \"ubifs\", flags, \\\n++\t\t\t\t\troot_mount_data);\n++\t\tswitch (err) {\n++\t\t\tcase -EACCES:\n++\t\t\t\tflags |= MS_RDONLY;\n++\t\t\t\ttried++;\n++\t\t\t\tbreak;\n++\t\t\tdefault:\n++\t\t\t\treturn err;\n++\t\t}\n++\t}\n++\n++\treturn -EINVAL;\n++}\n++\n+ #ifdef CONFIG_ROOT_NFS\n+ \n+ #define NFSROOT_TIMEOUT_MIN\t5\n+@@ -546,6 +567,10 @@ void __init mount_root(void)\n+ \t\treturn;\n+ \t}\n+ #endif\n++#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV\n++\tif (!mount_ubi_rootfs())\n++\t\treturn;\n++#endif\n+ #ifdef CONFIG_BLOCK\n+ \t{\n+ \t\tint err = create_dev(\"/dev/root\", ROOT_DEV);\ndiff --git a/target/linux/generic/pending-5.14/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-5.14/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch\nnew file mode 100644\nindex 0000000000..266a6331c2\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch\n@@ -0,0 +1,34 @@\n+From: Daniel Golle <daniel@makrotopia.org>\n+Subject: ubi: set ROOT_DEV to ubiblock \"rootfs\" if unset\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+---\n+ drivers/mtd/ubi/block.c | 10 ++++++++++\n+ 1 file changed, 10 insertions(+)\n+\n+--- a/drivers/mtd/ubi/block.c\n++++ b/drivers/mtd/ubi/block.c\n+@@ -42,6 +42,7 @@\n+ #include <linux/scatterlist.h>\n+ #include <linux/idr.h>\n+ #include <asm/div64.h>\n++#include <linux/root_dev.h>\n+ \n+ #include \"ubi-media.h\"\n+ #include \"ubi.h\"\n+@@ -451,6 +452,15 @@ int ubiblock_create(struct ubi_volume_in\n+ \tdev_info(disk_to_dev(dev->gd), \"created from ubi%d:%d(%s)\",\n+ \t\t dev->ubi_num, dev->vol_id, vi->name);\n+ \tmutex_unlock(&devices_mutex);\n++\n++\tif (!strcmp(vi->name, \"rootfs\") &&\n++\t    IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&\n++\t    ROOT_DEV == 0) {\n++\t\tpr_notice(\"ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\\n\",\n++\t\t\t  dev->ubi_num, dev->vol_id, vi->name);\n++\t\tROOT_DEV = MKDEV(gd->major, gd->first_minor);\n++\t}\n++\n+ \treturn 0;\n+ \n+ out_remove_minor:\ndiff --git a/target/linux/generic/pending-5.14/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-5.14/494-mtd-ubi-add-EOF-marker-support.patch\nnew file mode 100644\nindex 0000000000..fc48146221\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/494-mtd-ubi-add-EOF-marker-support.patch\n@@ -0,0 +1,60 @@\n+From: Gabor Juhos <juhosg@openwrt.org>\n+Subject: mtd: add EOF marker support to the UBI layer\n+\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+---\n+ drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++---\n+ drivers/mtd/ubi/ubi.h    |  1 +\n+ 2 files changed, 23 insertions(+), 3 deletions(-)\n+\n+--- a/drivers/mtd/ubi/attach.c\n++++ b/drivers/mtd/ubi/attach.c\n+@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id)\n+ #endif\n+ }\n+ \n++static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech)\n++{\n++\treturn ech->padding1[0] == 'E' &&\n++\t       ech->padding1[1] == 'O' &&\n++\t       ech->padding1[2] == 'F';\n++}\n++\n+ /**\n+  * scan_peb - scan and process UBI headers of a PEB.\n+  * @ubi: UBI device description object\n+@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u\n+ \t\treturn 0;\n+ \t}\n+ \n+-\terr = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);\n+-\tif (err < 0)\n+-\t\treturn err;\n++\tif (!ai->eof_found) {\n++\t\terr = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);\n++\t\tif (err < 0)\n++\t\t\treturn err;\n++\n++\t\tif (ec_hdr_has_eof(ech)) {\n++\t\t\tpr_notice(\"UBI: EOF marker found, PEBs from %d will be erased\\n\",\n++\t\t\t\tpnum);\n++\t\t\tai->eof_found = true;\n++\t\t}\n++\t}\n++\n++\tif (ai->eof_found)\n++\t\terr = UBI_IO_FF_BITFLIPS;\n++\n+ \tswitch (err) {\n+ \tcase 0:\n+ \t\tbreak;\n+--- a/drivers/mtd/ubi/ubi.h\n++++ b/drivers/mtd/ubi/ubi.h\n+@@ -780,6 +780,7 @@ struct ubi_attach_info {\n+ \tint mean_ec;\n+ \tuint64_t ec_sum;\n+ \tint ec_count;\n++\tbool eof_found;\n+ \tstruct kmem_cache *aeb_slab_cache;\n+ \tstruct ubi_ec_hdr *ech;\n+ \tstruct ubi_vid_io_buf *vidb;\ndiff --git a/target/linux/generic/pending-5.14/495-mtd-core-add-get_mtd_device_by_node.patch b/target/linux/generic/pending-5.14/495-mtd-core-add-get_mtd_device_by_node.patch\nnew file mode 100644\nindex 0000000000..9ef0874407\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/495-mtd-core-add-get_mtd_device_by_node.patch\n@@ -0,0 +1,75 @@\n+From 1bd1b740f208d1cf4071932cc51860d37266c402 Mon Sep 17 00:00:00 2001\n+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+Date: Sat, 1 Sep 2018 00:30:11 +0200\n+Subject: [PATCH 495/497] mtd: core: add get_mtd_device_by_node\n+\n+Add function to retrieve a mtd device by its OF node. Since drivers can\n+assign arbitrary names to mtd devices in the absence of a label\n+property, there is no other reliable way to retrieve a mtd device for a\n+given OF node.\n+\n+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>\n+---\n+ drivers/mtd/mtdcore.c   | 38 ++++++++++++++++++++++++++++++++++++++\n+ include/linux/mtd/mtd.h |  2 ++\n+ 2 files changed, 40 insertions(+)\n+\n+--- a/drivers/mtd/mtdcore.c\n++++ b/drivers/mtd/mtdcore.c\n+@@ -1199,6 +1199,44 @@ out_unlock:\n+ }\n+ EXPORT_SYMBOL_GPL(get_mtd_device_nm);\n+ \n++/**\n++ *\tget_mtd_device_by_node - obtain a validated handle for an MTD device\n++ *\tby of_node\n++ *\t@of_node: OF node of MTD device to open\n++ *\n++ *\tThis function returns MTD device description structure in case of\n++ *\tsuccess and an error code in case of failure.\n++ */\n++struct mtd_info *get_mtd_device_by_node(const struct device_node *of_node)\n++{\n++\tint err = -ENODEV;\n++\tstruct mtd_info *mtd = NULL, *other;\n++\n++\tmutex_lock(&mtd_table_mutex);\n++\n++\tmtd_for_each_device(other) {\n++\t\tif (of_node == other->dev.of_node) {\n++\t\t\tmtd = other;\n++\t\t\tbreak;\n++\t\t}\n++\t}\n++\n++\tif (!mtd)\n++\t\tgoto out_unlock;\n++\n++\terr = __get_mtd_device(mtd);\n++\tif (err)\n++\t\tgoto out_unlock;\n++\n++\tmutex_unlock(&mtd_table_mutex);\n++\treturn mtd;\n++\n++out_unlock:\n++\tmutex_unlock(&mtd_table_mutex);\n++\treturn ERR_PTR(err);\n++}\n++EXPORT_SYMBOL_GPL(get_mtd_device_by_node);\n++\n+ void put_mtd_device(struct mtd_info *mtd)\n+ {\n+ \tmutex_lock(&mtd_table_mutex);\n+--- a/include/linux/mtd/mtd.h\n++++ b/include/linux/mtd/mtd.h\n+@@ -703,6 +703,8 @@ extern struct mtd_info *get_mtd_device(s\n+ extern int __get_mtd_device(struct mtd_info *mtd);\n+ extern void __put_mtd_device(struct mtd_info *mtd);\n+ extern struct mtd_info *get_mtd_device_nm(const char *name);\n++extern struct mtd_info *get_mtd_device_by_node(\n++\t\tconst struct device_node *of_node);\n+ extern void put_mtd_device(struct mtd_info *mtd);\n+ \n+ static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd)\ndiff --git a/target/linux/generic/pending-5.14/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch b/target/linux/generic/pending-5.14/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch\nnew file mode 100644\nindex 0000000000..01f3b9ec2d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch\n@@ -0,0 +1,52 @@\n+From 5734c6669fba7ddb5ef491ccff7159d15dba0b59 Mon Sep 17 00:00:00 2001\n+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+Date: Wed, 5 Sep 2018 01:32:51 +0200\n+Subject: [PATCH 496/497] dt-bindings: add bindings for mtd-concat devices\n+\n+Document virtual mtd-concat device bindings.\n+\n+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+---\n+ .../devicetree/bindings/mtd/mtd-concat.txt    | 36 +++++++++++++++++++\n+ 1 file changed, 36 insertions(+)\n+ create mode 100644 Documentation/devicetree/bindings/mtd/mtd-concat.txt\n+\n+--- /dev/null\n++++ b/Documentation/devicetree/bindings/mtd/mtd-concat.txt\n+@@ -0,0 +1,36 @@\n++Virtual MTD concat device\n++\n++Requires properties:\n++- devices: list of phandles to mtd nodes that should be concatenated\n++\n++Example:\n++\n++&spi {\n++\tflash0: flash@0 {\n++\t\t...\n++\t};\n++\tflash1: flash@1 {\n++\t\t...\n++\t};\n++};\n++\n++flash {\n++\tcompatible = \"mtd-concat\";\n++\n++\tdevices = <&flash0 &flash1>;\n++\n++\tpartitions {\n++\t\tcompatible = \"fixed-partitions\";\n++\n++\t\tpartition@0 {\n++\t\t\tlabel = \"boot\";\n++\t\t\treg = <0x0000000 0x0040000>;\n++\t\t\tread-only;\n++\t\t};\n++\n++\t\tpartition@40000 {\n++\t\t\tlabel = \"firmware\";\n++\t\t\treg = <0x0040000 0x1fc0000>;\n++\t\t};\n++\t}\n++}\ndiff --git a/target/linux/generic/pending-5.14/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-5.14/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch\nnew file mode 100644\nindex 0000000000..3f23622830\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch\n@@ -0,0 +1,216 @@\n+From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001\n+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+Date: Sat, 25 Aug 2018 12:35:22 +0200\n+Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices\n+\n+Some mtd drivers like physmap variants have support for concatenating\n+multiple mtd devices, but there is no generic way to define such a\n+concat device from within the device tree.\n+\n+This is useful for some SoC boards that use multiple flash chips as\n+memory banks of a single mtd device, with partitions spanning chip\n+borders.\n+\n+This commit adds a driver for creating virtual mtd-concat devices. They\n+must have a compatible = \"mtd-concat\" line, and define a list of devices\n+to concat in the 'devices' property, for example:\n+\n+flash {\n+  compatible = \"mtd-concat\";\n+\n+  devices = <&flash0 &flash1>;\n+\n+  partitions {\n+    ...\n+  };\n+};\n+\n+The driver is added to the very end of the mtd Makefile to increase the\n+likelyhood of all child devices already being loaded at the time of\n+probing, preventing unnecessary deferred probes.\n+\n+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>\n+---\n+ drivers/mtd/Kconfig                 |   2 +\n+ drivers/mtd/Makefile                |   3 +\n+ drivers/mtd/composite/Kconfig       |  12 +++\n+ drivers/mtd/composite/Makefile      |   6 ++\n+ drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++\n+ 5 files changed, 151 insertions(+)\n+ create mode 100644 drivers/mtd/composite/Kconfig\n+ create mode 100644 drivers/mtd/composite/Makefile\n+ create mode 100644 drivers/mtd/composite/virt_concat.c\n+\n+--- a/drivers/mtd/Kconfig\n++++ b/drivers/mtd/Kconfig\n+@@ -239,4 +239,6 @@ source \"drivers/mtd/ubi/Kconfig\"\n+ \n+ source \"drivers/mtd/hyperbus/Kconfig\"\n+ \n++source \"drivers/mtd/composite/Kconfig\"\n++\n+ endif # MTD\n+--- a/drivers/mtd/Makefile\n++++ b/drivers/mtd/Makefile\n+@@ -33,3 +33,6 @@ obj-y\t\t+= chips/ lpddr/ maps/ devices/ n\n+ obj-$(CONFIG_MTD_SPI_NOR)\t+= spi-nor/\n+ obj-$(CONFIG_MTD_UBI)\t\t+= ubi/\n+ obj-$(CONFIG_MTD_HYPERBUS)\t+= hyperbus/\n++\n++# Composite drivers must be loaded last\n++obj-y\t\t\t\t+= composite/\n+--- /dev/null\n++++ b/drivers/mtd/composite/Kconfig\n+@@ -0,0 +1,12 @@\n++menu \"Composite MTD device drivers\"\n++\tdepends on MTD!=n\n++\n++config MTD_VIRT_CONCAT\n++\ttristate \"Virtual concat MTD device\"\n++\thelp\n++\t  This driver allows creation of a virtual MTD concat device, which\n++\t  concatenates multiple underlying MTD devices to a single device.\n++\t  This is required by some SoC boards where multiple memory banks are\n++\t  used as one device with partitions spanning across device boundaries.\n++\n++endmenu\n+--- /dev/null\n++++ b/drivers/mtd/composite/Makefile\n+@@ -0,0 +1,6 @@\n++# SPDX-License-Identifier: GPL-2.0\n++#\n++# linux/drivers/mtd/composite/Makefile\n++#\n++\n++obj-$(CONFIG_MTD_VIRT_CONCAT)   += virt_concat.o\n+--- /dev/null\n++++ b/drivers/mtd/composite/virt_concat.c\n+@@ -0,0 +1,128 @@\n++// SPDX-License-Identifier: GPL-2.0+\n++/*\n++ * Virtual concat MTD device driver\n++ *\n++ * Copyright (C) 2018 Bernhard Frauendienst\n++ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de\n++ */\n++\n++#include <linux/module.h>\n++#include <linux/device.h>\n++#include <linux/mtd/concat.h>\n++#include <linux/mtd/mtd.h>\n++#include <linux/mtd/partitions.h>\n++#include <linux/of.h>\n++#include <linux/of_platform.h>\n++#include <linux/slab.h>\n++\n++/*\n++ * struct of_virt_concat - platform device driver data.\n++ * @cmtd the final mtd_concat device\n++ * @num_devices the number of devices in @devices\n++ * @devices points to an array of devices already loaded\n++ */\n++struct of_virt_concat {\n++\tstruct mtd_info\t*cmtd;\n++\tint num_devices;\n++\tstruct mtd_info\t**devices;\n++};\n++\n++static int virt_concat_remove(struct platform_device *pdev)\n++{\n++\tstruct of_virt_concat *info;\n++\tint i;\n++\n++\tinfo = platform_get_drvdata(pdev);\n++\tif (!info)\n++\t\treturn 0;\n++\n++\t// unset data for when this is called after a probe error\n++\tplatform_set_drvdata(pdev, NULL);\n++\n++\tif (info->cmtd) {\n++\t\tmtd_device_unregister(info->cmtd);\n++\t\tmtd_concat_destroy(info->cmtd);\n++\t}\n++\n++\tif (info->devices) {\n++\t\tfor (i = 0; i < info->num_devices; i++)\n++\t\t\tput_mtd_device(info->devices[i]);\n++\t}\n++\n++\treturn 0;\n++}\n++\n++static int virt_concat_probe(struct platform_device *pdev)\n++{\n++\tstruct device_node *node = pdev->dev.of_node;\n++\tstruct of_phandle_iterator it;\n++\tstruct of_virt_concat *info;\n++\tstruct mtd_info *mtd;\n++\tint err = 0, count;\n++\n++\tcount = of_count_phandle_with_args(node, \"devices\", NULL);\n++\tif (count <= 0)\n++\t\treturn -EINVAL;\n++\n++\tinfo = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);\n++\tif (!info)\n++\t\treturn -ENOMEM;\n++\tinfo->devices = devm_kcalloc(&pdev->dev, count,\n++\t\t\t\t     sizeof(*(info->devices)), GFP_KERNEL);\n++\tif (!info->devices) {\n++\t\terr = -ENOMEM;\n++\t\tgoto err_remove;\n++\t}\n++\n++\tplatform_set_drvdata(pdev, info);\n++\n++\tof_for_each_phandle(&it, err, node, \"devices\", NULL, 0) {\n++\t\tmtd = get_mtd_device_by_node(it.node);\n++\t\tif (IS_ERR(mtd)) {\n++\t\t\tof_node_put(it.node);\n++\t\t\terr = -EPROBE_DEFER;\n++\t\t\tgoto err_remove;\n++\t\t}\n++\n++\t\tinfo->devices[info->num_devices++] = mtd;\n++\t}\n++\n++\tinfo->cmtd = mtd_concat_create(info->devices, info->num_devices,\n++\t\t\t\t       dev_name(&pdev->dev));\n++\tif (!info->cmtd) {\n++\t\terr = -ENXIO;\n++\t\tgoto err_remove;\n++\t}\n++\n++\tinfo->cmtd->dev.parent = &pdev->dev;\n++\tmtd_set_of_node(info->cmtd, node);\n++\tmtd_device_register(info->cmtd, NULL, 0);\n++\n++\treturn 0;\n++\n++err_remove:\n++\tvirt_concat_remove(pdev);\n++\n++\treturn err;\n++}\n++\n++static const struct of_device_id virt_concat_of_match[] = {\n++\t{ .compatible = \"mtd-concat\", },\n++\t{ /* sentinel */ }\n++};\n++MODULE_DEVICE_TABLE(of, virt_concat_of_match);\n++\n++static struct platform_driver virt_concat_driver = {\n++\t.probe = virt_concat_probe,\n++\t.remove = virt_concat_remove,\n++\t.driver\t = {\n++\t\t.name   = \"virt-mtdconcat\",\n++\t\t.of_match_table = virt_concat_of_match,\n++\t},\n++};\n++\n++module_platform_driver(virt_concat_driver);\n++\n++MODULE_LICENSE(\"GPL v2\");\n++MODULE_AUTHOR(\"Bernhard Frauendienst <kernel@nospam.obeliks.de>\");\n++MODULE_DESCRIPTION(\"Virtual concat MTD device driver\");\ndiff --git a/target/linux/generic/pending-5.14/498-mtd-mtdconcat-select-readwrite-function.patch b/target/linux/generic/pending-5.14/498-mtd-mtdconcat-select-readwrite-function.patch\nnew file mode 100644\nindex 0000000000..9e55e37161\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/498-mtd-mtdconcat-select-readwrite-function.patch\n@@ -0,0 +1,14 @@\n+--- a/drivers/mtd/mtdconcat.c\n++++ b/drivers/mtd/mtdconcat.c\n+@@ -686,8 +686,12 @@ struct mtd_info *mtd_concat_create(struc\n+ \t\tconcat->mtd._writev = concat_writev;\n+ \tif (subdev_master->_read_oob)\n+ \t\tconcat->mtd._read_oob = concat_read_oob;\n++\telse\n++\t\tconcat->mtd._read = concat_read;\n+ \tif (subdev_master->_write_oob)\n+ \t\tconcat->mtd._write_oob = concat_write_oob;\n++\telse\n++\t\tconcat->mtd._write = concat_write;\n+ \tif (subdev_master->_block_isbad)\n+ \t\tconcat->mtd._block_isbad = concat_block_isbad;\ndiff --git a/target/linux/generic/pending-5.14/500-fs_cdrom_dependencies.patch b/target/linux/generic/pending-5.14/500-fs_cdrom_dependencies.patch\nnew file mode 100644\nindex 0000000000..0a5a3aae5d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/500-fs_cdrom_dependencies.patch\n@@ -0,0 +1,40 @@\n+--- a/fs/hfs/Kconfig\n++++ b/fs/hfs/Kconfig\n+@@ -2,6 +2,7 @@\n+ config HFS_FS\n+ \ttristate \"Apple Macintosh file system support\"\n+ \tdepends on BLOCK\n++\tselect CDROM\n+ \tselect NLS\n+ \thelp\n+ \t  If you say Y here, you will be able to mount Macintosh-formatted\n+--- a/fs/hfsplus/Kconfig\n++++ b/fs/hfsplus/Kconfig\n+@@ -2,6 +2,7 @@\n+ config HFSPLUS_FS\n+ \ttristate \"Apple Extended HFS file system support\"\n+ \tdepends on BLOCK\n++\tselect CDROM\n+ \tselect NLS\n+ \tselect NLS_UTF8\n+ \thelp\n+--- a/fs/isofs/Kconfig\n++++ b/fs/isofs/Kconfig\n+@@ -1,6 +1,7 @@\n+ # SPDX-License-Identifier: GPL-2.0-only\n+ config ISO9660_FS\n+ \ttristate \"ISO 9660 CDROM file system support\"\n++\tselect CDROM\n+ \thelp\n+ \t  This is the standard file system used on CD-ROMs.  It was previously\n+ \t  known as \"High Sierra File System\" and is called \"hsfs\" on other\n+--- a/fs/udf/Kconfig\n++++ b/fs/udf/Kconfig\n+@@ -1,6 +1,7 @@\n+ # SPDX-License-Identifier: GPL-2.0-only\n+ config UDF_FS\n+ \ttristate \"UDF file system support\"\n++\tselect CDROM\n+ \tselect CRC_ITU_T\n+ \tselect NLS\n+ \thelp\ndiff --git a/target/linux/generic/pending-5.14/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-5.14/530-jffs2_make_lzma_available.patch\nnew file mode 100644\nindex 0000000000..cf2ab71d5d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/530-jffs2_make_lzma_available.patch\n@@ -0,0 +1,5180 @@\n+From: Alexandros C. Couloumbis <alex@ozo.com>\n+Subject: fs: add jffs2/lzma support (not activated by default yet)\n+\n+lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2\n+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>\n+---\n+ fs/jffs2/Kconfig             |    9 +\n+ fs/jffs2/Makefile            |    3 +\n+ fs/jffs2/compr.c             |    6 +\n+ fs/jffs2/compr.h             |   10 +-\n+ fs/jffs2/compr_lzma.c        |  128 +++\n+ fs/jffs2/super.c             |   33 +-\n+ include/linux/lzma.h         |   62 ++\n+ include/linux/lzma/LzFind.h  |  115 +++\n+ include/linux/lzma/LzHash.h  |   54 +\n+ include/linux/lzma/LzmaDec.h |  231 +++++\n+ include/linux/lzma/LzmaEnc.h |   80 ++\n+ include/linux/lzma/Types.h   |  226 +++++\n+ include/uapi/linux/jffs2.h   |    1 +\n+ lib/Kconfig                  |    6 +\n+ lib/Makefile                 |   12 +\n+ lib/lzma/LzFind.c            |  761 ++++++++++++++\n+ lib/lzma/LzmaDec.c           |  999 +++++++++++++++++++\n+ lib/lzma/LzmaEnc.c           | 2271 ++++++++++++++++++++++++++++++++++++++++++\n+ lib/lzma/Makefile            |    7 +\n+ 19 files changed, 5008 insertions(+), 6 deletions(-)\n+ create mode 100644 fs/jffs2/compr_lzma.c\n+ create mode 100644 include/linux/lzma.h\n+ create mode 100644 include/linux/lzma/LzFind.h\n+ create mode 100644 include/linux/lzma/LzHash.h\n+ create mode 100644 include/linux/lzma/LzmaDec.h\n+ create mode 100644 include/linux/lzma/LzmaEnc.h\n+ create mode 100644 include/linux/lzma/Types.h\n+ create mode 100644 lib/lzma/LzFind.c\n+ create mode 100644 lib/lzma/LzmaDec.c\n+ create mode 100644 lib/lzma/LzmaEnc.c\n+ create mode 100644 lib/lzma/Makefile\n+\n+--- a/fs/jffs2/Kconfig\n++++ b/fs/jffs2/Kconfig\n+@@ -136,6 +136,15 @@ config JFFS2_LZO\n+ \t  This feature was added in July, 2007. Say 'N' if you need\n+ \t  compatibility with older bootloaders or kernels.\n+ \n++config JFFS2_LZMA\n++\tbool \"JFFS2 LZMA compression support\" if JFFS2_COMPRESSION_OPTIONS\n++\tselect LZMA_COMPRESS\n++\tselect LZMA_DECOMPRESS\n++\tdepends on JFFS2_FS\n++\tdefault n\n++\thelp\n++\t  JFFS2 wrapper to the LZMA C SDK\n++\n+ config JFFS2_RTIME\n+ \tbool \"JFFS2 RTIME compression support\" if JFFS2_COMPRESSION_OPTIONS\n+ \tdepends on JFFS2_FS\n+--- a/fs/jffs2/Makefile\n++++ b/fs/jffs2/Makefile\n+@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN)\t+= compr_rub\n+ jffs2-$(CONFIG_JFFS2_RTIME)\t+= compr_rtime.o\n+ jffs2-$(CONFIG_JFFS2_ZLIB)\t+= compr_zlib.o\n+ jffs2-$(CONFIG_JFFS2_LZO)\t+= compr_lzo.o\n++jffs2-$(CONFIG_JFFS2_LZMA)\t+= compr_lzma.o\n+ jffs2-$(CONFIG_JFFS2_SUMMARY)   += summary.o\n++\n++CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma\n+--- a/fs/jffs2/compr.c\n++++ b/fs/jffs2/compr.c\n+@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void)\n+ #ifdef CONFIG_JFFS2_LZO\n+ \tjffs2_lzo_init();\n+ #endif\n++#ifdef CONFIG_JFFS2_LZMA\n++\tjffs2_lzma_init();\n++#endif\n+ /* Setting default compression mode */\n+ #ifdef CONFIG_JFFS2_CMODE_NONE\n+ \tjffs2_compression_mode = JFFS2_COMPR_MODE_NONE;\n+@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void)\n+ int jffs2_compressors_exit(void)\n+ {\n+ /* Unregistering compressors */\n++#ifdef CONFIG_JFFS2_LZMA\n++\tjffs2_lzma_exit();\n++#endif\n+ #ifdef CONFIG_JFFS2_LZO\n+ \tjffs2_lzo_exit();\n+ #endif\n+--- a/fs/jffs2/compr.h\n++++ b/fs/jffs2/compr.h\n+@@ -29,9 +29,9 @@\n+ #define JFFS2_DYNRUBIN_PRIORITY  20\n+ #define JFFS2_LZARI_PRIORITY     30\n+ #define JFFS2_RTIME_PRIORITY     50\n+-#define JFFS2_ZLIB_PRIORITY      60\n+-#define JFFS2_LZO_PRIORITY       80\n+-\n++#define JFFS2_LZMA_PRIORITY      70\n++#define JFFS2_ZLIB_PRIORITY      80\n++#define JFFS2_LZO_PRIORITY       90\n+ \n+ #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */\n+ #define JFFS2_DYNRUBIN_DISABLED  /*\t   for decompression */\n+@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void);\n+ int jffs2_lzo_init(void);\n+ void jffs2_lzo_exit(void);\n+ #endif\n++#ifdef CONFIG_JFFS2_LZMA\n++int jffs2_lzma_init(void);\n++void jffs2_lzma_exit(void);\n++#endif\n+ \n+ #endif /* __JFFS2_COMPR_H__ */\n+--- /dev/null\n++++ b/fs/jffs2/compr_lzma.c\n+@@ -0,0 +1,128 @@\n++/*\n++ * JFFS2 -- Journalling Flash File System, Version 2.\n++ *\n++ * For licensing information, see the file 'LICENCE' in this directory.\n++ *\n++ * JFFS2 wrapper to the LZMA C SDK\n++ *\n++ */\n++\n++#include <linux/lzma.h>\n++#include \"compr.h\"\n++\n++#ifdef __KERNEL__\n++\tstatic DEFINE_MUTEX(deflate_mutex);\n++#endif\n++\n++CLzmaEncHandle *p;\n++Byte propsEncoded[LZMA_PROPS_SIZE];\n++SizeT propsSize = sizeof(propsEncoded);\n++\n++STATIC void lzma_free_workspace(void)\n++{\n++\tLzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc);\n++}\n++\n++STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props)\n++{\n++\tif ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL)\n++\t{\n++\t\tPRINT_ERROR(\"Failed to allocate lzma deflate workspace\\n\");\n++\t\treturn -ENOMEM;\n++\t}\n++\n++\tif (LzmaEnc_SetProps(p, props) != SZ_OK)\n++\t{\n++\t\tlzma_free_workspace();\n++\t\treturn -1;\n++\t}\n++\n++\tif (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK)\n++\t{\n++\t\tlzma_free_workspace();\n++\t\treturn -1;\n++\t}\n++\n++\treturn 0;\n++}\n++\n++STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out,\n++\t\t\t      uint32_t *sourcelen, uint32_t *dstlen)\n++{\n++\tSizeT compress_size = (SizeT)(*dstlen);\n++\tint ret;\n++\n++\t#ifdef __KERNEL__\n++\t\tmutex_lock(&deflate_mutex);\n++\t#endif\n++\n++\tret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen,\n++\t\t0, NULL, &lzma_alloc, &lzma_alloc);\n++\n++\t#ifdef __KERNEL__\n++\t\tmutex_unlock(&deflate_mutex);\n++\t#endif\n++\n++\tif (ret != SZ_OK)\n++\t\treturn -1;\n++\n++\t*dstlen = (uint32_t)compress_size;\n++\n++\treturn 0;\n++}\n++\n++STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out,\n++\t\t\t\t uint32_t srclen, uint32_t destlen)\n++{\n++\tint ret;\n++\tSizeT dl = (SizeT)destlen;\n++\tSizeT sl = (SizeT)srclen;\n++\tELzmaStatus status;\n++\n++\tret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded,\n++\t\tpropsSize, LZMA_FINISH_ANY, &status, &lzma_alloc);\n++\n++\tif (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen)\n++\t\treturn -1;\n++\n++\treturn 0;\n++}\n++\n++static struct jffs2_compressor jffs2_lzma_comp = {\n++\t.priority = JFFS2_LZMA_PRIORITY,\n++\t.name = \"lzma\",\n++\t.compr = JFFS2_COMPR_LZMA,\n++\t.compress = &jffs2_lzma_compress,\n++\t.decompress = &jffs2_lzma_decompress,\n++\t.disabled = 0,\n++};\n++\n++int INIT jffs2_lzma_init(void)\n++{\n++\tint ret;\n++\tCLzmaEncProps props;\n++\tLzmaEncProps_Init(&props);\n++\n++\tprops.dictSize = LZMA_BEST_DICT(0x2000);\n++\tprops.level = LZMA_BEST_LEVEL;\n++\tprops.lc = LZMA_BEST_LC;\n++\tprops.lp = LZMA_BEST_LP;\n++\tprops.pb = LZMA_BEST_PB;\n++\tprops.fb = LZMA_BEST_FB;\n++\n++\tret = lzma_alloc_workspace(&props);\n++\tif (ret < 0)\n++\t\treturn ret;\n++\n++\tret = jffs2_register_compressor(&jffs2_lzma_comp);\n++\tif (ret)\n++\t\tlzma_free_workspace();\n++\n++\treturn ret;\n++}\n++\n++void jffs2_lzma_exit(void)\n++{\n++\tjffs2_unregister_compressor(&jffs2_lzma_comp);\n++\tlzma_free_workspace();\n++}\n+--- a/fs/jffs2/super.c\n++++ b/fs/jffs2/super.c\n+@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void)\n+ \tBUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68);\n+ \tBUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32);\n+ \n+-\tpr_info(\"version 2.2.\"\n++\tpr_info(\"version 2.2\"\n+ #ifdef CONFIG_JFFS2_FS_WRITEBUFFER\n+ \t       \" (NAND)\"\n+ #endif\n+ #ifdef CONFIG_JFFS2_SUMMARY\n+-\t       \" (SUMMARY) \"\n++\t       \" (SUMMARY)\"\n+ #endif\n+-\t       \" © 2001-2006 Red Hat, Inc.\\n\");\n++#ifdef CONFIG_JFFS2_ZLIB\n++\t       \" (ZLIB)\"\n++#endif\n++#ifdef CONFIG_JFFS2_LZO\n++\t       \" (LZO)\"\n++#endif\n++#ifdef CONFIG_JFFS2_LZMA\n++\t       \" (LZMA)\"\n++#endif\n++#ifdef CONFIG_JFFS2_RTIME\n++\t       \" (RTIME)\"\n++#endif\n++#ifdef CONFIG_JFFS2_RUBIN\n++\t       \" (RUBIN)\"\n++#endif\n++#ifdef  CONFIG_JFFS2_CMODE_NONE\n++\t       \" (CMODE_NONE)\"\n++#endif\n++#ifdef CONFIG_JFFS2_CMODE_PRIORITY\n++\t       \" (CMODE_PRIORITY)\"\n++#endif\n++#ifdef CONFIG_JFFS2_CMODE_SIZE\n++\t       \" (CMODE_SIZE)\"\n++#endif\n++#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO\n++\t       \" (CMODE_FAVOURLZO)\"\n++#endif\n++\t       \" (c) 2001-2006 Red Hat, Inc.\\n\");\n+ \n+ \tjffs2_inode_cachep = kmem_cache_create(\"jffs2_i\",\n+ \t\t\t\t\t     sizeof(struct jffs2_inode_info),\n+--- /dev/null\n++++ b/include/linux/lzma.h\n+@@ -0,0 +1,62 @@\n++#ifndef __LZMA_H__\n++#define __LZMA_H__\n++\n++#ifdef __KERNEL__\n++\t#include <linux/kernel.h>\n++\t#include <linux/sched.h>\n++\t#include <linux/slab.h>\n++\t#include <linux/vmalloc.h>\n++\t#include <linux/init.h>\n++\t#define LZMA_MALLOC vmalloc\n++\t#define LZMA_FREE vfree\n++\t#define PRINT_ERROR(msg) printk(KERN_WARNING #msg)\n++\t#define INIT __init\n++\t#define STATIC static\n++#else\n++\t#include <stdint.h>\n++\t#include <stdlib.h>\n++\t#include <stdio.h>\n++\t#include <unistd.h>\n++\t#include <string.h>\n++\t#include <asm/types.h>\n++\t#include <errno.h>\n++\t#include <linux/jffs2.h>\n++\t#ifndef PAGE_SIZE\n++\t\textern int page_size;\n++\t\t#define PAGE_SIZE page_size\n++\t#endif\n++\t#define LZMA_MALLOC malloc\n++\t#define LZMA_FREE free\n++\t#define PRINT_ERROR(msg) fprintf(stderr, msg)\n++\t#define INIT\n++\t#define STATIC\n++#endif\n++\n++#include \"lzma/LzmaDec.h\"\n++#include \"lzma/LzmaEnc.h\"\n++\n++#define LZMA_BEST_LEVEL (9)\n++#define LZMA_BEST_LC    (0)\n++#define LZMA_BEST_LP    (0)\n++#define LZMA_BEST_PB    (0)\n++#define LZMA_BEST_FB  (273)\n++\n++#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2)\n++\n++static void *p_lzma_malloc(void *p, size_t size)\n++{\n++\tif (size == 0)\n++\t\treturn NULL;\n++\n++\treturn LZMA_MALLOC(size);\n++}\n++\n++static void p_lzma_free(void *p, void *address)\n++{\n++\tif (address != NULL)\n++\t\tLZMA_FREE(address);\n++}\n++\n++static ISzAlloc lzma_alloc = {p_lzma_malloc, p_lzma_free};\n++\n++#endif\n+--- /dev/null\n++++ b/include/linux/lzma/LzFind.h\n+@@ -0,0 +1,115 @@\n++/* LzFind.h -- Match finder for LZ algorithms\n++2009-04-22 : Igor Pavlov : Public domain */\n++\n++#ifndef __LZ_FIND_H\n++#define __LZ_FIND_H\n++\n++#include \"Types.h\"\n++\n++#ifdef __cplusplus\n++extern \"C\" {\n++#endif\n++\n++typedef UInt32 CLzRef;\n++\n++typedef struct _CMatchFinder\n++{\n++  Byte *buffer;\n++  UInt32 pos;\n++  UInt32 posLimit;\n++  UInt32 streamPos;\n++  UInt32 lenLimit;\n++\n++  UInt32 cyclicBufferPos;\n++  UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */\n++\n++  UInt32 matchMaxLen;\n++  CLzRef *hash;\n++  CLzRef *son;\n++  UInt32 hashMask;\n++  UInt32 cutValue;\n++\n++  Byte *bufferBase;\n++  ISeqInStream *stream;\n++  int streamEndWasReached;\n++\n++  UInt32 blockSize;\n++  UInt32 keepSizeBefore;\n++  UInt32 keepSizeAfter;\n++\n++  UInt32 numHashBytes;\n++  int directInput;\n++  size_t directInputRem;\n++  int btMode;\n++  int bigHash;\n++  UInt32 historySize;\n++  UInt32 fixedHashSize;\n++  UInt32 hashSizeSum;\n++  UInt32 numSons;\n++  SRes result;\n++  UInt32 crc[256];\n++} CMatchFinder;\n++\n++#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)\n++#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])\n++\n++#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)\n++\n++int MatchFinder_NeedMove(CMatchFinder *p);\n++Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);\n++void MatchFinder_MoveBlock(CMatchFinder *p);\n++void MatchFinder_ReadIfRequired(CMatchFinder *p);\n++\n++void MatchFinder_Construct(CMatchFinder *p);\n++\n++/* Conditions:\n++     historySize <= 3 GB\n++     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB\n++*/\n++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,\n++    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,\n++    ISzAlloc *alloc);\n++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);\n++void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);\n++void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);\n++\n++UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,\n++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,\n++    UInt32 *distances, UInt32 maxLen);\n++\n++/*\n++Conditions:\n++  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.\n++  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function\n++*/\n++\n++typedef void (*Mf_Init_Func)(void *object);\n++typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);\n++typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);\n++typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);\n++typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);\n++typedef void (*Mf_Skip_Func)(void *object, UInt32);\n++\n++typedef struct _IMatchFinder\n++{\n++  Mf_Init_Func Init;\n++  Mf_GetIndexByte_Func GetIndexByte;\n++  Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;\n++  Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;\n++  Mf_GetMatches_Func GetMatches;\n++  Mf_Skip_Func Skip;\n++} IMatchFinder;\n++\n++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);\n++\n++void MatchFinder_Init(CMatchFinder *p);\n++UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\n++UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);\n++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\n++void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);\n++\n++#ifdef __cplusplus\n++}\n++#endif\n++\n++#endif\n+--- /dev/null\n++++ b/include/linux/lzma/LzHash.h\n+@@ -0,0 +1,54 @@\n++/* LzHash.h -- HASH functions for LZ algorithms\n++2009-02-07 : Igor Pavlov : Public domain */\n++\n++#ifndef __LZ_HASH_H\n++#define __LZ_HASH_H\n++\n++#define kHash2Size (1 << 10)\n++#define kHash3Size (1 << 16)\n++#define kHash4Size (1 << 20)\n++\n++#define kFix3HashSize (kHash2Size)\n++#define kFix4HashSize (kHash2Size + kHash3Size)\n++#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)\n++\n++#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);\n++\n++#define HASH3_CALC { \\\n++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n++  hash2Value = temp & (kHash2Size - 1); \\\n++  hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }\n++\n++#define HASH4_CALC { \\\n++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n++  hash2Value = temp & (kHash2Size - 1); \\\n++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n++  hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }\n++\n++#define HASH5_CALC { \\\n++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n++  hash2Value = temp & (kHash2Size - 1); \\\n++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n++  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \\\n++  hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \\\n++  hash4Value &= (kHash4Size - 1); }\n++\n++/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */\n++#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;\n++\n++\n++#define MT_HASH2_CALC \\\n++  hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);\n++\n++#define MT_HASH3_CALC { \\\n++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n++  hash2Value = temp & (kHash2Size - 1); \\\n++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }\n++\n++#define MT_HASH4_CALC { \\\n++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \\\n++  hash2Value = temp & (kHash2Size - 1); \\\n++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \\\n++  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }\n++\n++#endif\n+--- /dev/null\n++++ b/include/linux/lzma/LzmaDec.h\n+@@ -0,0 +1,231 @@\n++/* LzmaDec.h -- LZMA Decoder\n++2009-02-07 : Igor Pavlov : Public domain */\n++\n++#ifndef __LZMA_DEC_H\n++#define __LZMA_DEC_H\n++\n++#include \"Types.h\"\n++\n++#ifdef __cplusplus\n++extern \"C\" {\n++#endif\n++\n++/* #define _LZMA_PROB32 */\n++/* _LZMA_PROB32 can increase the speed on some CPUs,\n++   but memory usage for CLzmaDec::probs will be doubled in that case */\n++\n++#ifdef _LZMA_PROB32\n++#define CLzmaProb UInt32\n++#else\n++#define CLzmaProb UInt16\n++#endif\n++\n++\n++/* ---------- LZMA Properties ---------- */\n++\n++#define LZMA_PROPS_SIZE 5\n++\n++typedef struct _CLzmaProps\n++{\n++  unsigned lc, lp, pb;\n++  UInt32 dicSize;\n++} CLzmaProps;\n++\n++/* LzmaProps_Decode - decodes properties\n++Returns:\n++  SZ_OK\n++  SZ_ERROR_UNSUPPORTED - Unsupported properties\n++*/\n++\n++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);\n++\n++\n++/* ---------- LZMA Decoder state ---------- */\n++\n++/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.\n++   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */\n++\n++#define LZMA_REQUIRED_INPUT_MAX 20\n++\n++typedef struct\n++{\n++  CLzmaProps prop;\n++  CLzmaProb *probs;\n++  Byte *dic;\n++  const Byte *buf;\n++  UInt32 range, code;\n++  SizeT dicPos;\n++  SizeT dicBufSize;\n++  UInt32 processedPos;\n++  UInt32 checkDicSize;\n++  unsigned state;\n++  UInt32 reps[4];\n++  unsigned remainLen;\n++  int needFlush;\n++  int needInitState;\n++  UInt32 numProbs;\n++  unsigned tempBufSize;\n++  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];\n++} CLzmaDec;\n++\n++#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }\n++\n++void LzmaDec_Init(CLzmaDec *p);\n++\n++/* There are two types of LZMA streams:\n++     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.\n++     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */\n++\n++typedef enum\n++{\n++  LZMA_FINISH_ANY,   /* finish at any point */\n++  LZMA_FINISH_END    /* block must be finished at the end */\n++} ELzmaFinishMode;\n++\n++/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!\n++\n++   You must use LZMA_FINISH_END, when you know that current output buffer\n++   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.\n++\n++   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,\n++   and output value of destLen will be less than output buffer size limit.\n++   You can check status result also.\n++\n++   You can use multiple checks to test data integrity after full decompression:\n++     1) Check Result and \"status\" variable.\n++     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.\n++     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.\n++        You must use correct finish mode in that case. */\n++\n++typedef enum\n++{\n++  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */\n++  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */\n++  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */\n++  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */\n++  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */\n++} ELzmaStatus;\n++\n++/* ELzmaStatus is used only as output value for function call */\n++\n++\n++/* ---------- Interfaces ---------- */\n++\n++/* There are 3 levels of interfaces:\n++     1) Dictionary Interface\n++     2) Buffer Interface\n++     3) One Call Interface\n++   You can select any of these interfaces, but don't mix functions from different\n++   groups for same object. */\n++\n++\n++/* There are two variants to allocate state for Dictionary Interface:\n++     1) LzmaDec_Allocate / LzmaDec_Free\n++     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs\n++   You can use variant 2, if you set dictionary buffer manually.\n++   For Buffer Interface you must always use variant 1.\n++\n++LzmaDec_Allocate* can return:\n++  SZ_OK\n++  SZ_ERROR_MEM         - Memory allocation error\n++  SZ_ERROR_UNSUPPORTED - Unsupported properties\n++*/\n++\n++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);\n++void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);\n++\n++SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);\n++void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);\n++\n++/* ---------- Dictionary Interface ---------- */\n++\n++/* You can use it, if you want to eliminate the overhead for data copying from\n++   dictionary to some other external buffer.\n++   You must work with CLzmaDec variables directly in this interface.\n++\n++   STEPS:\n++     LzmaDec_Constr()\n++     LzmaDec_Allocate()\n++     for (each new stream)\n++     {\n++       LzmaDec_Init()\n++       while (it needs more decompression)\n++       {\n++         LzmaDec_DecodeToDic()\n++         use data from CLzmaDec::dic and update CLzmaDec::dicPos\n++       }\n++     }\n++     LzmaDec_Free()\n++*/\n++\n++/* LzmaDec_DecodeToDic\n++\n++   The decoding to internal dictionary buffer (CLzmaDec::dic).\n++   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!\n++\n++finishMode:\n++  It has meaning only if the decoding reaches output limit (dicLimit).\n++  LZMA_FINISH_ANY - Decode just dicLimit bytes.\n++  LZMA_FINISH_END - Stream must be finished after dicLimit.\n++\n++Returns:\n++  SZ_OK\n++    status:\n++      LZMA_STATUS_FINISHED_WITH_MARK\n++      LZMA_STATUS_NOT_FINISHED\n++      LZMA_STATUS_NEEDS_MORE_INPUT\n++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n++  SZ_ERROR_DATA - Data error\n++*/\n++\n++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,\n++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n++\n++\n++/* ---------- Buffer Interface ---------- */\n++\n++/* It's zlib-like interface.\n++   See LzmaDec_DecodeToDic description for information about STEPS and return results,\n++   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need\n++   to work with CLzmaDec variables manually.\n++\n++finishMode:\n++  It has meaning only if the decoding reaches output limit (*destLen).\n++  LZMA_FINISH_ANY - Decode just destLen bytes.\n++  LZMA_FINISH_END - Stream must be finished after (*destLen).\n++*/\n++\n++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,\n++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);\n++\n++\n++/* ---------- One Call Interface ---------- */\n++\n++/* LzmaDecode\n++\n++finishMode:\n++  It has meaning only if the decoding reaches output limit (*destLen).\n++  LZMA_FINISH_ANY - Decode just destLen bytes.\n++  LZMA_FINISH_END - Stream must be finished after (*destLen).\n++\n++Returns:\n++  SZ_OK\n++    status:\n++      LZMA_STATUS_FINISHED_WITH_MARK\n++      LZMA_STATUS_NOT_FINISHED\n++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK\n++  SZ_ERROR_DATA - Data error\n++  SZ_ERROR_MEM  - Memory allocation error\n++  SZ_ERROR_UNSUPPORTED - Unsupported properties\n++  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).\n++*/\n++\n++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n++    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n++    ELzmaStatus *status, ISzAlloc *alloc);\n++\n++#ifdef __cplusplus\n++}\n++#endif\n++\n++#endif\n+--- /dev/null\n++++ b/include/linux/lzma/LzmaEnc.h\n+@@ -0,0 +1,80 @@\n++/*  LzmaEnc.h -- LZMA Encoder\n++2009-02-07 : Igor Pavlov : Public domain */\n++\n++#ifndef __LZMA_ENC_H\n++#define __LZMA_ENC_H\n++\n++#include \"Types.h\"\n++\n++#ifdef __cplusplus\n++extern \"C\" {\n++#endif\n++\n++#define LZMA_PROPS_SIZE 5\n++\n++typedef struct _CLzmaEncProps\n++{\n++  int level;       /*  0 <= level <= 9 */\n++  UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version\n++                      (1 << 12) <= dictSize <= (1 << 30) for 64-bit version\n++                       default = (1 << 24) */\n++  int lc;          /* 0 <= lc <= 8, default = 3 */\n++  int lp;          /* 0 <= lp <= 4, default = 0 */\n++  int pb;          /* 0 <= pb <= 4, default = 2 */\n++  int algo;        /* 0 - fast, 1 - normal, default = 1 */\n++  int fb;          /* 5 <= fb <= 273, default = 32 */\n++  int btMode;      /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */\n++  int numHashBytes; /* 2, 3 or 4, default = 4 */\n++  UInt32 mc;        /* 1 <= mc <= (1 << 30), default = 32 */\n++  unsigned writeEndMark;  /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */\n++  int numThreads;  /* 1 or 2, default = 2 */\n++} CLzmaEncProps;\n++\n++void LzmaEncProps_Init(CLzmaEncProps *p);\n++void LzmaEncProps_Normalize(CLzmaEncProps *p);\n++UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);\n++\n++\n++/* ---------- CLzmaEncHandle Interface ---------- */\n++\n++/* LzmaEnc_* functions can return the following exit codes:\n++Returns:\n++  SZ_OK           - OK\n++  SZ_ERROR_MEM    - Memory allocation error\n++  SZ_ERROR_PARAM  - Incorrect paramater in props\n++  SZ_ERROR_WRITE  - Write callback error.\n++  SZ_ERROR_PROGRESS - some break from progress callback\n++  SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)\n++*/\n++\n++typedef void * CLzmaEncHandle;\n++\n++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);\n++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);\n++SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);\n++SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);\n++SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,\n++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n++SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n++    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n++\n++/* ---------- One Call Interface ---------- */\n++\n++/* LzmaEncode\n++Return code:\n++  SZ_OK               - OK\n++  SZ_ERROR_MEM        - Memory allocation error\n++  SZ_ERROR_PARAM      - Incorrect paramater\n++  SZ_ERROR_OUTPUT_EOF - output buffer overflow\n++  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)\n++*/\n++\n++SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n++    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);\n++\n++#ifdef __cplusplus\n++}\n++#endif\n++\n++#endif\n+--- /dev/null\n++++ b/include/linux/lzma/Types.h\n+@@ -0,0 +1,226 @@\n++/* Types.h -- Basic types\n++2009-11-23 : Igor Pavlov : Public domain */\n++\n++#ifndef __7Z_TYPES_H\n++#define __7Z_TYPES_H\n++\n++#include <stddef.h>\n++\n++#ifdef _WIN32\n++#include <windows.h>\n++#endif\n++\n++#ifndef EXTERN_C_BEGIN\n++#ifdef __cplusplus\n++#define EXTERN_C_BEGIN extern \"C\" {\n++#define EXTERN_C_END }\n++#else\n++#define EXTERN_C_BEGIN\n++#define EXTERN_C_END\n++#endif\n++#endif\n++\n++EXTERN_C_BEGIN\n++\n++#define SZ_OK 0\n++\n++#define SZ_ERROR_DATA 1\n++#define SZ_ERROR_MEM 2\n++#define SZ_ERROR_CRC 3\n++#define SZ_ERROR_UNSUPPORTED 4\n++#define SZ_ERROR_PARAM 5\n++#define SZ_ERROR_INPUT_EOF 6\n++#define SZ_ERROR_OUTPUT_EOF 7\n++#define SZ_ERROR_READ 8\n++#define SZ_ERROR_WRITE 9\n++#define SZ_ERROR_PROGRESS 10\n++#define SZ_ERROR_FAIL 11\n++#define SZ_ERROR_THREAD 12\n++\n++#define SZ_ERROR_ARCHIVE 16\n++#define SZ_ERROR_NO_ARCHIVE 17\n++\n++typedef int SRes;\n++\n++#ifdef _WIN32\n++typedef DWORD WRes;\n++#else\n++typedef int WRes;\n++#endif\n++\n++#ifndef RINOK\n++#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }\n++#endif\n++\n++typedef unsigned char Byte;\n++typedef short Int16;\n++typedef unsigned short UInt16;\n++\n++#ifdef _LZMA_UINT32_IS_ULONG\n++typedef long Int32;\n++typedef unsigned long UInt32;\n++#else\n++typedef int Int32;\n++typedef unsigned int UInt32;\n++#endif\n++\n++#ifdef _SZ_NO_INT_64\n++\n++/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.\n++   NOTES: Some code will work incorrectly in that case! */\n++\n++typedef long Int64;\n++typedef unsigned long UInt64;\n++\n++#else\n++\n++#if defined(_MSC_VER) || defined(__BORLANDC__)\n++typedef __int64 Int64;\n++typedef unsigned __int64 UInt64;\n++#else\n++typedef long long int Int64;\n++typedef unsigned long long int UInt64;\n++#endif\n++\n++#endif\n++\n++#ifdef _LZMA_NO_SYSTEM_SIZE_T\n++typedef UInt32 SizeT;\n++#else\n++typedef size_t SizeT;\n++#endif\n++\n++typedef int Bool;\n++#define True 1\n++#define False 0\n++\n++\n++#ifdef _WIN32\n++#define MY_STD_CALL __stdcall\n++#else\n++#define MY_STD_CALL\n++#endif\n++\n++#ifdef _MSC_VER\n++\n++#if _MSC_VER >= 1300\n++#define MY_NO_INLINE __declspec(noinline)\n++#else\n++#define MY_NO_INLINE\n++#endif\n++\n++#define MY_CDECL __cdecl\n++#define MY_FAST_CALL __fastcall\n++\n++#else\n++\n++#define MY_CDECL\n++#define MY_FAST_CALL\n++\n++#endif\n++\n++\n++/* The following interfaces use first parameter as pointer to structure */\n++\n++typedef struct\n++{\n++  SRes (*Read)(void *p, void *buf, size_t *size);\n++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n++       (output(*size) < input(*size)) is allowed */\n++} ISeqInStream;\n++\n++/* it can return SZ_ERROR_INPUT_EOF */\n++SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);\n++SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);\n++SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);\n++\n++typedef struct\n++{\n++  size_t (*Write)(void *p, const void *buf, size_t size);\n++    /* Returns: result - the number of actually written bytes.\n++       (result < size) means error */\n++} ISeqOutStream;\n++\n++typedef enum\n++{\n++  SZ_SEEK_SET = 0,\n++  SZ_SEEK_CUR = 1,\n++  SZ_SEEK_END = 2\n++} ESzSeek;\n++\n++typedef struct\n++{\n++  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */\n++  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n++} ISeekInStream;\n++\n++typedef struct\n++{\n++  SRes (*Look)(void *p, void **buf, size_t *size);\n++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.\n++       (output(*size) > input(*size)) is not allowed\n++       (output(*size) < input(*size)) is allowed */\n++  SRes (*Skip)(void *p, size_t offset);\n++    /* offset must be <= output(*size) of Look */\n++\n++  SRes (*Read)(void *p, void *buf, size_t *size);\n++    /* reads directly (without buffer). It's same as ISeqInStream::Read */\n++  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);\n++} ILookInStream;\n++\n++SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);\n++SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);\n++\n++/* reads via ILookInStream::Read */\n++SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);\n++SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);\n++\n++#define LookToRead_BUF_SIZE (1 << 14)\n++\n++typedef struct\n++{\n++  ILookInStream s;\n++  ISeekInStream *realStream;\n++  size_t pos;\n++  size_t size;\n++  Byte buf[LookToRead_BUF_SIZE];\n++} CLookToRead;\n++\n++void LookToRead_CreateVTable(CLookToRead *p, int lookahead);\n++void LookToRead_Init(CLookToRead *p);\n++\n++typedef struct\n++{\n++  ISeqInStream s;\n++  ILookInStream *realStream;\n++} CSecToLook;\n++\n++void SecToLook_CreateVTable(CSecToLook *p);\n++\n++typedef struct\n++{\n++  ISeqInStream s;\n++  ILookInStream *realStream;\n++} CSecToRead;\n++\n++void SecToRead_CreateVTable(CSecToRead *p);\n++\n++typedef struct\n++{\n++  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);\n++    /* Returns: result. (result != SZ_OK) means break.\n++       Value (UInt64)(Int64)-1 for size means unknown value. */\n++} ICompressProgress;\n++\n++typedef struct\n++{\n++  void *(*Alloc)(void *p, size_t size);\n++  void (*Free)(void *p, void *address); /* address can be 0 */\n++} ISzAlloc;\n++\n++#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)\n++#define IAlloc_Free(p, a) (p)->Free((p), a)\n++\n++EXTERN_C_END\n++\n++#endif\n+--- a/include/uapi/linux/jffs2.h\n++++ b/include/uapi/linux/jffs2.h\n+@@ -46,6 +46,7 @@\n+ #define JFFS2_COMPR_DYNRUBIN\t0x05\n+ #define JFFS2_COMPR_ZLIB\t0x06\n+ #define JFFS2_COMPR_LZO\t\t0x07\n++#define JFFS2_COMPR_LZMA\t0x08\n+ /* Compatibility flags. */\n+ #define JFFS2_COMPAT_MASK 0xc000      /* What do to if an unknown nodetype is found */\n+ #define JFFS2_NODE_ACCURATE 0x2000\n+--- a/lib/Kconfig\n++++ b/lib/Kconfig\n+@@ -330,6 +330,12 @@ config ZSTD_DECOMPRESS\n+ \n+ source \"lib/xz/Kconfig\"\n+ \n++config LZMA_COMPRESS\n++    tristate\n++\n++config LZMA_DECOMPRESS\n++    tristate\n++\n+ #\n+ # These all provide a common interface (hence the apparent duplication with\n+ # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)\n+--- a/lib/Makefile\n++++ b/lib/Makefile\n+@@ -135,6 +135,16 @@ CFLAGS_kobject.o += -DDEBUG\n+ CFLAGS_kobject_uevent.o += -DDEBUG\n+ endif\n+ \n++ifdef CONFIG_JFFS2_ZLIB\n++  CONFIG_ZLIB_INFLATE:=y\n++  CONFIG_ZLIB_DEFLATE:=y\n++endif\n++\n++ifdef CONFIG_JFFS2_LZMA\n++  CONFIG_LZMA_DECOMPRESS:=y\n++  CONFIG_LZMA_COMPRESS:=y\n++endif\n++\n+ obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o\n+ CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any)\n+ \n+@@ -192,6 +202,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/\n+ obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/\n+ obj-$(CONFIG_XZ_DEC) += xz/\n+ obj-$(CONFIG_RAID6_PQ) += raid6/\n++obj-$(CONFIG_LZMA_COMPRESS) += lzma/\n++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/\n+ \n+ lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o\n+ lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o\n+--- /dev/null\n++++ b/lib/lzma/LzFind.c\n+@@ -0,0 +1,761 @@\n++/* LzFind.c -- Match finder for LZ algorithms\n++2009-04-22 : Igor Pavlov : Public domain */\n++\n++#include <string.h>\n++\n++#include \"LzFind.h\"\n++#include \"LzHash.h\"\n++\n++#define kEmptyHashValue 0\n++#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)\n++#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */\n++#define kNormalizeMask (~(kNormalizeStepMin - 1))\n++#define kMaxHistorySize ((UInt32)3 << 30)\n++\n++#define kStartMaxLen 3\n++\n++static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)\n++{\n++  if (!p->directInput)\n++  {\n++    alloc->Free(alloc, p->bufferBase);\n++    p->bufferBase = 0;\n++  }\n++}\n++\n++/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */\n++\n++static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)\n++{\n++  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;\n++  if (p->directInput)\n++  {\n++    p->blockSize = blockSize;\n++    return 1;\n++  }\n++  if (p->bufferBase == 0 || p->blockSize != blockSize)\n++  {\n++    LzInWindow_Free(p, alloc);\n++    p->blockSize = blockSize;\n++    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);\n++  }\n++  return (p->bufferBase != 0);\n++}\n++\n++Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }\n++Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }\n++\n++UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }\n++\n++void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)\n++{\n++  p->posLimit -= subValue;\n++  p->pos -= subValue;\n++  p->streamPos -= subValue;\n++}\n++\n++static void MatchFinder_ReadBlock(CMatchFinder *p)\n++{\n++  if (p->streamEndWasReached || p->result != SZ_OK)\n++    return;\n++  if (p->directInput)\n++  {\n++    UInt32 curSize = 0xFFFFFFFF - p->streamPos;\n++    if (curSize > p->directInputRem)\n++      curSize = (UInt32)p->directInputRem;\n++    p->directInputRem -= curSize;\n++    p->streamPos += curSize;\n++    if (p->directInputRem == 0)\n++      p->streamEndWasReached = 1;\n++    return;\n++  }\n++  for (;;)\n++  {\n++    Byte *dest = p->buffer + (p->streamPos - p->pos);\n++    size_t size = (p->bufferBase + p->blockSize - dest);\n++    if (size == 0)\n++      return;\n++    p->result = p->stream->Read(p->stream, dest, &size);\n++    if (p->result != SZ_OK)\n++      return;\n++    if (size == 0)\n++    {\n++      p->streamEndWasReached = 1;\n++      return;\n++    }\n++    p->streamPos += (UInt32)size;\n++    if (p->streamPos - p->pos > p->keepSizeAfter)\n++      return;\n++  }\n++}\n++\n++void MatchFinder_MoveBlock(CMatchFinder *p)\n++{\n++  memmove(p->bufferBase,\n++    p->buffer - p->keepSizeBefore,\n++    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));\n++  p->buffer = p->bufferBase + p->keepSizeBefore;\n++}\n++\n++int MatchFinder_NeedMove(CMatchFinder *p)\n++{\n++  if (p->directInput)\n++    return 0;\n++  /* if (p->streamEndWasReached) return 0; */\n++  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);\n++}\n++\n++void MatchFinder_ReadIfRequired(CMatchFinder *p)\n++{\n++  if (p->streamEndWasReached)\n++    return;\n++  if (p->keepSizeAfter >= p->streamPos - p->pos)\n++    MatchFinder_ReadBlock(p);\n++}\n++\n++static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)\n++{\n++  if (MatchFinder_NeedMove(p))\n++    MatchFinder_MoveBlock(p);\n++  MatchFinder_ReadBlock(p);\n++}\n++\n++static void MatchFinder_SetDefaultSettings(CMatchFinder *p)\n++{\n++  p->cutValue = 32;\n++  p->btMode = 1;\n++  p->numHashBytes = 4;\n++  p->bigHash = 0;\n++}\n++\n++#define kCrcPoly 0xEDB88320\n++\n++void MatchFinder_Construct(CMatchFinder *p)\n++{\n++  UInt32 i;\n++  p->bufferBase = 0;\n++  p->directInput = 0;\n++  p->hash = 0;\n++  MatchFinder_SetDefaultSettings(p);\n++\n++  for (i = 0; i < 256; i++)\n++  {\n++    UInt32 r = i;\n++    int j;\n++    for (j = 0; j < 8; j++)\n++      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\n++    p->crc[i] = r;\n++  }\n++}\n++\n++static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)\n++{\n++  alloc->Free(alloc, p->hash);\n++  p->hash = 0;\n++}\n++\n++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)\n++{\n++  MatchFinder_FreeThisClassMemory(p, alloc);\n++  LzInWindow_Free(p, alloc);\n++}\n++\n++static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)\n++{\n++  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);\n++  if (sizeInBytes / sizeof(CLzRef) != num)\n++    return 0;\n++  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);\n++}\n++\n++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,\n++    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,\n++    ISzAlloc *alloc)\n++{\n++  UInt32 sizeReserv;\n++  if (historySize > kMaxHistorySize)\n++  {\n++    MatchFinder_Free(p, alloc);\n++    return 0;\n++  }\n++  sizeReserv = historySize >> 1;\n++  if (historySize > ((UInt32)2 << 30))\n++    sizeReserv = historySize >> 2;\n++  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);\n++\n++  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;\n++  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;\n++  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */\n++  if (LzInWindow_Create(p, sizeReserv, alloc))\n++  {\n++    UInt32 newCyclicBufferSize = historySize + 1;\n++    UInt32 hs;\n++    p->matchMaxLen = matchMaxLen;\n++    {\n++      p->fixedHashSize = 0;\n++      if (p->numHashBytes == 2)\n++        hs = (1 << 16) - 1;\n++      else\n++      {\n++        hs = historySize - 1;\n++        hs |= (hs >> 1);\n++        hs |= (hs >> 2);\n++        hs |= (hs >> 4);\n++        hs |= (hs >> 8);\n++        hs >>= 1;\n++        hs |= 0xFFFF; /* don't change it! It's required for Deflate */\n++        if (hs > (1 << 24))\n++        {\n++          if (p->numHashBytes == 3)\n++            hs = (1 << 24) - 1;\n++          else\n++            hs >>= 1;\n++        }\n++      }\n++      p->hashMask = hs;\n++      hs++;\n++      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;\n++      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;\n++      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;\n++      hs += p->fixedHashSize;\n++    }\n++\n++    {\n++      UInt32 prevSize = p->hashSizeSum + p->numSons;\n++      UInt32 newSize;\n++      p->historySize = historySize;\n++      p->hashSizeSum = hs;\n++      p->cyclicBufferSize = newCyclicBufferSize;\n++      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);\n++      newSize = p->hashSizeSum + p->numSons;\n++      if (p->hash != 0 && prevSize == newSize)\n++        return 1;\n++      MatchFinder_FreeThisClassMemory(p, alloc);\n++      p->hash = AllocRefs(newSize, alloc);\n++      if (p->hash != 0)\n++      {\n++        p->son = p->hash + p->hashSizeSum;\n++        return 1;\n++      }\n++    }\n++  }\n++  MatchFinder_Free(p, alloc);\n++  return 0;\n++}\n++\n++static void MatchFinder_SetLimits(CMatchFinder *p)\n++{\n++  UInt32 limit = kMaxValForNormalize - p->pos;\n++  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;\n++  if (limit2 < limit)\n++    limit = limit2;\n++  limit2 = p->streamPos - p->pos;\n++  if (limit2 <= p->keepSizeAfter)\n++  {\n++    if (limit2 > 0)\n++      limit2 = 1;\n++  }\n++  else\n++    limit2 -= p->keepSizeAfter;\n++  if (limit2 < limit)\n++    limit = limit2;\n++  {\n++    UInt32 lenLimit = p->streamPos - p->pos;\n++    if (lenLimit > p->matchMaxLen)\n++      lenLimit = p->matchMaxLen;\n++    p->lenLimit = lenLimit;\n++  }\n++  p->posLimit = p->pos + limit;\n++}\n++\n++void MatchFinder_Init(CMatchFinder *p)\n++{\n++  UInt32 i;\n++  for (i = 0; i < p->hashSizeSum; i++)\n++    p->hash[i] = kEmptyHashValue;\n++  p->cyclicBufferPos = 0;\n++  p->buffer = p->bufferBase;\n++  p->pos = p->streamPos = p->cyclicBufferSize;\n++  p->result = SZ_OK;\n++  p->streamEndWasReached = 0;\n++  MatchFinder_ReadBlock(p);\n++  MatchFinder_SetLimits(p);\n++}\n++\n++static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)\n++{\n++  return (p->pos - p->historySize - 1) & kNormalizeMask;\n++}\n++\n++void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)\n++{\n++  UInt32 i;\n++  for (i = 0; i < numItems; i++)\n++  {\n++    UInt32 value = items[i];\n++    if (value <= subValue)\n++      value = kEmptyHashValue;\n++    else\n++      value -= subValue;\n++    items[i] = value;\n++  }\n++}\n++\n++static void MatchFinder_Normalize(CMatchFinder *p)\n++{\n++  UInt32 subValue = MatchFinder_GetSubValue(p);\n++  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);\n++  MatchFinder_ReduceOffsets(p, subValue);\n++}\n++\n++static void MatchFinder_CheckLimits(CMatchFinder *p)\n++{\n++  if (p->pos == kMaxValForNormalize)\n++    MatchFinder_Normalize(p);\n++  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)\n++    MatchFinder_CheckAndMoveAndRead(p);\n++  if (p->cyclicBufferPos == p->cyclicBufferSize)\n++    p->cyclicBufferPos = 0;\n++  MatchFinder_SetLimits(p);\n++}\n++\n++static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n++    UInt32 *distances, UInt32 maxLen)\n++{\n++  son[_cyclicBufferPos] = curMatch;\n++  for (;;)\n++  {\n++    UInt32 delta = pos - curMatch;\n++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n++      return distances;\n++    {\n++      const Byte *pb = cur - delta;\n++      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];\n++      if (pb[maxLen] == cur[maxLen] && *pb == *cur)\n++      {\n++        UInt32 len = 0;\n++        while (++len != lenLimit)\n++          if (pb[len] != cur[len])\n++            break;\n++        if (maxLen < len)\n++        {\n++          *distances++ = maxLen = len;\n++          *distances++ = delta - 1;\n++          if (len == lenLimit)\n++            return distances;\n++        }\n++      }\n++    }\n++  }\n++}\n++\n++UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,\n++    UInt32 *distances, UInt32 maxLen)\n++{\n++  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;\n++  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);\n++  UInt32 len0 = 0, len1 = 0;\n++  for (;;)\n++  {\n++    UInt32 delta = pos - curMatch;\n++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n++    {\n++      *ptr0 = *ptr1 = kEmptyHashValue;\n++      return distances;\n++    }\n++    {\n++      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);\n++      const Byte *pb = cur - delta;\n++      UInt32 len = (len0 < len1 ? len0 : len1);\n++      if (pb[len] == cur[len])\n++      {\n++        if (++len != lenLimit && pb[len] == cur[len])\n++          while (++len != lenLimit)\n++            if (pb[len] != cur[len])\n++              break;\n++        if (maxLen < len)\n++        {\n++          *distances++ = maxLen = len;\n++          *distances++ = delta - 1;\n++          if (len == lenLimit)\n++          {\n++            *ptr1 = pair[0];\n++            *ptr0 = pair[1];\n++            return distances;\n++          }\n++        }\n++      }\n++      if (pb[len] < cur[len])\n++      {\n++        *ptr1 = curMatch;\n++        ptr1 = pair + 1;\n++        curMatch = *ptr1;\n++        len1 = len;\n++      }\n++      else\n++      {\n++        *ptr0 = curMatch;\n++        ptr0 = pair;\n++        curMatch = *ptr0;\n++        len0 = len;\n++      }\n++    }\n++  }\n++}\n++\n++static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,\n++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)\n++{\n++  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;\n++  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);\n++  UInt32 len0 = 0, len1 = 0;\n++  for (;;)\n++  {\n++    UInt32 delta = pos - curMatch;\n++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)\n++    {\n++      *ptr0 = *ptr1 = kEmptyHashValue;\n++      return;\n++    }\n++    {\n++      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);\n++      const Byte *pb = cur - delta;\n++      UInt32 len = (len0 < len1 ? len0 : len1);\n++      if (pb[len] == cur[len])\n++      {\n++        while (++len != lenLimit)\n++          if (pb[len] != cur[len])\n++            break;\n++        {\n++          if (len == lenLimit)\n++          {\n++            *ptr1 = pair[0];\n++            *ptr0 = pair[1];\n++            return;\n++          }\n++        }\n++      }\n++      if (pb[len] < cur[len])\n++      {\n++        *ptr1 = curMatch;\n++        ptr1 = pair + 1;\n++        curMatch = *ptr1;\n++        len1 = len;\n++      }\n++      else\n++      {\n++        *ptr0 = curMatch;\n++        ptr0 = pair;\n++        curMatch = *ptr0;\n++        len0 = len;\n++      }\n++    }\n++  }\n++}\n++\n++#define MOVE_POS \\\n++  ++p->cyclicBufferPos; \\\n++  p->buffer++; \\\n++  if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);\n++\n++#define MOVE_POS_RET MOVE_POS return offset;\n++\n++static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }\n++\n++#define GET_MATCHES_HEADER2(minLen, ret_op) \\\n++  UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \\\n++  lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \\\n++  cur = p->buffer;\n++\n++#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)\n++#define SKIP_HEADER(minLen)        GET_MATCHES_HEADER2(minLen, continue)\n++\n++#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue\n++\n++#define GET_MATCHES_FOOTER(offset, maxLen) \\\n++  offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \\\n++  distances + offset, maxLen) - distances); MOVE_POS_RET;\n++\n++#define SKIP_FOOTER \\\n++  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;\n++\n++static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 offset;\n++  GET_MATCHES_HEADER(2)\n++  HASH2_CALC;\n++  curMatch = p->hash[hashValue];\n++  p->hash[hashValue] = p->pos;\n++  offset = 0;\n++  GET_MATCHES_FOOTER(offset, 1)\n++}\n++\n++UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 offset;\n++  GET_MATCHES_HEADER(3)\n++  HASH_ZIP_CALC;\n++  curMatch = p->hash[hashValue];\n++  p->hash[hashValue] = p->pos;\n++  offset = 0;\n++  GET_MATCHES_FOOTER(offset, 2)\n++}\n++\n++static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 hash2Value, delta2, maxLen, offset;\n++  GET_MATCHES_HEADER(3)\n++\n++  HASH3_CALC;\n++\n++  delta2 = p->pos - p->hash[hash2Value];\n++  curMatch = p->hash[kFix3HashSize + hashValue];\n++\n++  p->hash[hash2Value] =\n++  p->hash[kFix3HashSize + hashValue] = p->pos;\n++\n++\n++  maxLen = 2;\n++  offset = 0;\n++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n++  {\n++    for (; maxLen != lenLimit; maxLen++)\n++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n++        break;\n++    distances[0] = maxLen;\n++    distances[1] = delta2 - 1;\n++    offset = 2;\n++    if (maxLen == lenLimit)\n++    {\n++      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));\n++      MOVE_POS_RET;\n++    }\n++  }\n++  GET_MATCHES_FOOTER(offset, maxLen)\n++}\n++\n++static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;\n++  GET_MATCHES_HEADER(4)\n++\n++  HASH4_CALC;\n++\n++  delta2 = p->pos - p->hash[                hash2Value];\n++  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];\n++  curMatch = p->hash[kFix4HashSize + hashValue];\n++\n++  p->hash[                hash2Value] =\n++  p->hash[kFix3HashSize + hash3Value] =\n++  p->hash[kFix4HashSize + hashValue] = p->pos;\n++\n++  maxLen = 1;\n++  offset = 0;\n++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n++  {\n++    distances[0] = maxLen = 2;\n++    distances[1] = delta2 - 1;\n++    offset = 2;\n++  }\n++  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)\n++  {\n++    maxLen = 3;\n++    distances[offset + 1] = delta3 - 1;\n++    offset += 2;\n++    delta2 = delta3;\n++  }\n++  if (offset != 0)\n++  {\n++    for (; maxLen != lenLimit; maxLen++)\n++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n++        break;\n++    distances[offset - 2] = maxLen;\n++    if (maxLen == lenLimit)\n++    {\n++      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));\n++      MOVE_POS_RET;\n++    }\n++  }\n++  if (maxLen < 3)\n++    maxLen = 3;\n++  GET_MATCHES_FOOTER(offset, maxLen)\n++}\n++\n++static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;\n++  GET_MATCHES_HEADER(4)\n++\n++  HASH4_CALC;\n++\n++  delta2 = p->pos - p->hash[                hash2Value];\n++  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];\n++  curMatch = p->hash[kFix4HashSize + hashValue];\n++\n++  p->hash[                hash2Value] =\n++  p->hash[kFix3HashSize + hash3Value] =\n++  p->hash[kFix4HashSize + hashValue] = p->pos;\n++\n++  maxLen = 1;\n++  offset = 0;\n++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)\n++  {\n++    distances[0] = maxLen = 2;\n++    distances[1] = delta2 - 1;\n++    offset = 2;\n++  }\n++  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)\n++  {\n++    maxLen = 3;\n++    distances[offset + 1] = delta3 - 1;\n++    offset += 2;\n++    delta2 = delta3;\n++  }\n++  if (offset != 0)\n++  {\n++    for (; maxLen != lenLimit; maxLen++)\n++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])\n++        break;\n++    distances[offset - 2] = maxLen;\n++    if (maxLen == lenLimit)\n++    {\n++      p->son[p->cyclicBufferPos] = curMatch;\n++      MOVE_POS_RET;\n++    }\n++  }\n++  if (maxLen < 3)\n++    maxLen = 3;\n++  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n++    distances + offset, maxLen) - (distances));\n++  MOVE_POS_RET\n++}\n++\n++UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)\n++{\n++  UInt32 offset;\n++  GET_MATCHES_HEADER(3)\n++  HASH_ZIP_CALC;\n++  curMatch = p->hash[hashValue];\n++  p->hash[hashValue] = p->pos;\n++  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),\n++    distances, 2) - (distances));\n++  MOVE_POS_RET\n++}\n++\n++static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    SKIP_HEADER(2)\n++    HASH2_CALC;\n++    curMatch = p->hash[hashValue];\n++    p->hash[hashValue] = p->pos;\n++    SKIP_FOOTER\n++  }\n++  while (--num != 0);\n++}\n++\n++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    SKIP_HEADER(3)\n++    HASH_ZIP_CALC;\n++    curMatch = p->hash[hashValue];\n++    p->hash[hashValue] = p->pos;\n++    SKIP_FOOTER\n++  }\n++  while (--num != 0);\n++}\n++\n++static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    UInt32 hash2Value;\n++    SKIP_HEADER(3)\n++    HASH3_CALC;\n++    curMatch = p->hash[kFix3HashSize + hashValue];\n++    p->hash[hash2Value] =\n++    p->hash[kFix3HashSize + hashValue] = p->pos;\n++    SKIP_FOOTER\n++  }\n++  while (--num != 0);\n++}\n++\n++static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    UInt32 hash2Value, hash3Value;\n++    SKIP_HEADER(4)\n++    HASH4_CALC;\n++    curMatch = p->hash[kFix4HashSize + hashValue];\n++    p->hash[                hash2Value] =\n++    p->hash[kFix3HashSize + hash3Value] = p->pos;\n++    p->hash[kFix4HashSize + hashValue] = p->pos;\n++    SKIP_FOOTER\n++  }\n++  while (--num != 0);\n++}\n++\n++static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    UInt32 hash2Value, hash3Value;\n++    SKIP_HEADER(4)\n++    HASH4_CALC;\n++    curMatch = p->hash[kFix4HashSize + hashValue];\n++    p->hash[                hash2Value] =\n++    p->hash[kFix3HashSize + hash3Value] =\n++    p->hash[kFix4HashSize + hashValue] = p->pos;\n++    p->son[p->cyclicBufferPos] = curMatch;\n++    MOVE_POS\n++  }\n++  while (--num != 0);\n++}\n++\n++void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)\n++{\n++  do\n++  {\n++    SKIP_HEADER(3)\n++    HASH_ZIP_CALC;\n++    curMatch = p->hash[hashValue];\n++    p->hash[hashValue] = p->pos;\n++    p->son[p->cyclicBufferPos] = curMatch;\n++    MOVE_POS\n++  }\n++  while (--num != 0);\n++}\n++\n++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)\n++{\n++  vTable->Init = (Mf_Init_Func)MatchFinder_Init;\n++  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;\n++  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;\n++  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;\n++  if (!p->btMode)\n++  {\n++    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;\n++    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;\n++  }\n++  else if (p->numHashBytes == 2)\n++  {\n++    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;\n++    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;\n++  }\n++  else if (p->numHashBytes == 3)\n++  {\n++    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;\n++    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;\n++  }\n++  else\n++  {\n++    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;\n++    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;\n++  }\n++}\n+--- /dev/null\n++++ b/lib/lzma/LzmaDec.c\n+@@ -0,0 +1,999 @@\n++/* LzmaDec.c -- LZMA Decoder\n++2009-09-20 : Igor Pavlov : Public domain */\n++\n++#include \"LzmaDec.h\"\n++\n++#include <string.h>\n++\n++#define kNumTopBits 24\n++#define kTopValue ((UInt32)1 << kNumTopBits)\n++\n++#define kNumBitModelTotalBits 11\n++#define kBitModelTotal (1 << kNumBitModelTotalBits)\n++#define kNumMoveBits 5\n++\n++#define RC_INIT_SIZE 5\n++\n++#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }\n++\n++#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n++#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));\n++#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));\n++#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \\\n++  { UPDATE_0(p); i = (i + i); A0; } else \\\n++  { UPDATE_1(p); i = (i + i) + 1; A1; }\n++#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)\n++\n++#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }\n++#define TREE_DECODE(probs, limit, i) \\\n++  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }\n++\n++/* #define _LZMA_SIZE_OPT */\n++\n++#ifdef _LZMA_SIZE_OPT\n++#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)\n++#else\n++#define TREE_6_DECODE(probs, i) \\\n++  { i = 1; \\\n++  TREE_GET_BIT(probs, i); \\\n++  TREE_GET_BIT(probs, i); \\\n++  TREE_GET_BIT(probs, i); \\\n++  TREE_GET_BIT(probs, i); \\\n++  TREE_GET_BIT(probs, i); \\\n++  TREE_GET_BIT(probs, i); \\\n++  i -= 0x40; }\n++#endif\n++\n++#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }\n++\n++#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)\n++#define UPDATE_0_CHECK range = bound;\n++#define UPDATE_1_CHECK range -= bound; code -= bound;\n++#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \\\n++  { UPDATE_0_CHECK; i = (i + i); A0; } else \\\n++  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }\n++#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)\n++#define TREE_DECODE_CHECK(probs, limit, i) \\\n++  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }\n++\n++\n++#define kNumPosBitsMax 4\n++#define kNumPosStatesMax (1 << kNumPosBitsMax)\n++\n++#define kLenNumLowBits 3\n++#define kLenNumLowSymbols (1 << kLenNumLowBits)\n++#define kLenNumMidBits 3\n++#define kLenNumMidSymbols (1 << kLenNumMidBits)\n++#define kLenNumHighBits 8\n++#define kLenNumHighSymbols (1 << kLenNumHighBits)\n++\n++#define LenChoice 0\n++#define LenChoice2 (LenChoice + 1)\n++#define LenLow (LenChoice2 + 1)\n++#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))\n++#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))\n++#define kNumLenProbs (LenHigh + kLenNumHighSymbols)\n++\n++\n++#define kNumStates 12\n++#define kNumLitStates 7\n++\n++#define kStartPosModelIndex 4\n++#define kEndPosModelIndex 14\n++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))\n++\n++#define kNumPosSlotBits 6\n++#define kNumLenToPosStates 4\n++\n++#define kNumAlignBits 4\n++#define kAlignTableSize (1 << kNumAlignBits)\n++\n++#define kMatchMinLen 2\n++#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n++\n++#define IsMatch 0\n++#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))\n++#define IsRepG0 (IsRep + kNumStates)\n++#define IsRepG1 (IsRepG0 + kNumStates)\n++#define IsRepG2 (IsRepG1 + kNumStates)\n++#define IsRep0Long (IsRepG2 + kNumStates)\n++#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))\n++#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))\n++#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)\n++#define LenCoder (Align + kAlignTableSize)\n++#define RepLenCoder (LenCoder + kNumLenProbs)\n++#define Literal (RepLenCoder + kNumLenProbs)\n++\n++#define LZMA_BASE_SIZE 1846\n++#define LZMA_LIT_SIZE 768\n++\n++#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))\n++\n++#if Literal != LZMA_BASE_SIZE\n++StopCompilingDueBUG\n++#endif\n++\n++#define LZMA_DIC_MIN (1 << 12)\n++\n++/* First LZMA-symbol is always decoded.\n++And it decodes new LZMA-symbols while (buf < bufLimit), but \"buf\" is without last normalization\n++Out:\n++  Result:\n++    SZ_OK - OK\n++    SZ_ERROR_DATA - Error\n++  p->remainLen:\n++    < kMatchSpecLenStart : normal remain\n++    = kMatchSpecLenStart : finished\n++    = kMatchSpecLenStart + 1 : Flush marker\n++    = kMatchSpecLenStart + 2 : State Init Marker\n++*/\n++\n++static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n++{\n++  CLzmaProb *probs = p->probs;\n++\n++  unsigned state = p->state;\n++  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];\n++  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;\n++  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;\n++  unsigned lc = p->prop.lc;\n++\n++  Byte *dic = p->dic;\n++  SizeT dicBufSize = p->dicBufSize;\n++  SizeT dicPos = p->dicPos;\n++\n++  UInt32 processedPos = p->processedPos;\n++  UInt32 checkDicSize = p->checkDicSize;\n++  unsigned len = 0;\n++\n++  const Byte *buf = p->buf;\n++  UInt32 range = p->range;\n++  UInt32 code = p->code;\n++\n++  do\n++  {\n++    CLzmaProb *prob;\n++    UInt32 bound;\n++    unsigned ttt;\n++    unsigned posState = processedPos & pbMask;\n++\n++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n++    IF_BIT_0(prob)\n++    {\n++      unsigned symbol;\n++      UPDATE_0(prob);\n++      prob = probs + Literal;\n++      if (checkDicSize != 0 || processedPos != 0)\n++        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +\n++        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));\n++\n++      if (state < kNumLitStates)\n++      {\n++        state -= (state < 4) ? state : 3;\n++        symbol = 1;\n++        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);\n++      }\n++      else\n++      {\n++        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n++        unsigned offs = 0x100;\n++        state -= (state < 10) ? 3 : 6;\n++        symbol = 1;\n++        do\n++        {\n++          unsigned bit;\n++          CLzmaProb *probLit;\n++          matchByte <<= 1;\n++          bit = (matchByte & offs);\n++          probLit = prob + offs + bit + symbol;\n++          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)\n++        }\n++        while (symbol < 0x100);\n++      }\n++      dic[dicPos++] = (Byte)symbol;\n++      processedPos++;\n++      continue;\n++    }\n++    else\n++    {\n++      UPDATE_1(prob);\n++      prob = probs + IsRep + state;\n++      IF_BIT_0(prob)\n++      {\n++        UPDATE_0(prob);\n++        state += kNumStates;\n++        prob = probs + LenCoder;\n++      }\n++      else\n++      {\n++        UPDATE_1(prob);\n++        if (checkDicSize == 0 && processedPos == 0)\n++          return SZ_ERROR_DATA;\n++        prob = probs + IsRepG0 + state;\n++        IF_BIT_0(prob)\n++        {\n++          UPDATE_0(prob);\n++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n++          IF_BIT_0(prob)\n++          {\n++            UPDATE_0(prob);\n++            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n++            dicPos++;\n++            processedPos++;\n++            state = state < kNumLitStates ? 9 : 11;\n++            continue;\n++          }\n++          UPDATE_1(prob);\n++        }\n++        else\n++        {\n++          UInt32 distance;\n++          UPDATE_1(prob);\n++          prob = probs + IsRepG1 + state;\n++          IF_BIT_0(prob)\n++          {\n++            UPDATE_0(prob);\n++            distance = rep1;\n++          }\n++          else\n++          {\n++            UPDATE_1(prob);\n++            prob = probs + IsRepG2 + state;\n++            IF_BIT_0(prob)\n++            {\n++              UPDATE_0(prob);\n++              distance = rep2;\n++            }\n++            else\n++            {\n++              UPDATE_1(prob);\n++              distance = rep3;\n++              rep3 = rep2;\n++            }\n++            rep2 = rep1;\n++          }\n++          rep1 = rep0;\n++          rep0 = distance;\n++        }\n++        state = state < kNumLitStates ? 8 : 11;\n++        prob = probs + RepLenCoder;\n++      }\n++      {\n++        unsigned limit, offset;\n++        CLzmaProb *probLen = prob + LenChoice;\n++        IF_BIT_0(probLen)\n++        {\n++          UPDATE_0(probLen);\n++          probLen = prob + LenLow + (posState << kLenNumLowBits);\n++          offset = 0;\n++          limit = (1 << kLenNumLowBits);\n++        }\n++        else\n++        {\n++          UPDATE_1(probLen);\n++          probLen = prob + LenChoice2;\n++          IF_BIT_0(probLen)\n++          {\n++            UPDATE_0(probLen);\n++            probLen = prob + LenMid + (posState << kLenNumMidBits);\n++            offset = kLenNumLowSymbols;\n++            limit = (1 << kLenNumMidBits);\n++          }\n++          else\n++          {\n++            UPDATE_1(probLen);\n++            probLen = prob + LenHigh;\n++            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n++            limit = (1 << kLenNumHighBits);\n++          }\n++        }\n++        TREE_DECODE(probLen, limit, len);\n++        len += offset;\n++      }\n++\n++      if (state >= kNumStates)\n++      {\n++        UInt32 distance;\n++        prob = probs + PosSlot +\n++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);\n++        TREE_6_DECODE(prob, distance);\n++        if (distance >= kStartPosModelIndex)\n++        {\n++          unsigned posSlot = (unsigned)distance;\n++          int numDirectBits = (int)(((distance >> 1) - 1));\n++          distance = (2 | (distance & 1));\n++          if (posSlot < kEndPosModelIndex)\n++          {\n++            distance <<= numDirectBits;\n++            prob = probs + SpecPos + distance - posSlot - 1;\n++            {\n++              UInt32 mask = 1;\n++              unsigned i = 1;\n++              do\n++              {\n++                GET_BIT2(prob + i, i, ; , distance |= mask);\n++                mask <<= 1;\n++              }\n++              while (--numDirectBits != 0);\n++            }\n++          }\n++          else\n++          {\n++            numDirectBits -= kNumAlignBits;\n++            do\n++            {\n++              NORMALIZE\n++              range >>= 1;\n++\n++              {\n++                UInt32 t;\n++                code -= range;\n++                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */\n++                distance = (distance << 1) + (t + 1);\n++                code += range & t;\n++              }\n++              /*\n++              distance <<= 1;\n++              if (code >= range)\n++              {\n++                code -= range;\n++                distance |= 1;\n++              }\n++              */\n++            }\n++            while (--numDirectBits != 0);\n++            prob = probs + Align;\n++            distance <<= kNumAlignBits;\n++            {\n++              unsigned i = 1;\n++              GET_BIT2(prob + i, i, ; , distance |= 1);\n++              GET_BIT2(prob + i, i, ; , distance |= 2);\n++              GET_BIT2(prob + i, i, ; , distance |= 4);\n++              GET_BIT2(prob + i, i, ; , distance |= 8);\n++            }\n++            if (distance == (UInt32)0xFFFFFFFF)\n++            {\n++              len += kMatchSpecLenStart;\n++              state -= kNumStates;\n++              break;\n++            }\n++          }\n++        }\n++        rep3 = rep2;\n++        rep2 = rep1;\n++        rep1 = rep0;\n++        rep0 = distance + 1;\n++        if (checkDicSize == 0)\n++        {\n++          if (distance >= processedPos)\n++            return SZ_ERROR_DATA;\n++        }\n++        else if (distance >= checkDicSize)\n++          return SZ_ERROR_DATA;\n++        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;\n++      }\n++\n++      len += kMatchMinLen;\n++\n++      if (limit == dicPos)\n++        return SZ_ERROR_DATA;\n++      {\n++        SizeT rem = limit - dicPos;\n++        unsigned curLen = ((rem < len) ? (unsigned)rem : len);\n++        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);\n++\n++        processedPos += curLen;\n++\n++        len -= curLen;\n++        if (pos + curLen <= dicBufSize)\n++        {\n++          Byte *dest = dic + dicPos;\n++          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;\n++          const Byte *lim = dest + curLen;\n++          dicPos += curLen;\n++          do\n++            *(dest) = (Byte)*(dest + src);\n++          while (++dest != lim);\n++        }\n++        else\n++        {\n++          do\n++          {\n++            dic[dicPos++] = dic[pos];\n++            if (++pos == dicBufSize)\n++              pos = 0;\n++          }\n++          while (--curLen != 0);\n++        }\n++      }\n++    }\n++  }\n++  while (dicPos < limit && buf < bufLimit);\n++  NORMALIZE;\n++  p->buf = buf;\n++  p->range = range;\n++  p->code = code;\n++  p->remainLen = len;\n++  p->dicPos = dicPos;\n++  p->processedPos = processedPos;\n++  p->reps[0] = rep0;\n++  p->reps[1] = rep1;\n++  p->reps[2] = rep2;\n++  p->reps[3] = rep3;\n++  p->state = state;\n++\n++  return SZ_OK;\n++}\n++\n++static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)\n++{\n++  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)\n++  {\n++    Byte *dic = p->dic;\n++    SizeT dicPos = p->dicPos;\n++    SizeT dicBufSize = p->dicBufSize;\n++    unsigned len = p->remainLen;\n++    UInt32 rep0 = p->reps[0];\n++    if (limit - dicPos < len)\n++      len = (unsigned)(limit - dicPos);\n++\n++    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)\n++      p->checkDicSize = p->prop.dicSize;\n++\n++    p->processedPos += len;\n++    p->remainLen -= len;\n++    while (len-- != 0)\n++    {\n++      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];\n++      dicPos++;\n++    }\n++    p->dicPos = dicPos;\n++  }\n++}\n++\n++static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)\n++{\n++  do\n++  {\n++    SizeT limit2 = limit;\n++    if (p->checkDicSize == 0)\n++    {\n++      UInt32 rem = p->prop.dicSize - p->processedPos;\n++      if (limit - p->dicPos > rem)\n++        limit2 = p->dicPos + rem;\n++    }\n++    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));\n++    if (p->processedPos >= p->prop.dicSize)\n++      p->checkDicSize = p->prop.dicSize;\n++    LzmaDec_WriteRem(p, limit);\n++  }\n++  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);\n++\n++  if (p->remainLen > kMatchSpecLenStart)\n++  {\n++    p->remainLen = kMatchSpecLenStart;\n++  }\n++  return 0;\n++}\n++\n++typedef enum\n++{\n++  DUMMY_ERROR, /* unexpected end of input stream */\n++  DUMMY_LIT,\n++  DUMMY_MATCH,\n++  DUMMY_REP\n++} ELzmaDummy;\n++\n++static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)\n++{\n++  UInt32 range = p->range;\n++  UInt32 code = p->code;\n++  const Byte *bufLimit = buf + inSize;\n++  CLzmaProb *probs = p->probs;\n++  unsigned state = p->state;\n++  ELzmaDummy res;\n++\n++  {\n++    CLzmaProb *prob;\n++    UInt32 bound;\n++    unsigned ttt;\n++    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);\n++\n++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;\n++    IF_BIT_0_CHECK(prob)\n++    {\n++      UPDATE_0_CHECK\n++\n++      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */\n++\n++      prob = probs + Literal;\n++      if (p->checkDicSize != 0 || p->processedPos != 0)\n++        prob += (LZMA_LIT_SIZE *\n++          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +\n++          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));\n++\n++      if (state < kNumLitStates)\n++      {\n++        unsigned symbol = 1;\n++        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);\n++      }\n++      else\n++      {\n++        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +\n++            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];\n++        unsigned offs = 0x100;\n++        unsigned symbol = 1;\n++        do\n++        {\n++          unsigned bit;\n++          CLzmaProb *probLit;\n++          matchByte <<= 1;\n++          bit = (matchByte & offs);\n++          probLit = prob + offs + bit + symbol;\n++          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)\n++        }\n++        while (symbol < 0x100);\n++      }\n++      res = DUMMY_LIT;\n++    }\n++    else\n++    {\n++      unsigned len;\n++      UPDATE_1_CHECK;\n++\n++      prob = probs + IsRep + state;\n++      IF_BIT_0_CHECK(prob)\n++      {\n++        UPDATE_0_CHECK;\n++        state = 0;\n++        prob = probs + LenCoder;\n++        res = DUMMY_MATCH;\n++      }\n++      else\n++      {\n++        UPDATE_1_CHECK;\n++        res = DUMMY_REP;\n++        prob = probs + IsRepG0 + state;\n++        IF_BIT_0_CHECK(prob)\n++        {\n++          UPDATE_0_CHECK;\n++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;\n++          IF_BIT_0_CHECK(prob)\n++          {\n++            UPDATE_0_CHECK;\n++            NORMALIZE_CHECK;\n++            return DUMMY_REP;\n++          }\n++          else\n++          {\n++            UPDATE_1_CHECK;\n++          }\n++        }\n++        else\n++        {\n++          UPDATE_1_CHECK;\n++          prob = probs + IsRepG1 + state;\n++          IF_BIT_0_CHECK(prob)\n++          {\n++            UPDATE_0_CHECK;\n++          }\n++          else\n++          {\n++            UPDATE_1_CHECK;\n++            prob = probs + IsRepG2 + state;\n++            IF_BIT_0_CHECK(prob)\n++            {\n++              UPDATE_0_CHECK;\n++            }\n++            else\n++            {\n++              UPDATE_1_CHECK;\n++            }\n++          }\n++        }\n++        state = kNumStates;\n++        prob = probs + RepLenCoder;\n++      }\n++      {\n++        unsigned limit, offset;\n++        CLzmaProb *probLen = prob + LenChoice;\n++        IF_BIT_0_CHECK(probLen)\n++        {\n++          UPDATE_0_CHECK;\n++          probLen = prob + LenLow + (posState << kLenNumLowBits);\n++          offset = 0;\n++          limit = 1 << kLenNumLowBits;\n++        }\n++        else\n++        {\n++          UPDATE_1_CHECK;\n++          probLen = prob + LenChoice2;\n++          IF_BIT_0_CHECK(probLen)\n++          {\n++            UPDATE_0_CHECK;\n++            probLen = prob + LenMid + (posState << kLenNumMidBits);\n++            offset = kLenNumLowSymbols;\n++            limit = 1 << kLenNumMidBits;\n++          }\n++          else\n++          {\n++            UPDATE_1_CHECK;\n++            probLen = prob + LenHigh;\n++            offset = kLenNumLowSymbols + kLenNumMidSymbols;\n++            limit = 1 << kLenNumHighBits;\n++          }\n++        }\n++        TREE_DECODE_CHECK(probLen, limit, len);\n++        len += offset;\n++      }\n++\n++      if (state < 4)\n++      {\n++        unsigned posSlot;\n++        prob = probs + PosSlot +\n++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<\n++            kNumPosSlotBits);\n++        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);\n++        if (posSlot >= kStartPosModelIndex)\n++        {\n++          int numDirectBits = ((posSlot >> 1) - 1);\n++\n++          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */\n++\n++          if (posSlot < kEndPosModelIndex)\n++          {\n++            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;\n++          }\n++          else\n++          {\n++            numDirectBits -= kNumAlignBits;\n++            do\n++            {\n++              NORMALIZE_CHECK\n++              range >>= 1;\n++              code -= range & (((code - range) >> 31) - 1);\n++              /* if (code >= range) code -= range; */\n++            }\n++            while (--numDirectBits != 0);\n++            prob = probs + Align;\n++            numDirectBits = kNumAlignBits;\n++          }\n++          {\n++            unsigned i = 1;\n++            do\n++            {\n++              GET_BIT_CHECK(prob + i, i);\n++            }\n++            while (--numDirectBits != 0);\n++          }\n++        }\n++      }\n++    }\n++  }\n++  NORMALIZE_CHECK;\n++  return res;\n++}\n++\n++\n++static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)\n++{\n++  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);\n++  p->range = 0xFFFFFFFF;\n++  p->needFlush = 0;\n++}\n++\n++void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)\n++{\n++  p->needFlush = 1;\n++  p->remainLen = 0;\n++  p->tempBufSize = 0;\n++\n++  if (initDic)\n++  {\n++    p->processedPos = 0;\n++    p->checkDicSize = 0;\n++    p->needInitState = 1;\n++  }\n++  if (initState)\n++    p->needInitState = 1;\n++}\n++\n++void LzmaDec_Init(CLzmaDec *p)\n++{\n++  p->dicPos = 0;\n++  LzmaDec_InitDicAndState(p, True, True);\n++}\n++\n++static void LzmaDec_InitStateReal(CLzmaDec *p)\n++{\n++  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));\n++  UInt32 i;\n++  CLzmaProb *probs = p->probs;\n++  for (i = 0; i < numProbs; i++)\n++    probs[i] = kBitModelTotal >> 1;\n++  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;\n++  p->state = 0;\n++  p->needInitState = 0;\n++}\n++\n++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,\n++    ELzmaFinishMode finishMode, ELzmaStatus *status)\n++{\n++  SizeT inSize = *srcLen;\n++  (*srcLen) = 0;\n++  LzmaDec_WriteRem(p, dicLimit);\n++\n++  *status = LZMA_STATUS_NOT_SPECIFIED;\n++\n++  while (p->remainLen != kMatchSpecLenStart)\n++  {\n++      int checkEndMarkNow;\n++\n++      if (p->needFlush != 0)\n++      {\n++        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)\n++          p->tempBuf[p->tempBufSize++] = *src++;\n++        if (p->tempBufSize < RC_INIT_SIZE)\n++        {\n++          *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n++          return SZ_OK;\n++        }\n++        if (p->tempBuf[0] != 0)\n++          return SZ_ERROR_DATA;\n++\n++        LzmaDec_InitRc(p, p->tempBuf);\n++        p->tempBufSize = 0;\n++      }\n++\n++      checkEndMarkNow = 0;\n++      if (p->dicPos >= dicLimit)\n++      {\n++        if (p->remainLen == 0 && p->code == 0)\n++        {\n++          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;\n++          return SZ_OK;\n++        }\n++        if (finishMode == LZMA_FINISH_ANY)\n++        {\n++          *status = LZMA_STATUS_NOT_FINISHED;\n++          return SZ_OK;\n++        }\n++        if (p->remainLen != 0)\n++        {\n++          *status = LZMA_STATUS_NOT_FINISHED;\n++          return SZ_ERROR_DATA;\n++        }\n++        checkEndMarkNow = 1;\n++      }\n++\n++      if (p->needInitState)\n++        LzmaDec_InitStateReal(p);\n++\n++      if (p->tempBufSize == 0)\n++      {\n++        SizeT processed;\n++        const Byte *bufLimit;\n++        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n++        {\n++          int dummyRes = LzmaDec_TryDummy(p, src, inSize);\n++          if (dummyRes == DUMMY_ERROR)\n++          {\n++            memcpy(p->tempBuf, src, inSize);\n++            p->tempBufSize = (unsigned)inSize;\n++            (*srcLen) += inSize;\n++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n++            return SZ_OK;\n++          }\n++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n++          {\n++            *status = LZMA_STATUS_NOT_FINISHED;\n++            return SZ_ERROR_DATA;\n++          }\n++          bufLimit = src;\n++        }\n++        else\n++          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;\n++        p->buf = src;\n++        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)\n++          return SZ_ERROR_DATA;\n++        processed = (SizeT)(p->buf - src);\n++        (*srcLen) += processed;\n++        src += processed;\n++        inSize -= processed;\n++      }\n++      else\n++      {\n++        unsigned rem = p->tempBufSize, lookAhead = 0;\n++        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)\n++          p->tempBuf[rem++] = src[lookAhead++];\n++        p->tempBufSize = rem;\n++        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)\n++        {\n++          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);\n++          if (dummyRes == DUMMY_ERROR)\n++          {\n++            (*srcLen) += lookAhead;\n++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;\n++            return SZ_OK;\n++          }\n++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)\n++          {\n++            *status = LZMA_STATUS_NOT_FINISHED;\n++            return SZ_ERROR_DATA;\n++          }\n++        }\n++        p->buf = p->tempBuf;\n++        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)\n++          return SZ_ERROR_DATA;\n++        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));\n++        (*srcLen) += lookAhead;\n++        src += lookAhead;\n++        inSize -= lookAhead;\n++        p->tempBufSize = 0;\n++      }\n++  }\n++  if (p->code == 0)\n++    *status = LZMA_STATUS_FINISHED_WITH_MARK;\n++  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;\n++}\n++\n++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)\n++{\n++  SizeT outSize = *destLen;\n++  SizeT inSize = *srcLen;\n++  *srcLen = *destLen = 0;\n++  for (;;)\n++  {\n++    SizeT inSizeCur = inSize, outSizeCur, dicPos;\n++    ELzmaFinishMode curFinishMode;\n++    SRes res;\n++    if (p->dicPos == p->dicBufSize)\n++      p->dicPos = 0;\n++    dicPos = p->dicPos;\n++    if (outSize > p->dicBufSize - dicPos)\n++    {\n++      outSizeCur = p->dicBufSize;\n++      curFinishMode = LZMA_FINISH_ANY;\n++    }\n++    else\n++    {\n++      outSizeCur = dicPos + outSize;\n++      curFinishMode = finishMode;\n++    }\n++\n++    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);\n++    src += inSizeCur;\n++    inSize -= inSizeCur;\n++    *srcLen += inSizeCur;\n++    outSizeCur = p->dicPos - dicPos;\n++    memcpy(dest, p->dic + dicPos, outSizeCur);\n++    dest += outSizeCur;\n++    outSize -= outSizeCur;\n++    *destLen += outSizeCur;\n++    if (res != 0)\n++      return res;\n++    if (outSizeCur == 0 || outSize == 0)\n++      return SZ_OK;\n++  }\n++}\n++\n++void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)\n++{\n++  alloc->Free(alloc, p->probs);\n++  p->probs = 0;\n++}\n++\n++static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)\n++{\n++  alloc->Free(alloc, p->dic);\n++  p->dic = 0;\n++}\n++\n++void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)\n++{\n++  LzmaDec_FreeProbs(p, alloc);\n++  LzmaDec_FreeDict(p, alloc);\n++}\n++\n++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)\n++{\n++  UInt32 dicSize;\n++  Byte d;\n++\n++  if (size < LZMA_PROPS_SIZE)\n++    return SZ_ERROR_UNSUPPORTED;\n++  else\n++    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);\n++\n++  if (dicSize < LZMA_DIC_MIN)\n++    dicSize = LZMA_DIC_MIN;\n++  p->dicSize = dicSize;\n++\n++  d = data[0];\n++  if (d >= (9 * 5 * 5))\n++    return SZ_ERROR_UNSUPPORTED;\n++\n++  p->lc = d % 9;\n++  d /= 9;\n++  p->pb = d / 5;\n++  p->lp = d % 5;\n++\n++  return SZ_OK;\n++}\n++\n++static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)\n++{\n++  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);\n++  if (p->probs == 0 || numProbs != p->numProbs)\n++  {\n++    LzmaDec_FreeProbs(p, alloc);\n++    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));\n++    p->numProbs = numProbs;\n++    if (p->probs == 0)\n++      return SZ_ERROR_MEM;\n++  }\n++  return SZ_OK;\n++}\n++\n++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n++{\n++  CLzmaProps propNew;\n++  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n++  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n++  p->prop = propNew;\n++  return SZ_OK;\n++}\n++\n++SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)\n++{\n++  CLzmaProps propNew;\n++  SizeT dicBufSize;\n++  RINOK(LzmaProps_Decode(&propNew, props, propsSize));\n++  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));\n++  dicBufSize = propNew.dicSize;\n++  if (p->dic == 0 || dicBufSize != p->dicBufSize)\n++  {\n++    LzmaDec_FreeDict(p, alloc);\n++    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);\n++    if (p->dic == 0)\n++    {\n++      LzmaDec_FreeProbs(p, alloc);\n++      return SZ_ERROR_MEM;\n++    }\n++  }\n++  p->dicBufSize = dicBufSize;\n++  p->prop = propNew;\n++  return SZ_OK;\n++}\n++\n++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,\n++    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,\n++    ELzmaStatus *status, ISzAlloc *alloc)\n++{\n++  CLzmaDec p;\n++  SRes res;\n++  SizeT inSize = *srcLen;\n++  SizeT outSize = *destLen;\n++  *srcLen = *destLen = 0;\n++  if (inSize < RC_INIT_SIZE)\n++    return SZ_ERROR_INPUT_EOF;\n++\n++  LzmaDec_Construct(&p);\n++  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);\n++  if (res != 0)\n++    return res;\n++  p.dic = dest;\n++  p.dicBufSize = outSize;\n++\n++  LzmaDec_Init(&p);\n++\n++  *srcLen = inSize;\n++  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);\n++\n++  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)\n++    res = SZ_ERROR_INPUT_EOF;\n++\n++  (*destLen) = p.dicPos;\n++  LzmaDec_FreeProbs(&p, alloc);\n++  return res;\n++}\n+--- /dev/null\n++++ b/lib/lzma/LzmaEnc.c\n+@@ -0,0 +1,2271 @@\n++/* LzmaEnc.c -- LZMA Encoder\n++2009-11-24 : Igor Pavlov : Public domain */\n++\n++#include <string.h>\n++\n++/* #define SHOW_STAT */\n++/* #define SHOW_STAT2 */\n++\n++#if defined(SHOW_STAT) || defined(SHOW_STAT2)\n++#include <stdio.h>\n++#endif\n++\n++#include \"LzmaEnc.h\"\n++\n++/* disable MT */\n++#define _7ZIP_ST\n++\n++#include \"LzFind.h\"\n++#ifndef _7ZIP_ST\n++#include \"LzFindMt.h\"\n++#endif\n++\n++#ifdef SHOW_STAT\n++static int ttt = 0;\n++#endif\n++\n++#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)\n++\n++#define kBlockSize (9 << 10)\n++#define kUnpackBlockSize (1 << 18)\n++#define kMatchArraySize (1 << 21)\n++#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)\n++\n++#define kNumMaxDirectBits (31)\n++\n++#define kNumTopBits 24\n++#define kTopValue ((UInt32)1 << kNumTopBits)\n++\n++#define kNumBitModelTotalBits 11\n++#define kBitModelTotal (1 << kNumBitModelTotalBits)\n++#define kNumMoveBits 5\n++#define kProbInitValue (kBitModelTotal >> 1)\n++\n++#define kNumMoveReducingBits 4\n++#define kNumBitPriceShiftBits 4\n++#define kBitPrice (1 << kNumBitPriceShiftBits)\n++\n++void LzmaEncProps_Init(CLzmaEncProps *p)\n++{\n++  p->level = 5;\n++  p->dictSize = p->mc = 0;\n++  p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;\n++  p->writeEndMark = 0;\n++}\n++\n++void LzmaEncProps_Normalize(CLzmaEncProps *p)\n++{\n++  int level = p->level;\n++  if (level < 0) level = 5;\n++  p->level = level;\n++  if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));\n++  if (p->lc < 0) p->lc = 3;\n++  if (p->lp < 0) p->lp = 0;\n++  if (p->pb < 0) p->pb = 2;\n++  if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);\n++  if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);\n++  if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);\n++  if (p->numHashBytes < 0) p->numHashBytes = 4;\n++  if (p->mc == 0)  p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);\n++  if (p->numThreads < 0)\n++    p->numThreads =\n++      #ifndef _7ZIP_ST\n++      ((p->btMode && p->algo) ? 2 : 1);\n++      #else\n++      1;\n++      #endif\n++}\n++\n++UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)\n++{\n++  CLzmaEncProps props = *props2;\n++  LzmaEncProps_Normalize(&props);\n++  return props.dictSize;\n++}\n++\n++/* #define LZMA_LOG_BSR */\n++/* Define it for Intel's CPU */\n++\n++\n++#ifdef LZMA_LOG_BSR\n++\n++#define kDicLogSizeMaxCompress 30\n++\n++#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }\n++\n++UInt32 GetPosSlot1(UInt32 pos)\n++{\n++  UInt32 res;\n++  BSR2_RET(pos, res);\n++  return res;\n++}\n++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }\n++#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }\n++\n++#else\n++\n++#define kNumLogBits (9 + (int)sizeof(size_t) / 2)\n++#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)\n++\n++void LzmaEnc_FastPosInit(Byte *g_FastPos)\n++{\n++  int c = 2, slotFast;\n++  g_FastPos[0] = 0;\n++  g_FastPos[1] = 1;\n++\n++  for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)\n++  {\n++    UInt32 k = (1 << ((slotFast >> 1) - 1));\n++    UInt32 j;\n++    for (j = 0; j < k; j++, c++)\n++      g_FastPos[c] = (Byte)slotFast;\n++  }\n++}\n++\n++#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \\\n++  (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \\\n++  res = p->g_FastPos[pos >> i] + (i * 2); }\n++/*\n++#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \\\n++  p->g_FastPos[pos >> 6] + 12 : \\\n++  p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }\n++*/\n++\n++#define GetPosSlot1(pos) p->g_FastPos[pos]\n++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }\n++#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }\n++\n++#endif\n++\n++\n++#define LZMA_NUM_REPS 4\n++\n++typedef unsigned CState;\n++\n++typedef struct\n++{\n++  UInt32 price;\n++\n++  CState state;\n++  int prev1IsChar;\n++  int prev2;\n++\n++  UInt32 posPrev2;\n++  UInt32 backPrev2;\n++\n++  UInt32 posPrev;\n++  UInt32 backPrev;\n++  UInt32 backs[LZMA_NUM_REPS];\n++} COptimal;\n++\n++#define kNumOpts (1 << 12)\n++\n++#define kNumLenToPosStates 4\n++#define kNumPosSlotBits 6\n++#define kDicLogSizeMin 0\n++#define kDicLogSizeMax 32\n++#define kDistTableSizeMax (kDicLogSizeMax * 2)\n++\n++\n++#define kNumAlignBits 4\n++#define kAlignTableSize (1 << kNumAlignBits)\n++#define kAlignMask (kAlignTableSize - 1)\n++\n++#define kStartPosModelIndex 4\n++#define kEndPosModelIndex 14\n++#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)\n++\n++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))\n++\n++#ifdef _LZMA_PROB32\n++#define CLzmaProb UInt32\n++#else\n++#define CLzmaProb UInt16\n++#endif\n++\n++#define LZMA_PB_MAX 4\n++#define LZMA_LC_MAX 8\n++#define LZMA_LP_MAX 4\n++\n++#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)\n++\n++\n++#define kLenNumLowBits 3\n++#define kLenNumLowSymbols (1 << kLenNumLowBits)\n++#define kLenNumMidBits 3\n++#define kLenNumMidSymbols (1 << kLenNumMidBits)\n++#define kLenNumHighBits 8\n++#define kLenNumHighSymbols (1 << kLenNumHighBits)\n++\n++#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)\n++\n++#define LZMA_MATCH_LEN_MIN 2\n++#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)\n++\n++#define kNumStates 12\n++\n++typedef struct\n++{\n++  CLzmaProb choice;\n++  CLzmaProb choice2;\n++  CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];\n++  CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];\n++  CLzmaProb high[kLenNumHighSymbols];\n++} CLenEnc;\n++\n++typedef struct\n++{\n++  CLenEnc p;\n++  UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];\n++  UInt32 tableSize;\n++  UInt32 counters[LZMA_NUM_PB_STATES_MAX];\n++} CLenPriceEnc;\n++\n++typedef struct\n++{\n++  UInt32 range;\n++  Byte cache;\n++  UInt64 low;\n++  UInt64 cacheSize;\n++  Byte *buf;\n++  Byte *bufLim;\n++  Byte *bufBase;\n++  ISeqOutStream *outStream;\n++  UInt64 processed;\n++  SRes res;\n++} CRangeEnc;\n++\n++typedef struct\n++{\n++  CLzmaProb *litProbs;\n++\n++  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];\n++  CLzmaProb isRep[kNumStates];\n++  CLzmaProb isRepG0[kNumStates];\n++  CLzmaProb isRepG1[kNumStates];\n++  CLzmaProb isRepG2[kNumStates];\n++  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];\n++\n++  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];\n++  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];\n++  CLzmaProb posAlignEncoder[1 << kNumAlignBits];\n++\n++  CLenPriceEnc lenEnc;\n++  CLenPriceEnc repLenEnc;\n++\n++  UInt32 reps[LZMA_NUM_REPS];\n++  UInt32 state;\n++} CSaveState;\n++\n++typedef struct\n++{\n++  IMatchFinder matchFinder;\n++  void *matchFinderObj;\n++\n++  #ifndef _7ZIP_ST\n++  Bool mtMode;\n++  CMatchFinderMt matchFinderMt;\n++  #endif\n++\n++  CMatchFinder matchFinderBase;\n++\n++  #ifndef _7ZIP_ST\n++  Byte pad[128];\n++  #endif\n++\n++  UInt32 optimumEndIndex;\n++  UInt32 optimumCurrentIndex;\n++\n++  UInt32 longestMatchLength;\n++  UInt32 numPairs;\n++  UInt32 numAvail;\n++  COptimal opt[kNumOpts];\n++\n++  #ifndef LZMA_LOG_BSR\n++  Byte g_FastPos[1 << kNumLogBits];\n++  #endif\n++\n++  UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];\n++  UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];\n++  UInt32 numFastBytes;\n++  UInt32 additionalOffset;\n++  UInt32 reps[LZMA_NUM_REPS];\n++  UInt32 state;\n++\n++  UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];\n++  UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];\n++  UInt32 alignPrices[kAlignTableSize];\n++  UInt32 alignPriceCount;\n++\n++  UInt32 distTableSize;\n++\n++  unsigned lc, lp, pb;\n++  unsigned lpMask, pbMask;\n++\n++  CLzmaProb *litProbs;\n++\n++  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];\n++  CLzmaProb isRep[kNumStates];\n++  CLzmaProb isRepG0[kNumStates];\n++  CLzmaProb isRepG1[kNumStates];\n++  CLzmaProb isRepG2[kNumStates];\n++  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];\n++\n++  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];\n++  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];\n++  CLzmaProb posAlignEncoder[1 << kNumAlignBits];\n++\n++  CLenPriceEnc lenEnc;\n++  CLenPriceEnc repLenEnc;\n++\n++  unsigned lclp;\n++\n++  Bool fastMode;\n++\n++  CRangeEnc rc;\n++\n++  Bool writeEndMark;\n++  UInt64 nowPos64;\n++  UInt32 matchPriceCount;\n++  Bool finished;\n++  Bool multiThread;\n++\n++  SRes result;\n++  UInt32 dictSize;\n++  UInt32 matchFinderCycles;\n++\n++  int needInit;\n++\n++  CSaveState saveState;\n++} CLzmaEnc;\n++\n++void LzmaEnc_SaveState(CLzmaEncHandle pp)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  CSaveState *dest = &p->saveState;\n++  int i;\n++  dest->lenEnc = p->lenEnc;\n++  dest->repLenEnc = p->repLenEnc;\n++  dest->state = p->state;\n++\n++  for (i = 0; i < kNumStates; i++)\n++  {\n++    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n++    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n++  }\n++  for (i = 0; i < kNumLenToPosStates; i++)\n++    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n++  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n++  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n++  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n++  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n++  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n++  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n++  memcpy(dest->reps, p->reps, sizeof(p->reps));\n++  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));\n++}\n++\n++void LzmaEnc_RestoreState(CLzmaEncHandle pp)\n++{\n++  CLzmaEnc *dest = (CLzmaEnc *)pp;\n++  const CSaveState *p = &dest->saveState;\n++  int i;\n++  dest->lenEnc = p->lenEnc;\n++  dest->repLenEnc = p->repLenEnc;\n++  dest->state = p->state;\n++\n++  for (i = 0; i < kNumStates; i++)\n++  {\n++    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));\n++    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));\n++  }\n++  for (i = 0; i < kNumLenToPosStates; i++)\n++    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));\n++  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));\n++  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));\n++  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));\n++  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));\n++  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));\n++  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));\n++  memcpy(dest->reps, p->reps, sizeof(p->reps));\n++  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));\n++}\n++\n++SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  CLzmaEncProps props = *props2;\n++  LzmaEncProps_Normalize(&props);\n++\n++  if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||\n++      props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))\n++    return SZ_ERROR_PARAM;\n++  p->dictSize = props.dictSize;\n++  p->matchFinderCycles = props.mc;\n++  {\n++    unsigned fb = props.fb;\n++    if (fb < 5)\n++      fb = 5;\n++    if (fb > LZMA_MATCH_LEN_MAX)\n++      fb = LZMA_MATCH_LEN_MAX;\n++    p->numFastBytes = fb;\n++  }\n++  p->lc = props.lc;\n++  p->lp = props.lp;\n++  p->pb = props.pb;\n++  p->fastMode = (props.algo == 0);\n++  p->matchFinderBase.btMode = props.btMode;\n++  {\n++    UInt32 numHashBytes = 4;\n++    if (props.btMode)\n++    {\n++      if (props.numHashBytes < 2)\n++        numHashBytes = 2;\n++      else if (props.numHashBytes < 4)\n++        numHashBytes = props.numHashBytes;\n++    }\n++    p->matchFinderBase.numHashBytes = numHashBytes;\n++  }\n++\n++  p->matchFinderBase.cutValue = props.mc;\n++\n++  p->writeEndMark = props.writeEndMark;\n++\n++  #ifndef _7ZIP_ST\n++  /*\n++  if (newMultiThread != _multiThread)\n++  {\n++    ReleaseMatchFinder();\n++    _multiThread = newMultiThread;\n++  }\n++  */\n++  p->multiThread = (props.numThreads > 1);\n++  #endif\n++\n++  return SZ_OK;\n++}\n++\n++static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};\n++static const int kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};\n++static const int kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};\n++static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};\n++\n++#define IsCharState(s) ((s) < 7)\n++\n++#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)\n++\n++#define kInfinityPrice (1 << 30)\n++\n++static void RangeEnc_Construct(CRangeEnc *p)\n++{\n++  p->outStream = 0;\n++  p->bufBase = 0;\n++}\n++\n++#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)\n++\n++#define RC_BUF_SIZE (1 << 16)\n++static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)\n++{\n++  if (p->bufBase == 0)\n++  {\n++    p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);\n++    if (p->bufBase == 0)\n++      return 0;\n++    p->bufLim = p->bufBase + RC_BUF_SIZE;\n++  }\n++  return 1;\n++}\n++\n++static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)\n++{\n++  alloc->Free(alloc, p->bufBase);\n++  p->bufBase = 0;\n++}\n++\n++static void RangeEnc_Init(CRangeEnc *p)\n++{\n++  /* Stream.Init(); */\n++  p->low = 0;\n++  p->range = 0xFFFFFFFF;\n++  p->cacheSize = 1;\n++  p->cache = 0;\n++\n++  p->buf = p->bufBase;\n++\n++  p->processed = 0;\n++  p->res = SZ_OK;\n++}\n++\n++static void RangeEnc_FlushStream(CRangeEnc *p)\n++{\n++  size_t num;\n++  if (p->res != SZ_OK)\n++    return;\n++  num = p->buf - p->bufBase;\n++  if (num != p->outStream->Write(p->outStream, p->bufBase, num))\n++    p->res = SZ_ERROR_WRITE;\n++  p->processed += num;\n++  p->buf = p->bufBase;\n++}\n++\n++static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)\n++{\n++  if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)\n++  {\n++    Byte temp = p->cache;\n++    do\n++    {\n++      Byte *buf = p->buf;\n++      *buf++ = (Byte)(temp + (Byte)(p->low >> 32));\n++      p->buf = buf;\n++      if (buf == p->bufLim)\n++        RangeEnc_FlushStream(p);\n++      temp = 0xFF;\n++    }\n++    while (--p->cacheSize != 0);\n++    p->cache = (Byte)((UInt32)p->low >> 24);\n++  }\n++  p->cacheSize++;\n++  p->low = (UInt32)p->low << 8;\n++}\n++\n++static void RangeEnc_FlushData(CRangeEnc *p)\n++{\n++  int i;\n++  for (i = 0; i < 5; i++)\n++    RangeEnc_ShiftLow(p);\n++}\n++\n++static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)\n++{\n++  do\n++  {\n++    p->range >>= 1;\n++    p->low += p->range & (0 - ((value >> --numBits) & 1));\n++    if (p->range < kTopValue)\n++    {\n++      p->range <<= 8;\n++      RangeEnc_ShiftLow(p);\n++    }\n++  }\n++  while (numBits != 0);\n++}\n++\n++static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)\n++{\n++  UInt32 ttt = *prob;\n++  UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;\n++  if (symbol == 0)\n++  {\n++    p->range = newBound;\n++    ttt += (kBitModelTotal - ttt) >> kNumMoveBits;\n++  }\n++  else\n++  {\n++    p->low += newBound;\n++    p->range -= newBound;\n++    ttt -= ttt >> kNumMoveBits;\n++  }\n++  *prob = (CLzmaProb)ttt;\n++  if (p->range < kTopValue)\n++  {\n++    p->range <<= 8;\n++    RangeEnc_ShiftLow(p);\n++  }\n++}\n++\n++static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)\n++{\n++  symbol |= 0x100;\n++  do\n++  {\n++    RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);\n++    symbol <<= 1;\n++  }\n++  while (symbol < 0x10000);\n++}\n++\n++static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)\n++{\n++  UInt32 offs = 0x100;\n++  symbol |= 0x100;\n++  do\n++  {\n++    matchByte <<= 1;\n++    RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);\n++    symbol <<= 1;\n++    offs &= ~(matchByte ^ symbol);\n++  }\n++  while (symbol < 0x10000);\n++}\n++\n++void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)\n++{\n++  UInt32 i;\n++  for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))\n++  {\n++    const int kCyclesBits = kNumBitPriceShiftBits;\n++    UInt32 w = i;\n++    UInt32 bitCount = 0;\n++    int j;\n++    for (j = 0; j < kCyclesBits; j++)\n++    {\n++      w = w * w;\n++      bitCount <<= 1;\n++      while (w >= ((UInt32)1 << 16))\n++      {\n++        w >>= 1;\n++        bitCount++;\n++      }\n++    }\n++    ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);\n++  }\n++}\n++\n++\n++#define GET_PRICE(prob, symbol) \\\n++  p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];\n++\n++#define GET_PRICEa(prob, symbol) \\\n++  ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];\n++\n++#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]\n++#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]\n++\n++#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]\n++#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]\n++\n++static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)\n++{\n++  UInt32 price = 0;\n++  symbol |= 0x100;\n++  do\n++  {\n++    price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);\n++    symbol <<= 1;\n++  }\n++  while (symbol < 0x10000);\n++  return price;\n++}\n++\n++static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)\n++{\n++  UInt32 price = 0;\n++  UInt32 offs = 0x100;\n++  symbol |= 0x100;\n++  do\n++  {\n++    matchByte <<= 1;\n++    price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);\n++    symbol <<= 1;\n++    offs &= ~(matchByte ^ symbol);\n++  }\n++  while (symbol < 0x10000);\n++  return price;\n++}\n++\n++\n++static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)\n++{\n++  UInt32 m = 1;\n++  int i;\n++  for (i = numBitLevels; i != 0;)\n++  {\n++    UInt32 bit;\n++    i--;\n++    bit = (symbol >> i) & 1;\n++    RangeEnc_EncodeBit(rc, probs + m, bit);\n++    m = (m << 1) | bit;\n++  }\n++}\n++\n++static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)\n++{\n++  UInt32 m = 1;\n++  int i;\n++  for (i = 0; i < numBitLevels; i++)\n++  {\n++    UInt32 bit = symbol & 1;\n++    RangeEnc_EncodeBit(rc, probs + m, bit);\n++    m = (m << 1) | bit;\n++    symbol >>= 1;\n++  }\n++}\n++\n++static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)\n++{\n++  UInt32 price = 0;\n++  symbol |= (1 << numBitLevels);\n++  while (symbol != 1)\n++  {\n++    price += GET_PRICEa(probs[symbol >> 1], symbol & 1);\n++    symbol >>= 1;\n++  }\n++  return price;\n++}\n++\n++static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)\n++{\n++  UInt32 price = 0;\n++  UInt32 m = 1;\n++  int i;\n++  for (i = numBitLevels; i != 0; i--)\n++  {\n++    UInt32 bit = symbol & 1;\n++    symbol >>= 1;\n++    price += GET_PRICEa(probs[m], bit);\n++    m = (m << 1) | bit;\n++  }\n++  return price;\n++}\n++\n++\n++static void LenEnc_Init(CLenEnc *p)\n++{\n++  unsigned i;\n++  p->choice = p->choice2 = kProbInitValue;\n++  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)\n++    p->low[i] = kProbInitValue;\n++  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)\n++    p->mid[i] = kProbInitValue;\n++  for (i = 0; i < kLenNumHighSymbols; i++)\n++    p->high[i] = kProbInitValue;\n++}\n++\n++static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)\n++{\n++  if (symbol < kLenNumLowSymbols)\n++  {\n++    RangeEnc_EncodeBit(rc, &p->choice, 0);\n++    RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);\n++  }\n++  else\n++  {\n++    RangeEnc_EncodeBit(rc, &p->choice, 1);\n++    if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)\n++    {\n++      RangeEnc_EncodeBit(rc, &p->choice2, 0);\n++      RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);\n++    }\n++    else\n++    {\n++      RangeEnc_EncodeBit(rc, &p->choice2, 1);\n++      RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);\n++    }\n++  }\n++}\n++\n++static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)\n++{\n++  UInt32 a0 = GET_PRICE_0a(p->choice);\n++  UInt32 a1 = GET_PRICE_1a(p->choice);\n++  UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);\n++  UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);\n++  UInt32 i = 0;\n++  for (i = 0; i < kLenNumLowSymbols; i++)\n++  {\n++    if (i >= numSymbols)\n++      return;\n++    prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);\n++  }\n++  for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)\n++  {\n++    if (i >= numSymbols)\n++      return;\n++    prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);\n++  }\n++  for (; i < numSymbols; i++)\n++    prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);\n++}\n++\n++static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)\n++{\n++  LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);\n++  p->counters[posState] = p->tableSize;\n++}\n++\n++static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)\n++{\n++  UInt32 posState;\n++  for (posState = 0; posState < numPosStates; posState++)\n++    LenPriceEnc_UpdateTable(p, posState, ProbPrices);\n++}\n++\n++static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)\n++{\n++  LenEnc_Encode(&p->p, rc, symbol, posState);\n++  if (updatePrice)\n++    if (--p->counters[posState] == 0)\n++      LenPriceEnc_UpdateTable(p, posState, ProbPrices);\n++}\n++\n++\n++\n++\n++static void MovePos(CLzmaEnc *p, UInt32 num)\n++{\n++  #ifdef SHOW_STAT\n++  ttt += num;\n++  printf(\"\\n MovePos %d\", num);\n++  #endif\n++  if (num != 0)\n++  {\n++    p->additionalOffset += num;\n++    p->matchFinder.Skip(p->matchFinderObj, num);\n++  }\n++}\n++\n++static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)\n++{\n++  UInt32 lenRes = 0, numPairs;\n++  p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);\n++  numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);\n++  #ifdef SHOW_STAT\n++  printf(\"\\n i = %d numPairs = %d    \", ttt, numPairs / 2);\n++  ttt++;\n++  {\n++    UInt32 i;\n++    for (i = 0; i < numPairs; i += 2)\n++      printf(\"%2d %6d   | \", p->matches[i], p->matches[i + 1]);\n++  }\n++  #endif\n++  if (numPairs > 0)\n++  {\n++    lenRes = p->matches[numPairs - 2];\n++    if (lenRes == p->numFastBytes)\n++    {\n++      const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n++      UInt32 distance = p->matches[numPairs - 1] + 1;\n++      UInt32 numAvail = p->numAvail;\n++      if (numAvail > LZMA_MATCH_LEN_MAX)\n++        numAvail = LZMA_MATCH_LEN_MAX;\n++      {\n++        const Byte *pby2 = pby - distance;\n++        for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);\n++      }\n++    }\n++  }\n++  p->additionalOffset++;\n++  *numDistancePairsRes = numPairs;\n++  return lenRes;\n++}\n++\n++\n++#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;\n++#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;\n++#define IsShortRep(p) ((p)->backPrev == 0)\n++\n++static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)\n++{\n++  return\n++    GET_PRICE_0(p->isRepG0[state]) +\n++    GET_PRICE_0(p->isRep0Long[state][posState]);\n++}\n++\n++static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)\n++{\n++  UInt32 price;\n++  if (repIndex == 0)\n++  {\n++    price = GET_PRICE_0(p->isRepG0[state]);\n++    price += GET_PRICE_1(p->isRep0Long[state][posState]);\n++  }\n++  else\n++  {\n++    price = GET_PRICE_1(p->isRepG0[state]);\n++    if (repIndex == 1)\n++      price += GET_PRICE_0(p->isRepG1[state]);\n++    else\n++    {\n++      price += GET_PRICE_1(p->isRepG1[state]);\n++      price += GET_PRICE(p->isRepG2[state], repIndex - 2);\n++    }\n++  }\n++  return price;\n++}\n++\n++static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)\n++{\n++  return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +\n++    GetPureRepPrice(p, repIndex, state, posState);\n++}\n++\n++static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)\n++{\n++  UInt32 posMem = p->opt[cur].posPrev;\n++  UInt32 backMem = p->opt[cur].backPrev;\n++  p->optimumEndIndex = cur;\n++  do\n++  {\n++    if (p->opt[cur].prev1IsChar)\n++    {\n++      MakeAsChar(&p->opt[posMem])\n++      p->opt[posMem].posPrev = posMem - 1;\n++      if (p->opt[cur].prev2)\n++      {\n++        p->opt[posMem - 1].prev1IsChar = False;\n++        p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;\n++        p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;\n++      }\n++    }\n++    {\n++      UInt32 posPrev = posMem;\n++      UInt32 backCur = backMem;\n++\n++      backMem = p->opt[posPrev].backPrev;\n++      posMem = p->opt[posPrev].posPrev;\n++\n++      p->opt[posPrev].backPrev = backCur;\n++      p->opt[posPrev].posPrev = cur;\n++      cur = posPrev;\n++    }\n++  }\n++  while (cur != 0);\n++  *backRes = p->opt[0].backPrev;\n++  p->optimumCurrentIndex  = p->opt[0].posPrev;\n++  return p->optimumCurrentIndex;\n++}\n++\n++#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)\n++\n++static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)\n++{\n++  UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;\n++  UInt32 matchPrice, repMatchPrice, normalMatchPrice;\n++  UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];\n++  UInt32 *matches;\n++  const Byte *data;\n++  Byte curByte, matchByte;\n++  if (p->optimumEndIndex != p->optimumCurrentIndex)\n++  {\n++    const COptimal *opt = &p->opt[p->optimumCurrentIndex];\n++    UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;\n++    *backRes = opt->backPrev;\n++    p->optimumCurrentIndex = opt->posPrev;\n++    return lenRes;\n++  }\n++  p->optimumCurrentIndex = p->optimumEndIndex = 0;\n++\n++  if (p->additionalOffset == 0)\n++    mainLen = ReadMatchDistances(p, &numPairs);\n++  else\n++  {\n++    mainLen = p->longestMatchLength;\n++    numPairs = p->numPairs;\n++  }\n++\n++  numAvail = p->numAvail;\n++  if (numAvail < 2)\n++  {\n++    *backRes = (UInt32)(-1);\n++    return 1;\n++  }\n++  if (numAvail > LZMA_MATCH_LEN_MAX)\n++    numAvail = LZMA_MATCH_LEN_MAX;\n++\n++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n++  repMaxIndex = 0;\n++  for (i = 0; i < LZMA_NUM_REPS; i++)\n++  {\n++    UInt32 lenTest;\n++    const Byte *data2;\n++    reps[i] = p->reps[i];\n++    data2 = data - (reps[i] + 1);\n++    if (data[0] != data2[0] || data[1] != data2[1])\n++    {\n++      repLens[i] = 0;\n++      continue;\n++    }\n++    for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);\n++    repLens[i] = lenTest;\n++    if (lenTest > repLens[repMaxIndex])\n++      repMaxIndex = i;\n++  }\n++  if (repLens[repMaxIndex] >= p->numFastBytes)\n++  {\n++    UInt32 lenRes;\n++    *backRes = repMaxIndex;\n++    lenRes = repLens[repMaxIndex];\n++    MovePos(p, lenRes - 1);\n++    return lenRes;\n++  }\n++\n++  matches = p->matches;\n++  if (mainLen >= p->numFastBytes)\n++  {\n++    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;\n++    MovePos(p, mainLen - 1);\n++    return mainLen;\n++  }\n++  curByte = *data;\n++  matchByte = *(data - (reps[0] + 1));\n++\n++  if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)\n++  {\n++    *backRes = (UInt32)-1;\n++    return 1;\n++  }\n++\n++  p->opt[0].state = (CState)p->state;\n++\n++  posState = (position & p->pbMask);\n++\n++  {\n++    const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));\n++    p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +\n++        (!IsCharState(p->state) ?\n++          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :\n++          LitEnc_GetPrice(probs, curByte, p->ProbPrices));\n++  }\n++\n++  MakeAsChar(&p->opt[1]);\n++\n++  matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);\n++  repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);\n++\n++  if (matchByte == curByte)\n++  {\n++    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);\n++    if (shortRepPrice < p->opt[1].price)\n++    {\n++      p->opt[1].price = shortRepPrice;\n++      MakeAsShortRep(&p->opt[1]);\n++    }\n++  }\n++  lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);\n++\n++  if (lenEnd < 2)\n++  {\n++    *backRes = p->opt[1].backPrev;\n++    return 1;\n++  }\n++\n++  p->opt[1].posPrev = 0;\n++  for (i = 0; i < LZMA_NUM_REPS; i++)\n++    p->opt[0].backs[i] = reps[i];\n++\n++  len = lenEnd;\n++  do\n++    p->opt[len--].price = kInfinityPrice;\n++  while (len >= 2);\n++\n++  for (i = 0; i < LZMA_NUM_REPS; i++)\n++  {\n++    UInt32 repLen = repLens[i];\n++    UInt32 price;\n++    if (repLen < 2)\n++      continue;\n++    price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);\n++    do\n++    {\n++      UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];\n++      COptimal *opt = &p->opt[repLen];\n++      if (curAndLenPrice < opt->price)\n++      {\n++        opt->price = curAndLenPrice;\n++        opt->posPrev = 0;\n++        opt->backPrev = i;\n++        opt->prev1IsChar = False;\n++      }\n++    }\n++    while (--repLen >= 2);\n++  }\n++\n++  normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);\n++\n++  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);\n++  if (len <= mainLen)\n++  {\n++    UInt32 offs = 0;\n++    while (len > matches[offs])\n++      offs += 2;\n++    for (; ; len++)\n++    {\n++      COptimal *opt;\n++      UInt32 distance = matches[offs + 1];\n++\n++      UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];\n++      UInt32 lenToPosState = GetLenToPosState(len);\n++      if (distance < kNumFullDistances)\n++        curAndLenPrice += p->distancesPrices[lenToPosState][distance];\n++      else\n++      {\n++        UInt32 slot;\n++        GetPosSlot2(distance, slot);\n++        curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];\n++      }\n++      opt = &p->opt[len];\n++      if (curAndLenPrice < opt->price)\n++      {\n++        opt->price = curAndLenPrice;\n++        opt->posPrev = 0;\n++        opt->backPrev = distance + LZMA_NUM_REPS;\n++        opt->prev1IsChar = False;\n++      }\n++      if (len == matches[offs])\n++      {\n++        offs += 2;\n++        if (offs == numPairs)\n++          break;\n++      }\n++    }\n++  }\n++\n++  cur = 0;\n++\n++    #ifdef SHOW_STAT2\n++    if (position >= 0)\n++    {\n++      unsigned i;\n++      printf(\"\\n pos = %4X\", position);\n++      for (i = cur; i <= lenEnd; i++)\n++      printf(\"\\nprice[%4X] = %d\", position - cur + i, p->opt[i].price);\n++    }\n++    #endif\n++\n++  for (;;)\n++  {\n++    UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;\n++    UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;\n++    Bool nextIsChar;\n++    Byte curByte, matchByte;\n++    const Byte *data;\n++    COptimal *curOpt;\n++    COptimal *nextOpt;\n++\n++    cur++;\n++    if (cur == lenEnd)\n++      return Backward(p, backRes, cur);\n++\n++    newLen = ReadMatchDistances(p, &numPairs);\n++    if (newLen >= p->numFastBytes)\n++    {\n++      p->numPairs = numPairs;\n++      p->longestMatchLength = newLen;\n++      return Backward(p, backRes, cur);\n++    }\n++    position++;\n++    curOpt = &p->opt[cur];\n++    posPrev = curOpt->posPrev;\n++    if (curOpt->prev1IsChar)\n++    {\n++      posPrev--;\n++      if (curOpt->prev2)\n++      {\n++        state = p->opt[curOpt->posPrev2].state;\n++        if (curOpt->backPrev2 < LZMA_NUM_REPS)\n++          state = kRepNextStates[state];\n++        else\n++          state = kMatchNextStates[state];\n++      }\n++      else\n++        state = p->opt[posPrev].state;\n++      state = kLiteralNextStates[state];\n++    }\n++    else\n++      state = p->opt[posPrev].state;\n++    if (posPrev == cur - 1)\n++    {\n++      if (IsShortRep(curOpt))\n++        state = kShortRepNextStates[state];\n++      else\n++        state = kLiteralNextStates[state];\n++    }\n++    else\n++    {\n++      UInt32 pos;\n++      const COptimal *prevOpt;\n++      if (curOpt->prev1IsChar && curOpt->prev2)\n++      {\n++        posPrev = curOpt->posPrev2;\n++        pos = curOpt->backPrev2;\n++        state = kRepNextStates[state];\n++      }\n++      else\n++      {\n++        pos = curOpt->backPrev;\n++        if (pos < LZMA_NUM_REPS)\n++          state = kRepNextStates[state];\n++        else\n++          state = kMatchNextStates[state];\n++      }\n++      prevOpt = &p->opt[posPrev];\n++      if (pos < LZMA_NUM_REPS)\n++      {\n++        UInt32 i;\n++        reps[0] = prevOpt->backs[pos];\n++        for (i = 1; i <= pos; i++)\n++          reps[i] = prevOpt->backs[i - 1];\n++        for (; i < LZMA_NUM_REPS; i++)\n++          reps[i] = prevOpt->backs[i];\n++      }\n++      else\n++      {\n++        UInt32 i;\n++        reps[0] = (pos - LZMA_NUM_REPS);\n++        for (i = 1; i < LZMA_NUM_REPS; i++)\n++          reps[i] = prevOpt->backs[i - 1];\n++      }\n++    }\n++    curOpt->state = (CState)state;\n++\n++    curOpt->backs[0] = reps[0];\n++    curOpt->backs[1] = reps[1];\n++    curOpt->backs[2] = reps[2];\n++    curOpt->backs[3] = reps[3];\n++\n++    curPrice = curOpt->price;\n++    nextIsChar = False;\n++    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n++    curByte = *data;\n++    matchByte = *(data - (reps[0] + 1));\n++\n++    posState = (position & p->pbMask);\n++\n++    curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);\n++    {\n++      const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));\n++      curAnd1Price +=\n++        (!IsCharState(state) ?\n++          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :\n++          LitEnc_GetPrice(probs, curByte, p->ProbPrices));\n++    }\n++\n++    nextOpt = &p->opt[cur + 1];\n++\n++    if (curAnd1Price < nextOpt->price)\n++    {\n++      nextOpt->price = curAnd1Price;\n++      nextOpt->posPrev = cur;\n++      MakeAsChar(nextOpt);\n++      nextIsChar = True;\n++    }\n++\n++    matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);\n++    repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);\n++\n++    if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))\n++    {\n++      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);\n++      if (shortRepPrice <= nextOpt->price)\n++      {\n++        nextOpt->price = shortRepPrice;\n++        nextOpt->posPrev = cur;\n++        MakeAsShortRep(nextOpt);\n++        nextIsChar = True;\n++      }\n++    }\n++    numAvailFull = p->numAvail;\n++    {\n++      UInt32 temp = kNumOpts - 1 - cur;\n++      if (temp < numAvailFull)\n++        numAvailFull = temp;\n++    }\n++\n++    if (numAvailFull < 2)\n++      continue;\n++    numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);\n++\n++    if (!nextIsChar && matchByte != curByte) /* speed optimization */\n++    {\n++      /* try Literal + rep0 */\n++      UInt32 temp;\n++      UInt32 lenTest2;\n++      const Byte *data2 = data - (reps[0] + 1);\n++      UInt32 limit = p->numFastBytes + 1;\n++      if (limit > numAvailFull)\n++        limit = numAvailFull;\n++\n++      for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);\n++      lenTest2 = temp - 1;\n++      if (lenTest2 >= 2)\n++      {\n++        UInt32 state2 = kLiteralNextStates[state];\n++        UInt32 posStateNext = (position + 1) & p->pbMask;\n++        UInt32 nextRepMatchPrice = curAnd1Price +\n++            GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n++            GET_PRICE_1(p->isRep[state2]);\n++        /* for (; lenTest2 >= 2; lenTest2--) */\n++        {\n++          UInt32 curAndLenPrice;\n++          COptimal *opt;\n++          UInt32 offset = cur + 1 + lenTest2;\n++          while (lenEnd < offset)\n++            p->opt[++lenEnd].price = kInfinityPrice;\n++          curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n++          opt = &p->opt[offset];\n++          if (curAndLenPrice < opt->price)\n++          {\n++            opt->price = curAndLenPrice;\n++            opt->posPrev = cur + 1;\n++            opt->backPrev = 0;\n++            opt->prev1IsChar = True;\n++            opt->prev2 = False;\n++          }\n++        }\n++      }\n++    }\n++\n++    startLen = 2; /* speed optimization */\n++    {\n++    UInt32 repIndex;\n++    for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)\n++    {\n++      UInt32 lenTest;\n++      UInt32 lenTestTemp;\n++      UInt32 price;\n++      const Byte *data2 = data - (reps[repIndex] + 1);\n++      if (data[0] != data2[0] || data[1] != data2[1])\n++        continue;\n++      for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);\n++      while (lenEnd < cur + lenTest)\n++        p->opt[++lenEnd].price = kInfinityPrice;\n++      lenTestTemp = lenTest;\n++      price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);\n++      do\n++      {\n++        UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];\n++        COptimal *opt = &p->opt[cur + lenTest];\n++        if (curAndLenPrice < opt->price)\n++        {\n++          opt->price = curAndLenPrice;\n++          opt->posPrev = cur;\n++          opt->backPrev = repIndex;\n++          opt->prev1IsChar = False;\n++        }\n++      }\n++      while (--lenTest >= 2);\n++      lenTest = lenTestTemp;\n++\n++      if (repIndex == 0)\n++        startLen = lenTest + 1;\n++\n++      /* if (_maxMode) */\n++        {\n++          UInt32 lenTest2 = lenTest + 1;\n++          UInt32 limit = lenTest2 + p->numFastBytes;\n++          UInt32 nextRepMatchPrice;\n++          if (limit > numAvailFull)\n++            limit = numAvailFull;\n++          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);\n++          lenTest2 -= lenTest + 1;\n++          if (lenTest2 >= 2)\n++          {\n++            UInt32 state2 = kRepNextStates[state];\n++            UInt32 posStateNext = (position + lenTest) & p->pbMask;\n++            UInt32 curAndLenCharPrice =\n++                price + p->repLenEnc.prices[posState][lenTest - 2] +\n++                GET_PRICE_0(p->isMatch[state2][posStateNext]) +\n++                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),\n++                    data[lenTest], data2[lenTest], p->ProbPrices);\n++            state2 = kLiteralNextStates[state2];\n++            posStateNext = (position + lenTest + 1) & p->pbMask;\n++            nextRepMatchPrice = curAndLenCharPrice +\n++                GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n++                GET_PRICE_1(p->isRep[state2]);\n++\n++            /* for (; lenTest2 >= 2; lenTest2--) */\n++            {\n++              UInt32 curAndLenPrice;\n++              COptimal *opt;\n++              UInt32 offset = cur + lenTest + 1 + lenTest2;\n++              while (lenEnd < offset)\n++                p->opt[++lenEnd].price = kInfinityPrice;\n++              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n++              opt = &p->opt[offset];\n++              if (curAndLenPrice < opt->price)\n++              {\n++                opt->price = curAndLenPrice;\n++                opt->posPrev = cur + lenTest + 1;\n++                opt->backPrev = 0;\n++                opt->prev1IsChar = True;\n++                opt->prev2 = True;\n++                opt->posPrev2 = cur;\n++                opt->backPrev2 = repIndex;\n++              }\n++            }\n++          }\n++        }\n++    }\n++    }\n++    /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */\n++    if (newLen > numAvail)\n++    {\n++      newLen = numAvail;\n++      for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);\n++      matches[numPairs] = newLen;\n++      numPairs += 2;\n++    }\n++    if (newLen >= startLen)\n++    {\n++      UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);\n++      UInt32 offs, curBack, posSlot;\n++      UInt32 lenTest;\n++      while (lenEnd < cur + newLen)\n++        p->opt[++lenEnd].price = kInfinityPrice;\n++\n++      offs = 0;\n++      while (startLen > matches[offs])\n++        offs += 2;\n++      curBack = matches[offs + 1];\n++      GetPosSlot2(curBack, posSlot);\n++      for (lenTest = /*2*/ startLen; ; lenTest++)\n++      {\n++        UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];\n++        UInt32 lenToPosState = GetLenToPosState(lenTest);\n++        COptimal *opt;\n++        if (curBack < kNumFullDistances)\n++          curAndLenPrice += p->distancesPrices[lenToPosState][curBack];\n++        else\n++          curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];\n++\n++        opt = &p->opt[cur + lenTest];\n++        if (curAndLenPrice < opt->price)\n++        {\n++          opt->price = curAndLenPrice;\n++          opt->posPrev = cur;\n++          opt->backPrev = curBack + LZMA_NUM_REPS;\n++          opt->prev1IsChar = False;\n++        }\n++\n++        if (/*_maxMode && */lenTest == matches[offs])\n++        {\n++          /* Try Match + Literal + Rep0 */\n++          const Byte *data2 = data - (curBack + 1);\n++          UInt32 lenTest2 = lenTest + 1;\n++          UInt32 limit = lenTest2 + p->numFastBytes;\n++          UInt32 nextRepMatchPrice;\n++          if (limit > numAvailFull)\n++            limit = numAvailFull;\n++          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);\n++          lenTest2 -= lenTest + 1;\n++          if (lenTest2 >= 2)\n++          {\n++            UInt32 state2 = kMatchNextStates[state];\n++            UInt32 posStateNext = (position + lenTest) & p->pbMask;\n++            UInt32 curAndLenCharPrice = curAndLenPrice +\n++                GET_PRICE_0(p->isMatch[state2][posStateNext]) +\n++                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),\n++                    data[lenTest], data2[lenTest], p->ProbPrices);\n++            state2 = kLiteralNextStates[state2];\n++            posStateNext = (posStateNext + 1) & p->pbMask;\n++            nextRepMatchPrice = curAndLenCharPrice +\n++                GET_PRICE_1(p->isMatch[state2][posStateNext]) +\n++                GET_PRICE_1(p->isRep[state2]);\n++\n++            /* for (; lenTest2 >= 2; lenTest2--) */\n++            {\n++              UInt32 offset = cur + lenTest + 1 + lenTest2;\n++              UInt32 curAndLenPrice;\n++              COptimal *opt;\n++              while (lenEnd < offset)\n++                p->opt[++lenEnd].price = kInfinityPrice;\n++              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);\n++              opt = &p->opt[offset];\n++              if (curAndLenPrice < opt->price)\n++              {\n++                opt->price = curAndLenPrice;\n++                opt->posPrev = cur + lenTest + 1;\n++                opt->backPrev = 0;\n++                opt->prev1IsChar = True;\n++                opt->prev2 = True;\n++                opt->posPrev2 = cur;\n++                opt->backPrev2 = curBack + LZMA_NUM_REPS;\n++              }\n++            }\n++          }\n++          offs += 2;\n++          if (offs == numPairs)\n++            break;\n++          curBack = matches[offs + 1];\n++          if (curBack >= kNumFullDistances)\n++            GetPosSlot2(curBack, posSlot);\n++        }\n++      }\n++    }\n++  }\n++}\n++\n++#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))\n++\n++static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)\n++{\n++  UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;\n++  const Byte *data;\n++  const UInt32 *matches;\n++\n++  if (p->additionalOffset == 0)\n++    mainLen = ReadMatchDistances(p, &numPairs);\n++  else\n++  {\n++    mainLen = p->longestMatchLength;\n++    numPairs = p->numPairs;\n++  }\n++\n++  numAvail = p->numAvail;\n++  *backRes = (UInt32)-1;\n++  if (numAvail < 2)\n++    return 1;\n++  if (numAvail > LZMA_MATCH_LEN_MAX)\n++    numAvail = LZMA_MATCH_LEN_MAX;\n++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n++\n++  repLen = repIndex = 0;\n++  for (i = 0; i < LZMA_NUM_REPS; i++)\n++  {\n++    UInt32 len;\n++    const Byte *data2 = data - (p->reps[i] + 1);\n++    if (data[0] != data2[0] || data[1] != data2[1])\n++      continue;\n++    for (len = 2; len < numAvail && data[len] == data2[len]; len++);\n++    if (len >= p->numFastBytes)\n++    {\n++      *backRes = i;\n++      MovePos(p, len - 1);\n++      return len;\n++    }\n++    if (len > repLen)\n++    {\n++      repIndex = i;\n++      repLen = len;\n++    }\n++  }\n++\n++  matches = p->matches;\n++  if (mainLen >= p->numFastBytes)\n++  {\n++    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;\n++    MovePos(p, mainLen - 1);\n++    return mainLen;\n++  }\n++\n++  mainDist = 0; /* for GCC */\n++  if (mainLen >= 2)\n++  {\n++    mainDist = matches[numPairs - 1];\n++    while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)\n++    {\n++      if (!ChangePair(matches[numPairs - 3], mainDist))\n++        break;\n++      numPairs -= 2;\n++      mainLen = matches[numPairs - 2];\n++      mainDist = matches[numPairs - 1];\n++    }\n++    if (mainLen == 2 && mainDist >= 0x80)\n++      mainLen = 1;\n++  }\n++\n++  if (repLen >= 2 && (\n++        (repLen + 1 >= mainLen) ||\n++        (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||\n++        (repLen + 3 >= mainLen && mainDist >= (1 << 15))))\n++  {\n++    *backRes = repIndex;\n++    MovePos(p, repLen - 1);\n++    return repLen;\n++  }\n++\n++  if (mainLen < 2 || numAvail <= 2)\n++    return 1;\n++\n++  p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);\n++  if (p->longestMatchLength >= 2)\n++  {\n++    UInt32 newDistance = matches[p->numPairs - 1];\n++    if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||\n++        (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||\n++        (p->longestMatchLength > mainLen + 1) ||\n++        (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))\n++      return 1;\n++  }\n++\n++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;\n++  for (i = 0; i < LZMA_NUM_REPS; i++)\n++  {\n++    UInt32 len, limit;\n++    const Byte *data2 = data - (p->reps[i] + 1);\n++    if (data[0] != data2[0] || data[1] != data2[1])\n++      continue;\n++    limit = mainLen - 1;\n++    for (len = 2; len < limit && data[len] == data2[len]; len++);\n++    if (len >= limit)\n++      return 1;\n++  }\n++  *backRes = mainDist + LZMA_NUM_REPS;\n++  MovePos(p, mainLen - 2);\n++  return mainLen;\n++}\n++\n++static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)\n++{\n++  UInt32 len;\n++  RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);\n++  RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);\n++  p->state = kMatchNextStates[p->state];\n++  len = LZMA_MATCH_LEN_MIN;\n++  LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n++  RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);\n++  RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);\n++  RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);\n++}\n++\n++static SRes CheckErrors(CLzmaEnc *p)\n++{\n++  if (p->result != SZ_OK)\n++    return p->result;\n++  if (p->rc.res != SZ_OK)\n++    p->result = SZ_ERROR_WRITE;\n++  if (p->matchFinderBase.result != SZ_OK)\n++    p->result = SZ_ERROR_READ;\n++  if (p->result != SZ_OK)\n++    p->finished = True;\n++  return p->result;\n++}\n++\n++static SRes Flush(CLzmaEnc *p, UInt32 nowPos)\n++{\n++  /* ReleaseMFStream(); */\n++  p->finished = True;\n++  if (p->writeEndMark)\n++    WriteEndMarker(p, nowPos & p->pbMask);\n++  RangeEnc_FlushData(&p->rc);\n++  RangeEnc_FlushStream(&p->rc);\n++  return CheckErrors(p);\n++}\n++\n++static void FillAlignPrices(CLzmaEnc *p)\n++{\n++  UInt32 i;\n++  for (i = 0; i < kAlignTableSize; i++)\n++    p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);\n++  p->alignPriceCount = 0;\n++}\n++\n++static void FillDistancesPrices(CLzmaEnc *p)\n++{\n++  UInt32 tempPrices[kNumFullDistances];\n++  UInt32 i, lenToPosState;\n++  for (i = kStartPosModelIndex; i < kNumFullDistances; i++)\n++  {\n++    UInt32 posSlot = GetPosSlot1(i);\n++    UInt32 footerBits = ((posSlot >> 1) - 1);\n++    UInt32 base = ((2 | (posSlot & 1)) << footerBits);\n++    tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);\n++  }\n++\n++  for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)\n++  {\n++    UInt32 posSlot;\n++    const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];\n++    UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];\n++    for (posSlot = 0; posSlot < p->distTableSize; posSlot++)\n++      posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);\n++    for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)\n++      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);\n++\n++    {\n++      UInt32 *distancesPrices = p->distancesPrices[lenToPosState];\n++      UInt32 i;\n++      for (i = 0; i < kStartPosModelIndex; i++)\n++        distancesPrices[i] = posSlotPrices[i];\n++      for (; i < kNumFullDistances; i++)\n++        distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];\n++    }\n++  }\n++  p->matchPriceCount = 0;\n++}\n++\n++void LzmaEnc_Construct(CLzmaEnc *p)\n++{\n++  RangeEnc_Construct(&p->rc);\n++  MatchFinder_Construct(&p->matchFinderBase);\n++  #ifndef _7ZIP_ST\n++  MatchFinderMt_Construct(&p->matchFinderMt);\n++  p->matchFinderMt.MatchFinder = &p->matchFinderBase;\n++  #endif\n++\n++  {\n++    CLzmaEncProps props;\n++    LzmaEncProps_Init(&props);\n++    LzmaEnc_SetProps(p, &props);\n++  }\n++\n++  #ifndef LZMA_LOG_BSR\n++  LzmaEnc_FastPosInit(p->g_FastPos);\n++  #endif\n++\n++  LzmaEnc_InitPriceTables(p->ProbPrices);\n++  p->litProbs = 0;\n++  p->saveState.litProbs = 0;\n++}\n++\n++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)\n++{\n++  void *p;\n++  p = alloc->Alloc(alloc, sizeof(CLzmaEnc));\n++  if (p != 0)\n++    LzmaEnc_Construct((CLzmaEnc *)p);\n++  return p;\n++}\n++\n++void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)\n++{\n++  alloc->Free(alloc, p->litProbs);\n++  alloc->Free(alloc, p->saveState.litProbs);\n++  p->litProbs = 0;\n++  p->saveState.litProbs = 0;\n++}\n++\n++void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  #ifndef _7ZIP_ST\n++  MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);\n++  #endif\n++  MatchFinder_Free(&p->matchFinderBase, allocBig);\n++  LzmaEnc_FreeLits(p, alloc);\n++  RangeEnc_Free(&p->rc, alloc);\n++}\n++\n++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);\n++  alloc->Free(alloc, p);\n++}\n++\n++static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)\n++{\n++  UInt32 nowPos32, startPos32;\n++  if (p->needInit)\n++  {\n++    p->matchFinder.Init(p->matchFinderObj);\n++    p->needInit = 0;\n++  }\n++\n++  if (p->finished)\n++    return p->result;\n++  RINOK(CheckErrors(p));\n++\n++  nowPos32 = (UInt32)p->nowPos64;\n++  startPos32 = nowPos32;\n++\n++  if (p->nowPos64 == 0)\n++  {\n++    UInt32 numPairs;\n++    Byte curByte;\n++    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)\n++      return Flush(p, nowPos32);\n++    ReadMatchDistances(p, &numPairs);\n++    RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);\n++    p->state = kLiteralNextStates[p->state];\n++    curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);\n++    LitEnc_Encode(&p->rc, p->litProbs, curByte);\n++    p->additionalOffset--;\n++    nowPos32++;\n++  }\n++\n++  if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)\n++  for (;;)\n++  {\n++    UInt32 pos, len, posState;\n++\n++    if (p->fastMode)\n++      len = GetOptimumFast(p, &pos);\n++    else\n++      len = GetOptimum(p, nowPos32, &pos);\n++\n++    #ifdef SHOW_STAT2\n++    printf(\"\\n pos = %4X,   len = %d   pos = %d\", nowPos32, len, pos);\n++    #endif\n++\n++    posState = nowPos32 & p->pbMask;\n++    if (len == 1 && pos == (UInt32)-1)\n++    {\n++      Byte curByte;\n++      CLzmaProb *probs;\n++      const Byte *data;\n++\n++      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);\n++      data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;\n++      curByte = *data;\n++      probs = LIT_PROBS(nowPos32, *(data - 1));\n++      if (IsCharState(p->state))\n++        LitEnc_Encode(&p->rc, probs, curByte);\n++      else\n++        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));\n++      p->state = kLiteralNextStates[p->state];\n++    }\n++    else\n++    {\n++      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);\n++      if (pos < LZMA_NUM_REPS)\n++      {\n++        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);\n++        if (pos == 0)\n++        {\n++          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);\n++          RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));\n++        }\n++        else\n++        {\n++          UInt32 distance = p->reps[pos];\n++          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);\n++          if (pos == 1)\n++            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);\n++          else\n++          {\n++            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);\n++            RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);\n++            if (pos == 3)\n++              p->reps[3] = p->reps[2];\n++            p->reps[2] = p->reps[1];\n++          }\n++          p->reps[1] = p->reps[0];\n++          p->reps[0] = distance;\n++        }\n++        if (len == 1)\n++          p->state = kShortRepNextStates[p->state];\n++        else\n++        {\n++          LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n++          p->state = kRepNextStates[p->state];\n++        }\n++      }\n++      else\n++      {\n++        UInt32 posSlot;\n++        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);\n++        p->state = kMatchNextStates[p->state];\n++        LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);\n++        pos -= LZMA_NUM_REPS;\n++        GetPosSlot(pos, posSlot);\n++        RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);\n++\n++        if (posSlot >= kStartPosModelIndex)\n++        {\n++          UInt32 footerBits = ((posSlot >> 1) - 1);\n++          UInt32 base = ((2 | (posSlot & 1)) << footerBits);\n++          UInt32 posReduced = pos - base;\n++\n++          if (posSlot < kEndPosModelIndex)\n++            RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);\n++          else\n++          {\n++            RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);\n++            RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);\n++            p->alignPriceCount++;\n++          }\n++        }\n++        p->reps[3] = p->reps[2];\n++        p->reps[2] = p->reps[1];\n++        p->reps[1] = p->reps[0];\n++        p->reps[0] = pos;\n++        p->matchPriceCount++;\n++      }\n++    }\n++    p->additionalOffset -= len;\n++    nowPos32 += len;\n++    if (p->additionalOffset == 0)\n++    {\n++      UInt32 processed;\n++      if (!p->fastMode)\n++      {\n++        if (p->matchPriceCount >= (1 << 7))\n++          FillDistancesPrices(p);\n++        if (p->alignPriceCount >= kAlignTableSize)\n++          FillAlignPrices(p);\n++      }\n++      if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)\n++        break;\n++      processed = nowPos32 - startPos32;\n++      if (useLimits)\n++      {\n++        if (processed + kNumOpts + 300 >= maxUnpackSize ||\n++            RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)\n++          break;\n++      }\n++      else if (processed >= (1 << 15))\n++      {\n++        p->nowPos64 += nowPos32 - startPos32;\n++        return CheckErrors(p);\n++      }\n++    }\n++  }\n++  p->nowPos64 += nowPos32 - startPos32;\n++  return Flush(p, nowPos32);\n++}\n++\n++#define kBigHashDicLimit ((UInt32)1 << 24)\n++\n++static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  UInt32 beforeSize = kNumOpts;\n++  Bool btMode;\n++  if (!RangeEnc_Alloc(&p->rc, alloc))\n++    return SZ_ERROR_MEM;\n++  btMode = (p->matchFinderBase.btMode != 0);\n++  #ifndef _7ZIP_ST\n++  p->mtMode = (p->multiThread && !p->fastMode && btMode);\n++  #endif\n++\n++  {\n++    unsigned lclp = p->lc + p->lp;\n++    if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)\n++    {\n++      LzmaEnc_FreeLits(p, alloc);\n++      p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));\n++      p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));\n++      if (p->litProbs == 0 || p->saveState.litProbs == 0)\n++      {\n++        LzmaEnc_FreeLits(p, alloc);\n++        return SZ_ERROR_MEM;\n++      }\n++      p->lclp = lclp;\n++    }\n++  }\n++\n++  p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);\n++\n++  if (beforeSize + p->dictSize < keepWindowSize)\n++    beforeSize = keepWindowSize - p->dictSize;\n++\n++  #ifndef _7ZIP_ST\n++  if (p->mtMode)\n++  {\n++    RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));\n++    p->matchFinderObj = &p->matchFinderMt;\n++    MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);\n++  }\n++  else\n++  #endif\n++  {\n++    if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))\n++      return SZ_ERROR_MEM;\n++    p->matchFinderObj = &p->matchFinderBase;\n++    MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);\n++  }\n++  return SZ_OK;\n++}\n++\n++void LzmaEnc_Init(CLzmaEnc *p)\n++{\n++  UInt32 i;\n++  p->state = 0;\n++  for (i = 0 ; i < LZMA_NUM_REPS; i++)\n++    p->reps[i] = 0;\n++\n++  RangeEnc_Init(&p->rc);\n++\n++\n++  for (i = 0; i < kNumStates; i++)\n++  {\n++    UInt32 j;\n++    for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)\n++    {\n++      p->isMatch[i][j] = kProbInitValue;\n++      p->isRep0Long[i][j] = kProbInitValue;\n++    }\n++    p->isRep[i] = kProbInitValue;\n++    p->isRepG0[i] = kProbInitValue;\n++    p->isRepG1[i] = kProbInitValue;\n++    p->isRepG2[i] = kProbInitValue;\n++  }\n++\n++  {\n++    UInt32 num = 0x300 << (p->lp + p->lc);\n++    for (i = 0; i < num; i++)\n++      p->litProbs[i] = kProbInitValue;\n++  }\n++\n++  {\n++    for (i = 0; i < kNumLenToPosStates; i++)\n++    {\n++      CLzmaProb *probs = p->posSlotEncoder[i];\n++      UInt32 j;\n++      for (j = 0; j < (1 << kNumPosSlotBits); j++)\n++        probs[j] = kProbInitValue;\n++    }\n++  }\n++  {\n++    for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)\n++      p->posEncoders[i] = kProbInitValue;\n++  }\n++\n++  LenEnc_Init(&p->lenEnc.p);\n++  LenEnc_Init(&p->repLenEnc.p);\n++\n++  for (i = 0; i < (1 << kNumAlignBits); i++)\n++    p->posAlignEncoder[i] = kProbInitValue;\n++\n++  p->optimumEndIndex = 0;\n++  p->optimumCurrentIndex = 0;\n++  p->additionalOffset = 0;\n++\n++  p->pbMask = (1 << p->pb) - 1;\n++  p->lpMask = (1 << p->lp) - 1;\n++}\n++\n++void LzmaEnc_InitPrices(CLzmaEnc *p)\n++{\n++  if (!p->fastMode)\n++  {\n++    FillDistancesPrices(p);\n++    FillAlignPrices(p);\n++  }\n++\n++  p->lenEnc.tableSize =\n++  p->repLenEnc.tableSize =\n++      p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;\n++  LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);\n++  LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);\n++}\n++\n++static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  UInt32 i;\n++  for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)\n++    if (p->dictSize <= ((UInt32)1 << i))\n++      break;\n++  p->distTableSize = i * 2;\n++\n++  p->finished = False;\n++  p->result = SZ_OK;\n++  RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));\n++  LzmaEnc_Init(p);\n++  LzmaEnc_InitPrices(p);\n++  p->nowPos64 = 0;\n++  return SZ_OK;\n++}\n++\n++static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,\n++    ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  p->matchFinderBase.stream = inStream;\n++  p->needInit = 1;\n++  p->rc.outStream = outStream;\n++  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);\n++}\n++\n++SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,\n++    ISeqInStream *inStream, UInt32 keepWindowSize,\n++    ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  p->matchFinderBase.stream = inStream;\n++  p->needInit = 1;\n++  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n++}\n++\n++static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)\n++{\n++  p->matchFinderBase.directInput = 1;\n++  p->matchFinderBase.bufferBase = (Byte *)src;\n++  p->matchFinderBase.directInputRem = srcLen;\n++}\n++\n++SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,\n++    UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  LzmaEnc_SetInputBuf(p, src, srcLen);\n++  p->needInit = 1;\n++\n++  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);\n++}\n++\n++void LzmaEnc_Finish(CLzmaEncHandle pp)\n++{\n++  #ifndef _7ZIP_ST\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  if (p->mtMode)\n++    MatchFinderMt_ReleaseStream(&p->matchFinderMt);\n++  #else\n++  pp = pp;\n++  #endif\n++}\n++\n++typedef struct\n++{\n++  ISeqOutStream funcTable;\n++  Byte *data;\n++  SizeT rem;\n++  Bool overflow;\n++} CSeqOutStreamBuf;\n++\n++static size_t MyWrite(void *pp, const void *data, size_t size)\n++{\n++  CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;\n++  if (p->rem < size)\n++  {\n++    size = p->rem;\n++    p->overflow = True;\n++  }\n++  memcpy(p->data, data, size);\n++  p->rem -= size;\n++  p->data += size;\n++  return size;\n++}\n++\n++\n++UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)\n++{\n++  const CLzmaEnc *p = (CLzmaEnc *)pp;\n++  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);\n++}\n++\n++const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)\n++{\n++  const CLzmaEnc *p = (CLzmaEnc *)pp;\n++  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;\n++}\n++\n++SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,\n++    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  UInt64 nowPos64;\n++  SRes res;\n++  CSeqOutStreamBuf outStream;\n++\n++  outStream.funcTable.Write = MyWrite;\n++  outStream.data = dest;\n++  outStream.rem = *destLen;\n++  outStream.overflow = False;\n++\n++  p->writeEndMark = False;\n++  p->finished = False;\n++  p->result = SZ_OK;\n++\n++  if (reInit)\n++    LzmaEnc_Init(p);\n++  LzmaEnc_InitPrices(p);\n++  nowPos64 = p->nowPos64;\n++  RangeEnc_Init(&p->rc);\n++  p->rc.outStream = &outStream.funcTable;\n++\n++  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);\n++\n++  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);\n++  *destLen -= outStream.rem;\n++  if (outStream.overflow)\n++    return SZ_ERROR_OUTPUT_EOF;\n++\n++  return res;\n++}\n++\n++static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)\n++{\n++  SRes res = SZ_OK;\n++\n++  #ifndef _7ZIP_ST\n++  Byte allocaDummy[0x300];\n++  int i = 0;\n++  for (i = 0; i < 16; i++)\n++    allocaDummy[i] = (Byte)i;\n++  #endif\n++\n++  for (;;)\n++  {\n++    res = LzmaEnc_CodeOneBlock(p, False, 0, 0);\n++    if (res != SZ_OK || p->finished != 0)\n++      break;\n++    if (progress != 0)\n++    {\n++      res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));\n++      if (res != SZ_OK)\n++      {\n++        res = SZ_ERROR_PROGRESS;\n++        break;\n++      }\n++    }\n++  }\n++  LzmaEnc_Finish(p);\n++  return res;\n++}\n++\n++SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,\n++    ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));\n++  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);\n++}\n++\n++SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++  int i;\n++  UInt32 dictSize = p->dictSize;\n++  if (*size < LZMA_PROPS_SIZE)\n++    return SZ_ERROR_PARAM;\n++  *size = LZMA_PROPS_SIZE;\n++  props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);\n++\n++  for (i = 11; i <= 30; i++)\n++  {\n++    if (dictSize <= ((UInt32)2 << i))\n++    {\n++      dictSize = (2 << i);\n++      break;\n++    }\n++    if (dictSize <= ((UInt32)3 << i))\n++    {\n++      dictSize = (3 << i);\n++      break;\n++    }\n++  }\n++\n++  for (i = 0; i < 4; i++)\n++    props[1 + i] = (Byte)(dictSize >> (8 * i));\n++  return SZ_OK;\n++}\n++\n++SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n++    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  SRes res;\n++  CLzmaEnc *p = (CLzmaEnc *)pp;\n++\n++  CSeqOutStreamBuf outStream;\n++\n++  LzmaEnc_SetInputBuf(p, src, srcLen);\n++\n++  outStream.funcTable.Write = MyWrite;\n++  outStream.data = dest;\n++  outStream.rem = *destLen;\n++  outStream.overflow = False;\n++\n++  p->writeEndMark = writeEndMark;\n++\n++  p->rc.outStream = &outStream.funcTable;\n++  res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);\n++  if (res == SZ_OK)\n++    res = LzmaEnc_Encode2(p, progress);\n++\n++  *destLen -= outStream.rem;\n++  if (outStream.overflow)\n++    return SZ_ERROR_OUTPUT_EOF;\n++  return res;\n++}\n++\n++SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,\n++    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,\n++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)\n++{\n++  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);\n++  SRes res;\n++  if (p == 0)\n++    return SZ_ERROR_MEM;\n++\n++  res = LzmaEnc_SetProps(p, props);\n++  if (res == SZ_OK)\n++  {\n++    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);\n++    if (res == SZ_OK)\n++      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,\n++          writeEndMark, progress, alloc, allocBig);\n++  }\n++\n++  LzmaEnc_Destroy(p, alloc, allocBig);\n++  return res;\n++}\n+--- /dev/null\n++++ b/lib/lzma/Makefile\n+@@ -0,0 +1,7 @@\n++lzma_compress-objs := LzFind.o LzmaEnc.o\n++lzma_decompress-objs := LzmaDec.o\n++\n++obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o\n++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o\n++\n++EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h\ndiff --git a/target/linux/generic/pending-5.14/532-jffs2_eofdetect.patch b/target/linux/generic/pending-5.14/532-jffs2_eofdetect.patch\nnew file mode 100644\nindex 0000000000..a1d7dc1a69\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/532-jffs2_eofdetect.patch\n@@ -0,0 +1,65 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: fs: jffs2: EOF marker\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ fs/jffs2/build.c | 10 ++++++++++\n+ fs/jffs2/scan.c  | 21 +++++++++++++++++++--\n+ 2 files changed, 29 insertions(+), 2 deletions(-)\n+\n+--- a/fs/jffs2/build.c\n++++ b/fs/jffs2/build.c\n+@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct\n+ \tdbg_fsbuild(\"scanned flash completely\\n\");\n+ \tjffs2_dbg_dump_block_lists_nolock(c);\n+ \n++\tif (c->flags & (1 << 7)) {\n++\t\tprintk(\"%s(): unlocking the mtd device... \", __func__);\n++\t\tmtd_unlock(c->mtd, 0, c->mtd->size);\n++\t\tprintk(\"done.\\n\");\n++\n++\t\tprintk(\"%s(): erasing all blocks after the end marker... \", __func__);\n++\t\tjffs2_erase_pending_blocks(c, -1);\n++\t\tprintk(\"done.\\n\");\n++\t}\n++\n+ \tdbg_fsbuild(\"pass 1 starting\\n\");\n+ \tc->flags |= JFFS2_SB_FLAG_BUILDING;\n+ \t/* Now scan the directory tree, increasing nlink according to every dirent found. */\n+--- a/fs/jffs2/scan.c\n++++ b/fs/jffs2/scan.c\n+@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_in\n+ \t\t/* reset summary info for next eraseblock scan */\n+ \t\tjffs2_sum_reset_collected(s);\n+ \n+-\t\tret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),\n+-\t\t\t\t\t\tbuf_size, s);\n++\t\tif (c->flags & (1 << 7)) {\n++\t\t\tif (mtd_block_isbad(c->mtd, jeb->offset))\n++\t\t\t\tret = BLK_STATE_BADBLOCK;\n++\t\t\telse\n++\t\t\t\tret = BLK_STATE_ALLFF;\n++\t\t} else\n++\t\t\tret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),\n++\t\t\t\t\t\t\tbuf_size, s);\n+ \n+ \t\tif (ret < 0)\n+ \t\t\tgoto out;\n+@@ -565,6 +571,17 @@ full_scan:\n+ \t\t\treturn err;\n+ \t}\n+ \n++\tif ((buf[0] == 0xde) &&\n++\t\t(buf[1] == 0xad) &&\n++\t\t(buf[2] == 0xc0) &&\n++\t\t(buf[3] == 0xde)) {\n++\t\t/* end of filesystem. erase everything after this point */\n++\t\tprintk(\"%s(): End of filesystem marker found at 0x%x\\n\", __func__, jeb->offset);\n++\t\tc->flags |= (1 << 7);\n++\n++\t\treturn BLK_STATE_ALLFF;\n++\t}\n++\n+ \t/* We temporarily use 'ofs' as a pointer into the buffer/jeb */\n+ \tofs = 0;\n+ \tmax_ofs = EMPTY_SCAN_SIZE(c->sector_size);\ndiff --git a/target/linux/generic/pending-5.14/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-5.14/600-netfilter_conntrack_flush.patch\nnew file mode 100644\nindex 0000000000..f4b815c889\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/600-netfilter_conntrack_flush.patch\n@@ -0,0 +1,88 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: netfilter: add support for flushing conntrack via /proc\n+\n+lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++-\n+ 1 file changed, 58 insertions(+), 1 deletion(-)\n+\n+--- a/net/netfilter/nf_conntrack_standalone.c\n++++ b/net/netfilter/nf_conntrack_standalone.c\n+@@ -9,6 +9,7 @@\n+ #include <linux/percpu.h>\n+ #include <linux/netdevice.h>\n+ #include <linux/security.h>\n++#include <linux/inet.h>\n+ #include <net/net_namespace.h>\n+ #ifdef CONFIG_SYSCTL\n+ #include <linux/sysctl.h>\n+@@ -459,6 +460,56 @@ static int ct_cpu_seq_show(struct seq_fi\n+ \treturn 0;\n+ }\n+ \n++struct kill_request {\n++\tu16 family;\n++\tunion nf_inet_addr addr;\n++};\n++\n++static int kill_matching(struct nf_conn *i, void *data)\n++{\n++\tstruct kill_request *kr = data;\n++\tstruct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple;\n++\tstruct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple;\n++\n++\tif (!kr->family)\n++\t\treturn 1;\n++\n++\tif (t1->src.l3num != kr->family)\n++\t\treturn 0;\n++\n++\treturn (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) ||\n++\t        nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) ||\n++\t        nf_inet_addr_cmp(&kr->addr, &t2->src.u3) ||\n++\t        nf_inet_addr_cmp(&kr->addr, &t2->dst.u3));\n++}\n++\n++static int ct_file_write(struct file *file, char *buf, size_t count)\n++{\n++\tstruct seq_file *seq = file->private_data;\n++\tstruct net *net = seq_file_net(seq);\n++\tstruct kill_request kr = { };\n++\n++\tif (count == 0)\n++\t\treturn 0;\n++\n++\tif (count >= INET6_ADDRSTRLEN)\n++\t\tcount = INET6_ADDRSTRLEN - 1;\n++\n++\tif (strnchr(buf, count, ':')) {\n++\t\tkr.family = AF_INET6;\n++\t\tif (!in6_pton(buf, count, (void *)&kr.addr, '\\n', NULL))\n++\t\t\treturn -EINVAL;\n++\t} else if (strnchr(buf, count, '.')) {\n++\t\tkr.family = AF_INET;\n++\t\tif (!in4_pton(buf, count, (void *)&kr.addr, '\\n', NULL))\n++\t\t\treturn -EINVAL;\n++\t}\n++\n++\tnf_ct_iterate_cleanup_net(net, kill_matching, &kr, 0, 0);\n++\n++\treturn 0;\n++}\n++\n+ static const struct seq_operations ct_cpu_seq_ops = {\n+ \t.start\t= ct_cpu_seq_start,\n+ \t.next\t= ct_cpu_seq_next,\n+@@ -472,8 +523,9 @@ static int nf_conntrack_standalone_init_\n+ \tkuid_t root_uid;\n+ \tkgid_t root_gid;\n+ \n+-\tpde = proc_create_net(\"nf_conntrack\", 0440, net->proc_net, &ct_seq_ops,\n+-\t\t\tsizeof(struct ct_iter_state));\n++\tpde = proc_create_net_data_write(\"nf_conntrack\", 0440, net->proc_net,\n++\t\t\t\t\t &ct_seq_ops, &ct_file_write,\n++\t\t\t\t\t sizeof(struct ct_iter_state), NULL);\n+ \tif (!pde)\n+ \t\tgoto out_nf_conntrack;\n+ \ndiff --git a/target/linux/generic/pending-5.14/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-5.14/610-netfilter_match_bypass_default_checks.patch\nnew file mode 100644\nindex 0000000000..457703121c\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/610-netfilter_match_bypass_default_checks.patch\n@@ -0,0 +1,110 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/uapi/linux/netfilter_ipv4/ip_tables.h |  1 +\n+ net/ipv4/netfilter/ip_tables.c                | 37 +++++++++++++++++++++++++++\n+ 2 files changed, 38 insertions(+)\n+\n+--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h\n++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h\n+@@ -89,6 +89,7 @@ struct ipt_ip {\n+ #define IPT_F_FRAG\t\t0x01\t/* Set if rule is a fragment rule */\n+ #define IPT_F_GOTO\t\t0x02\t/* Set if jump is a goto */\n+ #define IPT_F_MASK\t\t0x03\t/* All possible flag bits mask. */\n++#define IPT_F_NO_DEF_MATCH\t0x80\t/* Internal: no default match rules present */\n+ \n+ /* Values for \"inv\" field in struct ipt_ip. */\n+ #define IPT_INV_VIA_IN\t\t0x01\t/* Invert the sense of IN IFACE. */\n+--- a/net/ipv4/netfilter/ip_tables.c\n++++ b/net/ipv4/netfilter/ip_tables.c\n+@@ -50,6 +50,9 @@ ip_packet_match(const struct iphdr *ip,\n+ {\n+ \tunsigned long ret;\n+ \n++\tif (ipinfo->flags & IPT_F_NO_DEF_MATCH)\n++\t\treturn true;\n++\n+ \tif (NF_INVF(ipinfo, IPT_INV_SRCIP,\n+ \t\t    (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||\n+ \t    NF_INVF(ipinfo, IPT_INV_DSTIP,\n+@@ -80,6 +83,29 @@ ip_packet_match(const struct iphdr *ip,\n+ \treturn true;\n+ }\n+ \n++static void\n++ip_checkdefault(struct ipt_ip *ip)\n++{\n++\tstatic const char iface_mask[IFNAMSIZ] = {};\n++\n++\tif (ip->invflags || ip->flags & IPT_F_FRAG)\n++\t\treturn;\n++\n++\tif (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)\n++\t\treturn;\n++\n++\tif (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)\n++\t\treturn;\n++\n++\tif (ip->smsk.s_addr || ip->dmsk.s_addr)\n++\t\treturn;\n++\n++\tif (ip->proto)\n++\t\treturn;\n++\n++\tip->flags |= IPT_F_NO_DEF_MATCH;\n++}\n++\n+ static bool\n+ ip_checkentry(const struct ipt_ip *ip)\n+ {\n+@@ -524,6 +550,8 @@ find_check_entry(struct ipt_entry *e, st\n+ \tstruct xt_mtchk_param mtpar;\n+ \tstruct xt_entry_match *ematch;\n+ \n++\tip_checkdefault(&e->ip);\n++\n+ \tif (!xt_percpu_counter_alloc(alloc_state, &e->counters))\n+ \t\treturn -ENOMEM;\n+ \n+@@ -818,6 +846,7 @@ copy_entries_to_user(unsigned int total_\n+ \tconst struct xt_table_info *private = table->private;\n+ \tint ret = 0;\n+ \tconst void *loc_cpu_entry;\n++\tu8 flags;\n+ \n+ \tcounters = alloc_counters(table);\n+ \tif (IS_ERR(counters))\n+@@ -845,6 +874,14 @@ copy_entries_to_user(unsigned int total_\n+ \t\t\tgoto free_counters;\n+ \t\t}\n+ \n++\t\tflags = e->ip.flags & IPT_F_MASK;\n++\t\tif (copy_to_user(userptr + off\n++\t\t\t\t + offsetof(struct ipt_entry, ip.flags),\n++\t\t\t\t &flags, sizeof(flags)) != 0) {\n++\t\t\tret = -EFAULT;\n++\t\t\tgoto free_counters;\n++\t\t}\n++\n+ \t\tfor (i = sizeof(struct ipt_entry);\n+ \t\t     i < e->target_offset;\n+ \t\t     i += m->u.match_size) {\n+@@ -1223,12 +1260,15 @@ compat_copy_entry_to_user(struct ipt_ent\n+ \tcompat_uint_t origsize;\n+ \tconst struct xt_entry_match *ematch;\n+ \tint ret = 0;\n++\tu8 flags = e->ip.flags & IPT_F_MASK;\n+ \n+ \torigsize = *size;\n+ \tce = *dstptr;\n+ \tif (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||\n+ \t    copy_to_user(&ce->counters, &counters[i],\n+-\t    sizeof(counters[i])) != 0)\n++\t    sizeof(counters[i])) != 0 ||\n++\t    copy_to_user(&ce->ip.flags, &flags,\n++\t    sizeof(flags)) != 0)\n+ \t\treturn -EFAULT;\n+ \n+ \t*dstptr += sizeof(struct compat_ipt_entry);\ndiff --git a/target/linux/generic/pending-5.14/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-5.14/611-netfilter_match_bypass_default_table.patch\nnew file mode 100644\nindex 0000000000..baf738a8d2\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/611-netfilter_match_bypass_default_table.patch\n@@ -0,0 +1,106 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: netfilter: match bypass default table\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------\n+ 1 file changed, 58 insertions(+), 21 deletions(-)\n+\n+--- a/net/ipv4/netfilter/ip_tables.c\n++++ b/net/ipv4/netfilter/ip_tables.c\n+@@ -246,6 +246,33 @@ struct ipt_entry *ipt_next_entry(const s\n+ \treturn (void *)entry + entry->next_offset;\n+ }\n+ \n++static bool\n++ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)\n++{\n++\tstruct xt_entry_target *t;\n++\tstruct xt_standard_target *st;\n++\n++\tif (e->target_offset != sizeof(struct ipt_entry))\n++\t\treturn false;\n++\n++\tif (!(e->ip.flags & IPT_F_NO_DEF_MATCH))\n++\t\treturn false;\n++\n++\tt = ipt_get_target(e);\n++\tif (t->u.kernel.target->target)\n++\t\treturn false;\n++\n++\tst = (struct xt_standard_target *) t;\n++\tif (st->verdict == XT_RETURN)\n++\t\treturn false;\n++\n++\tif (st->verdict >= 0)\n++\t\treturn false;\n++\n++\t*verdict = (unsigned)(-st->verdict) - 1;\n++\treturn true;\n++}\n++\n+ /* Returns one of the generic firewall policies, like NF_ACCEPT. */\n+ unsigned int\n+ ipt_do_table(struct sk_buff *skb,\n+@@ -266,27 +293,28 @@ ipt_do_table(struct sk_buff *skb,\n+ \tunsigned int addend;\n+ \n+ \t/* Initialization */\n++\tWARN_ON(!(table->valid_hooks & (1 << hook)));\n++\tlocal_bh_disable();\n++\tprivate = READ_ONCE(table->private); /* Address dependency. */\n++\tcpu        = smp_processor_id();\n++\ttable_base = private->entries;\n++\n++\te = get_entry(table_base, private->hook_entry[hook]);\n++\tif (ipt_handle_default_rule(e, &verdict)) {\n++\t\tstruct xt_counters *counter;\n++\n++\t\tcounter = xt_get_this_cpu_counter(&e->counters);\n++\t\tADD_COUNTER(*counter, skb->len, 1);\n++\t\tlocal_bh_enable();\n++\t\treturn verdict;\n++\t}\n++\n+ \tstackidx = 0;\n+ \tip = ip_hdr(skb);\n+ \tindev = state->in ? state->in->name : nulldevname;\n+ \toutdev = state->out ? state->out->name : nulldevname;\n+-\t/* We handle fragments by dealing with the first fragment as\n+-\t * if it was a normal packet.  All other fragments are treated\n+-\t * normally, except that they will NEVER match rules that ask\n+-\t * things we don't know, ie. tcp syn flag or ports).  If the\n+-\t * rule is also a fragment-specific rule, non-fragments won't\n+-\t * match it. */\n+-\tacpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;\n+-\tacpar.thoff   = ip_hdrlen(skb);\n+-\tacpar.hotdrop = false;\n+-\tacpar.state   = state;\n+ \n+-\tWARN_ON(!(table->valid_hooks & (1 << hook)));\n+-\tlocal_bh_disable();\n+ \taddend = xt_write_recseq_begin();\n+-\tprivate = READ_ONCE(table->private); /* Address dependency. */\n+-\tcpu        = smp_processor_id();\n+-\ttable_base = private->entries;\n+ \tjumpstack  = (struct ipt_entry **)private->jumpstack[cpu];\n+ \n+ \t/* Switch to alternate jumpstack if we're being invoked via TEE.\n+@@ -299,7 +327,16 @@ ipt_do_table(struct sk_buff *skb,\n+ \tif (static_key_false(&xt_tee_enabled))\n+ \t\tjumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated);\n+ \n+-\te = get_entry(table_base, private->hook_entry[hook]);\n++\t/* We handle fragments by dealing with the first fragment as\n++\t * if it was a normal packet.  All other fragments are treated\n++\t * normally, except that they will NEVER match rules that ask\n++\t * things we don't know, ie. tcp syn flag or ports).  If the\n++\t * rule is also a fragment-specific rule, non-fragments won't\n++\t * match it. */\n++\tacpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;\n++\tacpar.thoff   = ip_hdrlen(skb);\n++\tacpar.hotdrop = false;\n++\tacpar.state   = state;\n+ \n+ \tdo {\n+ \t\tconst struct xt_entry_target *t;\ndiff --git a/target/linux/generic/pending-5.14/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-5.14/612-netfilter_match_reduce_memory_access.patch\nnew file mode 100644\nindex 0000000000..79da6778b6\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/612-netfilter_match_reduce_memory_access.patch\n@@ -0,0 +1,22 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: netfilter: reduce match memory access\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/ipv4/netfilter/ip_tables.c | 4 ++--\n+ 1 file changed, 2 insertions(+), 2 deletions(-)\n+\n+--- a/net/ipv4/netfilter/ip_tables.c\n++++ b/net/ipv4/netfilter/ip_tables.c\n+@@ -53,9 +53,9 @@ ip_packet_match(const struct iphdr *ip,\n+ \tif (ipinfo->flags & IPT_F_NO_DEF_MATCH)\n+ \t\treturn true;\n+ \n+-\tif (NF_INVF(ipinfo, IPT_INV_SRCIP,\n++\tif (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr &&\n+ \t\t    (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||\n+-\t    NF_INVF(ipinfo, IPT_INV_DSTIP,\n++\t    NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr &&\n+ \t\t    (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))\n+ \t\treturn false;\n+ \ndiff --git a/target/linux/generic/pending-5.14/613-netfilter_optional_tcp_window_check.patch b/target/linux/generic/pending-5.14/613-netfilter_optional_tcp_window_check.patch\nnew file mode 100644\nindex 0000000000..15f2125efa\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/613-netfilter_optional_tcp_window_check.patch\n@@ -0,0 +1,73 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: netfilter: optional tcp window check\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++\n+ 1 file changed, 13 insertions(+)\n+\n+--- a/net/netfilter/nf_conntrack_proto_tcp.c\n++++ b/net/netfilter/nf_conntrack_proto_tcp.c\n+@@ -31,6 +31,9 @@\n+ #include <net/netfilter/ipv4/nf_conntrack_ipv4.h>\n+ #include <net/netfilter/ipv6/nf_conntrack_ipv6.h>\n+ \n++/* Do not check the TCP window for incoming packets  */\n++static int nf_ct_tcp_no_window_check __read_mostly = 1;\n++\n+   /* FIXME: Examine ipfilter's timeouts and conntrack transitions more\n+      closely.  They're more complex. --RR */\n+ \n+@@ -465,6 +468,9 @@ static bool tcp_in_window(struct nf_conn\n+ \ts32 receiver_offset;\n+ \tbool res, in_recv_win;\n+ \n++\tif (nf_ct_tcp_no_window_check)\n++\t\treturn true;\n++\n+ \t/*\n+ \t * Get the required data from the packet.\n+ \t */\n+@@ -1151,7 +1157,7 @@ int nf_conntrack_tcp_packet(struct nf_co\n+ \t\t IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED &&\n+ \t\t timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK])\n+ \t\ttimeout = timeouts[TCP_CONNTRACK_UNACK];\n+-\telse if (ct->proto.tcp.last_win == 0 &&\n++\t\telse if (!nf_ct_tcp_no_window_check && ct->proto.tcp.last_win == 0 &&\n+ \t\t timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS])\n+ \t\ttimeout = timeouts[TCP_CONNTRACK_RETRANS];\n+ \telse\n+--- a/net/netfilter/nf_conntrack_standalone.c\n++++ b/net/netfilter/nf_conntrack_standalone.c\n+@@ -25,6 +25,9 @@\n+ #include <net/netfilter/nf_conntrack_timestamp.h>\n+ #include <linux/rculist_nulls.h>\n+ \n++/* Do not check the TCP window for incoming packets  */\n++static int nf_ct_tcp_no_window_check __read_mostly = 1;\n++\n+ static bool enable_hooks __read_mostly;\n+ MODULE_PARM_DESC(enable_hooks, \"Always enable conntrack hooks\");\n+ module_param(enable_hooks, bool, 0000);\n+@@ -667,6 +670,7 @@ enum nf_ct_sysctl_index {\n+ \tNF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,\n+ #endif\n+ \n++\tNF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK,\n+ \t__NF_SYSCTL_CT_LAST_SYSCTL,\n+ };\n+ \n+@@ -1025,6 +1029,13 @@ static struct ctl_table nf_ct_sysctl_tab\n+ \t\t.proc_handler   = proc_dointvec_jiffies,\n+ \t},\n+ #endif\n++\t[NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = {\n++\t\t.procname       = \"nf_conntrack_tcp_no_window_check\",\n++\t\t.data           = &nf_ct_tcp_no_window_check,\n++\t\t.maxlen         = sizeof(unsigned int),\n++\t\t.mode           = 0644,\n++\t\t.proc_handler   = proc_dointvec,\n++\t},\n+ \t{}\n+ };\n+ \ndiff --git a/target/linux/generic/pending-5.14/620-net_sched-codel-do-not-defer-queue-length-update.patch b/target/linux/generic/pending-5.14/620-net_sched-codel-do-not-defer-queue-length-update.patch\nnew file mode 100644\nindex 0000000000..4b4825ae3b\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/620-net_sched-codel-do-not-defer-queue-length-update.patch\n@@ -0,0 +1,86 @@\n+From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>\n+Date: Mon, 21 Aug 2017 11:14:14 +0300\n+Subject: [PATCH] net_sched/codel: do not defer queue length update\n+\n+When codel wants to drop last packet in ->dequeue() it cannot call\n+qdisc_tree_reduce_backlog() right away - it will notify parent qdisc\n+about zero qlen and HTB/HFSC will deactivate class. The same class will\n+be deactivated second time by caller of ->dequeue(). Currently codel and\n+fq_codel defer update. This triggers warning in HFSC when it's qlen != 0\n+but there is no active classes.\n+\n+This patch update parent queue length immediately: just temporary increase\n+qlen around qdisc_tree_reduce_backlog() to prevent first class deactivation\n+if we have skb to return.\n+\n+This might open another problem in HFSC - now operation peek could fail and\n+deactivate parent class.\n+\n+Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>\n+Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581\n+---\n+\n+--- a/net/sched/sch_codel.c\n++++ b/net/sched/sch_codel.c\n+@@ -95,11 +95,17 @@ static struct sk_buff *codel_qdisc_deque\n+ \t\t\t    &q->stats, qdisc_pkt_len, codel_get_enqueue_time,\n+ \t\t\t    drop_func, dequeue_func);\n+ \n+-\t/* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,\n+-\t * or HTB crashes. Defer it for next round.\n++\t/* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate\n++\t * parent class, dequeue in parent qdisc will do the same if we\n++\t * return skb. Temporary increment qlen if we have skb.\n+ \t */\n+-\tif (q->stats.drop_count && sch->q.qlen) {\n+-\t\tqdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len);\n++\tif (q->stats.drop_count) {\n++\t\tif (skb)\n++\t\t\tsch->q.qlen++;\n++\t\tqdisc_tree_reduce_backlog(sch, q->stats.drop_count,\n++\t\t\t\t\t  q->stats.drop_len);\n++\t\tif (skb)\n++\t\t\tsch->q.qlen--;\n+ \t\tq->stats.drop_count = 0;\n+ \t\tq->stats.drop_len = 0;\n+ \t}\n+--- a/net/sched/sch_fq_codel.c\n++++ b/net/sched/sch_fq_codel.c\n+@@ -304,6 +304,21 @@ begin:\n+ \t\t\t    &flow->cvars, &q->cstats, qdisc_pkt_len,\n+ \t\t\t    codel_get_enqueue_time, drop_func, dequeue_func);\n+ \n++\t/* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate\n++\t * parent class, dequeue in parent qdisc will do the same if we\n++\t * return skb. Temporary increment qlen if we have skb.\n++\t */\n++\tif (q->cstats.drop_count) {\n++\t\tif (skb)\n++\t\t\tsch->q.qlen++;\n++\t\tqdisc_tree_reduce_backlog(sch, q->cstats.drop_count,\n++\t\t\t\t\t  q->cstats.drop_len);\n++\t\tif (skb)\n++\t\t\tsch->q.qlen--;\n++\t\tq->cstats.drop_count = 0;\n++\t\tq->cstats.drop_len = 0;\n++\t}\n++\n+ \tif (!skb) {\n+ \t\t/* force a pass through old_flows to prevent starvation */\n+ \t\tif ((head == &q->new_flows) && !list_empty(&q->old_flows))\n+@@ -314,15 +329,6 @@ begin:\n+ \t}\n+ \tqdisc_bstats_update(sch, skb);\n+ \tflow->deficit -= qdisc_pkt_len(skb);\n+-\t/* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,\n+-\t * or HTB crashes. Defer it for next round.\n+-\t */\n+-\tif (q->cstats.drop_count && sch->q.qlen) {\n+-\t\tqdisc_tree_reduce_backlog(sch, q->cstats.drop_count,\n+-\t\t\t\t\t  q->cstats.drop_len);\n+-\t\tq->cstats.drop_count = 0;\n+-\t\tq->cstats.drop_len = 0;\n+-\t}\n+ \treturn skb;\n+ }\n+ \ndiff --git a/target/linux/generic/pending-5.14/630-packet_socket_type.patch b/target/linux/generic/pending-5.14/630-packet_socket_type.patch\nnew file mode 100644\nindex 0000000000..92db60b8bd\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/630-packet_socket_type.patch\n@@ -0,0 +1,138 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: net: add an optimization for dealing with raw sockets\n+\n+lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/uapi/linux/if_packet.h |  3 +++\n+ net/packet/af_packet.c         | 34 +++++++++++++++++++++++++++-------\n+ net/packet/internal.h          |  1 +\n+ 3 files changed, 31 insertions(+), 7 deletions(-)\n+\n+--- a/include/uapi/linux/if_packet.h\n++++ b/include/uapi/linux/if_packet.h\n+@@ -33,6 +33,8 @@ struct sockaddr_ll {\n+ #define PACKET_KERNEL\t\t7\t\t/* To kernel space\t*/\n+ /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */\n+ #define PACKET_FASTROUTE\t6\t\t/* Fastrouted frame\t*/\n++#define PACKET_MASK_ANY\t\t0xffffffff\t/* mask for packet type bits */\n++\n+ \n+ /* Packet socket options */\n+ \n+@@ -59,6 +61,7 @@ struct sockaddr_ll {\n+ #define PACKET_ROLLOVER_STATS\t\t21\n+ #define PACKET_FANOUT_DATA\t\t22\n+ #define PACKET_IGNORE_OUTGOING\t\t23\n++#define PACKET_RECV_TYPE\t\t24\n+ \n+ #define PACKET_FANOUT_HASH\t\t0\n+ #define PACKET_FANOUT_LB\t\t1\n+--- a/net/packet/af_packet.c\n++++ b/net/packet/af_packet.c\n+@@ -1820,6 +1820,7 @@ static int packet_rcv_spkt(struct sk_buf\n+ {\n+ \tstruct sock *sk;\n+ \tstruct sockaddr_pkt *spkt;\n++\tstruct packet_sock *po;\n+ \n+ \t/*\n+ \t *\tWhen we registered the protocol we saved the socket in the data\n+@@ -1827,6 +1828,7 @@ static int packet_rcv_spkt(struct sk_buf\n+ \t */\n+ \n+ \tsk = pt->af_packet_priv;\n++\tpo = pkt_sk(sk);\n+ \n+ \t/*\n+ \t *\tYank back the headers [hope the device set this\n+@@ -1839,7 +1841,7 @@ static int packet_rcv_spkt(struct sk_buf\n+ \t *\tso that this procedure is noop.\n+ \t */\n+ \n+-\tif (skb->pkt_type == PACKET_LOOPBACK)\n++\tif (!(po->pkt_type & (1 << skb->pkt_type)))\n+ \t\tgoto out;\n+ \n+ \tif (!net_eq(dev_net(dev), sock_net(sk)))\n+@@ -2077,12 +2079,12 @@ static int packet_rcv(struct sk_buff *sk\n+ \tunsigned int snaplen, res;\n+ \tbool is_drop_n_account = false;\n+ \n+-\tif (skb->pkt_type == PACKET_LOOPBACK)\n+-\t\tgoto drop;\n+-\n+ \tsk = pt->af_packet_priv;\n+ \tpo = pkt_sk(sk);\n+ \n++\tif (!(po->pkt_type & (1 << skb->pkt_type)))\n++\t\tgoto drop;\n++\n+ \tif (!net_eq(dev_net(dev), sock_net(sk)))\n+ \t\tgoto drop;\n+ \n+@@ -2208,12 +2210,12 @@ static int tpacket_rcv(struct sk_buff *s\n+ \tBUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);\n+ \tBUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);\n+ \n+-\tif (skb->pkt_type == PACKET_LOOPBACK)\n+-\t\tgoto drop;\n+-\n+ \tsk = pt->af_packet_priv;\n+ \tpo = pkt_sk(sk);\n+ \n++\tif (!(po->pkt_type & (1 << skb->pkt_type)))\n++\t\tgoto drop;\n++\n+ \tif (!net_eq(dev_net(dev), sock_net(sk)))\n+ \t\tgoto drop;\n+ \n+@@ -3320,6 +3322,7 @@ static int packet_create(struct net *net\n+ \tmutex_init(&po->pg_vec_lock);\n+ \tpo->rollover = NULL;\n+ \tpo->prot_hook.func = packet_rcv;\n++\tpo->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);\n+ \n+ \tif (sock->type == SOCK_PACKET)\n+ \t\tpo->prot_hook.func = packet_rcv_spkt;\n+@@ -3953,6 +3956,16 @@ packet_setsockopt(struct socket *sock, i\n+ \t\tpo->xmit = val ? packet_direct_xmit : dev_queue_xmit;\n+ \t\treturn 0;\n+ \t}\n++\tcase PACKET_RECV_TYPE:\n++\t{\n++\t\tunsigned int val;\n++\t\tif (optlen != sizeof(val))\n++\t\t\treturn -EINVAL;\n++\t\tif (copy_from_sockptr(&val, optval, sizeof(val)))\n++\t\t\treturn -EFAULT;\n++\t\tpo->pkt_type = val & ~BIT(PACKET_LOOPBACK);\n++\t\treturn 0;\n++\t}\n+ \tdefault:\n+ \t\treturn -ENOPROTOOPT;\n+ \t}\n+@@ -4009,6 +4022,13 @@ static int packet_getsockopt(struct sock\n+ \tcase PACKET_VNET_HDR:\n+ \t\tval = po->has_vnet_hdr;\n+ \t\tbreak;\n++\tcase PACKET_RECV_TYPE:\n++\t\tif (len > sizeof(unsigned int))\n++\t\t\tlen = sizeof(unsigned int);\n++\t\tval = po->pkt_type;\n++\n++\t\tdata = &val;\n++\t\tbreak;\n+ \tcase PACKET_VERSION:\n+ \t\tval = po->tp_version;\n+ \t\tbreak;\n+--- a/net/packet/internal.h\n++++ b/net/packet/internal.h\n+@@ -137,6 +137,7 @@ struct packet_sock {\n+ \tint\t\t\t(*xmit)(struct sk_buff *skb);\n+ \tstruct packet_type\tprot_hook ____cacheline_aligned_in_smp;\n+ \tatomic_t\t\ttp_drops ____cacheline_aligned_in_smp;\n++\tunsigned int\t\tpkt_type;\n+ };\n+ \n+ static inline struct packet_sock *pkt_sk(struct sock *sk)\ndiff --git a/target/linux/generic/pending-5.14/655-increase_skb_pad.patch b/target/linux/generic/pending-5.14/655-increase_skb_pad.patch\nnew file mode 100644\nindex 0000000000..c7d35f20f1\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/655-increase_skb_pad.patch\n@@ -0,0 +1,20 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance\n+\n+lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/skbuff.h | 2 +-\n+ 1 file changed, 1 insertion(+), 1 deletion(-)\n+\n+--- a/include/linux/skbuff.h\n++++ b/include/linux/skbuff.h\n+@@ -2703,7 +2703,7 @@ static inline int pskb_network_may_pull(\n+  * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)\n+  */\n+ #ifndef NET_SKB_PAD\n+-#define NET_SKB_PAD\tmax(32, L1_CACHE_BYTES)\n++#define NET_SKB_PAD\tmax(64, L1_CACHE_BYTES)\n+ #endif\n+ \n+ int ___pskb_trim(struct sk_buff *skb, unsigned int len);\ndiff --git a/target/linux/generic/pending-5.14/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-5.14/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch\nnew file mode 100644\nindex 0000000000..45c95c219d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch\n@@ -0,0 +1,511 @@\n+From: Steven Barth <steven@midlink.org>\n+Subject: Add support for MAP-E FMRs (mesh mode)\n+\n+MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication\n+between MAP CEs (mesh mode) without the need to forward such data to a\n+border relay. This is similar to how 6rd works but for IPv4 over IPv6.\n+\n+Signed-off-by: Steven Barth <cyrus@openwrt.org>\n+---\n+ include/net/ip6_tunnel.h       |  13 ++\n+ include/uapi/linux/if_tunnel.h |  13 ++\n+ net/ipv6/ip6_tunnel.c          | 276 +++++++++++++++++++++++++++++++++++++++--\n+ 3 files changed, 291 insertions(+), 11 deletions(-)\n+\n+--- a/include/net/ip6_tunnel.h\n++++ b/include/net/ip6_tunnel.h\n+@@ -18,6 +18,18 @@\n+ /* determine capability on a per-packet basis */\n+ #define IP6_TNL_F_CAP_PER_PACKET 0x40000\n+ \n++/* IPv6 tunnel FMR */\n++struct __ip6_tnl_fmr {\n++\tstruct __ip6_tnl_fmr *next; /* next fmr in list */\n++\tstruct in6_addr ip6_prefix;\n++\tstruct in_addr ip4_prefix;\n++\n++\t__u8 ip6_prefix_len;\n++\t__u8 ip4_prefix_len;\n++\t__u8 ea_len;\n++\t__u8 offset;\n++};\n++\n+ struct __ip6_tnl_parm {\n+ \tchar name[IFNAMSIZ];\t/* name of tunnel device */\n+ \tint link;\t\t/* ifindex of underlying L2 interface */\n+@@ -29,6 +41,7 @@ struct __ip6_tnl_parm {\n+ \t__u32 flags;\t\t/* tunnel flags */\n+ \tstruct in6_addr laddr;\t/* local tunnel end-point address */\n+ \tstruct in6_addr raddr;\t/* remote tunnel end-point address */\n++\tstruct __ip6_tnl_fmr *fmrs;\t/* FMRs */\n+ \n+ \t__be16\t\t\ti_flags;\n+ \t__be16\t\t\to_flags;\n+--- a/include/uapi/linux/if_tunnel.h\n++++ b/include/uapi/linux/if_tunnel.h\n+@@ -77,10 +77,23 @@ enum {\n+ \tIFLA_IPTUN_ENCAP_DPORT,\n+ \tIFLA_IPTUN_COLLECT_METADATA,\n+ \tIFLA_IPTUN_FWMARK,\n++\tIFLA_IPTUN_FMRS,\n+ \t__IFLA_IPTUN_MAX,\n+ };\n+ #define IFLA_IPTUN_MAX\t(__IFLA_IPTUN_MAX - 1)\n+ \n++enum {\n++\tIFLA_IPTUN_FMR_UNSPEC,\n++\tIFLA_IPTUN_FMR_IP6_PREFIX,\n++\tIFLA_IPTUN_FMR_IP4_PREFIX,\n++\tIFLA_IPTUN_FMR_IP6_PREFIX_LEN,\n++\tIFLA_IPTUN_FMR_IP4_PREFIX_LEN,\n++\tIFLA_IPTUN_FMR_EA_LEN,\n++\tIFLA_IPTUN_FMR_OFFSET,\n++\t__IFLA_IPTUN_FMR_MAX,\n++};\n++#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1)\n++\n+ enum tunnel_encap_types {\n+ \tTUNNEL_ENCAP_NONE,\n+ \tTUNNEL_ENCAP_FOU,\n+--- a/net/ipv6/ip6_tunnel.c\n++++ b/net/ipv6/ip6_tunnel.c\n+@@ -11,6 +11,9 @@\n+  *      linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c\n+  *\n+  *      RFC 2473\n++ *\n++ *      Changes:\n++ *      Steven Barth <cyrus@openwrt.org>:           MAP-E FMR support\n+  */\n+ \n+ #define pr_fmt(fmt) KBUILD_MODNAME \": \" fmt\n+@@ -67,9 +70,9 @@ static bool log_ecn_error = true;\n+ module_param(log_ecn_error, bool, 0644);\n+ MODULE_PARM_DESC(log_ecn_error, \"Log packets received with corrupted ECN\");\n+ \n+-static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2)\n++static u32 HASH(const struct in6_addr *addr)\n+ {\n+-\tu32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2);\n++\tu32 hash = ipv6_addr_hash(addr);\n+ \n+ \treturn hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT);\n+ }\n+@@ -114,17 +117,33 @@ static struct ip6_tnl *\n+ ip6_tnl_lookup(struct net *net, int link,\n+ \t       const struct in6_addr *remote, const struct in6_addr *local)\n+ {\n+-\tunsigned int hash = HASH(remote, local);\n++\tunsigned int hash = HASH(local);\n+ \tstruct ip6_tnl *t, *cand = NULL;\n+ \tstruct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);\n+ \tstruct in6_addr any;\n+ \n+ \tfor_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {\n+ \t\tif (!ipv6_addr_equal(local, &t->parms.laddr) ||\n+-\t\t    !ipv6_addr_equal(remote, &t->parms.raddr) ||\n+ \t\t    !(t->dev->flags & IFF_UP))\n+ \t\t\tcontinue;\n+ \n++\t\tif (!ipv6_addr_equal(remote, &t->parms.raddr)) {\n++\t\t\tstruct __ip6_tnl_fmr *fmr;\n++\t\t\tbool found = false;\n++\n++\t\t\tfor (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {\n++\t\t\t\tif (!ipv6_prefix_equal(remote, &fmr->ip6_prefix,\n++\t\t\t\t\t\t       fmr->ip6_prefix_len))\n++\t\t\t\t\tcontinue;\n++\n++\t\t\t\tfound = true;\n++\t\t\t\tbreak;\n++\t\t\t}\n++\n++\t\t\tif (!found)\n++\t\t\t\tcontinue;\n++\t\t}\n++\n+ \t\tif (link == t->parms.link)\n+ \t\t\treturn t;\n+ \t\telse\n+@@ -132,7 +151,7 @@ ip6_tnl_lookup(struct net *net, int link\n+ \t}\n+ \n+ \tmemset(&any, 0, sizeof(any));\n+-\thash = HASH(&any, local);\n++\thash = HASH(local);\n+ \tfor_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {\n+ \t\tif (!ipv6_addr_equal(local, &t->parms.laddr) ||\n+ \t\t    !ipv6_addr_any(&t->parms.raddr) ||\n+@@ -145,7 +164,7 @@ ip6_tnl_lookup(struct net *net, int link\n+ \t\t\tcand = t;\n+ \t}\n+ \n+-\thash = HASH(remote, &any);\n++\thash = HASH(&any);\n+ \tfor_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {\n+ \t\tif (!ipv6_addr_equal(remote, &t->parms.raddr) ||\n+ \t\t    !ipv6_addr_any(&t->parms.laddr) ||\n+@@ -194,7 +213,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,\n+ \n+ \tif (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {\n+ \t\tprio = 1;\n+-\t\th = HASH(remote, local);\n++\t\th = HASH(local);\n+ \t}\n+ \treturn &ip6n->tnls[prio][h];\n+ }\n+@@ -378,6 +397,12 @@ ip6_tnl_dev_uninit(struct net_device *de\n+ \tstruct net *net = t->net;\n+ \tstruct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);\n+ \n++\twhile (t->parms.fmrs) {\n++\t\tstruct __ip6_tnl_fmr *next = t->parms.fmrs->next;\n++\t\tkfree(t->parms.fmrs);\n++\t\tt->parms.fmrs = next;\n++\t}\n++\n+ \tif (dev == ip6n->fb_tnl_dev)\n+ \t\tRCU_INIT_POINTER(ip6n->tnls_wc[0], NULL);\n+ \telse\n+@@ -790,6 +815,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,\n+ }\n+ EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);\n+ \n++/**\n++ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR\n++ *   @dest: destination IPv6 address buffer\n++ *   @skb: received socket buffer\n++ *   @fmr: MAP FMR\n++ *   @xmit: Calculate for xmit or rcv\n++ **/\n++static void ip4ip6_fmr_calc(struct in6_addr *dest,\n++\t\tconst struct iphdr *iph, const uint8_t *end,\n++\t\tconst struct __ip6_tnl_fmr *fmr, bool xmit)\n++{\n++\tint psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len);\n++\tu8 *portp = NULL;\n++\tbool use_dest_addr;\n++\tconst struct iphdr *dsth = iph;\n++\n++\tif ((u8*)dsth >= end)\n++\t\treturn;\n++\n++\t/* find significant IP header */\n++\tif (iph->protocol == IPPROTO_ICMP) {\n++\t\tstruct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);\n++\t\tif (ih && ((u8*)&ih[1]) <= end && (\n++\t\t\tih->type == ICMP_DEST_UNREACH ||\n++\t\t\tih->type == ICMP_SOURCE_QUENCH ||\n++\t\t\tih->type == ICMP_TIME_EXCEEDED ||\n++\t\t\tih->type == ICMP_PARAMETERPROB ||\n++\t\t\tih->type == ICMP_REDIRECT))\n++\t\t\t\tdsth = (const struct iphdr*)&ih[1];\n++\t}\n++\n++\t/* in xmit-path use dest port by default and source port only if\n++\t\tthis is an ICMP reply to something else; vice versa in rcv-path */\n++\tuse_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph);\n++\n++\t/* get dst port */\n++\tif (((u8*)&dsth[1]) <= end && (\n++\t\tdsth->protocol == IPPROTO_UDP ||\n++\t\tdsth->protocol == IPPROTO_TCP ||\n++\t\tdsth->protocol == IPPROTO_SCTP ||\n++\t\tdsth->protocol == IPPROTO_DCCP)) {\n++\t\t\t/* for UDP, TCP, SCTP and DCCP source and dest port\n++\t\t\tfollow IPv4 header directly */\n++\t\t\tportp = ((u8*)dsth) + dsth->ihl * 4;\n++\n++\t\t\tif (use_dest_addr)\n++\t\t\t\tportp += sizeof(u16);\n++\t} else if (iph->protocol == IPPROTO_ICMP) {\n++\t\tstruct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);\n++\n++\t\t/* use icmp identifier as port */\n++\t\tif (((u8*)&ih) <= end && (\n++\t\t    (use_dest_addr && (\n++\t\t    ih->type == ICMP_ECHOREPLY ||\n++\t\t\tih->type == ICMP_TIMESTAMPREPLY ||\n++\t\t\tih->type == ICMP_INFO_REPLY ||\n++\t\t\tih->type == ICMP_ADDRESSREPLY)) ||\n++\t\t\t(!use_dest_addr && (\n++\t\t\tih->type == ICMP_ECHO ||\n++\t\t\tih->type == ICMP_TIMESTAMP ||\n++\t\t\tih->type == ICMP_INFO_REQUEST ||\n++\t\t\tih->type == ICMP_ADDRESS)\n++\t\t\t)))\n++\t\t\t\tportp = (u8*)&ih->un.echo.id;\n++\t}\n++\n++\tif ((portp && &portp[2] <= end) || psidlen == 0) {\n++\t\tint frombyte = fmr->ip6_prefix_len / 8;\n++\t\tint fromrem = fmr->ip6_prefix_len % 8;\n++\t\tint bytes = sizeof(struct in6_addr) - frombyte;\n++\t\tconst u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr;\n++\t\tu64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len);\n++\t\tu64 t = 0;\n++\n++\t\t/* extract PSID from port and add it to eabits */\n++\t\tu16 psidbits = 0;\n++\t\tif (psidlen > 0) {\n++\t\t\tpsidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]);\n++\t\t\tpsidbits >>= 16 - psidlen - fmr->offset;\n++\t\t\tpsidbits = (u16)(psidbits << (16 - psidlen));\n++\t\t\teabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen));\n++\t\t}\n++\n++\t\t/* rewrite destination address */\n++\t\t*dest = fmr->ip6_prefix;\n++\t\tmemcpy(&dest->s6_addr[10], addr, sizeof(*addr));\n++\t\tdest->s6_addr16[7] = htons(psidbits >> (16 - psidlen));\n++\n++\t\tif (bytes > sizeof(u64))\n++\t\t\tbytes = sizeof(u64);\n++\n++\t\t/* insert eabits */\n++\t\tmemcpy(&t, &dest->s6_addr[frombyte], bytes);\n++\t\tt = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1)\n++\t\t\t<< (64 - fmr->ea_len - fromrem));\n++\t\tt = cpu_to_be64(t | (eabits >> fromrem));\n++\t\tmemcpy(&dest->s6_addr[frombyte], &t, bytes);\n++\t}\n++}\n++\n++\n+ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,\n+ \t\t\t const struct tnl_ptk_info *tpi,\n+ \t\t\t struct metadata_dst *tun_dst,\n+@@ -843,6 +969,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl\n+ \tskb_reset_network_header(skb);\n+ \tmemset(skb->cb, 0, sizeof(struct inet6_skb_parm));\n+ \n++\tif (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs &&\n++\t\t!ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) {\n++\t\t\t/* Packet didn't come from BR, so lookup FMR */\n++\t\t\tstruct __ip6_tnl_fmr *fmr;\n++\t\t\tstruct in6_addr expected = tunnel->parms.raddr;\n++\t\t\tfor (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next)\n++\t\t\t\tif (ipv6_prefix_equal(&ipv6h->saddr,\n++\t\t\t\t\t&fmr->ip6_prefix, fmr->ip6_prefix_len))\n++\t\t\t\t\t\tbreak;\n++\n++\t\t\t/* Check that IPv6 matches IPv4 source to prevent spoofing */\n++\t\t\tif (fmr)\n++\t\t\t\tip4ip6_fmr_calc(&expected, ip_hdr(skb),\n++\t\t\t\t\t\tskb_tail_pointer(skb), fmr, false);\n++\n++\t\t\tif (!ipv6_addr_equal(&ipv6h->saddr, &expected)) {\n++\t\t\t\trcu_read_unlock();\n++\t\t\t\tgoto drop;\n++\t\t\t}\n++\t}\n++\n+ \t__skb_tunnel_rx(skb, tunnel->dev, tunnel->net);\n+ \n+ \terr = dscp_ecn_decapsulate(tunnel, ipv6h, skb);\n+@@ -994,6 +1141,7 @@ static void init_tel_txopt(struct ipv6_t\n+ \topt->ops.opt_nflen = 8;\n+ }\n+ \n++\n+ /**\n+  * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own\n+  *   @t: the outgoing tunnel device\n+@@ -1274,6 +1422,7 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str\n+ \t\tu8 protocol)\n+ {\n+ \tstruct ip6_tnl *t = netdev_priv(dev);\n++\tstruct __ip6_tnl_fmr *fmr;\n+ \tstruct ipv6hdr *ipv6h;\n+ \tconst struct iphdr  *iph;\n+ \tint encap_limit = -1;\n+@@ -1373,6 +1522,18 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str\n+ \tfl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);\n+ \tdsfield = INET_ECN_encapsulate(dsfield, orig_dsfield);\n+ \n++\t/* try to find matching FMR */\n++\tfor (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {\n++\t\tunsigned mshift = 32 - fmr->ip4_prefix_len;\n++\t\tif (ntohl(fmr->ip4_prefix.s_addr) >> mshift ==\n++\t\t\t\tntohl(ip_hdr(skb)->daddr) >> mshift)\n++\t\t\tbreak;\n++\t}\n++\n++\t/* change dstaddr according to FMR */\n++\tif (fmr)\n++\t\tip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);\n++\n+ \tif (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))\n+ \t\treturn -1;\n+ \n+@@ -1525,6 +1686,14 @@ ip6_tnl_change(struct ip6_tnl *t, const\n+ \tt->parms.link = p->link;\n+ \tt->parms.proto = p->proto;\n+ \tt->parms.fwmark = p->fwmark;\n++\n++\twhile (t->parms.fmrs) {\n++\t\tstruct __ip6_tnl_fmr *next = t->parms.fmrs->next;\n++\t\tkfree(t->parms.fmrs);\n++\t\tt->parms.fmrs = next;\n++\t}\n++\tt->parms.fmrs = p->fmrs;\n++\n+ \tdst_cache_reset(&t->dst_cache);\n+ \tip6_tnl_link_config(t);\n+ \treturn 0;\n+@@ -1563,6 +1732,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_\n+ \tp->flowinfo = u->flowinfo;\n+ \tp->link = u->link;\n+ \tp->proto = u->proto;\n++\tp->fmrs = NULL;\n+ \tmemcpy(p->name, u->name, sizeof(u->name));\n+ }\n+ \n+@@ -1948,6 +2118,15 @@ static int ip6_tnl_validate(struct nlatt\n+ \treturn 0;\n+ }\n+ \n++static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = {\n++\t[IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) },\n++\t[IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) },\n++\t[IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 },\n++\t[IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 },\n++\t[IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 },\n++\t[IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 }\n++};\n++\n+ static void ip6_tnl_netlink_parms(struct nlattr *data[],\n+ \t\t\t\t  struct __ip6_tnl_parm *parms)\n+ {\n+@@ -1985,6 +2164,46 @@ static void ip6_tnl_netlink_parms(struct\n+ \n+ \tif (data[IFLA_IPTUN_FWMARK])\n+ \t\tparms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);\n++\n++\tif (data[IFLA_IPTUN_FMRS]) {\n++\t\tunsigned rem;\n++\t\tstruct nlattr *fmr;\n++\t\tnla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) {\n++\t\t\tstruct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c;\n++\t\t\tstruct __ip6_tnl_fmr *nfmr;\n++\n++\t\t\tnla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX,\n++\t\t\t\tfmr, ip6_tnl_fmr_policy, NULL);\n++\n++\t\t\tif (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL)))\n++\t\t\t\tcontinue;\n++\n++\t\t\tnfmr->offset = 6;\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX]))\n++\t\t\t\tnla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX],\n++\t\t\t\t\tsizeof(nfmr->ip6_prefix));\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX]))\n++\t\t\t\tnla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX],\n++\t\t\t\t\tsizeof(nfmr->ip4_prefix));\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN]))\n++\t\t\t\tnfmr->ip6_prefix_len = nla_get_u8(c);\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN]))\n++\t\t\t\tnfmr->ip4_prefix_len = nla_get_u8(c);\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN]))\n++\t\t\t\tnfmr->ea_len = nla_get_u8(c);\n++\n++\t\t\tif ((c = fmrd[IFLA_IPTUN_FMR_OFFSET]))\n++\t\t\t\tnfmr->offset = nla_get_u8(c);\n++\n++\t\t\tnfmr->next = parms->fmrs;\n++\t\t\tparms->fmrs = nfmr;\n++\t\t}\n++\t}\n+ }\n+ \n+ static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],\n+@@ -2100,6 +2319,12 @@ static void ip6_tnl_dellink(struct net_d\n+ \n+ static size_t ip6_tnl_get_size(const struct net_device *dev)\n+ {\n++\tconst struct ip6_tnl *t = netdev_priv(dev);\n++\tstruct __ip6_tnl_fmr *c;\n++\tint fmrs = 0;\n++\tfor (c = t->parms.fmrs; c; c = c->next)\n++\t\t++fmrs;\n++\n+ \treturn\n+ \t\t/* IFLA_IPTUN_LINK */\n+ \t\tnla_total_size(4) +\n+@@ -2129,6 +2354,24 @@ static size_t ip6_tnl_get_size(const str\n+ \t\tnla_total_size(0) +\n+ \t\t/* IFLA_IPTUN_FWMARK */\n+ \t\tnla_total_size(4) +\n++\t\t/* IFLA_IPTUN_FMRS */\n++\t\tnla_total_size(0) +\n++\t\t(\n++\t\t\t/* nest */\n++\t\t\tnla_total_size(0) +\n++\t\t\t/* IFLA_IPTUN_FMR_IP6_PREFIX */\n++\t\t\tnla_total_size(sizeof(struct in6_addr)) +\n++\t\t\t/* IFLA_IPTUN_FMR_IP4_PREFIX */\n++\t\t\tnla_total_size(sizeof(struct in_addr)) +\n++\t\t\t/* IFLA_IPTUN_FMR_EA_LEN */\n++\t\t\tnla_total_size(1) +\n++\t\t\t/* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */\n++\t\t\tnla_total_size(1) +\n++\t\t\t/* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */\n++\t\t\tnla_total_size(1) +\n++\t\t\t/* IFLA_IPTUN_FMR_OFFSET */\n++\t\t\tnla_total_size(1)\n++\t\t) * fmrs +\n+ \t\t0;\n+ }\n+ \n+@@ -2136,6 +2379,9 @@ static int ip6_tnl_fill_info(struct sk_b\n+ {\n+ \tstruct ip6_tnl *tunnel = netdev_priv(dev);\n+ \tstruct __ip6_tnl_parm *parm = &tunnel->parms;\n++\tstruct __ip6_tnl_fmr *c;\n++\tint fmrcnt = 0;\n++\tstruct nlattr *fmrs;\n+ \n+ \tif (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||\n+ \t    nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||\n+@@ -2145,9 +2391,27 @@ static int ip6_tnl_fill_info(struct sk_b\n+ \t    nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||\n+ \t    nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||\n+ \t    nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) ||\n+-\t    nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark))\n++\t    nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) ||\n++\t    !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS)))\n+ \t\tgoto nla_put_failure;\n+ \n++\tfor (c = parm->fmrs; c; c = c->next) {\n++\t\tstruct nlattr *fmr = nla_nest_start(skb, ++fmrcnt);\n++\t\tif (!fmr ||\n++\t\t\tnla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX,\n++\t\t\t\tsizeof(c->ip6_prefix), &c->ip6_prefix) ||\n++\t\t\tnla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX,\n++\t\t\t\tsizeof(c->ip4_prefix), &c->ip4_prefix) ||\n++\t\t\tnla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) ||\n++\t\t\tnla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) ||\n++\t\t\tnla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) ||\n++\t\t\tnla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset))\n++\t\t\t\tgoto nla_put_failure;\n++\n++\t\tnla_nest_end(skb, fmr);\n++\t}\n++\tnla_nest_end(skb, fmrs);\n++\n+ \tif (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||\n+ \t    nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||\n+ \t    nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||\n+@@ -2187,6 +2451,7 @@ static const struct nla_policy ip6_tnl_p\n+ \t[IFLA_IPTUN_ENCAP_DPORT]\t= { .type = NLA_U16 },\n+ \t[IFLA_IPTUN_COLLECT_METADATA]\t= { .type = NLA_FLAG },\n+ \t[IFLA_IPTUN_FWMARK]\t\t= { .type = NLA_U32 },\n++\t[IFLA_IPTUN_FMRS]\t\t= { .type = NLA_NESTED },\n+ };\n+ \n+ static struct rtnl_link_ops ip6_link_ops __read_mostly = {\ndiff --git a/target/linux/generic/pending-5.14/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.14/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch\nnew file mode 100644\nindex 0000000000..9a398de64d\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch\n@@ -0,0 +1,263 @@\n+From: Jonas Gorski <jogo@openwrt.org>\n+Subject: ipv6: allow rejecting with \"source address failed policy\"\n+\n+RFC6204 L-14 requires rejecting traffic from invalid addresses with\n+ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/\n+egress policy) on the LAN side, so add an appropriate rule for that.\n+\n+Signed-off-by: Jonas Gorski <jogo@openwrt.org>\n+---\n+ include/net/netns/ipv6.h       |  1 +\n+ include/uapi/linux/fib_rules.h |  4 +++\n+ include/uapi/linux/rtnetlink.h |  1 +\n+ net/ipv4/fib_semantics.c       |  4 +++\n+ net/ipv4/fib_trie.c            |  1 +\n+ net/ipv4/ipmr.c                |  1 +\n+ net/ipv6/fib6_rules.c          |  4 +++\n+ net/ipv6/ip6mr.c               |  2 ++\n+ net/ipv6/route.c               | 58 +++++++++++++++++++++++++++++++++++++++++-\n+ 9 files changed, 75 insertions(+), 1 deletion(-)\n+\n+--- a/include/net/netns/ipv6.h\n++++ b/include/net/netns/ipv6.h\n+@@ -82,6 +82,7 @@ struct netns_ipv6 {\n+ \tunsigned int\t\tfib6_routes_require_src;\n+ #endif\n+ \tstruct rt6_info         *ip6_prohibit_entry;\n++\tstruct rt6_info\t\t*ip6_policy_failed_entry;\n+ \tstruct rt6_info         *ip6_blk_hole_entry;\n+ \tstruct fib6_table       *fib6_local_tbl;\n+ \tstruct fib_rules_ops    *fib6_rules_ops;\n+--- a/include/uapi/linux/fib_rules.h\n++++ b/include/uapi/linux/fib_rules.h\n+@@ -82,6 +82,10 @@ enum {\n+ \tFR_ACT_BLACKHOLE,\t/* Drop without notification */\n+ \tFR_ACT_UNREACHABLE,\t/* Drop with ENETUNREACH */\n+ \tFR_ACT_PROHIBIT,\t/* Drop with EACCES */\n++\tFR_ACT_RES9,\n++\tFR_ACT_RES10,\n++\tFR_ACT_RES11,\n++\tFR_ACT_POLICY_FAILED,\t/* Drop with EACCES */\n+ \t__FR_ACT_MAX,\n+ };\n+ \n+--- a/include/uapi/linux/rtnetlink.h\n++++ b/include/uapi/linux/rtnetlink.h\n+@@ -256,6 +256,7 @@ enum {\n+ \tRTN_THROW,\t\t/* Not in this table\t\t*/\n+ \tRTN_NAT,\t\t/* Translate this address\t*/\n+ \tRTN_XRESOLVE,\t\t/* Use external resolver\t*/\n++\tRTN_POLICY_FAILED,\t/* Failed ingress/egress policy */\n+ \t__RTN_MAX\n+ };\n+ \n+--- a/net/ipv4/fib_semantics.c\n++++ b/net/ipv4/fib_semantics.c\n+@@ -141,6 +141,10 @@ const struct fib_prop fib_props[RTN_MAX\n+ \t\t.error\t= -EINVAL,\n+ \t\t.scope\t= RT_SCOPE_NOWHERE,\n+ \t},\n++\t[RTN_POLICY_FAILED] = {\n++\t\t.error\t= -EACCES,\n++\t\t.scope\t= RT_SCOPE_UNIVERSE,\n++\t},\n+ };\n+ \n+ static void rt_fibinfo_free(struct rtable __rcu **rtp)\n+--- a/net/ipv4/fib_trie.c\n++++ b/net/ipv4/fib_trie.c\n+@@ -2763,6 +2763,7 @@ static const char *const rtn_type_names[\n+ \t[RTN_THROW] = \"THROW\",\n+ \t[RTN_NAT] = \"NAT\",\n+ \t[RTN_XRESOLVE] = \"XRESOLVE\",\n++\t[RTN_POLICY_FAILED] = \"POLICY_FAILED\",\n+ };\n+ \n+ static inline const char *rtn_type(char *buf, size_t len, unsigned int t)\n+--- a/net/ipv4/ipmr.c\n++++ b/net/ipv4/ipmr.c\n+@@ -175,6 +175,7 @@ static int ipmr_rule_action(struct fib_r\n+ \tcase FR_ACT_UNREACHABLE:\n+ \t\treturn -ENETUNREACH;\n+ \tcase FR_ACT_PROHIBIT:\n++\tcase FR_ACT_POLICY_FAILED:\n+ \t\treturn -EACCES;\n+ \tcase FR_ACT_BLACKHOLE:\n+ \tdefault:\n+--- a/net/ipv6/fib6_rules.c\n++++ b/net/ipv6/fib6_rules.c\n+@@ -220,6 +220,10 @@ static int __fib6_rule_action(struct fib\n+ \t\terr = -EACCES;\n+ \t\trt = net->ipv6.ip6_prohibit_entry;\n+ \t\tgoto discard_pkt;\n++\tcase FR_ACT_POLICY_FAILED:\n++\t\terr = -EACCES;\n++\t\trt = net->ipv6.ip6_policy_failed_entry;\n++\t\tgoto discard_pkt;\n+ \t}\n+ \n+ \ttb_id = fib_rule_get_table(rule, arg);\n+--- a/net/ipv6/ip6mr.c\n++++ b/net/ipv6/ip6mr.c\n+@@ -163,6 +163,8 @@ static int ip6mr_rule_action(struct fib_\n+ \t\treturn -ENETUNREACH;\n+ \tcase FR_ACT_PROHIBIT:\n+ \t\treturn -EACCES;\n++\tcase FR_ACT_POLICY_FAILED:\n++\t\treturn -EACCES;\n+ \tcase FR_ACT_BLACKHOLE:\n+ \tdefault:\n+ \t\treturn -EINVAL;\n+--- a/net/ipv6/route.c\n++++ b/net/ipv6/route.c\n+@@ -97,6 +97,8 @@ static int\t\tip6_pkt_discard(struct sk_bu\n+ static int\t\tip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);\n+ static int\t\tip6_pkt_prohibit(struct sk_buff *skb);\n+ static int\t\tip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);\n++static int\t\tip6_pkt_policy_failed(struct sk_buff *skb);\n++static int\t\tip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb);\n+ static void\t\tip6_link_failure(struct sk_buff *skb);\n+ static void\t\tip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,\n+ \t\t\t\t\t   struct sk_buff *skb, u32 mtu,\n+@@ -312,6 +314,18 @@ static const struct rt6_info ip6_prohibi\n+ \t.rt6i_flags\t= (RTF_REJECT | RTF_NONEXTHOP),\n+ };\n+ \n++static const struct rt6_info ip6_policy_failed_entry_template = {\n++\t.dst = {\n++\t\t.__refcnt\t= ATOMIC_INIT(1),\n++\t\t.__use\t\t= 1,\n++\t\t.obsolete\t= DST_OBSOLETE_FORCE_CHK,\n++\t\t.error\t\t= -EACCES,\n++\t\t.input\t\t= ip6_pkt_policy_failed,\n++\t\t.output\t\t= ip6_pkt_policy_failed_out,\n++\t},\n++\t.rt6i_flags\t= (RTF_REJECT | RTF_NONEXTHOP),\n++};\n++\n+ static const struct rt6_info ip6_blk_hole_entry_template = {\n+ \t.dst = {\n+ \t\t.__refcnt\t= ATOMIC_INIT(1),\n+@@ -1033,6 +1047,7 @@ static const int fib6_prop[RTN_MAX + 1]\n+ \t[RTN_BLACKHOLE]\t= -EINVAL,\n+ \t[RTN_UNREACHABLE] = -EHOSTUNREACH,\n+ \t[RTN_PROHIBIT]\t= -EACCES,\n++\t[RTN_POLICY_FAILED] = -EACCES,\n+ \t[RTN_THROW]\t= -EAGAIN,\n+ \t[RTN_NAT]\t= -EINVAL,\n+ \t[RTN_XRESOLVE]\t= -EINVAL,\n+@@ -1068,6 +1083,10 @@ static void ip6_rt_init_dst_reject(struc\n+ \t\trt->dst.output = ip6_pkt_prohibit_out;\n+ \t\trt->dst.input = ip6_pkt_prohibit;\n+ \t\tbreak;\n++\tcase RTN_POLICY_FAILED:\n++\t\trt->dst.output = ip6_pkt_policy_failed_out;\n++\t\trt->dst.input = ip6_pkt_policy_failed;\n++\t\tbreak;\n+ \tcase RTN_THROW:\n+ \tcase RTN_UNREACHABLE:\n+ \tdefault:\n+@@ -4559,6 +4578,17 @@ static int ip6_pkt_prohibit_out(struct n\n+ \treturn ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);\n+ }\n+ \n++static int ip6_pkt_policy_failed(struct sk_buff *skb)\n++{\n++\treturn ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);\n++}\n++\n++static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb)\n++{\n++\tskb->dev = skb_dst(skb)->dev;\n++\treturn ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);\n++}\n++\n+ /*\n+  *\tAllocate a dst for local (unicast / anycast) address.\n+  */\n+@@ -5039,7 +5069,8 @@ static int rtm_to_fib6_config(struct sk_\n+ \tif (rtm->rtm_type == RTN_UNREACHABLE ||\n+ \t    rtm->rtm_type == RTN_BLACKHOLE ||\n+ \t    rtm->rtm_type == RTN_PROHIBIT ||\n+-\t    rtm->rtm_type == RTN_THROW)\n++\t    rtm->rtm_type == RTN_THROW ||\n++\t    rtm->rtm_type == RTN_POLICY_FAILED)\n+ \t\tcfg->fc_flags |= RTF_REJECT;\n+ \n+ \tif (rtm->rtm_type == RTN_LOCAL)\n+@@ -6263,6 +6294,8 @@ static int ip6_route_dev_notify(struct n\n+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES\n+ \t\tnet->ipv6.ip6_prohibit_entry->dst.dev = dev;\n+ \t\tnet->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);\n++\t\tnet->ipv6.ip6_policy_failed_entry->dst.dev = dev;\n++\t\tnet->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev);\n+ \t\tnet->ipv6.ip6_blk_hole_entry->dst.dev = dev;\n+ \t\tnet->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);\n+ #endif\n+@@ -6274,6 +6307,7 @@ static int ip6_route_dev_notify(struct n\n+ \t\tin6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);\n+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES\n+ \t\tin6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);\n++\t\tin6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev);\n+ \t\tin6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);\n+ #endif\n+ \t}\n+@@ -6465,6 +6499,8 @@ static int __net_init ip6_route_net_init\n+ \n+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES\n+ \tnet->ipv6.fib6_has_custom_rules = false;\n++\n++\n+ \tnet->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,\n+ \t\t\t\t\t       sizeof(*net->ipv6.ip6_prohibit_entry),\n+ \t\t\t\t\t       GFP_KERNEL);\n+@@ -6475,11 +6511,21 @@ static int __net_init ip6_route_net_init\n+ \t\t\t ip6_template_metrics, true);\n+ \tINIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);\n+ \n++\tnet->ipv6.ip6_policy_failed_entry =\n++\t\t\t\tkmemdup(&ip6_policy_failed_entry_template,\n++\t\t\t\tsizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);\n++\tif (!net->ipv6.ip6_policy_failed_entry)\n++\t\tgoto out_ip6_prohibit_entry;\n++\tnet->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops;\n++\tdst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst,\n++\t\t\t ip6_template_metrics, true);\n++\tINIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached);\n++\n+ \tnet->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,\n+ \t\t\t\t\t       sizeof(*net->ipv6.ip6_blk_hole_entry),\n+ \t\t\t\t\t       GFP_KERNEL);\n+ \tif (!net->ipv6.ip6_blk_hole_entry)\n+-\t\tgoto out_ip6_prohibit_entry;\n++\t\tgoto out_ip6_policy_failed_entry;\n+ \tnet->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;\n+ \tdst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,\n+ \t\t\t ip6_template_metrics, true);\n+@@ -6506,6 +6552,8 @@ out:\n+ \treturn ret;\n+ \n+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES\n++out_ip6_policy_failed_entry:\n++\tkfree(net->ipv6.ip6_policy_failed_entry);\n+ out_ip6_prohibit_entry:\n+ \tkfree(net->ipv6.ip6_prohibit_entry);\n+ out_ip6_null_entry:\n+@@ -6525,6 +6573,7 @@ static void __net_exit ip6_route_net_exi\n+ \tkfree(net->ipv6.ip6_null_entry);\n+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES\n+ \tkfree(net->ipv6.ip6_prohibit_entry);\n++\tkfree(net->ipv6.ip6_policy_failed_entry);\n+ \tkfree(net->ipv6.ip6_blk_hole_entry);\n+ #endif\n+ \tdst_entries_destroy(&net->ipv6.ip6_dst_ops);\n+@@ -6602,6 +6651,9 @@ void __init ip6_route_init_special_entri\n+ \tinit_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);\n+ \tinit_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;\n+ \tinit_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);\n++\tinit_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev;\n++\tinit_net.ipv6.ip6_policy_failed_entry->rt6i_idev =\n++\t\tin6_dev_get(init_net.loopback_dev);\n+   #endif\n+ }\n+ \ndiff --git a/target/linux/generic/pending-5.14/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-5.14/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch\nnew file mode 100644\nindex 0000000000..bea43b2bad\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch\n@@ -0,0 +1,50 @@\n+From: Jonas Gorski <jogo@openwrt.org>\n+Subject: net: provide defines for _POLICY_FAILED until all code is updated\n+\n+Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination\n+unreachable, conflicting with our name.\n+\n+Add appropriate defines to allow our code to build with the new\n+name until we have updated our local patches for older kernels\n+and userspace packages.\n+\n+Signed-off-by: Jonas Gorski <jogo@openwrt.org>\n+---\n+ include/uapi/linux/fib_rules.h | 2 ++\n+ include/uapi/linux/icmpv6.h    | 2 ++\n+ include/uapi/linux/rtnetlink.h | 2 ++\n+ 3 files changed, 6 insertions(+)\n+\n+--- a/include/uapi/linux/fib_rules.h\n++++ b/include/uapi/linux/fib_rules.h\n+@@ -89,6 +89,8 @@ enum {\n+ \t__FR_ACT_MAX,\n+ };\n+ \n++#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED\n++\n+ #define FR_ACT_MAX (__FR_ACT_MAX - 1)\n+ \n+ #endif\n+--- a/include/uapi/linux/icmpv6.h\n++++ b/include/uapi/linux/icmpv6.h\n+@@ -126,6 +126,8 @@ struct icmp6hdr {\n+ #define ICMPV6_POLICY_FAIL\t\t5\n+ #define ICMPV6_REJECT_ROUTE\t\t6\n+ \n++#define ICMPV6_FAILED_POLICY\t\tICMPV6_POLICY_FAIL\n++\n+ /*\n+  *\tCodes for Time Exceeded\n+  */\n+--- a/include/uapi/linux/rtnetlink.h\n++++ b/include/uapi/linux/rtnetlink.h\n+@@ -260,6 +260,8 @@ enum {\n+ \t__RTN_MAX\n+ };\n+ \n++#define RTN_FAILED_POLICY RTN_POLICY_FAILED\n++\n+ #define RTN_MAX (__RTN_MAX - 1)\n+ \n+ \ndiff --git a/target/linux/generic/pending-5.14/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-5.14/680-NET-skip-GRO-for-foreign-MAC-addresses.patch\nnew file mode 100644\nindex 0000000000..e621bb9064\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/680-NET-skip-GRO-for-foreign-MAC-addresses.patch\n@@ -0,0 +1,149 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ include/linux/netdevice.h |  2 ++\n+ include/linux/skbuff.h    |  3 ++-\n+ net/core/dev.c            | 48 +++++++++++++++++++++++++++++++++++++++++++++++\n+ net/ethernet/eth.c        | 18 +++++++++++++++++-\n+ 4 files changed, 69 insertions(+), 2 deletions(-)\n+\n+--- a/include/linux/netdevice.h\n++++ b/include/linux/netdevice.h\n+@@ -2051,6 +2051,8 @@ struct net_device {\n+ \tstruct netdev_hw_addr_list\tmc;\n+ \tstruct netdev_hw_addr_list\tdev_addrs;\n+ \n++\tunsigned char\t\tlocal_addr_mask[MAX_ADDR_LEN];\n++\n+ #ifdef CONFIG_SYSFS\n+ \tstruct kset\t\t*queues_kset;\n+ #endif\n+--- a/include/linux/skbuff.h\n++++ b/include/linux/skbuff.h\n+@@ -870,6 +870,7 @@ struct sk_buff {\n+ #ifdef CONFIG_TLS_DEVICE\n+ \t__u8\t\t\tdecrypted:1;\n+ #endif\n++\t__u8\t\t\tgro_skip:1;\n+ \n+ #ifdef CONFIG_NET_SCHED\n+ \t__u16\t\t\ttc_index;\t/* traffic control index */\n+--- a/net/core/dev.c\n++++ b/net/core/dev.c\n+@@ -6108,6 +6108,9 @@ static enum gro_result dev_gro_receive(s\n+ \tint same_flow;\n+ \tint grow;\n+ \n++\tif (skb->gro_skip)\n++\t\tgoto normal;\n++\n+ \tif (netif_elide_gro(skb->dev))\n+ \t\tgoto normal;\n+ \n+@@ -8118,6 +8121,48 @@ static void __netdev_adjacent_dev_unlink\n+ \t\t\t\t\t   &upper_dev->adj_list.lower);\n+ }\n+ \n++static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr,\n++\t\t\t       struct net_device *dev)\n++{\n++\tint i;\n++\n++\tfor (i = 0; i < dev->addr_len; i++)\n++\t\tmask[i] |= addr[i] ^ dev->dev_addr[i];\n++}\n++\n++static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev,\n++\t\t\t\tstruct net_device *lower)\n++{\n++\tstruct net_device *cur;\n++\tstruct list_head *iter;\n++\n++\tnetdev_for_each_upper_dev_rcu(dev, cur, iter) {\n++\t\t__netdev_addr_mask(mask, cur->dev_addr, lower);\n++\t\t__netdev_upper_mask(mask, cur, lower);\n++\t}\n++}\n++\n++static void __netdev_update_addr_mask(struct net_device *dev)\n++{\n++\tunsigned char mask[MAX_ADDR_LEN];\n++\tstruct net_device *cur;\n++\tstruct list_head *iter;\n++\n++\tmemset(mask, 0, sizeof(mask));\n++\t__netdev_upper_mask(mask, dev, dev);\n++\tmemcpy(dev->local_addr_mask, mask, dev->addr_len);\n++\n++\tnetdev_for_each_lower_dev(dev, cur, iter)\n++\t\t__netdev_update_addr_mask(cur);\n++}\n++\n++static void netdev_update_addr_mask(struct net_device *dev)\n++{\n++\trcu_read_lock();\n++\t__netdev_update_addr_mask(dev);\n++\trcu_read_unlock();\n++}\n++\n+ static int __netdev_upper_dev_link(struct net_device *dev,\n+ \t\t\t\t   struct net_device *upper_dev, bool master,\n+ \t\t\t\t   void *upper_priv, void *upper_info,\n+@@ -8169,6 +8214,7 @@ static int __netdev_upper_dev_link(struc\n+ \tif (ret)\n+ \t\treturn ret;\n+ \n++\tnetdev_update_addr_mask(dev);\n+ \tret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,\n+ \t\t\t\t\t    &changeupper_info.info);\n+ \tret = notifier_to_errno(ret);\n+@@ -8265,6 +8311,7 @@ static void __netdev_upper_dev_unlink(st\n+ \n+ \t__netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);\n+ \n++\tnetdev_update_addr_mask(dev);\n+ \tcall_netdevice_notifiers_info(NETDEV_CHANGEUPPER,\n+ \t\t\t\t      &changeupper_info.info);\n+ \n+@@ -9084,6 +9131,7 @@ int dev_set_mac_address(struct net_devic\n+ \tif (err)\n+ \t\treturn err;\n+ \tdev->addr_assign_type = NET_ADDR_SET;\n++\tnetdev_update_addr_mask(dev);\n+ \tcall_netdevice_notifiers(NETDEV_CHANGEADDR, dev);\n+ \tadd_device_randomness(dev->dev_addr, dev->addr_len);\n+ \treturn 0;\n+--- a/net/ethernet/eth.c\n++++ b/net/ethernet/eth.c\n+@@ -144,6 +144,18 @@ u32 eth_get_headlen(const struct net_dev\n+ }\n+ EXPORT_SYMBOL(eth_get_headlen);\n+ \n++static inline bool\n++eth_check_local_mask(const void *addr1, const void *addr2, const void *mask)\n++{\n++\tconst u16 *a1 = addr1;\n++\tconst u16 *a2 = addr2;\n++\tconst u16 *m = mask;\n++\n++\treturn (((a1[0] ^ a2[0]) & ~m[0]) |\n++\t\t((a1[1] ^ a2[1]) & ~m[1]) |\n++\t\t((a1[2] ^ a2[2]) & ~m[2]));\n++}\n++\n+ /**\n+  * eth_type_trans - determine the packet's protocol ID.\n+  * @skb: received socket data\n+@@ -175,6 +187,10 @@ __be16 eth_type_trans(struct sk_buff *sk\n+ \t\t} else {\n+ \t\t\tskb->pkt_type = PACKET_OTHERHOST;\n+ \t\t}\n++\n++\t\tif (eth_check_local_mask(eth->h_dest, dev->dev_addr,\n++\t\t\t\t\t dev->local_addr_mask))\n++\t\t\tskb->gro_skip = 1;\n+ \t}\n+ \n+ \t/*\ndiff --git a/target/linux/generic/pending-5.14/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch b/target/linux/generic/pending-5.14/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch\nnew file mode 100644\nindex 0000000000..6323e5e966\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch\n@@ -0,0 +1,26 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Date: Thu, 8 Jul 2021 07:08:29 +0200\n+Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid creating duplicate offload\n+ entries\n+\n+Sometimes multiple CLS_REPLACE calls are issued for the same connection.\n+rhashtable_insert_fast does not check for these duplicates, so multiple\n+hardware flow entries can be created.\n+Fix this by checking for an existing entry early\n+\n+Fixes: 502e84e2382d (\"net: ethernet: mtk_eth_soc: add flow offloading support\")\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+\n+--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c\n++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c\n+@@ -189,6 +189,9 @@ mtk_flow_offload_replace(struct mtk_eth\n+ \tif (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params))\n+ \t\treturn -EEXIST;\n+ \n++\tif (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params))\n++\t\treturn -EEXIST;\n++\n+ \tif (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_META)) {\n+ \t\tstruct flow_match_meta match;\n+ \ndiff --git a/target/linux/generic/pending-5.14/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.14/703-phy-add-detach-callback-to-struct-phy_driver.patch\nnew file mode 100644\nindex 0000000000..016ed94a9a\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/703-phy-add-detach-callback-to-struct-phy_driver.patch\n@@ -0,0 +1,38 @@\n+From: Gabor Juhos <juhosg@openwrt.org>\n+Subject: generic: add detach callback to struct phy_driver\n+\n+lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867\n+\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+---\n+ drivers/net/phy/phy_device.c | 3 +++\n+ include/linux/phy.h          | 6 ++++++\n+ 2 files changed, 9 insertions(+)\n+\n+--- a/drivers/net/phy/phy_device.c\n++++ b/drivers/net/phy/phy_device.c\n+@@ -1701,6 +1701,9 @@ void phy_detach(struct phy_device *phyde\n+ \tstruct module *ndev_owner = NULL;\n+ \tstruct mii_bus *bus;\n+ \n++\tif (phydev->drv && phydev->drv->detach)\n++\t\tphydev->drv->detach(phydev);\n++\n+ \tif (phydev->sysfs_links) {\n+ \t\tif (dev)\n+ \t\t\tsysfs_remove_link(&dev->dev.kobj, \"phydev\");\n+--- a/include/linux/phy.h\n++++ b/include/linux/phy.h\n+@@ -783,6 +783,12 @@ struct phy_driver {\n+ \t/** @handle_interrupt: Override default interrupt handling */\n+ \tirqreturn_t (*handle_interrupt)(struct phy_device *phydev);\n+ \n++\t/*\n++\t * Called before an ethernet device is detached\n++\t * from the PHY.\n++\t */\n++\tvoid (*detach)(struct phy_device *phydev);\n++\n+ \t/** @remove: Clears up any memory if needed */\n+ \tvoid (*remove)(struct phy_device *phydev);\n+ \ndiff --git a/target/linux/generic/pending-5.14/735-net-phy-at803x-fix-at8033-sgmii-mode.patch b/target/linux/generic/pending-5.14/735-net-phy-at803x-fix-at8033-sgmii-mode.patch\nnew file mode 100644\nindex 0000000000..33a994a943\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/735-net-phy-at803x-fix-at8033-sgmii-mode.patch\n@@ -0,0 +1,51 @@\n+From: Roman Yeryomin <roman@advem.lv>\n+Subject: kernel: add at803x fix for sgmii mode\n+\n+Some (possibly broken) bootloaders incorreclty initialize at8033\n+phy. This patch enables sgmii autonegotiation mode.\n+\n+[john@phrozen.org: felix added this to his upstream queue]\n+\n+Signed-off-by: Roman Yeryomin <roman@advem.lv>\n+---\n+ drivers/net/phy/at803x.c | 25 +++++++++++++++++++++++++\n+ 1 file changed, 25 insertions(+)\n+\n+--- a/drivers/net/phy/at803x.c\n++++ b/drivers/net/phy/at803x.c\n+@@ -76,6 +76,7 @@\n+ #define AT803X_LOC_MAC_ADDR_32_47_OFFSET\t0x804A\n+ #define AT803X_REG_CHIP_CONFIG\t\t\t0x1f\n+ #define AT803X_BT_BX_REG_SEL\t\t\t0x8000\n++#define AT803X_SGMII_ANEG_EN\t\t\t0x1000\n+ \n+ #define AT803X_DEBUG_ADDR\t\t\t0x1D\n+ #define AT803X_DEBUG_DATA\t\t\t0x1E\n+@@ -790,6 +791,27 @@ static int at8031_pll_config(struct phy_\n+ static int at803x_config_init(struct phy_device *phydev)\n+ {\n+ \tint ret;\n++\tu32 v;\n++\n++\tif (phydev->drv->phy_id == ATH8031_PHY_ID &&\n++\t\tphydev->interface == PHY_INTERFACE_MODE_SGMII)\n++\t{\n++\t\tv = phy_read(phydev, AT803X_REG_CHIP_CONFIG);\n++\t\t/* select SGMII/fiber page */\n++\t\tret = phy_write(phydev, AT803X_REG_CHIP_CONFIG,\n++\t\t\t\t\t\tv & ~AT803X_BT_BX_REG_SEL);\n++\t\tif (ret)\n++\t\t\treturn ret;\n++\t\t/* enable SGMII autonegotiation */\n++\t\tret = phy_write(phydev, MII_BMCR, AT803X_SGMII_ANEG_EN);\n++\t\tif (ret)\n++\t\t\treturn ret;\n++\t\t/* select copper page */\n++\t\tret = phy_write(phydev, AT803X_REG_CHIP_CONFIG,\n++\t\t\t\t\t\tv | AT803X_BT_BX_REG_SEL);\n++\t\tif (ret)\n++\t\t\treturn ret;\n++\t}\n+ \n+ \t/* The RX and TX delay default is:\n+ \t *   after HW reset: RX delay enabled and TX delay disabled\ndiff --git a/target/linux/generic/pending-5.14/761-net-dsa-mt7530-Support-EEE-features.patch b/target/linux/generic/pending-5.14/761-net-dsa-mt7530-Support-EEE-features.patch\nnew file mode 100644\nindex 0000000000..302ebf6d02\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/761-net-dsa-mt7530-Support-EEE-features.patch\n@@ -0,0 +1,103 @@\n+From 9cfb2d426c38272f245e9e6f62b3552d1ed5852b Mon Sep 17 00:00:00 2001\n+From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>\n+Date: Tue, 21 Apr 2020 00:18:08 +0200\n+Subject: [PATCH] net: dsa: mt7530: Support EEE features\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+Signed-off-by: René van Dorst <opensource@vdorst.com>\n+--- a/drivers/net/dsa/mt7530.c\n++++ b/drivers/net/dsa/mt7530.c\n+@@ -2752,9 +2752,13 @@ static void mt753x_phylink_mac_link_up(s\n+ \tswitch (speed) {\n+ \tcase SPEED_1000:\n+ \t\tmcr |= PMCR_FORCE_SPEED_1000;\n++\t\tif (priv->eee_enable & BIT(port))\n++\t\t\tmcr |= PMCR_FORCE_EEE1G;\n+ \t\tbreak;\n+ \tcase SPEED_100:\n+ \t\tmcr |= PMCR_FORCE_SPEED_100;\n++\t\tif (priv->eee_enable & BIT(port))\n++\t\t\tmcr |= PMCR_FORCE_EEE100;\n+ \t\tbreak;\n+ \t}\n+ \tif (duplex == DUPLEX_FULL) {\n+@@ -3031,6 +3035,54 @@ static int mt753x_set_mac_eee(struct dsa\n+ \n+ \treturn 0;\n+ }\n++\n++static int mt7530_get_mac_eee(struct dsa_switch *ds, int port,\n++\t\t\t      struct ethtool_eee *e)\n++{\n++\tstruct mt7530_priv *priv = ds->priv;\n++\tu32 eeecr, pmsr;\n++\n++\te->eee_enabled = !!(priv->eee_enable & BIT(port));\n++\n++\tif (e->eee_enabled) {\n++\t\teeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));\n++\t\te->tx_lpi_enabled = !(eeecr & LPI_MODE_EN);\n++\t\te->tx_lpi_timer   = (eeecr >> 4) & 0xFFF;\n++\t\tpmsr = mt7530_read(priv, MT7530_PMSR_P(port));\n++\t\te->eee_active  = e->eee_enabled && !!(pmsr & PMSR_EEE1G);\n++\t} else {\n++\t\te->tx_lpi_enabled = 0;\n++\t\te->tx_lpi_timer = 0;\n++\t\te->eee_active = 0;\n++\t}\n++\n++\treturn 0;\n++}\n++\n++static int mt7530_set_mac_eee(struct dsa_switch *ds, int port,\n++\t\t\t      struct ethtool_eee *e)\n++{\n++\tstruct mt7530_priv *priv = ds->priv;\n++\tu32 eeecr;\n++\n++\tif (e->tx_lpi_enabled && e->tx_lpi_timer > 0xFFF)\n++\t\treturn -EINVAL;\n++\n++\tif (e->eee_enabled) {\n++\t\tpriv->eee_enable |= BIT(port);\n++\t\t//MT7530_PMEEECR_P\n++\t\teeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));\n++\t\teeecr &= 0xFFFF0000;\n++\t\tif (!e->tx_lpi_enabled)\n++\t\t\teeecr |= LPI_MODE_EN;\n++\t\teeecr = LPI_THRESH(e->tx_lpi_timer);\n++\t\tmt7530_write(priv, MT7530_PMEEECR_P(port), eeecr);\n++\t} else {\n++\t\tpriv->eee_enable &= ~(BIT(port));\n++\t}\n++\n++\treturn 0;\n++}\n+ \n+ static const struct dsa_switch_ops mt7530_switch_ops = {\n+ \t.get_tag_protocol\t= mtk_get_tag_protocol,\n+--- a/drivers/net/dsa/mt7530.h\n++++ b/drivers/net/dsa/mt7530.h\n+@@ -328,6 +328,12 @@ enum mt7530_vlan_port_attr {\n+ #define  MAX_RX_PKT_LEN_1552\t\t0x2\n+ #define  MAX_RX_PKT_LEN_JUMBO\t\t0x3\n+ \n++#define MT7530_PMEEECR_P(x)\t\t(0x3004 + (x) * 0x100)\n++#define  WAKEUP_TIME_1000(x)\t\t((x & 0xFF) << 24)\n++#define  WAKEUP_TIME_100(x)\t\t((x & 0xFF) << 16)\n++#define  LPI_THRESH(x)\t\t\t((x & 0xFFF) << 4)\n++#define  LPI_MODE_EN\t\t\tBIT(0)\n++\n+ /* Register for MIB */\n+ #define MT7530_PORT_MIB_COUNTER(x)\t(0x4000 + (x) * 0x100)\n+ #define MT7530_MIB_CCR\t\t\t0x4fe0\n+@@ -803,6 +809,7 @@ struct mt7530_priv {\n+ \tunsigned int\t\tp5_intf_sel;\n+ \tu8\t\t\tmirror_rx;\n+ \tu8\t\t\tmirror_tx;\n++\tu8\t\t\teee_enable;\n+ \n+ \tstruct mt7530_port\tports[MT7530_NUM_PORTS];\n+ \t/* protect among processes for registers access*/\ndiff --git a/target/linux/generic/pending-5.14/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-5.14/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch\nnew file mode 100644\nindex 0000000000..8ea307ea36\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch\n@@ -0,0 +1,71 @@\n+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>\n+Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the\n+ subdevices\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+For bus devices to be fully usable it's required to set their DMA\n+parameters.\n+\n+For years it has been missing and remained unnoticed because of\n+mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask.\n+Kernel 4.19 came with a lot of DMA changes and caused a regression on\n+the bcm47xx. Starting with the commit f8c55dc6e828 (\"MIPS: use generic\n+dma noncoherent ops for simple noncoherent platforms\") DMA coherent\n+allocations just fail. Example:\n+[    1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed\n+[    1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA\n+[    1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12\n+[    1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded\n+\n+This change fixes above regression in addition to the MIPS bcm47xx\n+commit 321c46b91550 (\"MIPS: BCM47XX: Setup struct device for the SoC\").\n+\n+It also fixes another *old* GPIO regression caused by a parent pointing\n+to the NULL:\n+[    0.157054] missing gpiochip .dev parent pointer\n+[    0.157287] bcma: bus0: Error registering GPIO driver: -22\n+introduced by the commit 74f4e0cc6108 (\"bcma: switch GPIO portions to\n+use GPIOLIB_IRQCHIP\").\n+\n+Fixes: f8c55dc6e828 (\"MIPS: use generic dma noncoherent ops for simple noncoherent platforms\")\n+Fixes: 74f4e0cc6108 (\"bcma: switch GPIO portions to use GPIOLIB_IRQCHIP\")\n+Cc: linux-mips@linux-mips.org\n+Cc: Christoph Hellwig <hch@lst.de>\n+Cc: Linus Walleij <linus.walleij@linaro.org>\n+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>\n+---\n+\n+--- a/drivers/bcma/host_soc.c\n++++ b/drivers/bcma/host_soc.c\n+@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm\n+ \tstruct bcma_bus *bus = &soc->bus;\n+ \tint err;\n+ \n++\tbus->dev = soc->dev;\n++\n+ \t/* Scan bus and initialize it */\n+ \terr = bcma_bus_early_register(bus);\n+ \tif (err)\n+--- a/drivers/bcma/main.c\n++++ b/drivers/bcma/main.c\n+@@ -236,13 +236,17 @@ EXPORT_SYMBOL(bcma_core_irq);\n+ \n+ void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)\n+ {\n++\tstruct device *dev = &core->dev;\n++\n+ \tdevice_initialize(&core->dev);\n+ \tcore->dev.release = bcma_release_core_dev;\n+ \tcore->dev.bus = &bcma_bus_type;\n+ \tdev_set_name(&core->dev, \"bcma%d:%d\", bus->num, core->core_index);\n+ \tcore->dev.parent = bus->dev;\n+-\tif (bus->dev)\n++\tif (bus->dev) {\n+ \t\tbcma_of_fill_device(bus->dev, core);\n++\t\tdma_coerce_mask_and_coherent(dev, bus->dev->coherent_dma_mask);\n++\t}\n+ \n+ \tswitch (bus->hosttype) {\n+ \tcase BCMA_HOSTTYPE_PCI:\ndiff --git a/target/linux/generic/pending-5.14/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-5.14/810-pci_disable_common_quirks.patch\nnew file mode 100644\nindex 0000000000..fc2979eb5a\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/810-pci_disable_common_quirks.patch\n@@ -0,0 +1,62 @@\n+From: Gabor Juhos <juhosg@openwrt.org>\n+Subject: debloat: add kernel config option to disabling common PCI quirks\n+\n+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>\n+---\n+ drivers/pci/Kconfig  | 6 ++++++\n+ drivers/pci/quirks.c | 6 ++++++\n+ 2 files changed, 12 insertions(+)\n+\n+--- a/drivers/pci/Kconfig\n++++ b/drivers/pci/Kconfig\n+@@ -118,6 +118,13 @@ config XEN_PCIDEV_FRONTEND\n+ \t  The PCI device frontend driver allows the kernel to import arbitrary\n+ \t  PCI devices from a PCI backend to support PCI driver domains.\n+ \n++config PCI_DISABLE_COMMON_QUIRKS\n++\tbool \"PCI disable common quirks\"\n++\tdepends on PCI\n++\thelp\n++\t  If you don't know what to do here, say N.\n++\n++\n+ config PCI_ATS\n+ \tbool\n+ \n+--- a/drivers/pci/quirks.c\n++++ b/drivers/pci/quirks.c\n+@@ -206,6 +206,7 @@ static void quirk_mmio_always_on(struct\n+ DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,\n+ \t\t\t\tPCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);\n+ \n++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS\n+ /*\n+  * The Mellanox Tavor device gives false positive parity errors.  Disable\n+  * parity error reporting.\n+@@ -3310,6 +3311,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I\n+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);\n+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);\n+ \n++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */\n++\n+ /*\n+  * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.\n+  * To work around this, query the size it should be configured to by the\n+@@ -3335,6 +3338,8 @@ static void quirk_intel_ntb(struct pci_d\n+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb);\n+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb);\n+ \n++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS\n++\n+ /*\n+  * Some BIOS implementations leave the Intel GPU interrupts enabled, even\n+  * though no one is handling them (e.g., if the i915 driver is never\n+@@ -3373,6 +3378,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN\n+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);\n+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);\n+ \n++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */\n++\n+ /*\n+  * PCI devices which are on Intel chips can skip the 10ms delay\n+  * before entering D3 mode.\ndiff --git a/target/linux/generic/pending-5.14/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-5.14/811-pci_disable_usb_common_quirks.patch\nnew file mode 100644\nindex 0000000000..67406bac84\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/811-pci_disable_usb_common_quirks.patch\n@@ -0,0 +1,115 @@\n+From: Felix Fietkau <nbd@nbd.name>\n+Subject: debloat: disable common USB quirks\n+\n+Signed-off-by: Felix Fietkau <nbd@nbd.name>\n+---\n+ drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++\n+ drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++-\n+ include/linux/usb/hcd.h       |  7 +++++++\n+ 3 files changed, 40 insertions(+), 1 deletion(-)\n+\n+--- a/drivers/usb/host/pci-quirks.c\n++++ b/drivers/usb/host/pci-quirks.c\n+@@ -128,6 +128,8 @@ struct amd_chipset_type {\n+ \tu8 rev;\n+ };\n+ \n++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS\n++\n+ static struct amd_chipset_info {\n+ \tstruct pci_dev\t*nb_dev;\n+ \tstruct pci_dev\t*smbus_dev;\n+@@ -633,6 +635,10 @@ bool usb_amd_pt_check_port(struct device\n+ }\n+ EXPORT_SYMBOL_GPL(usb_amd_pt_check_port);\n+ \n++#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */\n++\n++#if IS_ENABLED(CONFIG_USB_UHCI_HCD)\n++\n+ /*\n+  * Make sure the controller is completely inactive, unable to\n+  * generate interrupts or do DMA.\n+@@ -712,8 +718,17 @@ reset_needed:\n+ \tuhci_reset_hc(pdev, base);\n+ \treturn 1;\n+ }\n++#else\n++int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base)\n++{\n++\treturn 0;\n++}\n++\n++#endif\n+ EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc);\n+ \n++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS\n++\n+ static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask)\n+ {\n+ \tu16 cmd;\n+@@ -1285,3 +1300,4 @@ static void quirk_usb_early_handoff(stru\n+ }\n+ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,\n+ \t\t\tPCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff);\n++#endif\n+--- a/drivers/usb/host/pci-quirks.h\n++++ b/drivers/usb/host/pci-quirks.h\n+@@ -5,6 +5,9 @@\n+ #ifdef CONFIG_USB_PCI\n+ void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);\n+ int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);\n++#endif  /* CONFIG_USB_PCI */\n++\n++#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS)\n+ int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);\n+ bool usb_amd_hang_symptom_quirk(void);\n+ bool usb_amd_prefetch_quirk(void);\n+@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev,\n+ bool usb_amd_pt_check_port(struct device *device, int port);\n+ #else\n+ struct pci_dev;\n++static inline int usb_amd_quirk_pll_check(void)\n++{\n++\treturn 0;\n++}\n++static inline bool usb_amd_hang_symptom_quirk(void)\n++{\n++\treturn false;\n++}\n++static inline bool usb_amd_prefetch_quirk(void)\n++{\n++\treturn false;\n++}\n+ static inline void usb_amd_quirk_pll_disable(void) {}\n+ static inline void usb_amd_quirk_pll_enable(void) {}\n+ static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}\n+@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port\n+ {\n+ \treturn false;\n+ }\n++static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {}\n++static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev)\n++{\n++\treturn false;\n++}\n+ #endif  /* CONFIG_USB_PCI */\n+ \n+ #endif  /*  __LINUX_USB_PCI_QUIRKS_H  */\n+--- a/include/linux/usb/hcd.h\n++++ b/include/linux/usb/hcd.h\n+@@ -497,7 +497,14 @@ extern int usb_hcd_pci_probe(struct pci_\n+ extern void usb_hcd_pci_remove(struct pci_dev *dev);\n+ extern void usb_hcd_pci_shutdown(struct pci_dev *dev);\n+ \n++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS\n+ extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev);\n++#else\n++static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev)\n++{\n++\treturn 0;\n++}\n++#endif\n+ \n+ #ifdef CONFIG_PM\n+ extern const struct dev_pm_ops usb_hcd_pci_pm_ops;\ndiff --git a/target/linux/generic/pending-5.14/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch b/target/linux/generic/pending-5.14/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch\nnew file mode 100644\nindex 0000000000..33eb34c913\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch\n@@ -0,0 +1,26 @@\n+From d9c8bc8c1408f3e8529db6e4e04017b4c579c342 Mon Sep 17 00:00:00 2001\n+From: Pawel Dembicki <paweldembicki@gmail.com>\n+Date: Sun, 18 Feb 2018 17:08:04 +0100\n+Subject: [PATCH] w1: gpio: fix problem with platfom data in w1-gpio\n+\n+In devices, where fdt is used, is impossible to apply platform data\n+without proper fdt node.\n+\n+This patch allow to use platform data in devices with fdt.\n+\n+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>\n+---\n+ drivers/w1/masters/w1-gpio.c | 7 +++----\n+ 1 file changed, 3 insertions(+), 4 deletions(-)\n+\n+--- a/drivers/w1/masters/w1-gpio.c\n++++ b/drivers/w1/masters/w1-gpio.c\n+@@ -76,7 +76,7 @@ static int w1_gpio_probe(struct platform\n+ \tenum gpiod_flags gflags = GPIOD_OUT_LOW_OPEN_DRAIN;\n+ \tint err;\n+ \n+-\tif (of_have_populated_dt()) {\n++\tif (of_have_populated_dt() && !dev_get_platdata(&pdev->dev)) {\n+ \t\tpdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);\n+ \t\tif (!pdata)\n+ \t\t\treturn -ENOMEM;\ndiff --git a/target/linux/generic/pending-5.14/834-ledtrig-libata.patch b/target/linux/generic/pending-5.14/834-ledtrig-libata.patch\nnew file mode 100644\nindex 0000000000..a52e712d8c\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/834-ledtrig-libata.patch\n@@ -0,0 +1,149 @@\n+From: Daniel Golle <daniel@makrotopia.org>\n+Subject: libata: add ledtrig support\n+\n+This adds a LED trigger for each ATA port indicating disk activity.\n+\n+As this is needed only on specific platforms (NAS SoCs and such),\n+these platforms should define ARCH_WANTS_LIBATA_LEDS if there\n+are boards with LED(s) intended to indicate ATA disk activity and\n+need the OS to take care of that.\n+In that way, if not selected, LED trigger support not will be\n+included in libata-core and both, codepaths and structures remain\n+untouched.\n+\n+Signed-off-by: Daniel Golle <daniel@makrotopia.org>\n+---\n+ drivers/ata/Kconfig       | 16 ++++++++++++++++\n+ drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++\n+ include/linux/libata.h    |  9 +++++++++\n+ 3 files changed, 66 insertions(+)\n+\n+--- a/drivers/ata/Kconfig\n++++ b/drivers/ata/Kconfig\n+@@ -67,6 +67,22 @@ config ATA_FORCE\n+ \n+ \t  If unsure, say Y.\n+ \n++config ARCH_WANT_LIBATA_LEDS\n++\tbool\n++\n++config ATA_LEDS\n++\tbool \"support ATA port LED triggers\"\n++\tdepends on ARCH_WANT_LIBATA_LEDS\n++\tselect NEW_LEDS\n++\tselect LEDS_CLASS\n++\tselect LEDS_TRIGGERS\n++\tdefault y\n++\thelp\n++\t  This option adds a LED trigger for each registered ATA port.\n++\t  It is used to drive disk activity leds connected via GPIO.\n++\n++\t  If unsure, say N.\n++\n+ config ATA_ACPI\n+ \tbool \"ATA ACPI Support\"\n+ \tdepends on ACPI\n+--- a/drivers/ata/libata-core.c\n++++ b/drivers/ata/libata-core.c\n+@@ -650,6 +650,19 @@ u64 ata_tf_read_block(const struct ata_t\n+ \treturn block;\n+ }\n+ \n++#ifdef CONFIG_ATA_LEDS\n++#define LIBATA_BLINK_DELAY 20 /* ms */\n++static inline void ata_led_act(struct ata_port *ap)\n++{\n++\tunsigned long led_delay = LIBATA_BLINK_DELAY;\n++\n++\tif (unlikely(!ap->ledtrig))\n++\t\treturn;\n++\n++\tled_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0);\n++}\n++#endif\n++\n+ /**\n+  *\tata_build_rw_tf - Build ATA taskfile for given read/write request\n+  *\t@tf: Target ATA taskfile\n+@@ -4513,6 +4526,9 @@ struct ata_queued_cmd *ata_qc_new_init(s\n+ \t\tif (tag < 0)\n+ \t\t\treturn NULL;\n+ \t}\n++#ifdef CONFIG_ATA_LEDS\n++\tata_led_act(ap);\n++#endif\n+ \n+ \tqc = __ata_qc_from_tag(ap, tag);\n+ \tqc->tag = qc->hw_tag = tag;\n+@@ -5291,6 +5307,9 @@ struct ata_port *ata_port_alloc(struct a\n+ \tap->stats.unhandled_irq = 1;\n+ \tap->stats.idle_irq = 1;\n+ #endif\n++#ifdef CONFIG_ATA_LEDS\n++\tap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);\n++#endif\n+ \tata_sff_port_init(ap);\n+ \n+ \treturn ap;\n+@@ -5326,6 +5345,12 @@ static void ata_host_release(struct kref\n+ \n+ \t\tkfree(ap->pmp_link);\n+ \t\tkfree(ap->slave_link);\n++#ifdef CONFIG_ATA_LEDS\n++\t\tif (ap->ledtrig) {\n++\t\t\tled_trigger_unregister(ap->ledtrig);\n++\t\t\tkfree(ap->ledtrig);\n++\t\t};\n++#endif\n+ \t\tkfree(ap);\n+ \t\thost->ports[i] = NULL;\n+ \t}\n+@@ -5732,7 +5757,23 @@ int ata_host_register(struct ata_host *h\n+ \t\thost->ports[i]->print_id = atomic_inc_return(&ata_print_id);\n+ \t\thost->ports[i]->local_port_no = i + 1;\n+ \t}\n++#ifdef CONFIG_ATA_LEDS\n++\tfor (i = 0; i < host->n_ports; i++) {\n++\t\tif (unlikely(!host->ports[i]->ledtrig))\n++\t\t\tcontinue;\n+ \n++\t\tsnprintf(host->ports[i]->ledtrig_name,\n++\t\t\tsizeof(host->ports[i]->ledtrig_name), \"ata%u\",\n++\t\t\thost->ports[i]->print_id);\n++\n++\t\thost->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name;\n++\n++\t\tif (led_trigger_register(host->ports[i]->ledtrig)) {\n++\t\t\tkfree(host->ports[i]->ledtrig);\n++\t\t\thost->ports[i]->ledtrig = NULL;\n++\t\t}\n++\t}\n++#endif\n+ \t/* Create associated sysfs transport objects  */\n+ \tfor (i = 0; i < host->n_ports; i++) {\n+ \t\trc = ata_tport_add(host->dev,host->ports[i]);\n+--- a/include/linux/libata.h\n++++ b/include/linux/libata.h\n+@@ -23,6 +23,9 @@\n+ #include <linux/cdrom.h>\n+ #include <linux/sched.h>\n+ #include <linux/async.h>\n++#ifdef CONFIG_ATA_LEDS\n++#include <linux/leds.h>\n++#endif\n+ \n+ /*\n+  * Define if arch has non-standard setup.  This is a _PCI_ standard\n+@@ -882,6 +885,12 @@ struct ata_port {\n+ #ifdef CONFIG_ATA_ACPI\n+ \tstruct ata_acpi_gtm\t__acpi_init_gtm; /* use ata_acpi_init_gtm() */\n+ #endif\n++\n++#ifdef CONFIG_ATA_LEDS\n++\tstruct led_trigger\t*ledtrig;\n++\tchar\t\t\tledtrig_name[8];\n++#endif\n++\n+ \t/* owned by EH */\n+ \tu8\t\t\tsector_buf[ATA_SECT_SIZE] ____cacheline_aligned;\n+ };\ndiff --git a/target/linux/generic/pending-5.14/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-5.14/840-hwrng-bcm2835-set-quality-to-1000.patch\nnew file mode 100644\nindex 0000000000..5ca8933d6f\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/840-hwrng-bcm2835-set-quality-to-1000.patch\n@@ -0,0 +1,26 @@\n+From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001\n+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>\n+Date: Sat, 20 Feb 2021 18:36:38 +0100\n+Subject: [PATCH] hwrng: bcm2835: set quality to 1000\n+MIME-Version: 1.0\n+Content-Type: text/plain; charset=UTF-8\n+Content-Transfer-Encoding: 8bit\n+\n+This allows devices without a high precission timer to reduce boot from >100s\n+to <30s.\n+\n+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>\n+---\n+ drivers/char/hw_random/bcm2835-rng.c | 1 +\n+ 1 file changed, 1 insertion(+)\n+\n+--- a/drivers/char/hw_random/bcm2835-rng.c\n++++ b/drivers/char/hw_random/bcm2835-rng.c\n+@@ -170,6 +170,7 @@ static int bcm2835_rng_probe(struct plat\n+ \tpriv->rng.init = bcm2835_rng_init;\n+ \tpriv->rng.read = bcm2835_rng_read;\n+ \tpriv->rng.cleanup = bcm2835_rng_cleanup;\n++\tpriv->rng.quality = 1000;\n+ \n+ \tif (dev_of_node(dev)) {\n+ \t\trng_id = of_match_node(bcm2835_rng_of_match, dev->of_node);\ndiff --git a/target/linux/generic/pending-5.14/920-mangle_bootargs.patch b/target/linux/generic/pending-5.14/920-mangle_bootargs.patch\nnew file mode 100644\nindex 0000000000..840d35c0c9\n--- /dev/null\n+++ b/target/linux/generic/pending-5.14/920-mangle_bootargs.patch\n@@ -0,0 +1,71 @@\n+From: Imre Kaloz <kaloz@openwrt.org>\n+Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default\n+\n+Enabling this option renames the bootloader supplied root=\n+and rootfstype= variables, which might have to be know but\n+would break the automatisms OpenWrt uses.\n+\n+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>\n+---\n+ init/Kconfig |  9 +++++++++\n+ init/main.c  | 24 ++++++++++++++++++++++++\n+ 2 files changed, 33 insertions(+)\n+\n+--- a/init/Kconfig\n++++ b/init/Kconfig\n+@@ -1782,6 +1782,15 @@ config EMBEDDED\n+ \t  an embedded system so certain expert options are available\n+ \t  for configuration.\n+ \n++config MANGLE_BOOTARGS\n++\tbool \"Rename offending bootargs\"\n++\tdepends on EXPERT\n++\thelp\n++\t  Sometimes the bootloader passed bogus root= and rootfstype=\n++\t  parameters to the kernel, and while you want to ignore them,\n++\t  you need to know the values f.e. to support dual firmware\n++\t  layouts on the flash.\n++\n+ config HAVE_PERF_EVENTS\n+ \tbool\n+ \thelp\n+--- a/init/main.c\n++++ b/init/main.c\n+@@ -599,6 +599,29 @@ static inline void setup_nr_cpu_ids(void\n+ static inline void smp_prepare_cpus(unsigned int maxcpus) { }\n+ #endif\n+ \n++#ifdef CONFIG_MANGLE_BOOTARGS\n++static void __init mangle_bootargs(char *command_line)\n++{\n++\tchar *rootdev;\n++\tchar *rootfs;\n++\n++\trootdev = strstr(command_line, \"root=/dev/mtdblock\");\n++\n++\tif (rootdev)\n++\t\tstrncpy(rootdev, \"mangled_rootblock=\", 18);\n++\n++\trootfs = strstr(command_line, \"rootfstype\");\n++\n++\tif (rootfs)\n++\t\tstrncpy(rootfs, \"mangled_fs\", 10);\n++\n++}\n++#else\n++static void __init mangle_bootargs(char *command_line)\n++{\n++}\n++#endif\n++\n+ /*\n+  * We need to store the untouched command line for future reference.\n+  * We also need to store the touched command line since the parameter\n+@@ -930,6 +953,7 @@ asmlinkage __visible void __init __no_sa\n+ \tpr_notice(\"%s\", linux_banner);\n+ \tearly_security_init();\n+ \tsetup_arch(&command_line);\n++\tmangle_bootargs(command_line);\n+ \tsetup_boot_config();\n+ \tsetup_command_line(command_line);\n+ \tsetup_nr_cpu_ids();\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/2002-rockchip-add-5.14-support.patch",
    "content": "From f1d636e628e5b30517d07902d67410d532139e79 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Thu, 21 Oct 2021 02:10:42 +0800\nSubject: [PATCH] rockchip add 5.14 support\n\n---\n package/firmware/linux-firmware/realtek.mk    |  15 +-\n package/kernel/linux/modules/usb.mk           |   1 +\n target/linux/rockchip/Makefile                |   2 +-\n target/linux/rockchip/armv8/config-5.14       | 711 ++++++++++++++++++\n .../boot/dts/rockchip/rk3399-rock-pi-4.dts    |  19 +\n ...-r8152-add-LED-configuration-from-OF.patch |  74 ++\n ...et-add-RTL8152-binding-documentation.patch |  54 ++\n ...kchip-add-EEPROM-node-for-NanoPi-R4S.patch |  31 +\n ...-rockchip-use-system-LED-for-OpenWrt.patch |  31 +\n ...dd-OF-node-for-USB-eth-on-NanoPi-R2S.patch |  30 +\n .../patches-5.14/105-rockchip-rock-pi-4.patch |  10 +\n ...d-OF-node-for-pcie-eth-on-NanoPi-R4S.patch |  22 +\n ...-initial-signal-voltage-on-power-off.patch |  35 +\n ...8-add-i2c0-controller-for-nanopi-r2s.patch |  22 +\n ...328-Add-support-for-OrangePi-R1-Plus.patch |  52 ++\n ...-for-rockchip-hardware-random-number.patch |  45 ++\n ...ip-add-hardware-random-number-genera.patch |  50 ++\n ...ip-add-devfreq-driver-for-rk3328-dmc.patch |  44 ++\n ...setting-ddr-clock-via-SIP-Version-2-.patch | 210 ++++++\n ...eq-rockchip-dfi-add-more-soc-support.patch | 662 ++++++++++++++++\n ...m64-dts-rockchip-rk3328-add-dfi-node.patch |  27 +\n ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 ++++\n ...-add-driver-for-Rockchip-USB-3.0-PHY.patch |  51 ++\n ...adjust-default-coherent_pool-to-2MiB.patch |  28 +\n ...ip-add-more-cpu-operating-points-for.patch |  44 ++\n ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 182 +++++\n 26 files changed, 2576 insertions(+), 2 deletions(-)\n create mode 100644 target/linux/rockchip/armv8/config-5.14\n create mode 100644 target/linux/rockchip/files-5.14/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts\n create mode 100644 target/linux/rockchip/patches-5.14/002-net-usb-r8152-add-LED-configuration-from-OF.patch\n create mode 100644 target/linux/rockchip/patches-5.14/003-dt-bindings-net-add-RTL8152-binding-documentation.patch\n create mode 100644 target/linux/rockchip/patches-5.14/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch\n create mode 100644 target/linux/rockchip/patches-5.14/100-rockchip-use-system-LED-for-OpenWrt.patch\n create mode 100644 target/linux/rockchip/patches-5.14/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\n create mode 100644 target/linux/rockchip/patches-5.14/105-rockchip-rock-pi-4.patch\n create mode 100644 target/linux/rockchip/patches-5.14/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n create mode 100644 target/linux/rockchip/patches-5.14/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n create mode 100644 target/linux/rockchip/patches-5.14/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n create mode 100644 target/linux/rockchip/patches-5.14/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n create mode 100644 target/linux/rockchip/patches-5.14/801-char-add-support-for-rockchip-hardware-random-number.patch\n create mode 100644 target/linux/rockchip/patches-5.14/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n create mode 100644 target/linux/rockchip/patches-5.14/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n create mode 100644 target/linux/rockchip/patches-5.14/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n create mode 100644 target/linux/rockchip/patches-5.14/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n create mode 100644 target/linux/rockchip/patches-5.14/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n create mode 100644 target/linux/rockchip/patches-5.14/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n create mode 100644 target/linux/rockchip/patches-5.14/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\n create mode 100644 target/linux/rockchip/patches-5.14/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n create mode 100644 target/linux/rockchip/patches-5.14/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n create mode 100644 target/linux/rockchip/patches-5.14/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n\ndiff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk\nindex b0f6ff7f35..182a5ce4d1 100644\n--- a/package/firmware/linux-firmware/realtek.mk\n+++ b/package/firmware/linux-firmware/realtek.mk\n@@ -1,8 +1,21 @@\n+Package/r8152-firmware = $(call Package/firmware-default,RealTek RTL8152 firmware)\n+define Package/r8152-firmware/install\n+\t$(INSTALL_DIR) $(1)/lib/firmware/rtl_nic\n+\t$(CP) \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl8153* \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl8156* \\\n+\t\t$(1)/lib/firmware/rtl_nic\n+endef\n+$(eval $(call BuildPackage,r8152-firmware))\n+\n Package/r8169-firmware = $(call Package/firmware-default,RealTek RTL8169 firmware)\n define Package/r8169-firmware/install\n \t$(INSTALL_DIR) $(1)/lib/firmware/rtl_nic\n \t$(CP) \\\n-\t\t$(PKG_BUILD_DIR)/rtl_nic/* \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl810* \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl8125* \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl8168* \\\n+\t\t$(PKG_BUILD_DIR)/rtl_nic/rtl84* \\\n \t\t$(1)/lib/firmware/rtl_nic\n endef\n $(eval $(call BuildPackage,r8169-firmware))\ndiff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk\nindex 3249b854d6..96f8672f19 100644\n--- a/package/kernel/linux/modules/usb.mk\n+++ b/package/kernel/linux/modules/usb.mk\n@@ -1340,6 +1340,7 @@ $(eval $(call KernelPackage,usb-net-rtl8150))\n \n define KernelPackage/usb-net-rtl8152\n   TITLE:=Kernel module for USB-to-Ethernet Realtek convertors\n+  DEPENDS:=+r8152-firmware +kmod-crypto-sha256 +kmod-usb-net-cdc-ncm\n   KCONFIG:=CONFIG_USB_RTL8152\n   FILES:=$(LINUX_DIR)/drivers/$(USBNET_DIR)/r8152.ko\n   AUTOLOAD:=$(call AutoProbe,r8152)\ndiff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile\nindex 0245f02eac..45198d755e 100644\n--- a/target/linux/rockchip/Makefile\n+++ b/target/linux/rockchip/Makefile\n@@ -7,7 +7,7 @@ BOARDNAME:=Rockchip\n FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs\n SUBTARGETS:=armv8\n \n-KERNEL_PATCHVER=5.10\n+KERNEL_PATCHVER=5.14\n \n define Target/Description\n \tBuild firmware image for Rockchip SoC devices.\ndiff --git a/target/linux/rockchip/armv8/config-5.14 b/target/linux/rockchip/armv8/config-5.14\nnew file mode 100644\nindex 0000000000..3ad94a0bdd\n--- /dev/null\n+++ b/target/linux/rockchip/armv8/config-5.14\n@@ -0,0 +1,711 @@\n+CONFIG_64BIT=y\n+# CONFIG_ARCH_BCM4908 is not set\n+CONFIG_ARCH_DMA_ADDR_T_64BIT=y\n+CONFIG_ARCH_HIBERNATION_POSSIBLE=y\n+CONFIG_ARCH_KEEP_MEMBLOCK=y\n+CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y\n+CONFIG_ARCH_MMAP_RND_BITS=18\n+CONFIG_ARCH_MMAP_RND_BITS_MAX=33\n+CONFIG_ARCH_MMAP_RND_BITS_MIN=18\n+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11\n+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11\n+CONFIG_ARCH_PROC_KCORE_TEXT=y\n+CONFIG_ARCH_ROCKCHIP=y\n+CONFIG_ARCH_SPARSEMEM_ENABLE=y\n+CONFIG_ARCH_STACKWALK=y\n+CONFIG_ARCH_SUSPEND_POSSIBLE=y\n+CONFIG_ARCH_WANTS_NO_INSTR=y\n+CONFIG_ARC_EMAC_CORE=y\n+CONFIG_ARM64=y\n+CONFIG_ARM64_4K_PAGES=y\n+CONFIG_ARM64_CNP=y\n+# CONFIG_ARM64_ERRATUM_1165522 is not set\n+# CONFIG_ARM64_ERRATUM_1286807 is not set\n+# CONFIG_ARM64_ERRATUM_1418040 is not set\n+CONFIG_ARM64_ERRATUM_819472=y\n+CONFIG_ARM64_ERRATUM_824069=y\n+CONFIG_ARM64_ERRATUM_826319=y\n+CONFIG_ARM64_ERRATUM_827319=y\n+CONFIG_ARM64_ERRATUM_832075=y\n+CONFIG_ARM64_ERRATUM_843419=y\n+CONFIG_ARM64_ERRATUM_845719=y\n+CONFIG_ARM64_ERRATUM_858921=y\n+CONFIG_ARM64_HW_AFDBM=y\n+CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y\n+CONFIG_ARM64_MODULE_PLTS=y\n+CONFIG_ARM64_PAGE_SHIFT=12\n+CONFIG_ARM64_PAN=y\n+CONFIG_ARM64_PA_BITS=48\n+CONFIG_ARM64_PA_BITS_48=y\n+CONFIG_ARM64_PTR_AUTH=y\n+CONFIG_ARM64_RAS_EXTN=y\n+CONFIG_ARM64_SVE=y\n+# CONFIG_ARM64_SW_TTBR0_PAN is not set\n+CONFIG_ARM64_TAGGED_ADDR_ABI=y\n+CONFIG_ARM64_VA_BITS=48\n+# CONFIG_ARM64_VA_BITS_39 is not set\n+CONFIG_ARM64_VA_BITS_48=y\n+CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y\n+# CONFIG_ARMV8_DEPRECATED is not set\n+CONFIG_ARM_AMBA=y\n+CONFIG_ARM_ARCH_TIMER=y\n+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y\n+CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y\n+CONFIG_ARM_CPUIDLE=y\n+CONFIG_ARM_GIC=y\n+CONFIG_ARM_GIC_V2M=y\n+CONFIG_ARM_GIC_V3=y\n+CONFIG_ARM_GIC_V3_ITS=y\n+CONFIG_ARM_GIC_V3_ITS_PCI=y\n+CONFIG_ARM_MHU=y\n+# CONFIG_ARM_MHU_V2 is not set\n+CONFIG_ARM_PSCI_CPUIDLE=y\n+CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y\n+CONFIG_ARM_PSCI_FW=y\n+CONFIG_ARM_RK3328_DMC_DEVFREQ=y\n+# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set\n+# CONFIG_ARM_SCMI_PROTOCOL is not set\n+CONFIG_ARM_SCPI_CPUFREQ=y\n+CONFIG_ARM_SCPI_POWER_DOMAIN=y\n+CONFIG_ARM_SCPI_PROTOCOL=y\n+CONFIG_ARM_SMMU=y\n+CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y\n+# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set\n+CONFIG_ARM_SMMU_V3=y\n+# CONFIG_ARM_SMMU_V3_SVA is not set\n+CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y\n+CONFIG_BACKLIGHT_CLASS_DEVICE=y\n+CONFIG_BACKLIGHT_GPIO=y\n+CONFIG_BACKLIGHT_PWM=y\n+# CONFIG_BCM_VK is not set\n+CONFIG_BINARY_PRINTF=y\n+CONFIG_BLK_DEV_BSG=y\n+CONFIG_BLK_DEV_BSGLIB=y\n+# CONFIG_BLK_DEV_INITRD is not set\n+CONFIG_BLK_DEV_INTEGRITY=y\n+CONFIG_BLK_DEV_INTEGRITY_T10=y\n+CONFIG_BLK_DEV_LOOP=y\n+CONFIG_BLK_DEV_NVME=y\n+CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y\n+CONFIG_BLK_DEV_SD=y\n+CONFIG_BLK_MQ_PCI=y\n+CONFIG_BLK_PM=y\n+CONFIG_BLK_SCSI_REQUEST=y\n+CONFIG_BLOCK_COMPAT=y\n+CONFIG_BRCMSTB_GISB_ARB=y\n+# CONFIG_BRIDGE_CFM is not set\n+CONFIG_BSD_PROCESS_ACCT=y\n+CONFIG_BSD_PROCESS_ACCT_V3=y\n+# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set\n+# CONFIG_CHARGER_BQ256XX is not set\n+CONFIG_CHARGER_GPIO=y\n+# CONFIG_CHARGER_LTC4162L is not set\n+CONFIG_CLKSRC_MMIO=y\n+CONFIG_CLK_PX30=y\n+CONFIG_CLK_RK3308=y\n+CONFIG_CLK_RK3328=y\n+CONFIG_CLK_RK3368=y\n+CONFIG_CLK_RK3399=y\n+CONFIG_CLK_RK3568=y\n+CONFIG_CLONE_BACKWARDS=y\n+CONFIG_CMA=y\n+CONFIG_CMA_ALIGNMENT=8\n+CONFIG_CMA_AREAS=7\n+# CONFIG_CMA_DEBUG is not set\n+# CONFIG_CMA_DEBUGFS is not set\n+CONFIG_CMA_SIZE_MBYTES=5\n+# CONFIG_CMA_SIZE_SEL_MAX is not set\n+CONFIG_CMA_SIZE_SEL_MBYTES=y\n+# CONFIG_CMA_SIZE_SEL_MIN is not set\n+# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set\n+# CONFIG_CMA_SYSFS is not set\n+CONFIG_COMMON_CLK=y\n+# CONFIG_COMMON_CLK_AXI_CLKGEN is not set\n+CONFIG_COMMON_CLK_RK808=y\n+CONFIG_COMMON_CLK_ROCKCHIP=y\n+CONFIG_COMMON_CLK_SCPI=y\n+CONFIG_COMPAT=y\n+CONFIG_COMPAT_32BIT_TIME=y\n+CONFIG_COMPAT_BINFMT_ELF=y\n+CONFIG_COMPAT_NETLINK_MESSAGES=y\n+CONFIG_COMPAT_OLD_SIGACTION=y\n+CONFIG_CONFIGFS_FS=y\n+CONFIG_CONSOLE_TRANSLATIONS=y\n+CONFIG_CONTIG_ALLOC=y\n+CONFIG_CPUFREQ_DT=y\n+CONFIG_CPUFREQ_DT_PLATDEV=y\n+CONFIG_CPU_FREQ=y\n+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set\n+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y\n+CONFIG_CPU_FREQ_GOV_ATTR_SET=y\n+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set\n+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set\n+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y\n+CONFIG_CPU_FREQ_GOV_POWERSAVE=y\n+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y\n+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set\n+CONFIG_CPU_FREQ_STAT=y\n+CONFIG_CPU_IDLE=y\n+CONFIG_CPU_IDLE_GOV_MENU=y\n+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y\n+CONFIG_CPU_ISOLATION=y\n+CONFIG_CPU_PM=y\n+CONFIG_CPU_RMAP=y\n+CONFIG_CPU_THERMAL=y\n+CONFIG_CRASH_CORE=y\n+CONFIG_CRASH_DUMP=y\n+CONFIG_CRC16=y\n+# CONFIG_CRC32_SARWATE is not set\n+CONFIG_CRC32_SLICEBY8=y\n+CONFIG_CRC_T10DIF=y\n+CONFIG_CROSS_MEMORY_ATTACH=y\n+CONFIG_CRYPTO_AEAD=y\n+CONFIG_CRYPTO_AEAD2=y\n+CONFIG_CRYPTO_CRC32=y\n+CONFIG_CRYPTO_CRC32C=y\n+CONFIG_CRYPTO_CRCT10DIF=y\n+# CONFIG_CRYPTO_DEV_ROCKCHIP is not set\n+CONFIG_CRYPTO_DRBG=y\n+CONFIG_CRYPTO_DRBG_HMAC=y\n+CONFIG_CRYPTO_DRBG_MENU=y\n+CONFIG_CRYPTO_GF128MUL=y\n+CONFIG_CRYPTO_HASH=y\n+CONFIG_CRYPTO_HASH2=y\n+CONFIG_CRYPTO_JITTERENTROPY=y\n+CONFIG_CRYPTO_MANAGER=y\n+CONFIG_CRYPTO_MANAGER2=y\n+CONFIG_CRYPTO_NULL2=y\n+CONFIG_CRYPTO_RNG=y\n+CONFIG_CRYPTO_RNG2=y\n+CONFIG_CRYPTO_RNG_DEFAULT=y\n+# CONFIG_CXL_BUS is not set\n+CONFIG_DCACHE_WORD_ACCESS=y\n+CONFIG_DEBUG_BUGVERBOSE=y\n+# CONFIG_DEBUG_IRQFLAGS is not set\n+# CONFIG_DEVFREQ_GOV_PASSIVE is not set\n+CONFIG_DEVFREQ_GOV_PERFORMANCE=y\n+CONFIG_DEVFREQ_GOV_POWERSAVE=y\n+CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y\n+CONFIG_DEVFREQ_GOV_USERSPACE=y\n+# CONFIG_DEVFREQ_THERMAL is not set\n+CONFIG_DEVMEM=y\n+# CONFIG_DEVPORT is not set\n+CONFIG_DEVTMPFS=y\n+CONFIG_DEVTMPFS_MOUNT=y\n+# CONFIG_DMABUF_DEBUG is not set\n+CONFIG_DMADEVICES=y\n+CONFIG_DMA_CMA=y\n+CONFIG_DMA_DIRECT_REMAP=y\n+CONFIG_DMA_ENGINE=y\n+# CONFIG_DMA_MAP_BENCHMARK is not set\n+CONFIG_DMA_OF=y\n+CONFIG_DMA_OPS=y\n+# CONFIG_DMA_PERNUMA_CMA is not set\n+CONFIG_DMA_REMAP=y\n+CONFIG_DMA_SHARED_BUFFER=y\n+CONFIG_DNOTIFY=y\n+CONFIG_DTC=y\n+CONFIG_DT_IDLE_STATES=y\n+CONFIG_DUMMY_CONSOLE=y\n+CONFIG_DWMAC_DWC_QOS_ETH=y\n+CONFIG_DWMAC_GENERIC=y\n+CONFIG_DWMAC_ROCKCHIP=y\n+CONFIG_EDAC_SUPPORT=y\n+CONFIG_EEPROM_AT24=y\n+CONFIG_EMAC_ROCKCHIP=y\n+CONFIG_ENERGY_MODEL=y\n+CONFIG_EXT4_FS=y\n+CONFIG_EXT4_FS_POSIX_ACL=y\n+CONFIG_EXTCON=y\n+# CONFIG_EXTCON_USBC_TUSB320 is not set\n+CONFIG_F2FS_FS=y\n+CONFIG_FANOTIFY=y\n+CONFIG_FHANDLE=y\n+CONFIG_FIXED_PHY=y\n+CONFIG_FIX_EARLYCON_MEM=y\n+# CONFIG_FORTIFY_SOURCE is not set\n+CONFIG_FRAME_POINTER=y\n+CONFIG_FRAME_WARN=2048\n+CONFIG_FS_IOMAP=y\n+CONFIG_FS_MBCACHE=y\n+CONFIG_FS_POSIX_ACL=y\n+# CONFIG_FUJITSU_ERRATUM_010001 is not set\n+CONFIG_FWNODE_MDIO=y\n+CONFIG_FW_LOADER_PAGED_BUF=y\n+CONFIG_GENERIC_ALLOCATOR=y\n+CONFIG_GENERIC_ARCH_TOPOLOGY=y\n+CONFIG_GENERIC_BUG=y\n+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y\n+CONFIG_GENERIC_CLOCKEVENTS=y\n+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y\n+CONFIG_GENERIC_CPU_AUTOPROBE=y\n+CONFIG_GENERIC_CPU_VULNERABILITIES=y\n+CONFIG_GENERIC_CSUM=y\n+CONFIG_GENERIC_EARLY_IOREMAP=y\n+CONFIG_GENERIC_FIND_FIRST_BIT=y\n+CONFIG_GENERIC_GETTIMEOFDAY=y\n+CONFIG_GENERIC_IDLE_POLL_SETUP=y\n+CONFIG_GENERIC_IRQ_CHIP=y\n+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y\n+CONFIG_GENERIC_IRQ_MIGRATION=y\n+CONFIG_GENERIC_IRQ_SHOW=y\n+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y\n+CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y\n+CONFIG_GENERIC_MSI_IRQ=y\n+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y\n+CONFIG_GENERIC_PCI_IOMAP=y\n+CONFIG_GENERIC_PHY=y\n+CONFIG_GENERIC_PINCONF=y\n+CONFIG_GENERIC_SCHED_CLOCK=y\n+CONFIG_GENERIC_SMP_IDLE_THREAD=y\n+CONFIG_GENERIC_STRNCPY_FROM_USER=y\n+CONFIG_GENERIC_STRNLEN_USER=y\n+CONFIG_GENERIC_TIME_VSYSCALL=y\n+CONFIG_GPIOLIB=y\n+CONFIG_GPIOLIB_IRQCHIP=y\n+CONFIG_GPIO_CDEV=y\n+# CONFIG_GPIO_CDEV_V1 is not set\n+CONFIG_GPIO_DWAPB=y\n+CONFIG_GPIO_GENERIC=y\n+CONFIG_GPIO_GENERIC_PLATFORM=y\n+# CONFIG_GUP_TEST is not set\n+CONFIG_HANDLE_DOMAIN_IRQ=y\n+# CONFIG_HARDENED_USERCOPY is not set\n+CONFIG_HARDIRQS_SW_RESEND=y\n+CONFIG_HAS_DMA=y\n+CONFIG_HAS_IOMEM=y\n+CONFIG_HAS_IOPORT_MAP=y\n+CONFIG_HID=y\n+CONFIG_HID_GENERIC=y\n+# CONFIG_HID_PLAYSTATION is not set\n+CONFIG_HOTPLUG_CPU=y\n+CONFIG_HOTPLUG_PCI=y\n+# CONFIG_HOTPLUG_PCI_CPCI is not set\n+# CONFIG_HOTPLUG_PCI_PCIE is not set\n+# CONFIG_HOTPLUG_PCI_SHPC is not set\n+CONFIG_HUGETLBFS=y\n+CONFIG_HUGETLB_PAGE=y\n+CONFIG_HWMON=y\n+CONFIG_HWSPINLOCK=y\n+CONFIG_HW_CONSOLE=y\n+CONFIG_HW_RANDOM=y\n+CONFIG_HW_RANDOM_ROCKCHIP=y\n+CONFIG_HZ=250\n+CONFIG_HZ_250=y\n+CONFIG_I2C=y\n+CONFIG_I2C_BOARDINFO=y\n+CONFIG_I2C_CHARDEV=y\n+CONFIG_I2C_COMPAT=y\n+CONFIG_I2C_HELPER_AUTO=y\n+# CONFIG_I2C_HID_OF is not set\n+# CONFIG_I2C_HID_OF_GOODIX is not set\n+CONFIG_I2C_RK3X=y\n+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000\n+CONFIG_INDIRECT_PIO=y\n+CONFIG_INPUT=y\n+CONFIG_INPUT_EVDEV=y\n+CONFIG_INPUT_FF_MEMLESS=y\n+CONFIG_INPUT_KEYBOARD=y\n+CONFIG_INPUT_LEDS=y\n+CONFIG_INPUT_MATRIXKMAP=y\n+# CONFIG_INPUT_MISC is not set\n+CONFIG_IOMMU_API=y\n+# CONFIG_IOMMU_DEBUGFS is not set\n+# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set\n+CONFIG_IOMMU_DMA=y\n+CONFIG_IOMMU_IOVA=y\n+CONFIG_IOMMU_IO_PGTABLE=y\n+# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set\n+CONFIG_IOMMU_IO_PGTABLE_LPAE=y\n+# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set\n+CONFIG_IOMMU_SUPPORT=y\n+# CONFIG_IO_STRICT_DEVMEM is not set\n+CONFIG_IO_URING=y\n+CONFIG_IRQCHIP=y\n+CONFIG_IRQ_DOMAIN=y\n+CONFIG_IRQ_DOMAIN_HIERARCHY=y\n+CONFIG_IRQ_FORCED_THREADING=y\n+CONFIG_IRQ_MSI_IOMMU=y\n+CONFIG_IRQ_TIME_ACCOUNTING=y\n+CONFIG_IRQ_WORK=y\n+CONFIG_JBD2=y\n+CONFIG_JFFS2_ZLIB=y\n+CONFIG_JUMP_LABEL=y\n+CONFIG_KALLSYMS=y\n+CONFIG_KEXEC_CORE=y\n+CONFIG_KEXEC_FILE=y\n+# CONFIG_KEXEC_SIG is not set\n+# CONFIG_KFENCE is not set\n+CONFIG_KSM=y\n+# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set\n+CONFIG_LEDS_GPIO=y\n+CONFIG_LEDS_PWM=y\n+CONFIG_LEDS_SYSCON=y\n+CONFIG_LEDS_TRIGGER_CPU=y\n+CONFIG_LEDS_TRIGGER_PANIC=y\n+# CONFIG_LEDS_TRIGGER_TTY is not set\n+CONFIG_LEGACY_PTYS=y\n+CONFIG_LEGACY_PTY_COUNT=16\n+CONFIG_LIBCRC32C=y\n+CONFIG_LIBFDT=y\n+# CONFIG_LITEX_SOC_CONTROLLER is not set\n+CONFIG_LLD_VERSION=0\n+CONFIG_LOCALVERSION_AUTO=y\n+CONFIG_LOCK_DEBUGGING_SUPPORT=y\n+CONFIG_LOCK_SPIN_ON_OWNER=y\n+CONFIG_LOG_BUF_SHIFT=19\n+CONFIG_LTO_NONE=y\n+CONFIG_MAGIC_SYSRQ=y\n+CONFIG_MAGIC_SYSRQ_SERIAL=y\n+CONFIG_MAILBOX=y\n+# CONFIG_MAILBOX_TEST is not set\n+CONFIG_MANDATORY_FILE_LOCKING=y\n+CONFIG_MDIO_BUS=y\n+CONFIG_MDIO_BUS_MUX=y\n+CONFIG_MDIO_BUS_MUX_GPIO=y\n+CONFIG_MDIO_BUS_MUX_MMIOREG=y\n+CONFIG_MDIO_DEVICE=y\n+CONFIG_MDIO_DEVRES=y\n+CONFIG_MEMFD_CREATE=y\n+CONFIG_MEMORY_ISOLATION=y\n+CONFIG_MFD_CORE=y\n+# CONFIG_MFD_INTEL_PMT is not set\n+# CONFIG_MFD_KHADAS_MCU is not set\n+CONFIG_MFD_RK808=y\n+CONFIG_MFD_SYSCON=y\n+CONFIG_MIGRATION=y\n+CONFIG_MMC=y\n+CONFIG_MMC_BLOCK=y\n+CONFIG_MMC_BLOCK_MINORS=32\n+CONFIG_MMC_CQHCI=y\n+CONFIG_MMC_DW=y\n+# CONFIG_MMC_DW_BLUEFIELD is not set\n+# CONFIG_MMC_DW_EXYNOS is not set\n+# CONFIG_MMC_DW_HI3798CV200 is not set\n+# CONFIG_MMC_DW_K3 is not set\n+# CONFIG_MMC_DW_PCI is not set\n+CONFIG_MMC_DW_PLTFM=y\n+CONFIG_MMC_DW_ROCKCHIP=y\n+CONFIG_MMC_SDHCI=y\n+CONFIG_MMC_SDHCI_OF_ARASAN=y\n+CONFIG_MMC_SDHCI_OF_DWCMSHC=y\n+# CONFIG_MMC_SDHCI_PCI is not set\n+CONFIG_MMC_SDHCI_PLTFM=y\n+# CONFIG_MMC_TIFM_SD is not set\n+CONFIG_MODULES_USE_ELF_RELA=y\n+CONFIG_MQ_IOSCHED_DEADLINE=y\n+# CONFIG_MTD_CFI is not set\n+CONFIG_MTD_CMDLINE_PARTS=y\n+# CONFIG_MTD_COMPLEX_MAPPINGS is not set\n+# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set\n+CONFIG_MTD_SPI_NOR=y\n+# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set\n+CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y\n+# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set\n+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y\n+CONFIG_MTD_SPLIT_FIRMWARE=y\n+CONFIG_MUTEX_SPIN_ON_OWNER=y\n+CONFIG_NEED_DMA_MAP_STATE=y\n+CONFIG_NEED_SG_DMA_LENGTH=y\n+CONFIG_NET_FLOW_LIMIT=y\n+CONFIG_NET_SELFTESTS=y\n+CONFIG_NET_SOCK_MSG=y\n+CONFIG_NLS=y\n+CONFIG_NLS_ISO8859_1=y\n+CONFIG_NOP_USB_XCEIV=y\n+CONFIG_NO_HZ_COMMON=y\n+CONFIG_NO_HZ_IDLE=y\n+CONFIG_NR_CPUS=256\n+CONFIG_NVMEM=y\n+# CONFIG_NVMEM_RMEM is not set\n+CONFIG_NVMEM_SYSFS=y\n+CONFIG_NVME_CORE=y\n+# CONFIG_NVME_HWMON is not set\n+# CONFIG_NVME_MULTIPATH is not set\n+# CONFIG_NVME_TCP is not set\n+# CONFIG_OCTEONTX2_AF is not set\n+CONFIG_OF=y\n+CONFIG_OF_ADDRESS=y\n+CONFIG_OF_DYNAMIC=y\n+CONFIG_OF_EARLY_FLATTREE=y\n+CONFIG_OF_FLATTREE=y\n+CONFIG_OF_GPIO=y\n+CONFIG_OF_IOMMU=y\n+CONFIG_OF_IRQ=y\n+CONFIG_OF_KOBJ=y\n+CONFIG_OF_MDIO=y\n+CONFIG_OF_NET=y\n+CONFIG_OF_OVERLAY=y\n+CONFIG_OF_RESOLVE=y\n+CONFIG_OLD_SIGSUSPEND3=y\n+# CONFIG_OVERLAY_FS_XINO_AUTO is not set\n+CONFIG_PADATA=y\n+CONFIG_PAGE_POOL=y\n+# CONFIG_PANIC_ON_OOPS is not set\n+CONFIG_PANIC_ON_OOPS_VALUE=0\n+CONFIG_PANIC_TIMEOUT=0\n+# CONFIG_PARTITION_ADVANCED is not set\n+CONFIG_PARTITION_PERCPU=y\n+CONFIG_PCI=y\n+CONFIG_PCIEAER=y\n+CONFIG_PCIEASPM=y\n+CONFIG_PCIEASPM_DEFAULT=y\n+# CONFIG_PCIEASPM_PERFORMANCE is not set\n+# CONFIG_PCIEASPM_POWERSAVE is not set\n+# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set\n+CONFIG_PCIEPORTBUS=y\n+# CONFIG_PCIE_BUS_PERFORMANCE is not set\n+# CONFIG_PCIE_MICROCHIP_HOST is not set\n+CONFIG_PCIE_PME=y\n+CONFIG_PCIE_ROCKCHIP=y\n+CONFIG_PCIE_ROCKCHIP_HOST=y\n+CONFIG_PCI_DOMAINS=y\n+CONFIG_PCI_DOMAINS_GENERIC=y\n+CONFIG_PCI_MSI=y\n+CONFIG_PCI_MSI_IRQ_DOMAIN=y\n+CONFIG_PCI_STUB=y\n+CONFIG_PCS_XPCS=y\n+CONFIG_PGTABLE_LEVELS=4\n+CONFIG_PHYLIB=y\n+CONFIG_PHYLINK=y\n+CONFIG_PHYS_ADDR_T_64BIT=y\n+CONFIG_PHY_ROCKCHIP_DP=y\n+# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set\n+CONFIG_PHY_ROCKCHIP_EMMC=y\n+# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set\n+CONFIG_PHY_ROCKCHIP_INNO_USB2=y\n+# CONFIG_PHY_ROCKCHIP_INNO_USB3 is not set\n+CONFIG_PHY_ROCKCHIP_PCIE=y\n+CONFIG_PHY_ROCKCHIP_TYPEC=y\n+CONFIG_PHY_ROCKCHIP_USB=y\n+CONFIG_PINCTRL=y\n+# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set\n+# CONFIG_PINCTRL_RK805 is not set\n+CONFIG_PINCTRL_ROCKCHIP=y\n+# CONFIG_PINCTRL_SINGLE is not set\n+CONFIG_PL330_DMA=y\n+CONFIG_PLATFORM_MHU=y\n+CONFIG_PM=y\n+CONFIG_PM_CLK=y\n+CONFIG_PM_DEVFREQ=y\n+# CONFIG_PM_DEVFREQ_EVENT is not set\n+CONFIG_PM_GENERIC_DOMAINS=y\n+CONFIG_PM_GENERIC_DOMAINS_OF=y\n+CONFIG_PM_OPP=y\n+CONFIG_POWER_RESET=y\n+# CONFIG_POWER_RESET_REGULATOR is not set\n+CONFIG_POWER_SUPPLY=y\n+CONFIG_POWER_SUPPLY_HWMON=y\n+CONFIG_PREEMPT=y\n+CONFIG_PREEMPTION=y\n+CONFIG_PREEMPT_COUNT=y\n+# CONFIG_PREEMPT_NONE is not set\n+CONFIG_PREEMPT_RCU=y\n+CONFIG_PRINTK_TIME=y\n+# CONFIG_PRINT_QUOTA_WARNING is not set\n+CONFIG_PROC_PAGE_MONITOR=y\n+CONFIG_PROC_VMCORE=y\n+CONFIG_PWM=y\n+# CONFIG_PWM_ATMEL_TCB is not set\n+# CONFIG_PWM_DWC is not set\n+CONFIG_PWM_ROCKCHIP=y\n+CONFIG_PWM_SYSFS=y\n+# CONFIG_QFMT_V1 is not set\n+# CONFIG_QFMT_V2 is not set\n+CONFIG_QUEUED_RWLOCKS=y\n+CONFIG_QUEUED_SPINLOCKS=y\n+CONFIG_QUOTA=y\n+CONFIG_QUOTACTL=y\n+# CONFIG_QUOTA_NETLINK_INTERFACE is not set\n+CONFIG_RAID_ATTRS=y\n+CONFIG_RANDOMIZE_BASE=y\n+CONFIG_RANDOMIZE_MODULE_REGION_FULL=y\n+CONFIG_RAS=y\n+CONFIG_RATIONAL=y\n+# CONFIG_RAVE_SP_CORE is not set\n+CONFIG_RCU_CPU_STALL_TIMEOUT=21\n+# CONFIG_RCU_EXPERT is not set\n+CONFIG_RCU_NEED_SEGCBLIST=y\n+CONFIG_RCU_STALL_COMMON=y\n+CONFIG_RCU_TRACE=y\n+CONFIG_REALTEK_PHY=y\n+CONFIG_REGMAP=y\n+CONFIG_REGMAP_I2C=y\n+CONFIG_REGMAP_IRQ=y\n+CONFIG_REGMAP_MMIO=y\n+CONFIG_REGULATOR=y\n+# CONFIG_REGULATOR_DA9121 is not set\n+CONFIG_REGULATOR_FAN53555=y\n+CONFIG_REGULATOR_FIXED_VOLTAGE=y\n+CONFIG_REGULATOR_GPIO=y\n+# CONFIG_REGULATOR_PF8X00 is not set\n+CONFIG_REGULATOR_PWM=y\n+CONFIG_REGULATOR_RK808=y\n+CONFIG_RELOCATABLE=y\n+CONFIG_RESET_CONTROLLER=y\n+CONFIG_RFS_ACCEL=y\n+CONFIG_ROCKCHIP_EFUSE=y\n+CONFIG_ROCKCHIP_GRF=y\n+CONFIG_ROCKCHIP_IODOMAIN=y\n+CONFIG_ROCKCHIP_IOMMU=y\n+CONFIG_ROCKCHIP_MBOX=y\n+# CONFIG_ROCKCHIP_OTP is not set\n+CONFIG_ROCKCHIP_PHY=y\n+CONFIG_ROCKCHIP_PM_DOMAINS=y\n+CONFIG_ROCKCHIP_THERMAL=y\n+CONFIG_ROCKCHIP_TIMER=y\n+CONFIG_RODATA_FULL_DEFAULT_ENABLED=y\n+CONFIG_RPS=y\n+CONFIG_RSEQ=y\n+CONFIG_RTC_CLASS=y\n+CONFIG_RTC_DRV_RK808=y\n+CONFIG_RTC_I2C_AND_SPI=y\n+CONFIG_RTC_NVMEM=y\n+# CONFIG_RUNTIME_TESTING_MENU is not set\n+CONFIG_RWSEM_SPIN_ON_OWNER=y\n+CONFIG_SCHED_MC=y\n+CONFIG_SCSI=y\n+# CONFIG_SCSI_LOWLEVEL is not set\n+# CONFIG_SCSI_PROC_FS is not set\n+CONFIG_SCSI_SAS_ATTRS=y\n+CONFIG_SCSI_SAS_HOST_SMP=y\n+CONFIG_SCSI_SAS_LIBSAS=y\n+# CONFIG_SECURITY_DMESG_RESTRICT is not set\n+# CONFIG_SENSORS_AHT10 is not set\n+CONFIG_SENSORS_ARM_SCPI=y\n+# CONFIG_SENSORS_CORSAIR_PSU is not set\n+# CONFIG_SENSORS_LTC2992 is not set\n+# CONFIG_SENSORS_MAX127 is not set\n+# CONFIG_SENSORS_SBTSI is not set\n+# CONFIG_SENSORS_TPS23861 is not set\n+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y\n+CONFIG_SERIAL_8250_DW=y\n+CONFIG_SERIAL_8250_DWLIB=y\n+CONFIG_SERIAL_8250_EXAR=y\n+CONFIG_SERIAL_8250_EXTENDED=y\n+CONFIG_SERIAL_8250_FSL=y\n+CONFIG_SERIAL_8250_NR_UARTS=4\n+CONFIG_SERIAL_8250_PCI=y\n+CONFIG_SERIAL_8250_RUNTIME_UARTS=4\n+CONFIG_SERIAL_8250_SHARE_IRQ=y\n+CONFIG_SERIAL_AMBA_PL011=y\n+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y\n+CONFIG_SERIAL_DEV_BUS=y\n+CONFIG_SERIAL_DEV_CTRL_TTYPORT=y\n+CONFIG_SERIAL_MCTRL_GPIO=y\n+CONFIG_SERIAL_OF_PLATFORM=y\n+CONFIG_SERIO=y\n+CONFIG_SERIO_AMBAKMI=y\n+CONFIG_SERIO_LIBPS2=y\n+CONFIG_SG_POOL=y\n+CONFIG_SIMPLE_PM_BUS=y\n+CONFIG_SLUB_DEBUG=y\n+CONFIG_SMP=y\n+CONFIG_SOCK_RX_QUEUE_MAPPING=y\n+CONFIG_SPARSEMEM=y\n+CONFIG_SPARSEMEM_EXTREME=y\n+CONFIG_SPARSEMEM_VMEMMAP=y\n+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y\n+CONFIG_SPARSE_IRQ=y\n+CONFIG_SPI=y\n+CONFIG_SPI_BITBANG=y\n+CONFIG_SPI_DYNAMIC=y\n+CONFIG_SPI_MASTER=y\n+CONFIG_SPI_MEM=y\n+CONFIG_SPI_ROCKCHIP=y\n+CONFIG_SPI_SPIDEV=y\n+# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set\n+CONFIG_SQUASHFS_DECOMP_SINGLE=y\n+# CONFIG_SQUASHFS_EMBEDDED is not set\n+CONFIG_SQUASHFS_FILE_CACHE=y\n+# CONFIG_SQUASHFS_FILE_DIRECT is not set\n+CONFIG_SRAM=y\n+CONFIG_SRCU=y\n+CONFIG_STACKDEPOT=y\n+CONFIG_STACKPROTECTOR=y\n+CONFIG_STACKPROTECTOR_STRONG=y\n+CONFIG_STACKTRACE=y\n+# CONFIG_STAGING is not set\n+CONFIG_STMMAC_ETH=y\n+CONFIG_STMMAC_PLATFORM=y\n+# CONFIG_STMMAC_SELFTESTS is not set\n+CONFIG_STRICT_DEVMEM=y\n+# CONFIG_STRIP_ASM_SYMS is not set\n+# CONFIG_SWAP is not set\n+CONFIG_SWIOTLB=y\n+CONFIG_SWPHY=y\n+CONFIG_SYNC_FILE=y\n+CONFIG_SYSCTL_EXCEPTION_TRACE=y\n+CONFIG_SYSFS_SYSCALL=y\n+CONFIG_SYSVIPC_COMPAT=y\n+# CONFIG_TEXTSEARCH is not set\n+CONFIG_THERMAL=y\n+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y\n+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0\n+CONFIG_THERMAL_EMULATION=y\n+CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y\n+CONFIG_THERMAL_GOV_STEP_WISE=y\n+CONFIG_THERMAL_HWMON=y\n+CONFIG_THERMAL_OF=y\n+CONFIG_THREAD_INFO_IN_TASK=y\n+CONFIG_TICK_CPU_ACCOUNTING=y\n+CONFIG_TIMER_OF=y\n+CONFIG_TIMER_PROBE=y\n+CONFIG_TRACE_CLOCK=y\n+CONFIG_TRANSPARENT_HUGEPAGE=y\n+CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y\n+# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set\n+CONFIG_TREE_RCU=y\n+CONFIG_TREE_SRCU=y\n+CONFIG_TYPEC=y\n+# CONFIG_TYPEC_DP_ALTMODE is not set\n+CONFIG_TYPEC_FUSB302=y\n+# CONFIG_TYPEC_HD3SS3220 is not set\n+# CONFIG_TYPEC_MUX_PI3USB30532 is not set\n+# CONFIG_TYPEC_STUSB160X is not set\n+# CONFIG_TYPEC_TCPCI is not set\n+CONFIG_TYPEC_TCPM=y\n+# CONFIG_TYPEC_TPS6598X is not set\n+# CONFIG_UACCE is not set\n+# CONFIG_UCLAMP_TASK is not set\n+# CONFIG_UEVENT_HELPER is not set\n+CONFIG_UNINLINE_SPIN_UNLOCK=y\n+CONFIG_UNMAP_KERNEL_AT_EL0=y\n+CONFIG_USB=y\n+# CONFIG_USB_CDNS_SUPPORT is not set\n+CONFIG_USB_COMMON=y\n+CONFIG_USB_DWC3=y\n+CONFIG_USB_DWC3_HOST=y\n+CONFIG_USB_DWC3_OF_SIMPLE=y\n+CONFIG_USB_EHCI_HCD=y\n+CONFIG_USB_EHCI_HCD_PLATFORM=y\n+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set\n+CONFIG_USB_HID=y\n+CONFIG_USB_OHCI_HCD=y\n+CONFIG_USB_OHCI_HCD_PLATFORM=y\n+CONFIG_USB_PHY=y\n+CONFIG_USB_ROLE_SWITCH=y\n+CONFIG_USB_STORAGE=y\n+CONFIG_USB_SUPPORT=y\n+CONFIG_USB_ULPI=y\n+CONFIG_USB_ULPI_BUS=y\n+CONFIG_USB_ULPI_VIEWPORT=y\n+CONFIG_USB_XHCI_HCD=y\n+CONFIG_USB_XHCI_PLATFORM=y\n+# CONFIG_USERIO is not set\n+# CONFIG_VIRTIO_MENU is not set\n+CONFIG_VMAP_STACK=y\n+CONFIG_VM_EVENT_COUNTERS=y\n+CONFIG_VT=y\n+CONFIG_VT_CONSOLE=y\n+CONFIG_VT_HW_CONSOLE_BINDING=y\n+# CONFIG_WATCHDOG is not set\n+CONFIG_XARRAY_MULTI=y\n+CONFIG_XPS=y\n+CONFIG_XXHASH=y\n+CONFIG_XZ_DEC_ARM=y\n+CONFIG_XZ_DEC_ARMTHUMB=y\n+CONFIG_XZ_DEC_BCJ=y\n+CONFIG_ZLIB_DEFLATE=y\n+CONFIG_ZLIB_INFLATE=y\n+CONFIG_ZONE_DMA32=y\ndiff --git a/target/linux/rockchip/files-5.14/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts b/target/linux/rockchip/files-5.14/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts\nnew file mode 100644\nindex 0000000000..f6e7710a01\n--- /dev/null\n+++ b/target/linux/rockchip/files-5.14/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts\n@@ -0,0 +1,19 @@\n+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n+/*\n+ * Copyright (c) 2019 Akash Gajjar <Akash_Gajjar@mentor.com>\n+ * Copyright (c) 2019 Pragnesh Patel <Pragnesh_Patel@mentor.com>\n+ */\n+\n+/* TODO\n+ * Delete this file and migrate RockPi 4 to RockPi 4A after\n+ * removing Kernel 5.4.\n+ */\n+\n+\n+/dts-v1/;\n+#include \"rk3399-rock-pi-4.dtsi\"\n+\n+/ {\n+\tmodel = \"Radxa ROCK Pi 4\";\n+\tcompatible = \"radxa,rockpi4\", \"rockchip,rk3399\";\n+};\ndiff --git a/target/linux/rockchip/patches-5.14/002-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/rockchip/patches-5.14/002-net-usb-r8152-add-LED-configuration-from-OF.patch\nnew file mode 100644\nindex 0000000000..a4ac009d59\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/002-net-usb-r8152-add-LED-configuration-from-OF.patch\n@@ -0,0 +1,74 @@\n+From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Sun, 26 Jul 2020 02:38:31 +0200\n+Subject: [PATCH] net: usb: r8152: add LED configuration from OF\n+\n+This adds the ability to configure the LED configuration register using\n+OF. This way, the correct value for board specific LED configuration can\n+be determined.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++\n+ 1 file changed, 23 insertions(+)\n+\n+--- a/drivers/net/usb/r8152.c\n++++ b/drivers/net/usb/r8152.c\n+@@ -11,6 +11,7 @@\n+ #include <linux/mii.h>\n+ #include <linux/ethtool.h>\n+ #include <linux/usb.h>\n++#include <linux/of.h>\n+ #include <linux/crc32.h>\n+ #include <linux/if_vlan.h>\n+ #include <linux/uaccess.h>\n+@@ -6808,6 +6809,22 @@ static void rtl_tally_reset(struct r8152\n+ \tocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);\n+ }\n+ \n++static int r8152_led_configuration(struct r8152 *tp)\n++{\n++\tu32 led_data;\n++\tint ret;\n++\n++\tret = of_property_read_u32(tp->udev->dev.of_node, \"realtek,led-data\",\n++\t\t\t\t\t\t\t\t&led_data);\n++\n++\tif (ret)\n++\t\treturn ret;\n++\t\n++\tocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data);\n++\n++\treturn 0;\n++}\n++\n+ static void r8152b_init(struct r8152 *tp)\n+ {\n+ \tu32 ocp_data;\n+@@ -6849,6 +6866,8 @@ static void r8152b_init(struct r8152 *tp\n+ \tocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);\n+ \tocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);\n+ \tocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);\n++\n++\tr8152_led_configuration(tp);\n+ }\n+ \n+ static void r8153_init(struct r8152 *tp)\n+@@ -6989,6 +7008,8 @@ static void r8153_init(struct r8152 *tp)\n+ \t\ttp->coalesce = COALESCE_SLOW;\n+ \t\tbreak;\n+ \t}\n++\n++\tr8152_led_configuration(tp);\n+ }\n+ \n+ static void r8153b_init(struct r8152 *tp)\n+@@ -7071,6 +7092,8 @@ static void r8153b_init(struct r8152 *tp\n+ \trtl_tally_reset(tp);\n+ \n+ \ttp->coalesce = 15000;\t/* 15 us */\n++\n++\tr8152_led_configuration(tp);\n+ }\n+ \n+ static void r8153c_init(struct r8152 *tp)\ndiff --git a/target/linux/rockchip/patches-5.14/003-dt-bindings-net-add-RTL8152-binding-documentation.patch b/target/linux/rockchip/patches-5.14/003-dt-bindings-net-add-RTL8152-binding-documentation.patch\nnew file mode 100644\nindex 0000000000..be262b993c\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/003-dt-bindings-net-add-RTL8152-binding-documentation.patch\n@@ -0,0 +1,54 @@\n+From 3ee05f4aa64fc86af3be5bc176ba5808de9260a7 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Sun, 26 Jul 2020 15:30:33 +0200\n+Subject: [PATCH] dt-bindings: net: add RTL8152 binding documentation\n+\n+Add binding documentation for the Realtek RTL8152 / RTL8153 USB ethernet\n+adapters.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ .../bindings/net/realtek,rtl8152.yaml         | 36 +++++++++++++++++++\n+ 1 file changed, 36 insertions(+)\n+ create mode 100644 Documentation/devicetree/bindings/net/realtek,rtl8152.yaml\n+\n+--- /dev/null\n++++ b/Documentation/devicetree/bindings/net/realtek,rtl8152.yaml\n+@@ -0,0 +1,36 @@\n++# SPDX-License-Identifier: GPL-2.0\n++%YAML 1.2\n++---\n++$id: http://devicetree.org/schemas/net/realtek,rtl8152.yaml#\n++$schema: http://devicetree.org/meta-schemas/core.yaml#\n++\n++title: Realtek RTL8152/RTL8153 series USB ethernet\n++\n++maintainers:\n++  - David Bauer <mail@david-bauer.net>\n++\n++properties:\n++  compatible:\n++    oneOf:\n++      - items:\n++          - enum:\n++              - realtek,rtl8152\n++              - realtek,rtl8153\n++\n++  reg:\n++    description: The device number on the USB bus\n++\n++  realtek,led-data:\n++    description: Value to be written to the LED configuration register.\n++\n++required:\n++  - compatible\n++  - reg\n++\n++examples:\n++  - |\n++    usb-eth@2 {\n++      compatible = \"realtek,rtl8153\";\n++      reg = <2>;\n++      realtek,led-data = <0x87>;\n++    };\n+\\ No newline at end of file\ndiff --git a/target/linux/rockchip/patches-5.14/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.14/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch\nnew file mode 100644\nindex 0000000000..792028b292\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch\n@@ -0,0 +1,31 @@\n+From af20b3384e8723077cc6484160b0cf4e9be321de Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Mon, 7 Jun 2021 15:45:37 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add EEPROM node for NanoPi R4S\n+\n+NanoPi R4S has a EEPROM attached to the 2nd I2C bus (U92), which\n+stores the MAC address.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts | 9 +++++++++\n+ 1 file changed, 9 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -68,6 +68,15 @@\n+ \tstatus = \"disabled\";\n+ };\n+ \n++&i2c2 {\n++\teeprom@51 {\n++\t\tcompatible = \"microchip,24c02\", \"atmel,24c02\";\n++\t\treg = <0x51>;\n++\t\tpagesize = <16>;\n++\t\tread-only; /* This holds our MAC */\n++\t};\n++};\n++\n+ &i2c4 {\n+ \tstatus = \"disabled\";\n+ };\ndiff --git a/target/linux/rockchip/patches-5.14/100-rockchip-use-system-LED-for-OpenWrt.patch b/target/linux/rockchip/patches-5.14/100-rockchip-use-system-LED-for-OpenWrt.patch\nnew file mode 100644\nindex 0000000000..5ec7952bfe\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/100-rockchip-use-system-LED-for-OpenWrt.patch\n@@ -0,0 +1,31 @@\n+From 6731d2c9039fbe1ecf21915eab3acee0a999508a Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Fri, 10 Jul 2020 21:38:20 +0200\n+Subject: [PATCH] rockchip: use system LED for OpenWrt\n+\n+Use the SYS LED on the casing for showing system status.\n+\n+This patch is kept separate from the NanoPi R2S support patch, as i plan\n+on submitting the device support upstream.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 9 ++++++++-\n+ 1 file changed, 8 insertions(+), 1 deletion(-)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -18,6 +18,13 @@\n+ \t\tmmc0 = &sdmmc;\n+ \t};\n+ \n++\taliases {\n++\t\tled-boot = &sys_led;\n++\t\tled-failsafe = &sys_led;\n++\t\tled-running = &sys_led;\n++\t\tled-upgrade = &sys_led;\n++\t};\n++\n+ \tchosen {\n+ \t\tstdout-path = \"serial2:1500000n8\";\n+ \t};\ndiff --git a/target/linux/rockchip/patches-5.14/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.14/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\nnew file mode 100644\nindex 0000000000..4f19ef352a\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch\n@@ -0,0 +1,30 @@\n+From 2795c8b31a686bdb8338f9404d18ef7a154f0d75 Mon Sep 17 00:00:00 2001\n+From: David Bauer <mail@david-bauer.net>\n+Date: Sun, 26 Jul 2020 13:32:59 +0200\n+Subject: [PATCH] arm64: rockchip: add OF node for USB eth on NanoPi R2S\n+\n+This adds the OF node for the USB3 ethernet adapter on the FriendlyARM\n+NanoPi R2S. Add the correct value for the RTL8153 LED configuration\n+register to match the blink behavior of the other port on the device.\n+\n+Signed-off-by: David Bauer <mail@david-bauer.net>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 7 +++++++\n+ 1 file changed, 7 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -401,9 +401,11 @@\n+ \t#size-cells = <0>;\n+ \n+ \t/* Second port is for USB 3.0 */\n+-\trtl8153: device@2 {\n+-\t\tcompatible = \"usbbda,8153\";\n++\trtl8153: usb-eth@2 {\n++\t\tcompatible = \"realtek,rtl8153\";\n+ \t\treg = <2>;\n++\n++\t\trealtek,led-data = <0x87>;\n+ \t};\n+ };\n+ \ndiff --git a/target/linux/rockchip/patches-5.14/105-rockchip-rock-pi-4.patch b/target/linux/rockchip/patches-5.14/105-rockchip-rock-pi-4.patch\nnew file mode 100644\nindex 0000000000..24336dc573\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/105-rockchip-rock-pi-4.patch\n@@ -0,0 +1,10 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -42,6 +42,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pi\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc-mezzanine.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4a.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4c.dtb\ndiff --git a/target/linux/rockchip/patches-5.14/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.14/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\nnew file mode 100644\nindex 0000000000..c36b91019d\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/106-arm64-rockchip-add-OF-node-for-pcie-eth-on-NanoPi-R4S.patch\n@@ -0,0 +1,22 @@\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts\n+@@ -85,6 +85,19 @@\n+ \tmax-link-speed = <1>;\n+ \tnum-lanes = <1>;\n+ \tvpcie3v3-supply = <&vcc3v3_sys>;\n++\n++\tpcie@0 {\n++\t\treg = <0x00000000 0 0 0 0>;\n++\t\t#address-cells = <3>;\n++\t\t#size-cells = <2>;\n++\n++\t\tpcie-eth@0,0 {\n++\t\t\tcompatible = \"realtek,r8168\";\n++\t\t\treg = <0x000000 0 0 0 0>;\n++\n++\t\t\trealtek,led-data = <0x870>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &pinctrl {\ndiff --git a/target/linux/rockchip/patches-5.14/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.14/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\nnew file mode 100644\nindex 0000000000..56e1e17ee7\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/107-mmc-core-set-initial-signal-voltage-on-power-off.patch\n@@ -0,0 +1,35 @@\n+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001\n+From: Jonas Karlman <jonas@kwiboo.se>\n+Date: Wed, 20 Feb 2019 07:38:34 +0000\n+Subject: [PATCH] mmc: core: set initial signal voltage on power off\n+\n+Some boards have SD card connectors where the power rail cannot be switched\n+off by the driver. If the card has not been power cycled, it may still be\n+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling\n+will fail to boot from a UHS card that continue to use 1.8V signaling.\n+\n+Set initial signal voltage in mmc_power_off() to allow re-boot to function.\n+\n+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),\n+same issue have been seen on some Rockchip RK3399 boards.\n+\n+I am sending this as a RFC because I have no insights into SD/MMC subsystem,\n+this change fix a re-boot issue on my boards and does not break emmc/sdio.\n+Is this an acceptable workaround? Any advice is appreciated.\n+\n+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>\n+---\n+ drivers/mmc/core/core.c | 2 ++\n+ 1 file changed, 2 insertions(+)\n+\n+--- a/drivers/mmc/core/core.c\n++++ b/drivers/mmc/core/core.c\n+@@ -1357,6 +1357,8 @@ void mmc_power_off(struct mmc_host *host\n+ \n+ \tmmc_pwrseq_power_off(host);\n+ \n++\tmmc_set_initial_signal_voltage(host);\n++\n+ \thost->ios.clock = 0;\n+ \thost->ios.vdd = 0;\n+ \ndiff --git a/target/linux/rockchip/patches-5.14/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-5.14/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\nnew file mode 100644\nindex 0000000000..013e149811\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch\n@@ -0,0 +1,22 @@\n+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001\n+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>\n+Date: Tue, 4 Aug 2020 20:17:53 +0800\n+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s\n+\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++\n+ 1 files changed, 4 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -173,6 +173,10 @@\n+ \t};\n+ };\n+ \n++&i2c0 {\n++\tstatus = \"okay\";\n++};\n++\n+ &i2c1 {\n+ \tstatus = \"okay\";\n+ \ndiff --git a/target/linux/rockchip/patches-5.14/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-5.14/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\nnew file mode 100644\nindex 0000000000..3eb923183e\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch\n@@ -0,0 +1,52 @@\n+--- a/arch/arm64/boot/dts/rockchip/Makefile\n++++ b/arch/arm64/boot/dts/rockchip/Makefile\n+@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-od\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb\n++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb\n+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts\n+@@ -0,0 +1,39 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++#include \"rk3328-nanopi-r2s.dts\"\n++\n++/ {\n++\tmodel = \"Xunlong Orange Pi R1 Plus\";\n++\tcompatible = \"xunlong,orangepi-r1-plus\", \"rockchip,rk3328\";\n++};\n++\n++&lan_led {\n++\tlabel = \"orangepi-r1-plus:green:lan\";\n++};\n++\n++&spi0 {\n++\tmax-freq = <48000000>;\n++\tstatus = \"okay\";\n++\n++\tflash@0 {\n++\t\tcompatible = \"jedec,spi-nor\";\n++\t\treg = <0>;\n++\t\tspi-max-frequency = <10000000>;\n++\t};\n++};\n++\n++&sys_led {\n++\tgpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;\n++\tlabel = \"orangepi-r1-plus:red:sys\";\n++};\n++\n++&sys_led_pin {\n++\trockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;\n++};\n++\n++&uart1 {\n++\tstatus = \"okay\";\n++};\n++\n++&wan_led {\n++\tlabel = \"orangepi-r1-plus:green:wan\";\n++};\ndiff --git a/target/linux/rockchip/patches-5.14/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-5.14/801-char-add-support-for-rockchip-hardware-random-number.patch\nnew file mode 100644\nindex 0000000000..e1415bfa53\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/801-char-add-support-for-rockchip-hardware-random-number.patch\n@@ -0,0 +1,45 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] char: add support for rockchip hardware random number\n+ generator\n+\n+This patch provides hardware random number generator support for all rockchip SOC.\n+\n+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/drivers/char/hw_random/Kconfig\n++++ b/drivers/char/hw_random/Kconfig\n+@@ -385,6 +385,19 @@ config HW_RANDOM_STM32\n+ \n+ \t  If unsure, say N.\n+ \n++config HW_RANDOM_ROCKCHIP\n++\ttristate \"Rockchip Random Number Generator support\"\n++\tdepends on ARCH_ROCKCHIP\n++\tdefault HW_RANDOM\n++\thelp\n++\t  This driver provides kernel-side support for the Random Number\n++\t  Generator hardware found on Rockchip cpus.\n++\n++\t  To compile this driver as a module, choose M here: the\n++\t  module will be called rockchip-rng.\n++\n++\t  If unsure, say Y.\n++\n+ config HW_RANDOM_PIC32\n+ \ttristate \"Microchip PIC32 Random Number Generator support\"\n+ \tdepends on HW_RANDOM && MACH_PIC32\n+--- a/drivers/char/hw_random/Makefile\n++++ b/drivers/char/hw_random/Makefile\n+@@ -35,6 +35,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=\n+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o\n+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o\n+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o\n++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o\n+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o\n+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o\n+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o\ndiff --git a/target/linux/rockchip/patches-5.14/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.14/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\nnew file mode 100644\nindex 0000000000..8eea25381c\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch\n@@ -0,0 +1,50 @@\n+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001\n+From: wevsty <ty@wevs.org>\n+Date: Mon, 24 Aug 2020 02:27:11 +0800\n+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator\n+ for RK3328 and RK3399\n+\n+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.\n+\n+Signed-off-by: wevsty <ty@wevs.org>\n+---\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -279,6 +279,17 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\trng: rng@ff060000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff060000 0x0 0x4000>;\n++\n++\t\tclocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgrf: syscon@ff100000 {\n+ \t\tcompatible = \"rockchip,rk3328-grf\", \"syscon\", \"simple-mfd\";\n+ \t\treg = <0x0 0xff100000 0x0 0x1000>;\n+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi\n+@@ -1937,6 +1937,16 @@\n+ \t\t};\n+ \t};\n+ \n++\trng: rng@ff8b8000 {\n++\t\tcompatible = \"rockchip,cryptov1-rng\";\n++\t\treg = <0x0 0xff8b8000 0x0 0x1000>;\n++\t\tclocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tclock-names = \"clk_crypto\", \"hclk_crypto\";\n++\t\tassigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;\n++\t\tassigned-clock-rates = <150000000>, <100000000>;\n++\t\tstatus = \"okay\";\n++\t};\n++\n+ \tgpu: gpu@ff9a0000 {\n+ \t\tcompatible = \"rockchip,rk3399-mali\", \"arm,mali-t860\";\n+ \t\treg = <0x0 0xff9a0000 0x0 0x10000>;\ndiff --git a/target/linux/rockchip/patches-5.14/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.14/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\nnew file mode 100644\nindex 0000000000..e44bc3557e\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch\n@@ -0,0 +1,44 @@\n+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 13:53:25 +0800\n+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/Kconfig      |  18 +-\n+ drivers/devfreq/Makefile     |   1 +\n+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++\n+ 3 files changed, 862 insertions(+), 3 deletions(-)\n+ create mode 100644 drivers/devfreq/rk3328_dmc.c\n+\n+--- a/drivers/devfreq/Kconfig\n++++ b/drivers/devfreq/Kconfig\n+@@ -120,6 +120,18 @@ config ARM_TEGRA_DEVFREQ\n+ \t  It reads ACTMON counters of memory controllers and adjusts the\n+ \t  operating frequencies and voltages with OPP support.\n+ \n++config ARM_RK3328_DMC_DEVFREQ\n++\ttristate \"ARM RK3328 DMC DEVFREQ Driver\"\n++\tdepends on ARCH_ROCKCHIP\n++\tselect DEVFREQ_EVENT_ROCKCHIP_DFI\n++\tselect DEVFREQ_GOV_SIMPLE_ONDEMAND\n++\tselect PM_DEVFREQ_EVENT\n++\tselect PM_OPP\n++\thelp\n++\t  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).\n++\t  It sets the frequency for the memory controller and reads the usage counts\n++\t  from hardware.\n++\n+ config ARM_RK3399_DMC_DEVFREQ\n+ \ttristate \"ARM RK3399 DMC DEVFREQ Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \\\n+--- a/drivers/devfreq/Makefile\n++++ b/drivers/devfreq/Makefile\n+@@ -12,6 +12,7 @@ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)\t+=\n+ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ)\t+= imx-bus.o\n+ obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ)\t+= imx8m-ddrc.o\n+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)\t+= rk3399_dmc.o\n++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)\t+= rk3328_dmc.o\n+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)\t\t+= tegra30-devfreq.o\n+ \n+ # DEVFREQ Event Drivers\ndiff --git a/target/linux/rockchip/patches-5.14/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.14/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\nnew file mode 100644\nindex 0000000000..0408a0a73a\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch\n@@ -0,0 +1,210 @@\n+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001\n+From: Tang Yun ping <typ@rock-chips.com>\n+Date: Thu, 4 May 2017 20:49:58 +0800\n+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2\n+ APIs\n+\n+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.\n+\n+Signed-off-by: Tang Yun ping <typ@rock-chips.com>\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++\n+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-\n+ drivers/clk/rockchip/clk.h          |   3 +-\n+ include/soc/rockchip/rockchip_sip.h |  11 +++\n+ 4 files changed, 147 insertions(+), 4 deletions(-)\n+\n+--- a/drivers/clk/rockchip/clk-ddr.c\n++++ b/drivers/clk/rockchip/clk-ddr.c\n+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddr\n+ \t.get_parent = rockchip_ddrclk_get_parent,\n+ };\n+ \n++/* See v4.4/include/dt-bindings/display/rk_fb.h */\n++#define SCREEN_NULL\t\t\t0\n++#define SCREEN_HDMI\t\t\t6\n++\n++static inline int rk_drm_get_lcdc_type(void)\n++{\n++\treturn SCREEN_NULL;\n++}\n++\n++struct share_params {\n++\tu32 hz;\n++\tu32 lcdc_type;\n++\tu32 vop;\n++\tu32 vop_dclk_mode;\n++\tu32 sr_idle_en;\n++\tu32 addr_mcu_el3;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag1;\n++\t/*\n++\t * 1: need to wait flag1\n++\t * 0: never wait flag1\n++\t */\n++\tu32 wait_flag0;\n++\tu32 complt_hwirq;\n++\t /* if need, add parameter after */\n++};\n++\n++struct rockchip_ddrclk_data {\n++\tu32 inited_flag;\n++\tvoid __iomem *share_memory;\n++};\n++\n++static struct rockchip_ddrclk_data ddr_data;\n++\n++static void rockchip_ddrclk_data_init(void)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,\n++\t\t      1, SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif (!res.a0) {\n++\t\tddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);\n++\t\tddr_data.inited_flag = 1;\n++\t}\n++}\n++\n++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t   unsigned long drate,\n++\t\t\t\t\t   unsigned long prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = drate;\n++\tp->lcdc_type = rk_drm_get_lcdc_type();\n++\tp->wait_flag1 = 1;\n++\tp->wait_flag0 = 1;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\n++\tif ((int)res.a1 == -6) {\n++\t\tpr_err(\"%s: timeout, drate = %lumhz\\n\", __func__, drate/1000000);\n++\t\t/* TODO: rockchip_dmcfreq_wait_complete(); */\n++\t}\n++\n++\treturn res.a0;\n++}\n++\n++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2\n++\t\t\t(struct clk_hw *hw, unsigned long parent_rate)\n++{\n++\tstruct arm_smccc_res res;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,\n++\t\t\t\t\t      unsigned long rate,\n++\t\t\t\t\t      unsigned long *prate)\n++{\n++\tstruct share_params *p;\n++\tstruct arm_smccc_res res;\n++\n++\tif (!ddr_data.inited_flag)\n++\t\trockchip_ddrclk_data_init();\n++\n++\tp = (struct share_params *)ddr_data.share_memory;\n++\n++\tp->hz = rate;\n++\n++\tarm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,\n++\t\t      SHARE_PAGE_TYPE_DDR, 0,\n++\t\t      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,\n++\t\t      0, 0, 0, 0, &res);\n++\tif (!res.a0)\n++\t\treturn res.a1;\n++\telse\n++\t\treturn 0;\n++}\n++\n++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {\n++\t.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,\n++\t.set_rate = rockchip_ddrclk_sip_set_rate_v2,\n++\t.round_rate = rockchip_ddrclk_sip_round_rate_v2,\n++\t.get_parent = rockchip_ddrclk_get_parent,\n++};\n++\n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+ \t\t\t\t\t u8 num_parents, int mux_offset,\n+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk\n+ \tcase ROCKCHIP_DDRCLK_SIP:\n+ \t\tinit.ops = &rockchip_ddrclk_sip_ops;\n+ \t\tbreak;\n++\tcase ROCKCHIP_DDRCLK_SIP_V2:\n++\t\tinit.ops = &rockchip_ddrclk_sip_ops_v2;\n++\t\tbreak;\n+ \tdefault:\n+ \t\tpr_err(\"%s: unsupported ddrclk type %d\\n\", __func__, ddr_flag);\n+ \t\tkfree(ddrclk);\n+--- a/drivers/clk/rockchip/clk-rk3328.c\n++++ b/drivers/clk/rockchip/clk-rk3328.c\n+@@ -315,9 +315,10 @@ static struct rockchip_clk_branch rk3328\n+ \t\t\tRK3328_CLKGATE_CON(14), 1, GFLAGS),\n+ \n+ \t/* PD_DDR */\n+-\tCOMPOSITE(0, \"clk_ddr\", mux_ddrphy_p, CLK_IGNORE_UNUSED,\n+-\t\t\tRK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,\n+-\t\t\tRK3328_CLKGATE_CON(0), 4, GFLAGS),\n++\tCOMPOSITE_DDRCLK(SCLK_DDRCLK, \"sclk_ddrc\", mux_ddrphy_p, 0,\n++\t\t\tRK3328_CLKSEL_CON(3), 8, 2, 0, 3,\n++\t\t\tROCKCHIP_DDRCLK_SIP_V2),\n++\n+ \tGATE(0, \"clk_ddrmsch\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+ \t\t\tRK3328_CLKGATE_CON(18), 6, GFLAGS),\n+ \tGATE(0, \"clk_ddrupctl\", \"clk_ddr\", CLK_IGNORE_UNUSED,\n+--- a/drivers/clk/rockchip/clk.h\n++++ b/drivers/clk/rockchip/clk.h\n+@@ -399,7 +399,8 @@ struct clk *rockchip_clk_register_mmc(co\n+  * DDRCLK flags, including method of setting the rate\n+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.\n+  */\n+-#define ROCKCHIP_DDRCLK_SIP\t\tBIT(0)\n++#define ROCKCHIP_DDRCLK_SIP\t\t0x01\n++#define ROCKCHIP_DDRCLK_SIP_V2\t\t0x03\n+ \n+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,\n+ \t\t\t\t\t const char *const *parent_names,\n+--- a/include/soc/rockchip/rockchip_sip.h\n++++ b/include/soc/rockchip/rockchip_sip.h\n+@@ -16,5 +16,16 @@\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ\t0x06\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM\t0x07\n+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD\t0x08\n++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION\t0x08\n++\n++#define ROCKCHIP_SIP_SHARE_MEM\t\t\t0x82000009\n++\n++/* Share mem page types */\n++typedef enum {\n++    SHARE_PAGE_TYPE_INVALID = 0,\n++    SHARE_PAGE_TYPE_UARTDBG,\n++    SHARE_PAGE_TYPE_DDR,\n++    SHARE_PAGE_TYPE_MAX,\n++} share_page_type_t;\n+ \n+ #endif\ndiff --git a/target/linux/rockchip/patches-5.14/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.14/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\nnew file mode 100644\nindex 0000000000..283e4abd2f\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch\n@@ -0,0 +1,662 @@\n+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 12:49:48 +0800\n+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---\n+ 1 file changed, 505 insertions(+), 49 deletions(-)\n+\n+--- a/drivers/devfreq/event/rockchip-dfi.c\n++++ b/drivers/devfreq/event/rockchip-dfi.c\n+@@ -18,25 +18,66 @@\n+ #include <linux/list.h>\n+ #include <linux/of.h>\n+ \n+-#include <soc/rockchip/rk3399_grf.h>\n+-\n+-#define RK3399_DMC_NUM_CH\t2\n++#define PX30_PMUGRF_OS_REG2\t\t0x208\n+ \n++#define RK3128_GRF_SOC_CON0\t\t0x140\n++#define RK3128_GRF_OS_REG1\t\t0x1cc\n++#define RK3128_GRF_DFI_WRNUM\t\t0x220\n++#define RK3128_GRF_DFI_RDNUM\t\t0x224\n++#define RK3128_GRF_DFI_TIMERVAL\t\t0x22c\n++#define RK3128_DDR_MONITOR_EN\t\t((1 << (16 + 6)) + (1 << 6))\n++#define RK3128_DDR_MONITOR_DISB\t\t((1 << (16 + 6)) + (0 << 6))\n++\n++#define RK3288_PMU_SYS_REG2\t\t0x9c\n++#define RK3288_GRF_SOC_CON4\t\t0x254\n++#define RK3288_GRF_SOC_STATUS(n)\t(0x280 + (n) * 4)\n++#define RK3288_DFI_EN\t\t\t(0x30003 << 14)\n++#define RK3288_DFI_DIS\t\t\t(0x30000 << 14)\n++#define RK3288_LPDDR_SEL\t\t(0x10001 << 13)\n++#define RK3288_DDR3_SEL\t\t\t(0x10000 << 13)\n++\n++#define RK3328_GRF_OS_REG2\t\t0x5d0\n++\n++#define RK3368_GRF_DDRC0_CON0\t\t0x600\n++#define RK3368_GRF_SOC_STATUS5\t\t0x494\n++#define RK3368_GRF_SOC_STATUS6\t\t0x498\n++#define RK3368_GRF_SOC_STATUS8\t\t0x4a0\n++#define RK3368_GRF_SOC_STATUS9\t\t0x4a4\n++#define RK3368_GRF_SOC_STATUS10\t\t0x4a8\n++#define RK3368_DFI_EN\t\t\t(0x30003 << 5)\n++#define RK3368_DFI_DIS\t\t\t(0x30000 << 5)\n++\n++#define MAX_DMC_NUM_CH\t\t\t2\n++#define READ_DRAMTYPE_INFO(n)\t\t(((n) >> 13) & 0x7)\n++#define READ_CH_INFO(n)\t\t\t(((n) >> 28) & 0x3)\n+ /* DDRMON_CTRL */\n+-#define DDRMON_CTRL\t0x04\n+-#define CLR_DDRMON_CTRL\t(0x1f0000 << 0)\n+-#define LPDDR4_EN\t(0x10001 << 4)\n+-#define HARDWARE_EN\t(0x10001 << 3)\n+-#define LPDDR3_EN\t(0x10001 << 2)\n+-#define SOFTWARE_EN\t(0x10001 << 1)\n+-#define SOFTWARE_DIS\t(0x10000 << 1)\n+-#define TIME_CNT_EN\t(0x10001 << 0)\n++#define DDRMON_CTRL\t\t\t0x04\n++#define CLR_DDRMON_CTRL\t\t\t(0x3f0000 << 0)\n++#define DDR4_EN\t\t\t\t(0x10001 << 5)\n++#define LPDDR4_EN\t\t\t(0x10001 << 4)\n++#define HARDWARE_EN\t\t\t(0x10001 << 3)\n++#define LPDDR2_3_EN\t\t\t(0x10001 << 2)\n++#define SOFTWARE_EN\t\t\t(0x10001 << 1)\n++#define SOFTWARE_DIS\t\t\t(0x10000 << 1)\n++#define TIME_CNT_EN\t\t\t(0x10001 << 0)\n+ \n+ #define DDRMON_CH0_COUNT_NUM\t\t0x28\n+ #define DDRMON_CH0_DFI_ACCESS_NUM\t0x2c\n+ #define DDRMON_CH1_COUNT_NUM\t\t0x3c\n+ #define DDRMON_CH1_DFI_ACCESS_NUM\t0x40\n+ \n++/* pmu grf */\n++#define PMUGRF_OS_REG2\t\t\t0x308\n++\n++enum {\n++\tDDR4 = 0,\n++\tDDR3 = 3,\n++\tLPDDR2 = 5,\n++\tLPDDR3 = 6,\n++\tLPDDR4 = 7,\n++\tUNUSED = 0xFF\n++};\n++\n+ struct dmc_usage {\n+ \tu32 access;\n+ \tu32 total;\n+@@ -50,33 +91,261 @@ struct dmc_usage {\n+ struct rockchip_dfi {\n+ \tstruct devfreq_event_dev *edev;\n+ \tstruct devfreq_event_desc *desc;\n+-\tstruct dmc_usage ch_usage[RK3399_DMC_NUM_CH];\n++\tstruct dmc_usage ch_usage[MAX_DMC_NUM_CH];\n+ \tstruct device *dev;\n+ \tvoid __iomem *regs;\n+ \tstruct regmap *regmap_pmu;\n++\tstruct regmap *regmap_grf;\n++\tstruct regmap *regmap_pmugrf;\n+ \tstruct clk *clk;\n++\tu32 dram_type;\n++\t/*\n++\t * available mask, 1: available, 0: not available\n++\t * each bit represent a channel\n++\t */\n++\tu32 ch_msk;\n++};\n++\n++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_EN);\n++}\n++\n++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf,\n++\t\t     RK3128_GRF_SOC_CON0,\n++\t\t     RK3128_DDR_MONITOR_DISB);\n++}\n++\n++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi_wr, dfi_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3128_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);\n++\tregmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);\n++\n++\tedata->load_count = (dfi_wr + dfi_rd) * 4;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3128_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3128_dfi_ops = {\n++\t.disable = rk3128_dfi_disable,\n++\t.enable = rk3128_dfi_enable,\n++\t.get_event = rk3128_dfi_get_event,\n++\t.set_event = rk3128_dfi_set_event,\n++};\n++\n++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);\n++}\n++\n++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);\n++}\n++\n++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tu32 tmp, max = 0;\n++\tu32 i, busier_ch = 0;\n++\tu32 rd_count, wr_count, total_count;\n++\n++\trk3288_dfi_stop_hardware_counter(edev);\n++\n++\t/* Find out which channel is busier */\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);\n++\t\tregmap_read(info->regmap_grf,\n++\t\t\t    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);\n++\t\tinfo->ch_usage[i].access = (wr_count + rd_count) * 4;\n++\t\tinfo->ch_usage[i].total = total_count;\n++\t\ttmp = info->ch_usage[i].access;\n++\t\tif (tmp > max) {\n++\t\t\tbusier_ch = i;\n++\t\t\tmax = tmp;\n++\t\t}\n++\t}\n++\trk3288_dfi_start_hardware_counter(edev);\n++\n++\treturn busier_ch;\n++}\n++\n++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tint busier_ch;\n++\tunsigned long flags;\n++\n++\tlocal_irq_save(flags);\n++\tbusier_ch = rk3288_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n++\n++\tedata->load_count = info->ch_usage[busier_ch].access;\n++\tedata->total_count = info->ch_usage[busier_ch].total;\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3288_dfi_ops = {\n++\t.disable = rk3288_dfi_disable,\n++\t.enable = rk3288_dfi_enable,\n++\t.get_event = rk3288_dfi_get_event,\n++\t.set_event = rk3288_dfi_set_event,\n++};\n++\n++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);\n++}\n++\n++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\n++\tregmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);\n++}\n++\n++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)\n++{\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)\n++{\n++\treturn 0;\n++}\n++\n++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,\n++\t\t\t\tstruct devfreq_event_data *edata)\n++{\n++\tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n++\tunsigned long flags;\n++\tu32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;\n++\n++\tlocal_irq_save(flags);\n++\n++\trk3368_dfi_stop_hardware_counter(edev);\n++\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);\n++\tregmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);\n++\n++\tedata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;\n++\tedata->total_count = dfi_timer;\n++\n++\trk3368_dfi_start_hardware_counter(edev);\n++\n++\tlocal_irq_restore(flags);\n++\n++\treturn 0;\n++}\n++\n++static const struct devfreq_event_ops rk3368_dfi_ops = {\n++\t.disable = rk3368_dfi_disable,\n++\t.enable = rk3368_dfi_enable,\n++\t.get_event = rk3368_dfi_get_event,\n++\t.set_event = rk3368_dfi_set_event,\n+ };\n+ \n+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tvoid __iomem *dfi_regs = info->regs;\n+-\tu32 val;\n+-\tu32 ddr_type;\n+-\n+-\t/* get ddr type */\n+-\tregmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);\n+-\tddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &\n+-\t\t    RK3399_PMUGRF_DDRTYPE_MASK;\n+ \n+ \t/* clear DDRMON_CTRL setting */\n+ \twritel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* set ddr type to dfi */\n+-\tif (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)\n+-\t\twritel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);\n+-\telse if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)\n++\tif (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)\n++\t\twritel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == LPDDR4)\n+ \t\twritel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);\n++\telse if (info->dram_type == DDR4)\n++\t\twritel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);\n+ \n+ \t/* enable count, use software mode */\n+ \twritel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);\n+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st\n+ \trockchip_dfi_stop_hardware_counter(edev);\n+ \n+ \t/* Find out which channel is busier */\n+-\tfor (i = 0; i < RK3399_DMC_NUM_CH; i++) {\n+-\t\tinfo->ch_usage[i].access = readl_relaxed(dfi_regs +\n+-\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;\n++\tfor (i = 0; i < MAX_DMC_NUM_CH; i++) {\n++\t\tif (!(info->ch_msk & BIT(i)))\n++\t\t\tcontinue;\n++\n+ \t\tinfo->ch_usage[i].total = readl_relaxed(dfi_regs +\n+ \t\t\t\tDDRMON_CH0_COUNT_NUM + i * 20);\n+-\t\ttmp = info->ch_usage[i].access;\n++\n++\t\t/* LPDDR4 BL = 16,other DDR type BL = 8 */\n++\t\ttmp = readl_relaxed(dfi_regs +\n++\t\t\t\tDDRMON_CH0_DFI_ACCESS_NUM + i * 20);\n++\t\tif (info->dram_type == LPDDR4)\n++\t\t\ttmp *= 8;\n++\t\telse\n++\t\t\ttmp *= 4;\n++\t\tinfo->ch_usage[i].access = tmp;\n++\n+ \t\tif (tmp > max) {\n+ \t\t\tbusier_ch = i;\n+ \t\t\tmax = tmp;\n+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \n+ \trockchip_dfi_stop_hardware_counter(edev);\n+-\tclk_disable_unprepare(info->clk);\n++\tif (info->clk)\n++\t\tclk_disable_unprepare(info->clk);\n+ \n+ \treturn 0;\n+ }\n+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint ret;\n+ \n+-\tret = clk_prepare_enable(info->clk);\n+-\tif (ret) {\n+-\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\", ret);\n+-\t\treturn ret;\n++\tif (info->clk) {\n++\t\tret = clk_prepare_enable(info->clk);\n++\t\tif (ret) {\n++\t\t\tdev_err(&edev->dev, \"failed to enable dfi clk: %d\\n\",\n++\t\t\t\tret);\n++\t\t\treturn ret;\n++\t\t}\n+ \t}\n+ \n+ \trockchip_dfi_start_hardware_counter(edev);\n+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct\n+ {\n+ \tstruct rockchip_dfi *info = devfreq_event_get_drvdata(edev);\n+ \tint busier_ch;\n++\tunsigned long flags;\n+ \n++\tlocal_irq_save(flags);\n+ \tbusier_ch = rockchip_dfi_get_busier_ch(edev);\n++\tlocal_irq_restore(flags);\n+ \n+ \tedata->load_count = info->ch_usage[busier_ch].access;\n+ \tedata->total_count = info->ch_usage[busier_ch].total;\n+@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro\n+ \t.set_event = rockchip_dfi_set_event,\n+ };\n+ \n+-static const struct of_device_id rockchip_dfi_id_match[] = {\n+-\t{ .compatible = \"rockchip,rk3399-dfi\" },\n+-\t{ },\n+-};\n+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++static __init int px30_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n+ \n+-static int rockchip_dfi_probe(struct platform_device *pdev)\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmugrf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmugrf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmugrf))\n++\t\t\treturn PTR_ERR(data->regmap_pmugrf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3128_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n+ {\n+-\tstruct device *dev = &pdev->dev;\n+-\tstruct rockchip_dfi *data;\n+-\tstruct devfreq_event_desc *desc;\n+ \tstruct device_node *np = pdev->dev.of_node, *node;\n+ \n+-\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n+-\tif (!data)\n+-\t\treturn -ENOMEM;\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tdesc->ops = &rk3128_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3288_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n++\n++\tnode = of_parse_phandle(np, \"rockchip,pmu\", 0);\n++\tif (node) {\n++\t\tdata->regmap_pmu = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_pmu))\n++\t\t\treturn PTR_ERR(data->regmap_pmu);\n++\t}\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tif (data->dram_type == DDR3)\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_DDR3_SEL);\n++\telse\n++\t\tregmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,\n++\t\t\t     RK3288_LPDDR_SEL);\n++\n++\tdesc->ops = &rk3288_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3368_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\n++\tif (!dev->parent || !dev->parent->of_node)\n++\t\treturn -EINVAL;\n++\n++\tdata->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);\n++\tif (IS_ERR(data->regmap_grf))\n++\t\treturn PTR_ERR(data->regmap_grf);\n++\n++\tdesc->ops = &rk3368_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rockchip_dfi_init(struct platform_device *pdev,\n++\t\t\t\t    struct rockchip_dfi *data,\n++\t\t\t\t    struct devfreq_event_desc *desc)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tu32 val;\n+ \n+ \tdata->regs = devm_platform_ioremap_resource(pdev, 0);\n+ \tif (IS_ERR(data->regs))\n+@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla\n+ \t\tif (IS_ERR(data->regmap_pmu))\n+ \t\t\treturn PTR_ERR(data->regmap_pmu);\n+ \t}\n+-\tdata->dev = dev;\n++\n++\tregmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = READ_CH_INFO(val);\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static __init int rk3328_dfi_init(struct platform_device *pdev,\n++\t\t\t\t  struct rockchip_dfi *data,\n++\t\t\t\t  struct devfreq_event_desc *desc)\n++{\n++\tstruct device_node *np = pdev->dev.of_node, *node;\n++\tstruct resource *res;\n++\tu32 val;\n++\n++\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n++\tdata->regs = devm_ioremap_resource(&pdev->dev, res);\n++\tif (IS_ERR(data->regs))\n++\t\treturn PTR_ERR(data->regs);\n++\n++\tnode = of_parse_phandle(np, \"rockchip,grf\", 0);\n++\tif (node) {\n++\t\tdata->regmap_grf = syscon_node_to_regmap(node);\n++\t\tif (IS_ERR(data->regmap_grf))\n++\t\t\treturn PTR_ERR(data->regmap_grf);\n++\t}\n++\n++\tregmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);\n++\tdata->dram_type = READ_DRAMTYPE_INFO(val);\n++\tdata->ch_msk = 1;\n++\tdata->clk = NULL;\n++\n++\tdesc->ops = &rockchip_dfi_ops;\n++\n++\treturn 0;\n++}\n++\n++static const struct of_device_id rockchip_dfi_id_match[] = {\n++\t{ .compatible = \"rockchip,px30-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk1808-dfi\", .data = px30_dfi_init },\n++\t{ .compatible = \"rockchip,rk3128-dfi\", .data = rk3128_dfi_init },\n++\t{ .compatible = \"rockchip,rk3288-dfi\", .data = rk3288_dfi_init },\n++\t{ .compatible = \"rockchip,rk3328-dfi\", .data = rk3328_dfi_init },\n++\t{ .compatible = \"rockchip,rk3368-dfi\", .data = rk3368_dfi_init },\n++\t{ .compatible = \"rockchip,rk3399-dfi\", .data = rockchip_dfi_init },\n++\t{ },\n++};\n++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);\n++\n++static int rockchip_dfi_probe(struct platform_device *pdev)\n++{\n++\tstruct device *dev = &pdev->dev;\n++\tstruct rockchip_dfi *data;\n++\tstruct devfreq_event_desc *desc;\n++\tstruct device_node *np = pdev->dev.of_node;\n++\tconst struct of_device_id *match;\n++\tint (*init)(struct platform_device *pdev, struct rockchip_dfi *data,\n++\t\t    struct devfreq_event_desc *desc);\n++\n++\tdata = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);\n++\tif (!data)\n++\t\treturn -ENOMEM;\n+ \n+ \tdesc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);\n+ \tif (!desc)\n+ \t\treturn -ENOMEM;\n+ \n+-\tdesc->ops = &rockchip_dfi_ops;\n++\tmatch = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);\n++\tif (match) {\n++\t\tinit = match->data;\n++\t\tif (init) {\n++\t\t\tif (init(pdev, data, desc))\n++\t\t\t\treturn -EINVAL;\n++\t\t} else {\n++\t\t\treturn 0;\n++\t\t}\n++\t} else {\n++\t\treturn 0;\n++\t}\n++\n+ \tdesc->driver_data = data;\n+ \tdesc->name = np->name;\n+ \tdata->desc = desc;\n++\tdata->dev = dev;\n+ \n+-\tdata->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);\n++\tdata->edev = devm_devfreq_event_add_edev(dev, desc);\n+ \tif (IS_ERR(data->edev)) {\n+-\t\tdev_err(&pdev->dev,\n+-\t\t\t\"failed to add devfreq-event device\\n\");\n++\t\tdev_err(dev, \"failed to add devfreq-event device\\n\");\n+ \t\treturn PTR_ERR(data->edev);\n+ \t}\n+ \ndiff --git a/target/linux/rockchip/patches-5.14/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.14/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\nnew file mode 100644\nindex 0000000000..d9c5f944d9\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch\n@@ -0,0 +1,27 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+[adjusted commit title]\n+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -1010,6 +1010,13 @@\n+ \t\tstatus = \"disabled\";\n+ \t};\n+ \n++\tdfi: dfi@ff790000 {\n++\t\treg = <0x00 0xff790000 0x00 0x400>;\n++\t\tcompatible = \"rockchip,rk3328-dfi\";\n++\t\trockchip,grf = <&grf>;\n++\t\tstatus = \"disabled\";\n++\t};\n++\n+ \tgic: interrupt-controller@ff811000 {\n+ \t\tcompatible = \"arm,gic-400\";\n+ \t\t#interrupt-cells = <3>;\ndiff --git a/target/linux/rockchip/patches-5.14/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.14/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\nnew file mode 100644\nindex 0000000000..1d142ff5e3\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch\n@@ -0,0 +1,126 @@\n+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 14:21:51 +0800\n+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++\n+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-\n+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++\n+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++\n+ 4 files changed, 617 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi\n+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h\n+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts\n+@@ -7,6 +7,7 @@\n+ \n+ #include <dt-bindings/input/input.h>\n+ #include <dt-bindings/gpio/gpio.h>\n++#include \"rk3328-dram-nanopi2-timing.dtsi\"\n+ #include \"rk3328.dtsi\"\n+ \n+ / {\n+@@ -121,6 +122,72 @@\n+ \t\tregulator-boot-on;\n+ \t\tvin-supply = <&vdd_5v>;\n+ \t};\n++\n++\tdmc: dmc {\n++\t\tcompatible = \"rockchip,rk3328-dmc\";\n++\t\tdevfreq-events = <&dfi>;\n++\t\tcenter-supply = <&vdd_log>;\n++\t\tclocks = <&cru SCLK_DDRCLK>;\n++\t\tclock-names = \"dmc_clk\";\n++\t\toperating-points-v2 = <&dmc_opp_table>;\n++\t\tddr_timing = <&ddr_timing>;\n++\t\tupthreshold = <40>;\n++\t\tdowndifferential = <20>;\n++\t\tauto-min-freq = <786000>;\n++\t\tauto-freq-en = <0>;\n++\t\t#cooling-cells = <2>;\n++\t\tstatus = \"okay\";\n++\n++\t\tddr_power_model: ddr_power_model {\n++\t\t\tcompatible = \"ddr_power_model\";\n++\t\t\tdynamic-power-coefficient = <120>;\n++\t\t\tstatic-power-coefficient = <200>;\n++\t\t\tts = <32000 4700 (-80) 2>;\n++\t\t\tthermal-zone = \"soc-thermal\";\n++\t\t};\n++\t};\n++\n++\tdmc_opp_table: dmc-opp-table {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\trockchip,leakage-voltage-sel = <\n++\t\t\t1   10    0\n++\t\t\t11  254   1\n++\t\t>;\n++\t\tnvmem-cells = <&logic_leakage>;\n++\t\tnvmem-cell-names = \"ddr_leakage\";\n++\n++\t\topp-786000000 {\n++\t\t\topp-hz = /bits/ 64 <786000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-798000000 {\n++\t\t\topp-hz = /bits/ 64 <798000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-840000000 {\n++\t\t\topp-hz = /bits/ 64 <840000000>;\n++\t\t\topp-microvolt = <1075000>;\n++\t\t\topp-microvolt-L0 = <1075000>;\n++\t\t\topp-microvolt-L1 = <1050000>;\n++\t\t};\n++\t\topp-924000000 {\n++\t\t\topp-hz = /bits/ 64 <924000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t\topp-microvolt-L0 = <1100000>;\n++\t\t\topp-microvolt-L1 = <1075000>;\n++\t\t};\n++\t\topp-1056000000 {\n++\t\t\topp-hz = /bits/ 64 <1056000000>;\n++\t\t\topp-microvolt = <1175000>;\n++\t\t\topp-microvolt-L0 = <1175000>;\n++\t\t\topp-microvolt-L1 = <1150000>;\n++\t\t};\n++\t};\n+ };\n+ \n+ &cpu0 {\n+@@ -143,6 +210,10 @@\n+ \tstatus = \"disabled\";\n+ };\n+ \n++&dfi {\n++\tstatus = \"okay\";\n++};\n++\n+ &gmac2io {\n+ \tassigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;\n+ \tassigned-clock-parents = <&gmac_clk>, <&gmac_clk>;\n+@@ -206,6 +277,7 @@\n+ \t\t\t\tregulator-name = \"vdd_log\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1075000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\n+@@ -220,6 +292,7 @@\n+ \t\t\t\tregulator-name = \"vdd_arm\";\n+ \t\t\t\tregulator-always-on;\n+ \t\t\t\tregulator-boot-on;\n++\t\t\t\tregulator-init-microvolt = <1225000>;\n+ \t\t\t\tregulator-min-microvolt = <712500>;\n+ \t\t\t\tregulator-max-microvolt = <1450000>;\n+ \t\t\t\tregulator-ramp-delay = <12500>;\ndiff --git a/target/linux/rockchip/patches-5.14/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch b/target/linux/rockchip/patches-5.14/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\nnew file mode 100644\nindex 0000000000..9c7eb8970b\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/808-phy-rockchip-add-driver-for-Rockchip-USB-3.0-PHY.patch\n@@ -0,0 +1,51 @@\n+From faa767a9d0ced5642da0ae50b53d87de258f9525 Mon Sep 17 00:00:00 2001\n+From: hmz007 <hmz007@gmail.com>\n+Date: Tue, 19 Nov 2019 17:24:30 +0800\n+Subject: [PATCH] phy: rockchip: add driver for Rockchip USB 3.0 PHY\n+\n+Signed-off-by: hmz007 <hmz007@gmail.com>\n+---\n+ drivers/phy/rockchip/Kconfig                  |    8 +\n+ drivers/phy/rockchip/Makefile                 |    1 +\n+ drivers/phy/rockchip/phy-rockchip-inno-usb3.c | 1175 +++++++++++++++++\n+ 3 files changed, 1184 insertions(+)\n+ create mode 100644 drivers/phy/rockchip/phy-rockchip-inno-usb3.c\n+\n+--- a/drivers/phy/rockchip/Kconfig\n++++ b/drivers/phy/rockchip/Kconfig\n+@@ -66,6 +66,15 @@ config PHY_ROCKCHIP_INNO_DSIDPHY\n+ \t  Enable this to support the Rockchip MIPI/LVDS/TTL PHY with\n+ \t  Innosilicon IP block.\n+ \n++config PHY_ROCKCHIP_INNO_USB3\n++\ttristate \"Rockchip INNO USB 3.0 PHY Driver\"\n++\tdepends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF\n++\tdepends on USB_SUPPORT\n++\tselect GENERIC_PHY\n++\tselect USB_PHY\n++\thelp\n++\t  Support for Rockchip USB 3.0 PHY with Innosilicon IP block.\n++\n+ config PHY_ROCKCHIP_PCIE\n+ \ttristate \"Rockchip PCIe PHY Driver\"\n+ \tdepends on (ARCH_ROCKCHIP && OF) || COMPILE_TEST\n+--- a/drivers/phy/rockchip/Makefile\n++++ b/drivers/phy/rockchip/Makefile\n+@@ -6,6 +6,7 @@ obj-$(CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY)\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY)\t+= phy-rockchip-inno-dsidphy.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI)\t+= phy-rockchip-inno-hdmi.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)\t+= phy-rockchip-inno-usb2.o\n++obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB3)\t+= phy-rockchip-inno-usb3.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_PCIE)\t\t+= phy-rockchip-pcie.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)\t+= phy-rockchip-typec.o\n+ obj-$(CONFIG_PHY_ROCKCHIP_USB)\t\t+= phy-rockchip-usb.o\n+--- a/Documentation/devicetree/bindings/soc/rockchip/grf.yaml\n++++ b/Documentation/devicetree/bindings/soc/rockchip/grf.yaml\n+@@ -17,6 +17,7 @@ properties:\n+               - rockchip,rk3288-sgrf\n+               - rockchip,rv1108-pmugrf\n+               - rockchip,rv1108-usbgrf\n++              - rockchip,u3phy-grf\n+           - const: syscon\n+       - items:\n+           - enum:\ndiff --git a/target/linux/rockchip/patches-5.14/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch b/target/linux/rockchip/patches-5.14/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\nnew file mode 100644\nindex 0000000000..690c85dbb6\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/911-kernel-dma-adjust-default-coherent_pool-to-2MiB.patch\n@@ -0,0 +1,28 @@\n+From 16bdf3e76fec6ddb44f1fcf221139fb39d225031 Mon Sep 17 00:00:00 2001\n+From: Igor Pecovnik <igor.pecovnik@gmail.com>\n+Date: Sat, 2 Jan 2021 05:23:55 +0000\n+Subject: [PATCH] kernel: dma: adjust default coherent_pool to 2MiB\n+\n+---\n+ kernel/dma/pool.c | 8 +++-----\n+ 1 file changed, 3 insertions(+), 5 deletions(-)\n+\n+--- a/kernel/dma/pool.c\n++++ b/kernel/dma/pool.c\n+@@ -189,13 +189,11 @@ static int __init dma_atomic_pool_init(v\n+ \tint ret = 0;\n+ \n+ \t/*\n+-\t * If coherent_pool was not used on the command line, default the pool\n+-\t * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.\n++\t * Always use 2MiB as default pool size.\n++\t * See: https://forum.armbian.com/topic/4811-uas-mainline-kernel-coherent-pool-memory-size/\n+ \t */\n+ \tif (!atomic_pool_size) {\n+-\t\tunsigned long pages = totalram_pages() / (SZ_1G / SZ_128K);\n+-\t\tpages = min_t(unsigned long, pages, MAX_ORDER_NR_PAGES);\n+-\t\tatomic_pool_size = max_t(size_t, pages << PAGE_SHIFT, SZ_128K);\n++\t\tatomic_pool_size = SZ_2M;\n+ \t}\n+ \tINIT_WORK(&atomic_pool_work, atomic_pool_work_fn);\n+ \ndiff --git a/target/linux/rockchip/patches-5.14/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.14/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\nnew file mode 100644\nindex 0000000000..315ac0e34a\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch\n@@ -0,0 +1,44 @@\n+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001\n+From: Leonidas P. Papadakos <papadakospan@gmail.com>\n+Date: Fri, 1 Mar 2019 21:55:53 +0200\n+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for\n+ RK3328\n+\n+This allows for greater max frequency on rk3328 boards,\n+increasing performance.\n+\n+It has been included in Armbian (a linux distibution for ARM boards)\n+for a while now without any reported issues\n+\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch\n+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch\n+\n+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>\n+---\n+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++\n+ 1 files changed, 15 insertions(+)\n+\n+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi\n+@@ -140,6 +140,21 @@\n+ \t\t\topp-microvolt = <1300000>;\n+ \t\t\tclock-latency-ns = <40000>;\n+ \t\t};\n++\t\topp-1392000000 {\n++\t\t\topp-hz = /bits/ 64 <1392000000>;\n++\t\t\topp-microvolt = <1350000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1512000000 {\n++\t\t\topp-hz = /bits/ 64 <1512000000>;\n++\t\t\topp-microvolt = <1400000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp-1608000000 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1450000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n+ \t};\n+ \n+ \tanalog_sound: analog-sound {\ndiff --git a/target/linux/rockchip/patches-5.14/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.14/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\nnew file mode 100644\nindex 0000000000..c212b34cf6\n--- /dev/null\n+++ b/target/linux/rockchip/patches-5.14/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch\n@@ -0,0 +1,182 @@\n+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001\n+From: Tianling Shen <cnsztl@gmail.com>\n+Date: Sat, 19 Dec 2020 12:42:27 +0000\n+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz for NanoPi4 devices\n+\n+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,\n+and for better performance.\n+\n+Signed-off-by: Tianling Shen <cnsztl@gmail.com>\n+Co-authored-by: gzelvis <gzelvis@gmail.com>\n+---\n+ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 156 ++++++++++++++++++\n+ .../boot/dts/rockchip/rk3399-nanopi4.dtsi     |   2 +-\n+ 2 files changed, 157 insertions(+), 1 deletion(-)\n+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+\n+--- /dev/null\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi\n+@@ -0,0 +1,152 @@\n++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)\n++/*\n++ * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd\n++ *\n++ * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com>\n++ * Copyright (c) 2020 gzelvis <gzelvis@gmail.com>\n++ */\n++\n++/ {\n++\tcluster0_opp: opp-table0 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <850000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <1000000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1125000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1225000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1275000>;\n++\t\t};\n++\t};\n++\n++\tcluster1_opp: opp-table1 {\n++\t\tcompatible = \"operating-points-v2\";\n++\t\topp-shared;\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <408000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t\tclock-latency-ns = <40000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <816000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <1008000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <1200000000>;\n++\t\t\topp-microvolt = <950000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <1416000000>;\n++\t\t\topp-microvolt = <1025000>;\n++\t\t};\n++\t\topp06 {\n++\t\t\topp-hz = /bits/ 64 <1608000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t\topp07 {\n++\t\t\topp-hz = /bits/ 64 <1800000000>;\n++\t\t\topp-microvolt = <1200000>;\n++\t\t};\n++\t\topp08 {\n++\t\t\topp-hz = /bits/ 64 <2016000000>;\n++\t\t\topp-microvolt = <1250000>;\n++\t\t};\n++\t\topp09 {\n++\t\t\topp-hz = /bits/ 64 <2208000000>;\n++\t\t\topp-microvolt = <1325000>;\n++\t\t};\n++\t};\n++\n++\tgpu_opp_table: opp-table2 {\n++\t\tcompatible = \"operating-points-v2\";\n++\n++\t\topp00 {\n++\t\t\topp-hz = /bits/ 64 <200000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp01 {\n++\t\t\topp-hz = /bits/ 64 <297000000>;\n++\t\t\topp-microvolt = <800000>;\n++\t\t};\n++\t\topp02 {\n++\t\t\topp-hz = /bits/ 64 <400000000>;\n++\t\t\topp-microvolt = <825000>;\n++\t\t};\n++\t\topp03 {\n++\t\t\topp-hz = /bits/ 64 <500000000>;\n++\t\t\topp-microvolt = <875000>;\n++\t\t};\n++\t\topp04 {\n++\t\t\topp-hz = /bits/ 64 <600000000>;\n++\t\t\topp-microvolt = <925000>;\n++\t\t};\n++\t\topp05 {\n++\t\t\topp-hz = /bits/ 64 <800000000>;\n++\t\t\topp-microvolt = <1100000>;\n++\t\t};\n++\t};\n++};\n++\n++&cpu_l0 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l1 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l2 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_l3 {\n++\toperating-points-v2 = <&cluster0_opp>;\n++};\n++\n++&cpu_b0 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&cpu_b1 {\n++\toperating-points-v2 = <&cluster1_opp>;\n++};\n++\n++&gpu {\n++\toperating-points-v2 = <&gpu_opp_table>;\n++};\n+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi\n+@@ -14,7 +14,7 @@\n+ /dts-v1/;\n+ #include <dt-bindings/input/linux-event-codes.h>\n+ #include \"rk3399.dtsi\"\n+-#include \"rk3399-opp.dtsi\"\n++#include \"rk3399-nanopi4-opp.dtsi\"\n+ \n+ / {\n+ \taliases {\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/2003-mod-for-k514.patch",
    "content": "From 612fec9271b6dcffe2ff2e6a60c5fbb3fbd9f7c4 Mon Sep 17 00:00:00 2001\nFrom: quintus-lab<noreply@github.com>\nDate: Tue, 20 Jul 2021 19:56:44 +0800\nSubject: [PATCH 3/3] mod for k514\n\n---\n feeds/packages/net/xtables-addons/Makefile |   6 +++---\n package/kernel/linux/modules/fs.mk         |   6 +-\n package/kernel/linux/modules/lib.mk        |  19 +-\n package/kernel/linux/modules/netsupport.mk |   2 +-\n package/kernel/linux/modules/other.mk      |   3 +-\n package/lean/luci-app-ssr-plus/Makefile    |   2 +-\n target/linux/generic/config-5.14           |   2 +\n 7 files changed, 35 insertions(+), 8 deletions(-)\n create mode 100644 feeds/packages/net/xtables-addons/Makefile\n\ndiff --git a/feeds/packages/net/xtables-addons/Makefile b/feeds/packages/net/xtables-addons/Makefile\nindex c5e2c3f8a3f0..297082710b80 100644\n--- a/feeds/packages/net/xtables-addons/Makefile\n+++ b/feeds/packages/net/xtables-addons/Makefile\n@@ -9,9 +9,9 @@ include $(TOPDIR)/rules.mk\n include $(INCLUDE_DIR)/kernel.mk\n \n PKG_NAME:=xtables-addons\n-PKG_VERSION:=3.13\n-PKG_RELEASE:=4\n-PKG_HASH:=893c0c4ea09759cda1ab7e68f1281d125e59270f7b59e446204ce686c6a76d65\n+PKG_VERSION:=3.18\n+PKG_RELEASE:=1\n+PKG_HASH:=a77914a483ff381663f52120577e5e9355ca07cca73958b038e09d91247458d5\n \n PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz\n PKG_SOURCE_URL:=https://inai.de/files/xtables-addons/\ndiff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk\nindex 7de1a0673c..10a18d4034 100644\n--- a/package/kernel/linux/modules/fs.mk\n+++ b/package/kernel/linux/modules/fs.mk\n@@ -105,7 +105,11 @@ define KernelPackage/fs-cifs\n     +kmod-crypto-aead \\\n     +kmod-crypto-ccm \\\n     +kmod-crypto-ecb \\\n-    +kmod-crypto-des\n+    +kmod-crypto-des \\\n+    +kmod-asn1-decoder \\\n+    +kmod-asn1-encoder \\\n+    +kmod-oid_registry \\\n+    +kmod-dnsresolver\n endef\n \n define KernelPackage/fs-cifs/description\ndiff --git a/package/kernel/linux/modules/lib.mk b/package/kernel/linux/modules/lib.mk\nindex 9a341932bd..8a9bf3878e 100644\n--- a/package/kernel/linux/modules/lib.mk\n+++ b/package/kernel/linux/modules/lib.mk\n@@ -267,8 +267,25 @@ define KernelPackage/asn1-decoder\n   SUBMENU:=$(LIB_MENU)\n   TITLE:=Simple ASN1 decoder\n   KCONFIG:= CONFIG_ASN1\n-  HIDDEN:=1\n   FILES:=$(LINUX_DIR)/lib/asn1_decoder.ko\n endef\n \n $(eval $(call KernelPackage,asn1-decoder))\n+\n+define KernelPackage/asn1-encoder\n+  SUBMENU:=$(LIB_MENU)\n+  TITLE:=Simple ASN1 encoder\n+  KCONFIG:= CONFIG_ASN1\n+  FILES:=$(LINUX_DIR)/lib/asn1_encoder.ko\n+endef\n+\n+$(eval $(call KernelPackage,asn1-encoder))\n+\n+define KernelPackage/oid_registry\n+  SUBMENU:=$(LIB_MENU)\n+  TITLE:=OID registry\n+  KCONFIG:= CONFIG_OID_REGISTRY\n+  FILES:=$(LINUX_DIR)/lib/oid_registry.ko\n+endef\n+\n+$(eval $(call KernelPackage,oid_registry))\ndiff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk\nindex 1eec9f9b63..091aae28c3 100644\n--- a/package/kernel/linux/modules/netsupport.mk\n+++ b/package/kernel/linux/modules/netsupport.mk\n@@ -1075,7 +1075,7 @@ define KernelPackage/sctp\n      CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y\n   FILES:= $(LINUX_DIR)/net/sctp/sctp.ko\n   AUTOLOAD:= $(call AutoLoad,32,sctp)\n-  DEPENDS:=+kmod-lib-crc32c +kmod-crypto-md5 +kmod-crypto-hmac\n+  DEPENDS:=+kmod-lib-crc32c +kmod-crypto-md5 +kmod-crypto-hmac +kmod-udptunnel6 +kmod-udptunnel4\n endef\n \n define KernelPackage/sctp/description\ndiff --git a/package/kernel/linux/modules/other.mk b/package/kernel/linux/modules/other.mk\nindex 926fc67386..909dc3ea6f 100644\n--- a/package/kernel/linux/modules/other.mk\n+++ b/package/kernel/linux/modules/other.mk\n@@ -1123,7 +1123,8 @@ $(eval $(call KernelPackage,keys-encrypted))\n define KernelPackage/keys-trusted\n   SUBMENU:=$(OTHER_MENU)\n   TITLE:=TPM trusted keys on kernel keyring\n-  DEPENDS:=@KERNEL_KEYS +kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha1 +kmod-tpm\n+  DEPENDS:=@KERNEL_KEYS +kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha1 +kmod-tpm \\\n+\t  +kmod-asn1-decoder +kmod-asn1-encoder +kmod-oid_registry\n   KCONFIG:=CONFIG_TRUSTED_KEYS\n   FILES:= \\\n \t  $(LINUX_DIR)/security/keys/trusted.ko@lt5.10 \\\ndiff --git a/package/lean/luci-app-ssr-plus/Makefile b/package/lean/luci-app-ssr-plus/Makefile\nindex 6a5912d739..1f88e787db 100644\n--- a/package/lean/luci-app-ssr-plus/Makefile\n+++ b/package/lean/luci-app-ssr-plus/Makefile\n@@ -22,7 +22,7 @@ PKG_CONFIG_DEPENDS:= \\\n LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Socks5/Tun LuCI interface\n LUCI_PKGARCH:=all\n LUCI_DEPENDS:=+coreutils +coreutils-base64 +dns2socks +dnsmasq-full +ipset \\\n-\t+ip-full +iptables-mod-tproxy +lua +libuci-lua +microsocks +pdnsd-alt \\\n+\t+ip-full +iptables-mod-tproxy +lua +libuci-lua +microsocks \\\n \t+tcping +resolveip +shadowsocksr-libev-ssr-check +uclient-fetch \\\n \t+libustream-openssl \\\n \t+PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \\\ndiff --git a/target/linux/generic/config-5.14 b/target/linux/generic/config-5.14\nindex ee74833fc8..7ee656af97 100644\n--- a/target/linux/generic/config-5.14\n+++ b/target/linux/generic/config-5.14\n@@ -416,6 +416,7 @@ CONFIG_ARM_GIC_MAX_NR=1\n # CONFIG_AS3935 is not set\n # CONFIG_AS73211 is not set\n # CONFIG_ASM9260_TIMER is not set\n+# CONFIG_ASN1 is not set\n # CONFIG_ASUS_LAPTOP is not set\n # CONFIG_ASUS_WIRELESS is not set\n # CONFIG_ASYMMETRIC_KEY_TYPE is not set\n@@ -4220,6 +4221,7 @@ CONFIG_NMI_LOG_BUF_SHIFT=13\n # CONFIG_OF_OVERLAY is not set\n CONFIG_OF_RESERVED_MEM=y\n # CONFIG_OF_UNITTEST is not set\n+# CONFIG_OID_REGISTRY is not set\n # CONFIG_OMAP2_DSS_DEBUG is not set\n # CONFIG_OMAP2_DSS_DEBUGFS is not set\n # CONFIG_OMAP2_DSS_SDI is not set\n-- \n2.25.1\n\n"
  },
  {
    "path": "patches/910-mini-ttl.patch",
    "content": "--- a/src/dnsmasq.h\n+++ b/src/dnsmasq.h\n@@ -1116,7 +1116,7 @@ extern struct daemon {\n   int max_logs;  /* queue limit */\n   int cachesize, ftabsize;\n   int port, query_port, min_port, max_port;\n-  unsigned long local_ttl, neg_ttl, max_ttl, min_cache_ttl, max_cache_ttl, auth_ttl, dhcp_ttl, use_dhcp_ttl;\n+  unsigned long local_ttl, neg_ttl, min_ttl, max_ttl, min_cache_ttl, max_cache_ttl, auth_ttl, dhcp_ttl, use_dhcp_ttl;\n   char *dns_client_id;\n   u32 umbrella_org;\n   u32 umbrella_asset;\n--- a/src/option.c\n+++ b/src/option.c\n@@ -174,6 +174,7 @@ struct myoption {\n #define LOPT_CMARK_ALST_EN 365\n #define LOPT_CMARK_ALST    366\n #define LOPT_QUIET_TFTP    367\n+#define LOPT_MINTTL        368\n  \n #ifdef HAVE_GETOPT_LONG\n static const struct option opts[] =  \n@@ -292,6 +293,7 @@ static const struct myoption opts[] =\n     { \"dhcp-name-match\", 1, 0, LOPT_NAME_MATCH },\n     { \"dhcp-broadcast\", 2, 0, LOPT_BROADCAST },\n     { \"neg-ttl\", 1, 0, LOPT_NEGTTL },\n+    { \"min-ttl\", 1, 0, LOPT_MINTTL },\n     { \"max-ttl\", 1, 0, LOPT_MAXTTL },\n     { \"min-cache-ttl\", 1, 0, LOPT_MINCTTL },\n     { \"max-cache-ttl\", 1, 0, LOPT_MAXCTTL },\n@@ -425,6 +427,7 @@ static struct {\n   { 't', ARG_ONE, \"<host_name>\", gettext_noop(\"Specify default target in an MX record.\"), NULL },\n   { 'T', ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live in seconds for replies from /etc/hosts.\"), NULL },\n   { LOPT_NEGTTL, ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live in seconds for negative caching.\"), NULL },\n+  { LOPT_MINTTL, ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live in seconds for minimum TTL to send to clients.\"), NULL },\n   { LOPT_MAXTTL, ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live in seconds for maximum TTL to send to clients.\"), NULL },\n   { LOPT_MAXCTTL, ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live ceiling for cache.\"), NULL },\n   { LOPT_MINCTTL, ARG_ONE, \"<integer>\", gettext_noop(\"Specify time-to-live floor for cache.\"), NULL },\n@@ -3047,6 +3050,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma\n       \n     case 'T':         /* --local-ttl */\n     case LOPT_NEGTTL: /* --neg-ttl */\n+    case LOPT_MINTTL: /* --min-ttl */\n     case LOPT_MAXTTL: /* --max-ttl */\n     case LOPT_MINCTTL: /* --min-cache-ttl */\n     case LOPT_MAXCTTL: /* --max-cache-ttl */\n@@ -3058,6 +3062,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma\n \t  ret_err(gen_err);\n \telse if (option == LOPT_NEGTTL)\n \t  daemon->neg_ttl = (unsigned long)ttl;\n+\telse if (option == LOPT_MINTTL)\n+\t  daemon->min_ttl = (unsigned long)ttl;\n \telse if (option == LOPT_MAXTTL)\n \t  daemon->max_ttl = (unsigned long)ttl;\n \telse if (option == LOPT_MINCTTL)\n--- a/src/rfc1035.c\n+++ b/src/rfc1035.c\n@@ -607,6 +607,7 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t\n \t  for (j = 0; j < ntohs(header->ancount); j++) \n \t    {\n \t      int secflag = 0;\n+\t      unsigned long mttl = 0;\n \t      if (!(res = extract_name(header, qlen, &p1, name, 0, 10)))\n \t\treturn 0; /* bad packet */\n \t      \n@@ -615,6 +616,14 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t\n \t      GETLONG(attl, p1);\n \t      \n \t      if ((daemon->max_ttl != 0) && (attl > daemon->max_ttl) && !is_sign)\n+\t        {\n+\t          mttl = daemon->max_ttl;\n+\t        }\n+\t      if ((daemon->min_ttl != 0) && (attl < daemon->min_ttl) && !is_sign)\n+\t        {\n+\t           mttl = daemon->min_ttl;\n+\t        }\n+\t      if (mttl != 0)\n \t\t{\n \t\t  (p1) -= 4;\n \t\t  PUTLONG(daemon->max_ttl, p1);\n@@ -722,6 +731,7 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t\n       for (j = 0; j < ntohs(header->ancount); j++) \n \t{\n \t  int secflag = 0;\n+\t  unsigned long mttl = 0;\n \t  \n \t  if (!(res = extract_name(header, qlen, &p1, name, 0, 10)))\n \t    return 0; /* bad packet */\n@@ -730,6 +740,14 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t\n \t  GETSHORT(aqclass, p1);\n \t  GETLONG(attl, p1);\n \t  if ((daemon->max_ttl != 0) && (attl > daemon->max_ttl) && !is_sign)\n+\t  {\n+\t    mttl = daemon->max_ttl;\n+\t  }\n+\t  if ((daemon->min_ttl != 0) && (attl < daemon->min_ttl) && !is_sign)\n+\t  {\n+\t    mttl = daemon->min_ttl;\n+\t  }\n+\t    if (mttl != 0)\n \t    {\n \t      (p1) -= 4;\n \t      PUTLONG(daemon->max_ttl, p1);\n"
  },
  {
    "path": "patches/911-dnsmasq-filter-aaaa.patch",
    "content": "From 966471712184cfb3b067f2ae8dad9d8e2a896cae Mon Sep 17 00:00:00 2001\nFrom: Bearice Ren <bearice@icybear.net>\nDate: Tue, 20 Sep 2016 11:52:08 +0800\nSubject: [PATCH] add filter-aaaa option\n\n---\n src/dnsmasq.h | 3 ++-\n src/option.c  | 3 +++\n src/rfc1035.c | 9 +++++++++\n 3 files changed, 14 insertions(+), 1 deletion(-)\n\n--- a/src/dnsmasq.h\n+++ b/src/dnsmasq.h\n@@ -275,7 +275,8 @@ struct event_desc {\n #define OPT_UMBRELLA_DEVID 64\n #define OPT_CMARK_ALST_EN  65\n #define OPT_QUIET_TFTP     66\n-#define OPT_LAST           67\n+#define OPT_FILTER_AAAA    67\n+#define OPT_LAST           68\n \n #define OPTION_BITS (sizeof(unsigned int)*8)\n #define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )\n--- a/src/option.c\n+++ b/src/option.c\n@@ -175,6 +175,7 @@ struct myoption {\n #define LOPT_CMARK_ALST    366\n #define LOPT_QUIET_TFTP    367\n #define LOPT_MINTTL        368\n+#define LOPT_FILTER_AAAA   369\n  \n #ifdef HAVE_GETOPT_LONG\n static const struct option opts[] =  \n@@ -355,6 +356,7 @@ static const struct myoption opts[] =\n     { \"log-debug\", 0, 0, LOPT_LOG_DEBUG },\n \t{ \"umbrella\", 2, 0, LOPT_UMBRELLA },\n     { \"quiet-tftp\", 0, 0, LOPT_QUIET_TFTP },\n+    { \"filter-aaaa\", 0, 0, LOPT_FILTER_AAAA },\n     { NULL, 0, 0, 0 }\n   };\n \n@@ -542,6 +544,7 @@ static struct {\n   { LOPT_SCRIPT_TIME, OPT_LEASE_RENEW, NULL, gettext_noop(\"Call dhcp-script when lease expiry changes.\"), NULL },\n   { LOPT_UMBRELLA, ARG_ONE, \"[=<optspec>]\", gettext_noop(\"Send Cisco Umbrella identifiers including remote IP.\"), NULL },\n   { LOPT_QUIET_TFTP, OPT_QUIET_TFTP, NULL, gettext_noop(\"Do not log routine TFTP.\"), NULL },\n+  { LOPT_FILTER_AAAA, OPT_FILTER_AAAA, NULL, gettext_noop(\"Filter all AAAA requests.\"), NULL },\n   { 0, 0, NULL, NULL, NULL }\n }; \n \n--- a/src/rfc1035.c\n+++ b/src/rfc1035.c\n@@ -2005,6 +2005,16 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,\n \t    }\n \t}\n \n+      /* patch to filter aaaa forwards */\n+      if (qtype == T_AAAA && option_bool(OPT_FILTER_AAAA))\n+        {\n+          /* return a null reply */\n+          ans = 1;\n+          if (!dryrun)\n+            log_query(F_CONFIG | F_IPV6 | F_NEG, name, &addr, NULL);\n+          break;\n+        }\n+\n       if (!ans)\n \treturn 0; /* failed to answer a question */\n     }\n"
  },
  {
    "path": "script/free_disk_space.sh",
    "content": "# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE file distributed with\n# this work for additional information regarding copyright ownership.\n# The ASF licenses this file to You under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with\n# the License.  You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\n#\n# The Azure provided machines typically have the following disk allocation:\n# Total space: 85GB\n# Allocated: 67 GB\n# Free: 17 GB\n# This script frees up 28 GB of disk space by deleting unneeded packages and \n# large directories.\n# The Flink end to end tests download and generate more than 17 GB of files,\n# causing unpredictable behavior and build failures.\n#\necho \"==============================================================================\"\necho \"Freeing up disk space on CI system\"\necho \"==============================================================================\"\n\necho \"Listing 100 largest packages\"\ndpkg-query -Wf '${Installed-Size}\\t${Package}\\n' | sort -n | tail -n 100\ndf -h\necho \"Removing large packages\"\nsudo apt-get remove -y '^ghc-8.*'\nsudo apt-get remove -y '^dotnet-.*'\nsudo apt-get remove -y '^llvm-.*'\nsudo apt-get remove -y 'php.*'\nsudo apt-get remove -y azure-cli google-cloud-sdk hhvm google-chrome-stable firefox powershell mono-devel\nsudo apt-get autoremove -y\nsudo apt-get clean\ndf -h\necho \"Removing large directories\"\n# deleting 15GB\nrm -rf /usr/share/dotnet/\ndf -h\n"
  },
  {
    "path": "script/origin-slim.sh",
    "content": "\n#!/bin/bash\ngit clone https://git.openwrt.org/openwrt/openwrt.git\ncd openwrt\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/rockchip-add-support-for-FriendlyARM-NanoPi-R2S.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/rockchip-add-support-for-rk3328-radxa-rock-pi-e.patch\npatch -p1 < ./rockchip-add-support-for-rk3328-radxa-rock-pi-e.patch\npatch -p1 < ./rockchip-add-support-for-FriendlyARM-NanoPi-R2S.patch\n#\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/01-prepare_package.sh\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/02-convert_translation.sh\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/03-remove_upx.sh\nbash 01-prepare_package.sh\nbash 02-convert_translation.sh\nbash 03-remove_upx.sh\nrm .config\nwget -O .config https://github.com/quintus-lab/Openwrt-R2S/raw/master/seed/origin-slim.seed\nmake defconfig\nmake download -j10\nchmod -R 755 ./\nlet make_process=$(nproc)+1\nmake toolchain/install -j${make_process} V=s\nlet make_process=$(nproc)+1\nmake -j${make_process} V=s || make -j${make_process} V=s\ncd bin/targets/rockchip/armv8\ngzip -d *.gz\ngzip *.img\n"
  },
  {
    "path": "script/step.sh",
    "content": "git clone https://git.openwrt.org/openwrt/openwrt.git\n\ncd openwrt\ngit config --local user.email \"action@github.com\" && git config --local user.name \"GitHub Action\"\ngit remote add upstream https://github.com/openwrt/openwrt.git && git fetch upstream\ngit rebase upstream/master\n\n./scripts/feeds update -a && ./scripts/feeds install -a\n\nsed -i 's/Os/O3/g' include/target.mk\nsed -i 's/O2/O3/g' ./rules.mk\n#irqbalance\nsed -i 's/0/1/g' feeds/packages/utils/irqbalance/files/irqbalance.config\nwget -P package/base-files/files/etc/init.d/ https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/zzz-adjust_network\n\n#patches\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/dnsmasq-add-filter-aaaa-option.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/luci-add-filter-aaaa-option.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/luci-app-firewall_add_sfe_switch.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/use_json_object_new_int64.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/kernel_crypto-add-rk3328-crypto-support.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/900-add-filter-aaaa-option.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/991-r8152-Add-module-param-for-customized-LEDs.patch\n\npatch -p1 < ./kernel_crypto-add-rk3328-crypto-support.patch\npatch -p1 < ./use_json_object_new_int64.patch\npatch -p1 < ./dnsmasq-add-filter-aaaa-option.patch\npatch -p1 < ./luci-add-filter-aaaa-option.patch\npatch -p1 < ./luci-app-firewall_add_sfe_switch.patch\ncp ./900-add-filter-aaaa-option.patch package/network/services/dnsmasq/patches/\ncp ./998-rockchip-enable-i2c0-on-NanoPi-R2S.patch ./target/linux/rockchip/patches-5.4/\ncp ./991-r8152-Add-module-param-for-customized-LEDs.patch ./target/linux/rockchip/patches-5.4/\n\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-cpufreq package/lean/luci-app-cpufreq\nwget https://github.com/project-openwrt/R2S-OpenWrt/raw/master/PATCH/luci-app-freq.patch\npatch -p1 < ./luci-app-freq.patch\n\n#FullCone Patch\ngit clone -b master --single-branch https://github.com/QiuSimons/openwrt-fullconenat package/fullconenat\n# Patch FireWall for fullcone\nmkdir package/network/config/firewall/patches\nwget -P package/network/config/firewall/patches/ https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/fullconenat.patch\n\npushd feeds/luci\nwget -O- https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/luci.patch | git apply\npopd\n#Patch Kernel for fullcone\npushd target/linux/generic/hack-5.4\nwget https://raw.githubusercontent.com/coolsnowwolf/lede/master/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch\npopd\n\n# SFE kernel patch\npushd target/linux/generic/hack-5.4\nwget https://raw.githubusercontent.com/coolsnowwolf/lede/master/target/linux/generic/hack-5.4/999-shortcut-fe-support.patch\npopd\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shortcut-fe package/new/shortcut-fe\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/fast-classifier package/new/fast-classifier\n\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/patches/999-unlock-1608mhz-rk3328.patch\ncp 999-unlock-1608mhz-rk3328.patch target/linux/rockchip/patches-5.4/\n\n\nrm -rf ./feeds/packages/devel/gcc\nsvn co https://github.com/openwrt/packages/trunk/devel/gcc feeds/packages/devel/gcc\n\n#arpbind\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-arpbind package/lean/luci-app-arpbind\n#AutoCore\nsvn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/autocore package/lean/autocore\n#coremark\nrm -rf ./feeds/packages/utils/coremark\nrm -rf ./package/feeds/packages/coremark\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/coremark package/lean/coremark\nsed -i 's,-DMULTIT,-Ofast -DMULTIT,g' package/lean/coremark/Makefile\n#ddns script\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_aliyun package/lean/ddns-scripts_aliyun\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_dnspod package/lean/ddns-scripts_dnspod\n#autoreboot\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-autoreboot package/lean/luci-app-autoreboot\n#gost\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/gost package/ctcgfw/gost\nsvn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/luci-app-gost package/ctcgfw/luci-app-gost\n#ssrp\nsvn co https://github.com/fw876/helloworld/trunk/luci-app-ssr-plus package/lean/luci-app-ssr-plus\nrm -rf ./feeds/packages/net/kcptun\nrm -rf ./feeds/packages/net/shadowsocks-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shadowsocksr-libev package/lean/shadowsocksr-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/pdnsd-alt package/lean/pdnsd\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/v2ray package/lean/v2ray\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/kcptun package/lean/kcptun\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/v2ray-plugin package/lean/v2ray-plugin\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/srelay package/lean/srelay\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/microsocks package/lean/microsocks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/dns2socks package/lean/dns2socks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/redsocks2 package/lean/redsocks2\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/proxychains-ng package/lean/proxychains-ng\ngit clone -b master --single-branch https://github.com/pexcn/openwrt-ipt2socks package/lean/ipt2socks\ngit clone -b master --single-branch https://github.com/aa65535/openwrt-simple-obfs package/lean/simple-obfs\nsvn co https://github.com/coolsnowwolf/packages/trunk/net/shadowsocks-libev package/lean/shadowsocks-libev\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/trojan package/lean/trojan\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/lean/tcpping package/lean/tcpping\n\ngit clone -b master --single-branch https://github.com/garypang13/luci-theme-edge package/new/luci-theme-edge\n\n#OLED display\ngit clone https://github.com/natelol/luci-app-oled package/natelol/luci-app-oled\n\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-ramfree package/lean/luci-app-ramfree\n#打印机\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-usb-printer package/lean/luci-app-usb-printer\n#流量监视\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-wrtbwmon package/lean/luci-app-wrtbwmon\n\ngit clone -b master --single-branch https://github.com/brvphoenix/wrtbwmon package/new/wrtbwmon\ngit clone -b master --single-branch https://github.com/brvphoenix/luci-app-wrtbwmon package/new/luci-app-wrtbwmon\n\n#jd-dailybonus\ngit clone https://github.com/jerrykuku/node-request package/lean/node-request\ngit clone https://github.com/jerrykuku/luci-app-jd-dailybonus package/lean/luci-app-jd-dailybonus\nwget -O package/lean/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js https://github.com/NobyDa/Script/raw/master/JD-DailyBonus/JD_DailyBonus.js\n#\n\nrm -f ./feeds/luci/applications/luci-app-frps\nrm -f ./package/feeds/luci/luci-app-frps\nrm -f ./feeds/luci/applications/luci-app-frpc\nrm -f ./package/feeds/luci/luci-app-frpc\nrm -rf ./feeds/packages/net/frp\nrm -rf ./package/feeds/packages/frp\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/frp package/lean/frp\ngit clone https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps\ngit clone https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc\n\n#beardropper\ngit clone https://github.com/NateLol/luci-app-beardropper package/luci-app-beardropper\n#tmate\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/tmate package/ctcgfw/tmate\n#transmission-web-control\nrm -rf ./feeds/packages/net/transmission*\nrm -rf ./feeds/luci/applications/luci-app-transmission/\nsvn co https://github.com/coolsnowwolf/packages/trunk/net/transmission feeds/packages/net/transmission\nsvn co https://github.com/coolsnowwolf/packages/trunk/net/transmission-web-control feeds/packages/net/transmission-web-control\nsvn co https://github.com/coolsnowwolf/luci/trunk/applications/luci-app-transmission feeds/luci/applications/luci-app-transmission\n\ngit clone https://github.com/rufengsuixing/luci-app-zerotier package/lean/luci-app-zerotier\nsvn co https://github.com/coolsnowwolf/packages/trunk/net/zerotier package/lean/zerotier\nsed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf\n\n#翻译\ngit clone -b master --single-branch https://github.com/QiuSimons/addition-trans-zh package/lean/lean-translate\nwget -O package/lean/lean-translate/files/zzz-default-settings https://github.com/quintus-lab/Openwrt-R2S/raw/master/script/zzz-default-settings\n\nsvn co https://github.com/project-openwrt/openwrt/trunk/package/ctcgfw/rtl8821cu package/ctcgfw/rtl8821cu\n\nrm -rf .config\n#修正架构\nsed -i \"s,boardinfo.system,'ARMv8',g\" feeds/luci/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js\nchmod -R 755 ./\necho -e '\\nQuintus Build @ '$(date \"+%Y.%m.%d\")'\\n'  >> package/base-files/files/etc/banner\nsed -i '/DISTRIB_REVISION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_REVISION='$(date \"+%Y.%m.%d\")'\" >> package/base-files/files/etc/openwrt_release\nsed -i '/DISTRIB_DESCRIPTION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_DESCRIPTION='Quintus Build@$(date \"+%Y.%m.%d\")\" >> package/base-files/files/etc/openwrt_release\n\n#install upx\nmkdir -p staging_dir/host/bin/\nln -s /usr/bin/upx-ucl staging_dir/host/bin/upx\n#or\nwget https://github.com/quintus-lab/Openwrt-R2S/raw/master/step/03-remove_upx.sh\nbash 03-remove_upx\n"
  },
  {
    "path": "script/zzz-default-settings",
    "content": "#!/bin/sh\n\n#uci set luci.main.mediaurlbase='/luci-static/argon'\n#uci commit luci\n\nuci set system.@system[0].timezone=CST-8\nuci set system.@system[0].zonename=Asia/Shanghai\nuci commit system\n\nsed -i 's/local ucic = uci.cursor()/local ucic = luci.model.uci.cursor()/g' /usr/share/shadowsocksr/subscribe.lua\nsed -i \"s/'cbid.shadowsocksr.'/'widget.cbid.shadowsocksr.'/g\" /usr/lib/lua/luci/view/shadowsocksr/ssrurl.htm\n\nsed -i 's/0/1/g' /etc/config/irqbalance\n\nsed -i '/openwrt_luci/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\nsed -i '/openwrt_packages/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\nsed -i '/openwrt_routing/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\nsed -i '/openwrt_telephony/ { s/snapshots\\/packages/releases\\/packages-19.07/g; }' /etc/opkg/distfeeds.conf\nsed -i '/natelol/d' /etc/opkg/distfeeds.conf\nsed -i 's,downloads.openwrt.org,mirrors.cloud.tencent.com/lede,g' /etc/opkg/distfeeds.conf\n\nuci set fstab.@global[0].anon_mount=1\nuci commit fstab\n\nrm -f /usr/lib/lua/luci/view/admin_status/index/mwan.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/upnp.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/ddns.htm\nrm -f /usr/lib/lua/luci/view/admin_status/index/minidlna.htm\n\nuci set uhttpd.main.rfc1918_filter=0\nuci set uhttpd.main.redirect_https=0\nuci commit uhttpd\n\n#sed -i 's,/opt,/overlay,g' /etc/config/dockerman\n\n#Mark\nBuild_Date=$(date +%Y.%m.%d)\necho -e '\\nQuintus Build @ '$Build_Date'\\n'  >> /etc/banner\nsed -i '/DISTRIB_REVISION/d' /etc/openwrt_release\necho \"DISTRIB_REVISION='$(date \"+%Y.%m.%d\")'\" >> /etc/openwrt_release\nsed -i '/DISTRIB_DESCRIPTION/d' /etc/openwrt_release\necho \"DISTRIB_DESCRIPTION='Quintus Build@$Build_Date'\" >> /etc/openwrt_release\n\n#SSL\nsed -i 's,#afalg,afalg,g' /etc/ssl/openssl.cnf\nsed -i 's/#devcrypto/devcrypto/g' /etc/ssl/openssl.cnf\nsed -i 's/#USE_SOFTDRIVERS = 2/USE_SOFTDRIVERS = 1/g' /etc/ssl/openssl.cnf\n\nsed -i '/log-facility/d' /etc/dnsmasq.conf\necho \"log-facility=/dev/null\" >> /etc/dnsmasq.conf\nrm -rf /tmp/luci-modulecache/\nrm -f /tmp/luci-indexcache\nln -sf /sbin/ip /usr/bin/ip\n#opkg flag hold luci-app-ddns\n#opkg flag hold luci-i18n-ddns-zh-cn\n#opkg flag hold ddns-scripts\n#opkg flag hold ddns-scripts_cloudflare.com-v4\nopkg flag hold luci-app-firewall\nopkg flag hold firewall\nopkg flag hold dnsmasq-full\n\n#uci delete network.lan.ip6assign\n#uci delete network.wan6\n#uci set dhcp.lan.ra=disabled\n#uci set dhcp.lan.dhcpv6=disabled\n#uci commit \nuci set ttyd.@ttyd[0].command='/bin/login'\nuci commit ttyd\n\nexit 0\n"
  },
  {
    "path": "seed/k514.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_MULTI_PROFILE=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r4s=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_xunlong_orangepi-r1-plus=y\nCONFIG_DEVEL=y\nCONFIG_TOOLCHAINOPTS=y\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_ARP=y\nCONFIG_BUSYBOX_CONFIG_ARPING=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_WIDTH=y\nCONFIG_BUSYBOX_CONFIG_TELNET=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_EXPERIMENTAL=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_KERNEL_ARM_PMU=y\n# CONFIG_KERNEL_CGROUPS is not set\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_HUGETLBFS=y\nCONFIG_KERNEL_HUGETLB_PAGE=y\n# CONFIG_KERNEL_NAMESPACES is not set\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_NGHTTP2=y\nCONFIG_LIBCURL_NO_SMB=\"!\"\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBCURL_WOLFSSL=y\nCONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_LINUX_5_14=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_ERROR_MESSAGES=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_adbyby=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_bind-client=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_boost=y\nCONFIG_PACKAGE_boost-date_time=y\nCONFIG_PACKAGE_boost-program_options=y\nCONFIG_PACKAGE_boost-system=y\nCONFIG_PACKAGE_ca-certificates=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils=y\nCONFIG_PACKAGE_coreutils-base64=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_ddns-scripts=y\nCONFIG_PACKAGE_ddns-scripts-cloudflare=y\nCONFIG_PACKAGE_ddns-scripts-services=y\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_default-settings=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsforwarder=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_etherwake=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_i2c-tools=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip-full=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipset=y\nCONFIG_PACKAGE_ipt2socks=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-extra=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_iptables-mod-tproxy=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_jq=y\nCONFIG_PACKAGE_kmod-asn1-decoder=y\nCONFIG_PACKAGE_kmod-asn1-encoder=y\nCONFIG_PACKAGE_kmod-br-netfilter=y\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-aead=y\nCONFIG_PACKAGE_kmod-crypto-arc4=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-crc32=y\nCONFIG_PACKAGE_kmod-crypto-crc32c=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-gcm=y\nCONFIG_PACKAGE_kmod-crypto-gf128=y\nCONFIG_PACKAGE_kmod-crypto-ghash=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-kpp=y\nCONFIG_PACKAGE_kmod-crypto-lib-blake2s=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y\nCONFIG_PACKAGE_kmod-crypto-lib-curve25519=y\nCONFIG_PACKAGE_kmod-crypto-lib-poly1305=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-null=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-user=y\nCONFIG_PACKAGE_kmod-dax=y\nCONFIG_PACKAGE_kmod-dm=y\nCONFIG_PACKAGE_kmod-dnsresolver=y\nCONFIG_PACKAGE_kmod-dummy=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-ntfs=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-fuse=y\nCONFIG_PACKAGE_kmod-i2c-algo-bit=y\nCONFIG_PACKAGE_kmod-i2c-core=y\nCONFIG_PACKAGE_kmod-i2c-gpio=y\nCONFIG_PACKAGE_kmod-ifb=y\nCONFIG_PACKAGE_kmod-ikconfig=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-extra=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-ipset=y\nCONFIG_PACKAGE_kmod-ipt-ipv4options=y\nCONFIG_PACKAGE_kmod-ipt-nat-extra=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-ipt-raw=y\nCONFIG_PACKAGE_kmod-ipt-tproxy=y\nCONFIG_PACKAGE_kmod-iptunnel=y\nCONFIG_PACKAGE_kmod-keys-encrypted=y\nCONFIG_PACKAGE_kmod-keys-trusted=y\nCONFIG_PACKAGE_kmod-lib-crc32c=y\nCONFIG_PACKAGE_kmod-lib-lzo=y\nCONFIG_PACKAGE_kmod-lib-raid6=y\nCONFIG_PACKAGE_kmod-lib-textsearch=y\nCONFIG_PACKAGE_kmod-lib-xor=y\nCONFIG_PACKAGE_kmod-lib-zlib-deflate=y\nCONFIG_PACKAGE_kmod-lib-zlib-inflate=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_PACKAGE_kmod-mpls=y\nCONFIG_PACKAGE_kmod-nat46=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-nf-nathelper=y\nCONFIG_PACKAGE_kmod-nf-nathelper-extra=y\nCONFIG_PACKAGE_kmod-nfnetlink=y\nCONFIG_PACKAGE_kmod-nft-bridge=m\nCONFIG_PACKAGE_kmod-nft-core=y\nCONFIG_PACKAGE_kmod-nft-nat=y\nCONFIG_PACKAGE_kmod-nft-offload=y\nCONFIG_PACKAGE_kmod-nls-cp437=y\nCONFIG_PACKAGE_kmod-nls-iso8859-1=y\nCONFIG_PACKAGE_kmod-nls-utf8=y\nCONFIG_PACKAGE_kmod-oid_registry=y\nCONFIG_PACKAGE_kmod-random-core=y\nCONFIG_PACKAGE_kmod-sched-cake=y\nCONFIG_PACKAGE_kmod-sched-core=y\nCONFIG_PACKAGE_kmod-scsi-core=y\nCONFIG_PACKAGE_kmod-sctp=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tpm=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_kmod-udptunnel4=y\nCONFIG_PACKAGE_kmod-udptunnel6=y\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-vxlan=y\nCONFIG_PACKAGE_kmod-wireguard=y\nCONFIG_PACKAGE_libaio=y\nCONFIG_PACKAGE_libatomic=y\nCONFIG_PACKAGE_libbpf=y\nCONFIG_PACKAGE_libbsd=y\nCONFIG_PACKAGE_libbz2=y\nCONFIG_PACKAGE_libcap=y\nCONFIG_PACKAGE_libcap-bin=y\nCONFIG_PACKAGE_libcap-bin-capsh-shell=\"/bin/sh\"\nCONFIG_PACKAGE_libcap-ng=y\nCONFIG_PACKAGE_libcap-ng-bin=y\nCONFIG_PACKAGE_libcares=y\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libdb47=y\nCONFIG_PACKAGE_libelf=y\nCONFIG_PACKAGE_libev=y\nCONFIG_PACKAGE_libevdev=y\nCONFIG_PACKAGE_libevent2=y\nCONFIG_PACKAGE_libfdisk=y\nCONFIG_PACKAGE_libffi=y\nCONFIG_PACKAGE_libgdbm=y\nCONFIG_PACKAGE_libgmp=y\nCONFIG_PACKAGE_libi2c=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libipset=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-data=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_libkmod=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_liblzma=y\nCONFIG_PACKAGE_libmbedtls=y\nCONFIG_PACKAGE_libminiupnpc=y\nCONFIG_PACKAGE_libmnl=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libnatpmp=y\nCONFIG_PACKAGE_libncurses=y\nCONFIG_PACKAGE_libnetfilter-conntrack=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libnettle=y\nCONFIG_PACKAGE_libnfnetlink=y\nCONFIG_PACKAGE_libnghttp2=y\nCONFIG_PACKAGE_libnss=y\nCONFIG_PACKAGE_libopenssl=y\nCONFIG_PACKAGE_libopenssl-conf=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpcap=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libpcre=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libpython3=y\nCONFIG_PACKAGE_libreadline=y\nCONFIG_PACKAGE_libruby=y\nCONFIG_PACKAGE_libsctp=y\nCONFIG_PACKAGE_libsodium=y\nCONFIG_PACKAGE_libsqlite3=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libstdcpp=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_libuci-lua=y\nCONFIG_PACKAGE_libudev-zero=y\nCONFIG_PACKAGE_libudns=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libustream-openssl=y\n# CONFIG_PACKAGE_libustream-wolfssl is not set\nCONFIG_PACKAGE_libuv=y\nCONFIG_PACKAGE_libwebsockets-full=y\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_libyaml=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adbyby-plus=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_libustream-openssl=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wireguard=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-base=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-proto-wireguard=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_microsocks=y\nCONFIG_PACKAGE_miniupnpd=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_msgpack-c=y\nCONFIG_PACKAGE_mt7601u-firmware=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_musl-fts=y\nCONFIG_PACKAGE_naiveproxy=y\nCONFIG_PACKAGE_nspr=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_python3=y\nCONFIG_PACKAGE_python3-asyncio=y\nCONFIG_PACKAGE_python3-base=y\nCONFIG_PACKAGE_python3-cgi=y\nCONFIG_PACKAGE_python3-cgitb=y\nCONFIG_PACKAGE_python3-codecs=y\nCONFIG_PACKAGE_python3-ctypes=y\nCONFIG_PACKAGE_python3-dbm=y\nCONFIG_PACKAGE_python3-decimal=y\nCONFIG_PACKAGE_python3-distutils=y\nCONFIG_PACKAGE_python3-email=y\nCONFIG_PACKAGE_python3-light=y\nCONFIG_PACKAGE_python3-logging=y\nCONFIG_PACKAGE_python3-lzma=y\nCONFIG_PACKAGE_python3-multiprocessing=y\nCONFIG_PACKAGE_python3-ncurses=y\nCONFIG_PACKAGE_python3-openssl=y\nCONFIG_PACKAGE_python3-pkg-resources=y\nCONFIG_PACKAGE_python3-pydoc=y\nCONFIG_PACKAGE_python3-readline=y\nCONFIG_PACKAGE_python3-sqlite3=y\nCONFIG_PACKAGE_python3-unittest=y\nCONFIG_PACKAGE_python3-urllib=y\nCONFIG_PACKAGE_python3-xml=y\nCONFIG_PACKAGE_redsocks2=y\nCONFIG_PACKAGE_resolveip=y\nCONFIG_PACKAGE_rpcd=y\nCONFIG_PACKAGE_rpcd-mod-file=y\nCONFIG_PACKAGE_rpcd-mod-iwinfo=y\nCONFIG_PACKAGE_rpcd-mod-luci=y\nCONFIG_PACKAGE_rpcd-mod-rrdns=y\nCONFIG_PACKAGE_ruby=y\nCONFIG_PACKAGE_ruby-bigdecimal=y\nCONFIG_PACKAGE_ruby-date=y\nCONFIG_PACKAGE_ruby-dbm=y\nCONFIG_PACKAGE_ruby-digest=y\nCONFIG_PACKAGE_ruby-enc=y\nCONFIG_PACKAGE_ruby-forwardable=y\nCONFIG_PACKAGE_ruby-pstore=y\nCONFIG_PACKAGE_ruby-psych=y\nCONFIG_PACKAGE_ruby-stringio=y\nCONFIG_PACKAGE_ruby-strscan=y\nCONFIG_PACKAGE_ruby-yaml=y\nCONFIG_PACKAGE_shadowsocks-rust-sslocal=y\nCONFIG_PACKAGE_shadowsocks-rust-ssmanager=y\nCONFIG_PACKAGE_shadowsocks-rust-ssserver=y\nCONFIG_PACKAGE_shadowsocks-rust-ssurl=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-check=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-redir=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_sqm-scripts=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_stress-ng=y\nCONFIG_PACKAGE_tc-mod-iptables=y\nCONFIG_PACKAGE_tc-tiny=y\nCONFIG_PACKAGE_tcping=y\nCONFIG_PACKAGE_terminfo=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_trojan=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_uhttpd-mod-ubus=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbids=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_wireguard-tools=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\nCONFIG_PACKAGE_wrtbwmon=y\nCONFIG_PACKAGE_xray-core=y\nCONFIG_PACKAGE_yq=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_zlib=y\nCONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y\nCONFIG_SQLITE3_FTS3=y\nCONFIG_SQLITE3_FTS4=y\nCONFIG_SQLITE3_FTS5=y\nCONFIG_SQLITE3_JSON1=y\nCONFIG_SQLITE3_RTREE=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_OPTIONS=y\nCONFIG_TARGET_ROOTFS_PARTSIZE=1024\nCONFIG_TESTING_KERNEL=y\nCONFIG_WPA_MSG_MIN_PRIORITY=3\nCONFIG_boost-compile-visibility-hidden=y\nCONFIG_boost-runtime-shared=y\nCONFIG_boost-static-and-shared-libs=y\nCONFIG_boost-variant-release=y\n# CONFIG_PACKAGE_libustream-wolfssl is not set\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_libustream-openssl=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_libustream-wolfssl is not set\n"
  },
  {
    "path": "seed/nanopi.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_MULTI_PROFILE=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r4s=y\nCONFIG_DEVEL=y\nCONFIG_TOOLCHAINOPTS=y\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_ARP=y\nCONFIG_BUSYBOX_CONFIG_ARPING=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_WIDTH=y\nCONFIG_BUSYBOX_CONFIG_TELNET=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_EXPERIMENTAL=y\n# CONFIG_GCC_USE_VERSION_8 is not set\nCONFIG_GCC_USE_VERSION_9=y\nCONFIG_GCC_VERSION=\"9.3.0\"\nCONFIG_GCC_VERSION_9=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_KERNEL_ARM_PMU=y\n# CONFIG_KERNEL_CGROUPS is not set\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_HUGETLBFS=y\nCONFIG_KERNEL_HUGETLB_PAGE=y\n# CONFIG_KERNEL_NAMESPACES is not set\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_NO_SMB=\"!\"\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBCURL_WOLFSSL=y\nCONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_LINUX_5_10=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_ERROR_MESSAGES=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_MAC80211_DEBUGFS=y\nCONFIG_PACKAGE_MAC80211_MESH=y\nCONFIG_PACKAGE_adbyby=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_bind-client=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_boost=y\nCONFIG_PACKAGE_boost-date_time=y\nCONFIG_PACKAGE_boost-program_options=y\nCONFIG_PACKAGE_boost-system=y\nCONFIG_PACKAGE_ca-certificates=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils=y\nCONFIG_PACKAGE_coreutils-base64=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_ddns-scripts=y\nCONFIG_PACKAGE_ddns-scripts-cloudflare=y\nCONFIG_PACKAGE_ddns-scripts-services=y\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_default-settings=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsforwarder=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_etherwake=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip-full=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipset=y\nCONFIG_PACKAGE_ipt2socks=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-extra=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_iptables-mod-tproxy=y\nCONFIG_PACKAGE_i2c-tools=y\nCONFIG_PACKAGE_libi2c=y\nCONFIG_PACKAGE_kmod-i2c-algo-bit=y\nCONFIG_PACKAGE_kmod-i2c-core=y\nCONFIG_PACKAGE_kmod-i2c-gpio=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_jq=y\nCONFIG_PACKAGE_kmod-asn1-decoder=y\nCONFIG_PACKAGE_kmod-br-netfilter=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-aead=y\nCONFIG_PACKAGE_kmod-crypto-arc4=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-crc32=y\nCONFIG_PACKAGE_kmod-crypto-crc32c=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-hash=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-kpp=y\nCONFIG_PACKAGE_kmod-crypto-lib-blake2s=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y\nCONFIG_PACKAGE_kmod-crypto-lib-curve25519=y\nCONFIG_PACKAGE_kmod-crypto-lib-poly1305=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-null=y\nCONFIG_PACKAGE_kmod-crypto-pcompress=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-dax=y\nCONFIG_PACKAGE_kmod-dm=y\nCONFIG_PACKAGE_kmod-dummy=y\nCONFIG_PACKAGE_kmod-fs-antfs=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-ifb=y\nCONFIG_PACKAGE_kmod-ikconfig=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-extra=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-ipset=y\nCONFIG_PACKAGE_kmod-ipt-ipv4options=y\nCONFIG_PACKAGE_kmod-ipt-nat-extra=y\nCONFIG_PACKAGE_kmod-ipt-raw=y\nCONFIG_PACKAGE_kmod-ipt-tproxy=y\nCONFIG_PACKAGE_kmod-keys-encrypted=y\nCONFIG_PACKAGE_kmod-keys-trusted=y\nCONFIG_PACKAGE_kmod-lib-crc32c=y\nCONFIG_PACKAGE_kmod-lib-lzo=y\nCONFIG_PACKAGE_kmod-lib-raid6=y\nCONFIG_PACKAGE_kmod-lib-textsearch=y\nCONFIG_PACKAGE_kmod-lib-xor=y\nCONFIG_PACKAGE_kmod-lib-zlib-deflate=y\nCONFIG_PACKAGE_kmod-lib-zlib-inflate=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_PACKAGE_kmod-mac80211=y\nCONFIG_PACKAGE_kmod-mdio-devres=y\nCONFIG_PACKAGE_kmod-mt76-core=y\nCONFIG_PACKAGE_kmod-mt76-usb=y\nCONFIG_PACKAGE_kmod-mt7601u=y\nCONFIG_PACKAGE_kmod-mt76x02-common=y\nCONFIG_PACKAGE_kmod-mt76x02-usb=y\nCONFIG_PACKAGE_kmod-mt76x2-common=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-nf-nathelper=y\nCONFIG_PACKAGE_kmod-nf-nathelper-extra=y\nCONFIG_PACKAGE_kmod-nfnetlink=y\nCONFIG_PACKAGE_kmod-nft-bridge=m\nCONFIG_PACKAGE_kmod-nft-core=y\nCONFIG_PACKAGE_kmod-nft-nat=y\nCONFIG_PACKAGE_kmod-nft-offload=y\nCONFIG_PACKAGE_kmod-nls-cp437=y\nCONFIG_PACKAGE_kmod-nls-iso8859-1=y\nCONFIG_PACKAGE_kmod-nls-utf8=y\nCONFIG_PACKAGE_kmod-random-core=y\nCONFIG_PACKAGE_kmod-sched-cake=y\nCONFIG_PACKAGE_kmod-sched-core=y\nCONFIG_PACKAGE_kmod-scsi-core=y\nCONFIG_PACKAGE_kmod-sctp=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tpm=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_kmod-udptunnel4=y\nCONFIG_PACKAGE_kmod-udptunnel6=y\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-wireguard=y\nCONFIG_PACKAGE_libaio=y\nCONFIG_PACKAGE_libatomic=y\nCONFIG_PACKAGE_libbpf=y\nCONFIG_PACKAGE_libbsd=y\nCONFIG_PACKAGE_libbz2=y\nCONFIG_PACKAGE_libcap=y\nCONFIG_PACKAGE_libcap-bin=y\nCONFIG_PACKAGE_libcap-bin-capsh-shell=\"/bin/sh\"\nCONFIG_PACKAGE_libcap-ng=y\nCONFIG_PACKAGE_libcap-ng-bin=y\nCONFIG_PACKAGE_libcares=y\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libdb47=y\nCONFIG_PACKAGE_libelf=y\nCONFIG_PACKAGE_libev=y\nCONFIG_PACKAGE_libevdev=y\nCONFIG_PACKAGE_libevent2=y\nCONFIG_PACKAGE_libfdisk=y\nCONFIG_PACKAGE_libffi=y\nCONFIG_PACKAGE_libgdbm=y\nCONFIG_PACKAGE_libgmp=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libipset=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_liblzma=y\nCONFIG_PACKAGE_libmbedtls=y\nCONFIG_PACKAGE_libminiupnpc=y\nCONFIG_PACKAGE_libmnl=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libmsgpack-c=y\nCONFIG_PACKAGE_libnatpmp=y\nCONFIG_PACKAGE_libncurses=y\nCONFIG_PACKAGE_libnetfilter-conntrack=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libnettle=y\nCONFIG_PACKAGE_libnfnetlink=y\nCONFIG_PACKAGE_libnghttp2=y\nCONFIG_PACKAGE_libnss=y\nCONFIG_PACKAGE_libopenssl=y\nCONFIG_PACKAGE_libopenssl-conf=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpcap=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libpcre=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libruby=y\nCONFIG_PACKAGE_libsctp=y\nCONFIG_PACKAGE_libsodium=y\nCONFIG_PACKAGE_libsqlite3=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libstdcpp=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_libuci-lua=y\nCONFIG_PACKAGE_libudev-zero=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libuv=y\nCONFIG_PACKAGE_libwebsockets-full=y\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_libyaml=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adbyby-plus=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks is not set\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wireguard=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-base=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-proto-wireguard=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_microsocks=y\nCONFIG_PACKAGE_miniupnpd=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_mt7601u-firmware=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_musl-fts=y\nCONFIG_PACKAGE_naiveproxy=y\nCONFIG_PACKAGE_nspr=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_pdnsd-alt=y\nCONFIG_PACKAGE_python3=y\nCONFIG_PACKAGE_python3-asyncio=y\nCONFIG_PACKAGE_python3-base=y\nCONFIG_PACKAGE_python3-cgi=y\nCONFIG_PACKAGE_python3-cgitb=y\nCONFIG_PACKAGE_python3-codecs=y\nCONFIG_PACKAGE_python3-ctypes=y\nCONFIG_PACKAGE_python3-dbm=y\nCONFIG_PACKAGE_python3-decimal=y\nCONFIG_PACKAGE_python3-distutils=y\nCONFIG_PACKAGE_python3-email=y\nCONFIG_PACKAGE_python3-gdbm=y\nCONFIG_PACKAGE_python3-light=y\nCONFIG_PACKAGE_python3-logging=y\nCONFIG_PACKAGE_python3-lzma=y\nCONFIG_PACKAGE_python3-multiprocessing=y\nCONFIG_PACKAGE_python3-ncurses=y\nCONFIG_PACKAGE_python3-openssl=y\nCONFIG_PACKAGE_python3-pkg-resources=y\nCONFIG_PACKAGE_python3-pydoc=y\nCONFIG_PACKAGE_python3-sqlite3=y\nCONFIG_PACKAGE_python3-unittest=y\nCONFIG_PACKAGE_python3-urllib=y\nCONFIG_PACKAGE_python3-xml=y\nCONFIG_PACKAGE_redsocks2=y\nCONFIG_PACKAGE_resolveip=y\nCONFIG_PACKAGE_rpcd=y\nCONFIG_PACKAGE_rpcd-mod-file=y\nCONFIG_PACKAGE_rpcd-mod-iwinfo=y\nCONFIG_PACKAGE_rpcd-mod-luci=y\nCONFIG_PACKAGE_rpcd-mod-rrdns=y\nCONFIG_PACKAGE_ruby=y\nCONFIG_PACKAGE_ruby-bigdecimal=y\nCONFIG_PACKAGE_ruby-date=y\nCONFIG_PACKAGE_ruby-dbm=y\nCONFIG_PACKAGE_ruby-digest=y\nCONFIG_PACKAGE_ruby-enc=y\nCONFIG_PACKAGE_ruby-forwardable=y\nCONFIG_PACKAGE_ruby-pstore=y\nCONFIG_PACKAGE_ruby-psych=y\nCONFIG_PACKAGE_ruby-stringio=y\nCONFIG_PACKAGE_ruby-strscan=y\nCONFIG_PACKAGE_ruby-yaml=y\nCONFIG_PACKAGE_shadowsocks-rust-sslocal=y\nCONFIG_PACKAGE_shadowsocks-rust-ssmanager=y\nCONFIG_PACKAGE_shadowsocks-rust-ssserver=y\nCONFIG_PACKAGE_shadowsocks-rust-ssurl=y\nCONFIG_PACKAGE_shadowsocksr-libev-alt=y\nCONFIG_PACKAGE_shadowsocksr-libev-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_simple-obfs=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_sqm-scripts=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_stress-ng=y\nCONFIG_PACKAGE_tc=y\nCONFIG_PACKAGE_tcping=y\nCONFIG_PACKAGE_terminfo=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_trojan=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_uhttpd-mod-ubus=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbids=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_wireguard-tools=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\nCONFIG_PACKAGE_wrtbwmon=y\nCONFIG_PACKAGE_xray-core=y\nCONFIG_PACKAGE_yq=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_zlib=y\nCONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y\nCONFIG_SQLITE3_FTS3=y\nCONFIG_SQLITE3_FTS4=y\nCONFIG_SQLITE3_FTS5=y\nCONFIG_SQLITE3_JSON1=y\nCONFIG_SQLITE3_RTREE=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_OPTIONS=y\nCONFIG_TARGET_ROOTFS_PARTSIZE=1024\nCONFIG_TESTING_KERNEL=y\nCONFIG_WPA_MSG_MIN_PRIORITY=3\nCONFIG_boost-compile-visibility-hidden=y\nCONFIG_boost-runtime-shared=y\nCONFIG_boost-static-and-shared-libs=y\nCONFIG_boost-variant-release=y\n"
  },
  {
    "path": "seed/r2s.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_DEVEL=y\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_WIDTH=y\nCONFIG_BUSYBOX_CONFIG_TELNET=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_EXPERIMENTAL=y\nCONFIG_EXTRA_OPTIMIZATION=\"-fno-caller-saves -fno-plt -ftree-vectorize\"\nCONFIG_GNUTLS_ALPN=y\nCONFIG_GNUTLS_ANON=y\nCONFIG_GNUTLS_DTLS_SRTP=y\nCONFIG_GNUTLS_HEARTBEAT=y\nCONFIG_GNUTLS_OCSP=y\nCONFIG_GNUTLS_PSK=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_IMAGEOPT=y\nCONFIG_KERNEL_ARM_PMU=y\nCONFIG_KERNEL_BTRFS_FS_POSIX_ACL=y\nCONFIG_KERNEL_BUILD_DOMAIN=\"buildhost\"\nCONFIG_KERNEL_BUILD_USER=\"builder\"\n# CONFIG_KERNEL_CGROUPS is not set\nCONFIG_KERNEL_FS_POSIX_ACL=y\n# CONFIG_KERNEL_NAMESPACES is not set\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_NO_SMB=\"!\"\nCONFIG_LIBCURL_OPENSSL=y\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_MAC80211_DEBUGFS=y\nCONFIG_PACKAGE_MAC80211_MESH=y\nCONFIG_PACKAGE_acme=y\nCONFIG_PACKAGE_acme-dnsapi=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_boost=y\nCONFIG_PACKAGE_boost-date_time=y\nCONFIG_PACKAGE_boost-program_options=y\nCONFIG_PACKAGE_boost-system=y\nCONFIG_PACKAGE_ca-certificates=y\nCONFIG_PACKAGE_certtool=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_cifsmount=y\nCONFIG_PACKAGE_collectd=y\nCONFIG_PACKAGE_collectd-mod-cpu=y\nCONFIG_PACKAGE_collectd-mod-interface=y\nCONFIG_PACKAGE_collectd-mod-iwinfo=y\nCONFIG_PACKAGE_collectd-mod-load=y\nCONFIG_PACKAGE_collectd-mod-memory=y\nCONFIG_PACKAGE_collectd-mod-network=y\nCONFIG_PACKAGE_collectd-mod-rrdtool=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils=y\nCONFIG_PACKAGE_coreutils-base64=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_ddns-scripts=y\nCONFIG_PACKAGE_ddns-scripts-cloudflare=y\nCONFIG_PACKAGE_ddns-scripts-services=y\nCONFIG_PACKAGE_default-settings=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsforwarder=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_gzip=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_i2c-tools=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip-full=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipset=y\nCONFIG_PACKAGE_ipt2socks=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-extra=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_iptables-mod-tproxy=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_jq=m\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-aead=y\nCONFIG_PACKAGE_kmod-crypto-arc4=y\nCONFIG_PACKAGE_kmod-crypto-authenc=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-crc32=y\nCONFIG_PACKAGE_kmod-crypto-crc32c=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-gf128=y\nCONFIG_PACKAGE_kmod-crypto-hash=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-null=y\nCONFIG_PACKAGE_kmod-crypto-pcompress=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-user=y\nCONFIG_PACKAGE_kmod-crypto-xcbc=y\nCONFIG_PACKAGE_kmod-crypto-xts=y\nCONFIG_PACKAGE_kmod-cryptodev=y\nCONFIG_PACKAGE_kmod-fast-classifier=y\nCONFIG_PACKAGE_kmod-fs-antfs=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-ext4=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-ifb=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-extra=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-ipset=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-ipt-raw=y\nCONFIG_PACKAGE_kmod-ipt-tproxy=y\nCONFIG_PACKAGE_kmod-lib-crc16=y\nCONFIG_PACKAGE_kmod-lib-crc32c=y\nCONFIG_PACKAGE_kmod-lib-lzo=y\nCONFIG_PACKAGE_kmod-lib-raid6=y\nCONFIG_PACKAGE_kmod-lib-xor=y\nCONFIG_PACKAGE_kmod-lib-zlib-deflate=y\nCONFIG_PACKAGE_kmod-lib-zlib-inflate=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_PACKAGE_kmod-libphy=y\nCONFIG_PACKAGE_kmod-mac80211=y\nCONFIG_PACKAGE_kmod-mt76-core=y\nCONFIG_PACKAGE_kmod-mt76-usb=y\nCONFIG_PACKAGE_kmod-mt7601u-ap=y\nCONFIG_PACKAGE_kmod-mt76x02-common=y\nCONFIG_PACKAGE_kmod-mt76x02-usb=y\nCONFIG_PACKAGE_kmod-mt76x2-common=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-nfnetlink=y\nCONFIG_PACKAGE_kmod-nls-cp437=y\nCONFIG_PACKAGE_kmod-nls-iso8859-1=y\nCONFIG_PACKAGE_kmod-nls-utf8=y\nCONFIG_PACKAGE_kmod-rtl8812au-ac=y\nCONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-rtl88x2bu=y\nCONFIG_PACKAGE_kmod-sched-cake=y\nCONFIG_PACKAGE_kmod-sched-core=y\nCONFIG_PACKAGE_kmod-scsi-core=y\nCONFIG_PACKAGE_kmod-sctp=y\nCONFIG_PACKAGE_kmod-shortcut-fe=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_kmod-udptunnel4=y\nCONFIG_PACKAGE_kmod-udptunnel6=y\nCONFIG_PACKAGE_kmod-usb-ehci=y\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-ohci=y\nCONFIG_PACKAGE_kmod-usb-ohci-pci=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-usb-uhci=y\nCONFIG_PACKAGE_kmod-usb2=y\nCONFIG_PACKAGE_kmod-usb3=y\nCONFIG_PACKAGE_kmod-wireguard=y\nCONFIG_PACKAGE_libaio=y\nCONFIG_PACKAGE_libatomic=y\nCONFIG_PACKAGE_libbsd=y\nCONFIG_PACKAGE_libcap=y\nCONFIG_PACKAGE_libcap-ng=y\nCONFIG_PACKAGE_libcares=y\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libelf=y\nCONFIG_PACKAGE_libev=y\nCONFIG_PACKAGE_libevdev=y\nCONFIG_PACKAGE_libevent2=y\nCONFIG_PACKAGE_libfdisk=y\nCONFIG_PACKAGE_libgmp=y\nCONFIG_PACKAGE_libgnutls=y\nCONFIG_PACKAGE_libhttp-parser=y\nCONFIG_PACKAGE_libi2c=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libipset=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_libltdl=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_libmbedtls=y\nCONFIG_PACKAGE_libminiupnpc=y\nCONFIG_PACKAGE_libmnl=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libmsgpack-c=y\nCONFIG_PACKAGE_libnatpmp=y\nCONFIG_PACKAGE_libncurses=y\nCONFIG_PACKAGE_libnetfilter-conntrack=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libnettle=y\nCONFIG_PACKAGE_libnfnetlink=y\nCONFIG_PACKAGE_libnss=y\nCONFIG_PACKAGE_libopenssl=y\nCONFIG_PACKAGE_libopenssl-afalg=y\nCONFIG_PACKAGE_libopenssl-conf=y\nCONFIG_PACKAGE_libopenssl-devcrypto=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpcap=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libpcre=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libprotobuf-c=y\nCONFIG_PACKAGE_libreadline=y\nCONFIG_PACKAGE_librrd1=y\nCONFIG_PACKAGE_libsctp=y\nCONFIG_PACKAGE_libsodium=y\nCONFIG_PACKAGE_libsqlite3=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libstdcpp=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_libuci-lua=y\nCONFIG_PACKAGE_libudev-zero=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libustream-openssl=y\n# CONFIG_PACKAGE_libustream-wolfssl is not set\nCONFIG_PACKAGE_libuv=y\nCONFIG_PACKAGE_libwebsockets-full=y\n# CONFIG_PACKAGE_libwolfssl is not set\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_losetup=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-acme=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-oled=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-statistics=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-turboacc=y\nCONFIG_PACKAGE_luci-app-turboacc_INCLUDE_dnsforwarder=y\nCONFIG_PACKAGE_luci-app-turboacc_INCLUDE_shortcut-fe=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wireguard=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-base=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-proto-wireguard=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_microsocks=y\nCONFIG_PACKAGE_miniupnpd=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_naiveproxy=y\nCONFIG_PACKAGE_nmap=y\nCONFIG_PACKAGE_nspr=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_pdnsd-alt=y\nCONFIG_PACKAGE_resolveip=y\nCONFIG_PACKAGE_rpcd=y\nCONFIG_PACKAGE_rpcd-mod-file=y\nCONFIG_PACKAGE_rpcd-mod-iwinfo=y\nCONFIG_PACKAGE_rpcd-mod-luci=y\nCONFIG_PACKAGE_rpcd-mod-rrdns=y\nCONFIG_PACKAGE_rrdtool1=y\nCONFIG_PACKAGE_rtl8192cu-firmware=y\nCONFIG_PACKAGE_shadowsocks-libev-config=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-local=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-redir=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-alt=y\nCONFIG_PACKAGE_shadowsocksr-libev-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_simple-obfs=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_sqm-scripts=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_stress-ng=y\nCONFIG_PACKAGE_tc=y\nCONFIG_PACKAGE_tcping=y\nCONFIG_PACKAGE_terminfo=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_trojan=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_uclibcxx=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_uhttpd-mod-ubus=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbids=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_wireguard-tools=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wrtbwmon=y\nCONFIG_PACKAGE_xray-core=y\nCONFIG_PACKAGE_yq=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_zlib=y\nCONFIG_PREINITOPT=y\nCONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y\nCONFIG_SQLITE3_FTS3=y\nCONFIG_SQLITE3_FTS4=y\nCONFIG_SQLITE3_FTS5=y\nCONFIG_SQLITE3_JSON1=y\nCONFIG_SQLITE3_RTREE=y\n# CONFIG_TARGET_IMAGES_GZIP is not set\nCONFIG_TARGET_KERNEL_PARTSIZE=30\nCONFIG_TARGET_ROOTFS_PARTSIZE=1024\nCONFIG_WPA_MSG_MIN_PRIORITY=3\nCONFIG_boost-compile-visibility-hidden=y\nCONFIG_boost-runtime-shared=y\nCONFIG_boost-static-and-shared-libs=y\nCONFIG_boost-variant-release=y\n# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set\n"
  },
  {
    "path": "seed/r4s.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r4s=y\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_WIDTH=y\nCONFIG_BUSYBOX_CONFIG_TELNET=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_EXPERIMENTAL=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_KERNEL_ARM_PMU=y\n# CONFIG_KERNEL_CGROUPS is not set\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_HUGETLBFS=y\nCONFIG_KERNEL_HUGETLB_PAGE=y\n# CONFIG_KERNEL_NAMESPACES is not set\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_NO_SMB=\"!\"\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBCURL_WOLFSSL=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_ERROR_MESSAGES=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_MAC80211_DEBUGFS=y\nCONFIG_PACKAGE_MAC80211_MESH=y\nCONFIG_PACKAGE_adbyby=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_bind-client=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_boost=y\nCONFIG_PACKAGE_boost-date_time=y\nCONFIG_PACKAGE_boost-program_options=y\nCONFIG_PACKAGE_boost-system=y\nCONFIG_PACKAGE_ca-certificates=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils=y\nCONFIG_PACKAGE_coreutils-base64=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_ddns-scripts=y\nCONFIG_PACKAGE_ddns-scripts-cloudflare=y\nCONFIG_PACKAGE_ddns-scripts-services=y\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_ddns-scripts_dnspod=y\nCONFIG_PACKAGE_default-settings=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsforwarder=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_etherwake=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_fdisk=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip-full=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipset=y\nCONFIG_PACKAGE_ipt2socks=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-extra=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_iptables-mod-tproxy=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_jq=y\nCONFIG_PACKAGE_kmod-asn1-decoder=y\nCONFIG_PACKAGE_kmod-br-netfilter=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-aead=y\nCONFIG_PACKAGE_kmod-crypto-arc4=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-crc32=y\nCONFIG_PACKAGE_kmod-crypto-crc32c=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-hash=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-null=y\nCONFIG_PACKAGE_kmod-crypto-pcompress=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-dax=y\nCONFIG_PACKAGE_kmod-dm=y\nCONFIG_PACKAGE_kmod-dummy=y\nCONFIG_PACKAGE_kmod-fast-classifier=y\nCONFIG_PACKAGE_kmod-fs-antfs=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-ifb=y\nCONFIG_PACKAGE_kmod-ikconfig=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-extra=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-ipset=y\nCONFIG_PACKAGE_kmod-ipt-ipv4options=y\nCONFIG_PACKAGE_kmod-ipt-nat-extra=y\nCONFIG_PACKAGE_kmod-ipt-raw=y\nCONFIG_PACKAGE_kmod-ipt-tproxy=y\nCONFIG_PACKAGE_kmod-lib-crc32c=y\nCONFIG_PACKAGE_kmod-lib-lzo=y\nCONFIG_PACKAGE_kmod-lib-raid6=y\nCONFIG_PACKAGE_kmod-lib-textsearch=y\nCONFIG_PACKAGE_kmod-lib-xor=y\nCONFIG_PACKAGE_kmod-lib-zlib-deflate=y\nCONFIG_PACKAGE_kmod-lib-zlib-inflate=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_PACKAGE_kmod-libphy=y\nCONFIG_PACKAGE_kmod-mac80211=y\nCONFIG_PACKAGE_kmod-mii=y\nCONFIG_PACKAGE_kmod-mt76-core=y\nCONFIG_PACKAGE_kmod-mt76-usb=y\nCONFIG_PACKAGE_kmod-mt7601u-ap=y\nCONFIG_PACKAGE_kmod-mt76x02-common=y\nCONFIG_PACKAGE_kmod-mt76x02-usb=y\nCONFIG_PACKAGE_kmod-mt76x2-common=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-nf-nathelper=y\nCONFIG_PACKAGE_kmod-nf-nathelper-extra=y\nCONFIG_PACKAGE_kmod-nfnetlink=y\nCONFIG_PACKAGE_kmod-nft-bridge=m\nCONFIG_PACKAGE_kmod-nft-core=y\nCONFIG_PACKAGE_kmod-nft-nat=y\nCONFIG_PACKAGE_kmod-nft-offload=y\nCONFIG_PACKAGE_kmod-nls-base=y\nCONFIG_PACKAGE_kmod-nls-cp437=y\nCONFIG_PACKAGE_kmod-nls-iso8859-1=y\nCONFIG_PACKAGE_kmod-nls-utf8=y\nCONFIG_PACKAGE_kmod-rtl8192c-common=y\nCONFIG_PACKAGE_kmod-rtl8192cu=y\nCONFIG_PACKAGE_kmod-rtl8812au-ac=y\nCONFIG_PACKAGE_kmod-rtl8821cu=y\nCONFIG_PACKAGE_kmod-rtlwifi=y\nCONFIG_PACKAGE_kmod-rtlwifi-usb=y\nCONFIG_PACKAGE_kmod-sched-cake=y\nCONFIG_PACKAGE_kmod-sched-core=y\nCONFIG_PACKAGE_kmod-scsi-core=y\nCONFIG_PACKAGE_kmod-sctp=y\nCONFIG_PACKAGE_kmod-shortcut-fe=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_kmod-udptunnel4=y\nCONFIG_PACKAGE_kmod-udptunnel6=y\nCONFIG_PACKAGE_kmod-usb-core=y\nCONFIG_PACKAGE_kmod-usb-net=y\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-wireguard=y\nCONFIG_PACKAGE_libaio=y\nCONFIG_PACKAGE_libatomic=y\nCONFIG_PACKAGE_libbsd=y\nCONFIG_PACKAGE_libbz2=y\nCONFIG_PACKAGE_libcap=y\nCONFIG_PACKAGE_libcap-bin=y\nCONFIG_PACKAGE_libcap-bin-capsh-shell=\"/bin/sh\"\nCONFIG_PACKAGE_libcap-ng=y\nCONFIG_PACKAGE_libcap-ng-bin=y\nCONFIG_PACKAGE_libcares=y\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libdb47=y\nCONFIG_PACKAGE_libelf=y\nCONFIG_PACKAGE_libev=y\nCONFIG_PACKAGE_libevdev=y\nCONFIG_PACKAGE_libevent2=y\nCONFIG_PACKAGE_libfdisk=y\nCONFIG_PACKAGE_libffi=y\nCONFIG_PACKAGE_libgdbm=y\nCONFIG_PACKAGE_libgmp=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libipset=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_liblzma=y\nCONFIG_PACKAGE_libmbedtls=y\nCONFIG_PACKAGE_libminiupnpc=y\nCONFIG_PACKAGE_libmnl=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libmsgpack-c=y\nCONFIG_PACKAGE_libnatpmp=y\nCONFIG_PACKAGE_libncurses=y\nCONFIG_PACKAGE_libnetfilter-conntrack=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libnettle=y\nCONFIG_PACKAGE_libnfnetlink=y\nCONFIG_PACKAGE_libnss=y\nCONFIG_PACKAGE_libopenssl=y\nCONFIG_PACKAGE_libopenssl-conf=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpcap=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libpcre=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libruby=y\nCONFIG_PACKAGE_libsctp=y\nCONFIG_PACKAGE_libsodium=y\nCONFIG_PACKAGE_libsqlite3=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libstdcpp=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_libuci-lua=y\nCONFIG_PACKAGE_libudev-zero=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libuv=y\nCONFIG_PACKAGE_libwebsockets-full=y\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_libyaml=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adbyby-plus=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-turboacc=y\nCONFIG_PACKAGE_luci-app-turboacc_INCLUDE_dnsforwarder=y\nCONFIG_PACKAGE_luci-app-turboacc_INCLUDE_shortcut-fe=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wireguard=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-base=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-proto-wireguard=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_microsocks=y\nCONFIG_PACKAGE_miniupnpd=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_musl-fts=y\nCONFIG_PACKAGE_naiveproxy=y\nCONFIG_PACKAGE_nspr=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_pdnsd-alt=y\nCONFIG_PACKAGE_python3=y\nCONFIG_PACKAGE_python3-asyncio=y\nCONFIG_PACKAGE_python3-base=y\nCONFIG_PACKAGE_python3-cgi=y\nCONFIG_PACKAGE_python3-cgitb=y\nCONFIG_PACKAGE_python3-codecs=y\nCONFIG_PACKAGE_python3-ctypes=y\nCONFIG_PACKAGE_python3-dbm=y\nCONFIG_PACKAGE_python3-decimal=y\nCONFIG_PACKAGE_python3-distutils=y\nCONFIG_PACKAGE_python3-email=y\nCONFIG_PACKAGE_python3-gdbm=y\nCONFIG_PACKAGE_python3-light=y\nCONFIG_PACKAGE_python3-logging=y\nCONFIG_PACKAGE_python3-lzma=y\nCONFIG_PACKAGE_python3-multiprocessing=y\nCONFIG_PACKAGE_python3-ncurses=y\nCONFIG_PACKAGE_python3-openssl=y\nCONFIG_PACKAGE_python3-pkg-resources=y\nCONFIG_PACKAGE_python3-pydoc=y\nCONFIG_PACKAGE_python3-sqlite3=y\nCONFIG_PACKAGE_python3-unittest=y\nCONFIG_PACKAGE_python3-urllib=y\nCONFIG_PACKAGE_python3-xml=y\nCONFIG_PACKAGE_resolveip=y\nCONFIG_PACKAGE_rpcd=y\nCONFIG_PACKAGE_rpcd-mod-file=y\nCONFIG_PACKAGE_rpcd-mod-iwinfo=y\nCONFIG_PACKAGE_rpcd-mod-luci=y\nCONFIG_PACKAGE_rpcd-mod-rrdns=y\nCONFIG_PACKAGE_rtl8192cu-firmware=y\nCONFIG_PACKAGE_ruby=y\nCONFIG_PACKAGE_ruby-bigdecimal=y\nCONFIG_PACKAGE_ruby-date=y\nCONFIG_PACKAGE_ruby-dbm=y\nCONFIG_PACKAGE_ruby-digest=y\nCONFIG_PACKAGE_ruby-enc=y\nCONFIG_PACKAGE_ruby-pstore=y\nCONFIG_PACKAGE_ruby-psych=y\nCONFIG_PACKAGE_ruby-stringio=y\nCONFIG_PACKAGE_ruby-strscan=y\nCONFIG_PACKAGE_ruby-yaml=y\nCONFIG_PACKAGE_shadowsocks-libev-config=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-local=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-redir=y\nCONFIG_PACKAGE_shadowsocks-libev-ss-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-alt=y\nCONFIG_PACKAGE_shadowsocksr-libev-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_simple-obfs=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_sqm-scripts=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_stress-ng=y\nCONFIG_PACKAGE_tc=y\nCONFIG_PACKAGE_tcping=y\nCONFIG_PACKAGE_terminfo=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_trojan=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_uhttpd-mod-ubus=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbids=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_wireguard-tools=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad=y\nCONFIG_PACKAGE_wrtbwmon=y\nCONFIG_PACKAGE_xray-core=y\nCONFIG_PACKAGE_yq=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_zlib=y\nCONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y\nCONFIG_SQLITE3_FTS3=y\nCONFIG_SQLITE3_FTS4=y\nCONFIG_SQLITE3_FTS5=y\nCONFIG_SQLITE3_JSON1=y\nCONFIG_SQLITE3_RTREE=y\nCONFIG_TARGET_KERNEL_PARTSIZE=30\nCONFIG_TARGET_ROOTFS_PARTSIZE=1024\nCONFIG_WPA_MSG_MIN_PRIORITY=3\nCONFIG_boost-compile-visibility-hidden=y\nCONFIG_boost-runtime-shared=y\nCONFIG_boost-static-and-shared-libs=y\nCONFIG_boost-variant-release=y\n"
  },
  {
    "path": "seed/rockchip.seed",
    "content": "CONFIG_TARGET_rockchip=y\nCONFIG_TARGET_rockchip_armv8=y\nCONFIG_TARGET_MULTI_PROFILE=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_friendlyarm_nanopi-r4s=y\nCONFIG_TARGET_DEVICE_rockchip_armv8_DEVICE_xunlong_orangepi-r1-plus=y\nCONFIG_DEVEL=y\nCONFIG_TOOLCHAINOPTS=y\nCONFIG_BUSYBOX_CUSTOM=y\nCONFIG_BUSYBOX_CONFIG_ARP=y\nCONFIG_BUSYBOX_CONFIG_ARPING=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE=y\nCONFIG_BUSYBOX_CONFIG_FEATURE_TELNET_WIDTH=y\nCONFIG_BUSYBOX_CONFIG_TELNET=y\nCONFIG_COREMARK_ENABLE_MULTITHREADING=y\nCONFIG_COREMARK_NUMBER_OF_THREADS=16\nCONFIG_COREMARK_OPTIMIZE_O3=y\nCONFIG_DRIVER_11AC_SUPPORT=y\nCONFIG_DRIVER_11N_SUPPORT=y\nCONFIG_EXPERIMENTAL=y\n# CONFIG_GCC_USE_VERSION_8 is not set\nCONFIG_GCC_USE_VERSION_9=y\nCONFIG_GCC_VERSION=\"9.3.0\"\nCONFIG_GCC_VERSION_9=y\nCONFIG_IFSTAT_SNMP=y\nCONFIG_KERNEL_ARM_PMU=y\n# CONFIG_KERNEL_CGROUPS is not set\nCONFIG_KERNEL_FS_POSIX_ACL=y\nCONFIG_KERNEL_HUGETLBFS=y\nCONFIG_KERNEL_HUGETLB_PAGE=y\n# CONFIG_KERNEL_NAMESPACES is not set\nCONFIG_KERNEL_PERF_EVENTS=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE=y\nCONFIG_KERNEL_TRANSPARENT_HUGEPAGE_ALWAYS=y\nCONFIG_LIBCURL_COOKIES=y\nCONFIG_LIBCURL_FILE=y\nCONFIG_LIBCURL_FTP=y\nCONFIG_LIBCURL_HTTP=y\nCONFIG_LIBCURL_NO_SMB=\"!\"\nCONFIG_LIBCURL_PROXY=y\nCONFIG_LIBCURL_WOLFSSL=y\nCONFIG_LIBMBEDTLS_HAVE_ARMV8CE_AES=y\nCONFIG_LIBSODIUM_MINIMAL=y\nCONFIG_LINUX_5_10=y\nCONFIG_OPENSSL_ENGINE=y\nCONFIG_OPENSSL_OPTIMIZE_SPEED=y\nCONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y\nCONFIG_OPENSSL_WITH_ASM=y\nCONFIG_OPENSSL_WITH_CHACHA_POLY1305=y\nCONFIG_OPENSSL_WITH_CMS=y\nCONFIG_OPENSSL_WITH_DEPRECATED=y\nCONFIG_OPENSSL_WITH_ERROR_MESSAGES=y\nCONFIG_OPENSSL_WITH_PSK=y\nCONFIG_OPENSSL_WITH_SRP=y\nCONFIG_OPENSSL_WITH_TLS13=y\nCONFIG_PACKAGE_MAC80211_DEBUGFS=y\nCONFIG_PACKAGE_MAC80211_MESH=y\nCONFIG_PACKAGE_adbyby=y\nCONFIG_PACKAGE_autocore-arm=y\nCONFIG_PACKAGE_bind-client=y\nCONFIG_PACKAGE_bind-dig=y\nCONFIG_PACKAGE_bind-libs=y\nCONFIG_PACKAGE_blkid=y\nCONFIG_PACKAGE_block-mount=y\nCONFIG_PACKAGE_boost=y\nCONFIG_PACKAGE_boost-date_time=y\nCONFIG_PACKAGE_boost-program_options=y\nCONFIG_PACKAGE_boost-system=y\nCONFIG_PACKAGE_ca-certificates=y\nCONFIG_PACKAGE_cfdisk=y\nCONFIG_PACKAGE_cgi-io=y\nCONFIG_PACKAGE_coremark=y\nCONFIG_PACKAGE_coreutils=y\nCONFIG_PACKAGE_coreutils-base64=y\nCONFIG_PACKAGE_coreutils-nohup=y\nCONFIG_PACKAGE_curl=y\nCONFIG_PACKAGE_ddns-scripts=y\nCONFIG_PACKAGE_ddns-scripts-cloudflare=y\nCONFIG_PACKAGE_ddns-scripts-services=y\nCONFIG_PACKAGE_ddns-scripts_aliyun=y\nCONFIG_PACKAGE_default-settings=y\nCONFIG_PACKAGE_dns2socks=y\nCONFIG_PACKAGE_dnsforwarder=y\n# CONFIG_PACKAGE_dnsmasq is not set\nCONFIG_PACKAGE_dnsmasq-full=y\nCONFIG_PACKAGE_dnsmasq_full_auth=y\nCONFIG_PACKAGE_dnsmasq_full_conntrack=y\nCONFIG_PACKAGE_dnsmasq_full_dhcp=y\nCONFIG_PACKAGE_dnsmasq_full_dhcpv6=y\nCONFIG_PACKAGE_dnsmasq_full_dnssec=y\nCONFIG_PACKAGE_dnsmasq_full_ipset=y\nCONFIG_PACKAGE_dnsmasq_full_noid=y\nCONFIG_PACKAGE_dnsmasq_full_tftp=y\nCONFIG_PACKAGE_etherwake=y\nCONFIG_PACKAGE_ethtool=y\nCONFIG_PACKAGE_frpc=y\nCONFIG_PACKAGE_frps=y\nCONFIG_PACKAGE_gost=y\nCONFIG_PACKAGE_hostapd-common=y\nCONFIG_PACKAGE_htop=y\nCONFIG_PACKAGE_i2c-tools=y\nCONFIG_PACKAGE_ifstat=y\nCONFIG_PACKAGE_iftop=y\nCONFIG_PACKAGE_ip-full=y\nCONFIG_PACKAGE_iperf3=y\nCONFIG_PACKAGE_ipset=y\nCONFIG_PACKAGE_ipt2socks=y\nCONFIG_PACKAGE_iptables-mod-conntrack-extra=y\nCONFIG_PACKAGE_iptables-mod-extra=y\nCONFIG_PACKAGE_iptables-mod-fullconenat=y\nCONFIG_PACKAGE_iptables-mod-ipopt=y\nCONFIG_PACKAGE_iptables-mod-tproxy=y\nCONFIG_PACKAGE_iw=y\nCONFIG_PACKAGE_iwinfo=y\nCONFIG_PACKAGE_jq=y\nCONFIG_PACKAGE_kmod-asn1-decoder=y\nCONFIG_PACKAGE_kmod-br-netfilter=y\nCONFIG_PACKAGE_kmod-cfg80211=y\nCONFIG_PACKAGE_kmod-crypto-acompress=y\nCONFIG_PACKAGE_kmod-crypto-aead=y\nCONFIG_PACKAGE_kmod-crypto-arc4=y\nCONFIG_PACKAGE_kmod-crypto-cbc=y\nCONFIG_PACKAGE_kmod-crypto-ccm=y\nCONFIG_PACKAGE_kmod-crypto-cmac=y\nCONFIG_PACKAGE_kmod-crypto-crc32=y\nCONFIG_PACKAGE_kmod-crypto-crc32c=y\nCONFIG_PACKAGE_kmod-crypto-ctr=y\nCONFIG_PACKAGE_kmod-crypto-des=y\nCONFIG_PACKAGE_kmod-crypto-ecb=y\nCONFIG_PACKAGE_kmod-crypto-hash=y\nCONFIG_PACKAGE_kmod-crypto-hmac=y\nCONFIG_PACKAGE_kmod-crypto-kpp=y\nCONFIG_PACKAGE_kmod-crypto-lib-blake2s=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20=y\nCONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y\nCONFIG_PACKAGE_kmod-crypto-lib-curve25519=y\nCONFIG_PACKAGE_kmod-crypto-lib-poly1305=y\nCONFIG_PACKAGE_kmod-crypto-manager=y\nCONFIG_PACKAGE_kmod-crypto-md4=y\nCONFIG_PACKAGE_kmod-crypto-md5=y\nCONFIG_PACKAGE_kmod-crypto-null=y\nCONFIG_PACKAGE_kmod-crypto-pcompress=y\nCONFIG_PACKAGE_kmod-crypto-rng=y\nCONFIG_PACKAGE_kmod-crypto-seqiv=y\nCONFIG_PACKAGE_kmod-crypto-sha1=y\nCONFIG_PACKAGE_kmod-crypto-sha256=y\nCONFIG_PACKAGE_kmod-crypto-sha512=y\nCONFIG_PACKAGE_kmod-crypto-user=y\nCONFIG_PACKAGE_kmod-dax=y\nCONFIG_PACKAGE_kmod-dm=y\nCONFIG_PACKAGE_kmod-dummy=y\nCONFIG_PACKAGE_kmod-fs-antfs=y\nCONFIG_PACKAGE_kmod-fs-btrfs=y\nCONFIG_PACKAGE_kmod-fs-cifs=y\nCONFIG_PACKAGE_kmod-fs-f2fs=y\nCONFIG_PACKAGE_kmod-fs-msdos=y\nCONFIG_PACKAGE_kmod-fs-squashfs=y\nCONFIG_PACKAGE_kmod-fs-vfat=y\nCONFIG_PACKAGE_kmod-i2c-algo-bit=y\nCONFIG_PACKAGE_kmod-i2c-core=y\nCONFIG_PACKAGE_kmod-i2c-gpio=y\nCONFIG_PACKAGE_kmod-ifb=y\nCONFIG_PACKAGE_kmod-ikconfig=y\nCONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\nCONFIG_PACKAGE_kmod-ipt-extra=y\nCONFIG_PACKAGE_kmod-ipt-fullconenat=y\nCONFIG_PACKAGE_kmod-ipt-ipopt=y\nCONFIG_PACKAGE_kmod-ipt-ipset=y\nCONFIG_PACKAGE_kmod-ipt-ipv4options=y\nCONFIG_PACKAGE_kmod-ipt-nat-extra=y\nCONFIG_PACKAGE_kmod-ipt-nat6=y\nCONFIG_PACKAGE_kmod-ipt-raw=y\nCONFIG_PACKAGE_kmod-ipt-tproxy=y\nCONFIG_PACKAGE_kmod-iptunnel=y\nCONFIG_PACKAGE_kmod-keys-encrypted=y\nCONFIG_PACKAGE_kmod-keys-trusted=y\nCONFIG_PACKAGE_kmod-lib-crc32c=y\nCONFIG_PACKAGE_kmod-lib-lzo=y\nCONFIG_PACKAGE_kmod-lib-raid6=y\nCONFIG_PACKAGE_kmod-lib-textsearch=y\nCONFIG_PACKAGE_kmod-lib-xor=y\nCONFIG_PACKAGE_kmod-lib-zlib-deflate=y\nCONFIG_PACKAGE_kmod-lib-zlib-inflate=y\nCONFIG_PACKAGE_kmod-lib-zstd=y\nCONFIG_PACKAGE_kmod-libphy=y\nCONFIG_PACKAGE_kmod-mac80211=y\nCONFIG_PACKAGE_kmod-mpls=y\nCONFIG_PACKAGE_kmod-mt76-core=y\nCONFIG_PACKAGE_kmod-mt76-usb=y\nCONFIG_PACKAGE_kmod-mt7601u=y\nCONFIG_PACKAGE_kmod-mt76x02-common=y\nCONFIG_PACKAGE_kmod-mt76x02-usb=y\nCONFIG_PACKAGE_kmod-mt76x2-common=y\nCONFIG_PACKAGE_kmod-mt76x2u=y\nCONFIG_PACKAGE_kmod-nat46=y\nCONFIG_PACKAGE_kmod-netlink-diag=y\nCONFIG_PACKAGE_kmod-nf-conntrack-netlink=y\nCONFIG_PACKAGE_kmod-nf-nat6=y\nCONFIG_PACKAGE_kmod-nf-nathelper=y\nCONFIG_PACKAGE_kmod-nf-nathelper-extra=y\nCONFIG_PACKAGE_kmod-nfnetlink=y\nCONFIG_PACKAGE_kmod-nft-bridge=m\nCONFIG_PACKAGE_kmod-nft-core=y\nCONFIG_PACKAGE_kmod-nft-nat=y\nCONFIG_PACKAGE_kmod-nft-offload=y\nCONFIG_PACKAGE_kmod-nls-cp437=y\nCONFIG_PACKAGE_kmod-nls-iso8859-1=y\nCONFIG_PACKAGE_kmod-nls-utf8=y\nCONFIG_PACKAGE_kmod-random-core=y\nCONFIG_PACKAGE_kmod-sched-cake=y\nCONFIG_PACKAGE_kmod-sched-core=y\nCONFIG_PACKAGE_kmod-scsi-core=y\nCONFIG_PACKAGE_kmod-sctp=y\nCONFIG_PACKAGE_kmod-tcp-bbr=y\nCONFIG_PACKAGE_kmod-tpm=y\nCONFIG_PACKAGE_kmod-tun=y\nCONFIG_PACKAGE_kmod-udptunnel4=y\nCONFIG_PACKAGE_kmod-udptunnel6=y\nCONFIG_PACKAGE_kmod-usb-net-asix=y\nCONFIG_PACKAGE_kmod-usb-net-asix-ax88179=y\nCONFIG_PACKAGE_kmod-usb-net-cdc-ether=y\nCONFIG_PACKAGE_kmod-usb-net-ipheth=y\nCONFIG_PACKAGE_kmod-usb-net-rndis=y\nCONFIG_PACKAGE_kmod-usb-net-rtl8150=y\nCONFIG_PACKAGE_kmod-usb-storage=y\nCONFIG_PACKAGE_kmod-usb-storage-extras=y\nCONFIG_PACKAGE_kmod-usb-storage-uas=y\nCONFIG_PACKAGE_kmod-vxlan=y\nCONFIG_PACKAGE_kmod-wireguard=y\nCONFIG_PACKAGE_libaio=y\nCONFIG_PACKAGE_libatomic=y\nCONFIG_PACKAGE_libbpf=y\nCONFIG_PACKAGE_libbsd=y\nCONFIG_PACKAGE_libbz2=y\nCONFIG_PACKAGE_libcap=y\nCONFIG_PACKAGE_libcap-bin=y\nCONFIG_PACKAGE_libcap-bin-capsh-shell=\"/bin/sh\"\nCONFIG_PACKAGE_libcap-ng=y\nCONFIG_PACKAGE_libcap-ng-bin=y\nCONFIG_PACKAGE_libcares=y\nCONFIG_PACKAGE_libcurl=y\nCONFIG_PACKAGE_libdb47=y\nCONFIG_PACKAGE_libelf=y\nCONFIG_PACKAGE_libev=y\nCONFIG_PACKAGE_libevdev=y\nCONFIG_PACKAGE_libevent2=y\nCONFIG_PACKAGE_libfdisk=y\nCONFIG_PACKAGE_libffi=y\nCONFIG_PACKAGE_libgdbm=y\nCONFIG_PACKAGE_libgmp=y\nCONFIG_PACKAGE_libi2c=y\nCONFIG_PACKAGE_libimobiledevice=y\nCONFIG_PACKAGE_libipset=y\nCONFIG_PACKAGE_libiwinfo=y\nCONFIG_PACKAGE_libiwinfo-lua=y\nCONFIG_PACKAGE_liblua=y\nCONFIG_PACKAGE_liblucihttp=y\nCONFIG_PACKAGE_liblucihttp-lua=y\nCONFIG_PACKAGE_liblzma=y\nCONFIG_PACKAGE_libmbedtls=y\nCONFIG_PACKAGE_libminiupnpc=y\nCONFIG_PACKAGE_libmnl=y\nCONFIG_PACKAGE_libmount=y\nCONFIG_PACKAGE_libnatpmp=y\nCONFIG_PACKAGE_libncurses=y\nCONFIG_PACKAGE_libnetfilter-conntrack=y\nCONFIG_PACKAGE_libnetsnmp=y\nCONFIG_PACKAGE_libnettle=y\nCONFIG_PACKAGE_libnfnetlink=y\nCONFIG_PACKAGE_libnghttp2=y\nCONFIG_PACKAGE_libnss=y\nCONFIG_PACKAGE_libopenssl=y\nCONFIG_PACKAGE_libopenssl-conf=y\nCONFIG_PACKAGE_libpam=y\nCONFIG_PACKAGE_libpcap=y\nCONFIG_PACKAGE_libpci=y\nCONFIG_PACKAGE_libpcre=y\nCONFIG_PACKAGE_libplist=y\nCONFIG_PACKAGE_libruby=y\nCONFIG_PACKAGE_libsctp=y\nCONFIG_PACKAGE_libsodium=y\nCONFIG_PACKAGE_libsqlite3=y\nCONFIG_PACKAGE_libssh=y\nCONFIG_PACKAGE_libstdcpp=y\nCONFIG_PACKAGE_libtirpc=y\nCONFIG_PACKAGE_libubus-lua=y\nCONFIG_PACKAGE_libuci-lua=y\nCONFIG_PACKAGE_libudev-zero=y\nCONFIG_PACKAGE_libusb-1.0=y\nCONFIG_PACKAGE_libusbmuxd=y\nCONFIG_PACKAGE_libuv=y\nCONFIG_PACKAGE_libwebsockets-full=y\nCONFIG_PACKAGE_libxml2=y\nCONFIG_PACKAGE_libyaml=y\nCONFIG_PACKAGE_lrzsz=y\nCONFIG_PACKAGE_lsblk=y\nCONFIG_PACKAGE_lscpu=y\nCONFIG_PACKAGE_lsof=y\nCONFIG_PACKAGE_lua=y\nCONFIG_PACKAGE_luci=y\nCONFIG_PACKAGE_luci-app-adbyby-plus=y\nCONFIG_PACKAGE_luci-app-arpbind=y\nCONFIG_PACKAGE_luci-app-autoreboot=y\nCONFIG_PACKAGE_luci-app-beardropper=y\nCONFIG_PACKAGE_luci-app-cpufreq=y\nCONFIG_PACKAGE_luci-app-ddns=y\nCONFIG_PACKAGE_luci-app-filetransfer=y\nCONFIG_PACKAGE_luci-app-firewall=y\nCONFIG_PACKAGE_luci-app-frpc=y\nCONFIG_PACKAGE_luci-app-frps=y\nCONFIG_PACKAGE_luci-app-gost=y\nCONFIG_PACKAGE_luci-app-onliner=y\nCONFIG_PACKAGE_luci-app-opkg=y\nCONFIG_PACKAGE_luci-app-ramfree=y\nCONFIG_PACKAGE_luci-app-sqm=y\nCONFIG_PACKAGE_luci-app-ssr-plus=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_NaiveProxy=y\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Redsocks2=y\n# CONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Shadowsocks is not set\nCONFIG_PACKAGE_luci-app-ssr-plus_INCLUDE_Trojan=y\nCONFIG_PACKAGE_luci-app-ttyd=y\nCONFIG_PACKAGE_luci-app-upnp=y\nCONFIG_PACKAGE_luci-app-wireguard=y\nCONFIG_PACKAGE_luci-app-wol=y\nCONFIG_PACKAGE_luci-app-wrtbwmon=y\nCONFIG_PACKAGE_luci-app-zerotier=y\nCONFIG_PACKAGE_luci-base=y\nCONFIG_PACKAGE_luci-compat=y\nCONFIG_PACKAGE_luci-lib-base=y\nCONFIG_PACKAGE_luci-lib-fs=y\nCONFIG_PACKAGE_luci-lib-ip=y\nCONFIG_PACKAGE_luci-lib-ipkg=y\nCONFIG_PACKAGE_luci-lib-jsonc=y\nCONFIG_PACKAGE_luci-lib-nixio=y\nCONFIG_PACKAGE_luci-mod-admin-full=y\nCONFIG_PACKAGE_luci-mod-network=y\nCONFIG_PACKAGE_luci-mod-status=y\nCONFIG_PACKAGE_luci-mod-system=y\nCONFIG_PACKAGE_luci-proto-ipv6=y\nCONFIG_PACKAGE_luci-proto-ppp=y\nCONFIG_PACKAGE_luci-proto-wireguard=y\nCONFIG_PACKAGE_luci-theme-bootstrap=y\nCONFIG_PACKAGE_microsocks=y\nCONFIG_PACKAGE_miniupnpd=y\nCONFIG_PACKAGE_mount-utils=y\nCONFIG_PACKAGE_msgpack-c=y\nCONFIG_PACKAGE_mt7601u-firmware=y\nCONFIG_PACKAGE_mtr=y\nCONFIG_PACKAGE_musl-fts=y\nCONFIG_PACKAGE_naiveproxy=y\nCONFIG_PACKAGE_nspr=y\nCONFIG_PACKAGE_openssh-sftp-server=y\nCONFIG_PACKAGE_openssl-util=y\nCONFIG_PACKAGE_pdnsd-alt=y\nCONFIG_PACKAGE_python3=y\nCONFIG_PACKAGE_python3-asyncio=y\nCONFIG_PACKAGE_python3-base=y\nCONFIG_PACKAGE_python3-cgi=y\nCONFIG_PACKAGE_python3-cgitb=y\nCONFIG_PACKAGE_python3-codecs=y\nCONFIG_PACKAGE_python3-ctypes=y\nCONFIG_PACKAGE_python3-dbm=y\nCONFIG_PACKAGE_python3-decimal=y\nCONFIG_PACKAGE_python3-distutils=y\nCONFIG_PACKAGE_python3-email=y\nCONFIG_PACKAGE_python3-gdbm=y\nCONFIG_PACKAGE_python3-light=y\nCONFIG_PACKAGE_python3-logging=y\nCONFIG_PACKAGE_python3-lzma=y\nCONFIG_PACKAGE_python3-multiprocessing=y\nCONFIG_PACKAGE_python3-ncurses=y\nCONFIG_PACKAGE_python3-openssl=y\nCONFIG_PACKAGE_python3-pkg-resources=y\nCONFIG_PACKAGE_python3-pydoc=y\nCONFIG_PACKAGE_python3-sqlite3=y\nCONFIG_PACKAGE_python3-unittest=y\nCONFIG_PACKAGE_python3-urllib=y\nCONFIG_PACKAGE_python3-xml=y\nCONFIG_PACKAGE_redsocks2=y\nCONFIG_PACKAGE_resolveip=y\nCONFIG_PACKAGE_rpcd=y\nCONFIG_PACKAGE_rpcd-mod-file=y\nCONFIG_PACKAGE_rpcd-mod-iwinfo=y\nCONFIG_PACKAGE_rpcd-mod-luci=y\nCONFIG_PACKAGE_rpcd-mod-rrdns=y\nCONFIG_PACKAGE_ruby=y\nCONFIG_PACKAGE_ruby-bigdecimal=y\nCONFIG_PACKAGE_ruby-date=y\nCONFIG_PACKAGE_ruby-dbm=y\nCONFIG_PACKAGE_ruby-digest=y\nCONFIG_PACKAGE_ruby-enc=y\nCONFIG_PACKAGE_ruby-forwardable=y\nCONFIG_PACKAGE_ruby-pstore=y\nCONFIG_PACKAGE_ruby-psych=y\nCONFIG_PACKAGE_ruby-stringio=y\nCONFIG_PACKAGE_ruby-strscan=y\nCONFIG_PACKAGE_ruby-yaml=y\nCONFIG_PACKAGE_shadowsocks-rust-sslocal=y\nCONFIG_PACKAGE_shadowsocks-rust-ssmanager=y\nCONFIG_PACKAGE_shadowsocks-rust-ssserver=y\nCONFIG_PACKAGE_shadowsocks-rust-ssurl=y\nCONFIG_PACKAGE_shadowsocksr-libev-alt=y\nCONFIG_PACKAGE_shadowsocksr-libev-server=y\nCONFIG_PACKAGE_shadowsocksr-libev-ssr-local=y\nCONFIG_PACKAGE_simple-obfs=y\nCONFIG_PACKAGE_socat=y\nCONFIG_PACKAGE_sqm-scripts=y\nCONFIG_PACKAGE_ss=y\nCONFIG_PACKAGE_stress-ng=y\nCONFIG_PACKAGE_tc-mod-iptables=y\nCONFIG_PACKAGE_tc-tiny=y\nCONFIG_PACKAGE_tcping=y\nCONFIG_PACKAGE_terminfo=y\nCONFIG_PACKAGE_tmate=y\nCONFIG_PACKAGE_trojan=y\nCONFIG_PACKAGE_ttyd=y\nCONFIG_PACKAGE_uhttpd=y\nCONFIG_PACKAGE_uhttpd-mod-ubus=y\nCONFIG_PACKAGE_unzip=y\nCONFIG_PACKAGE_usb-modeswitch=y\nCONFIG_PACKAGE_usbids=y\nCONFIG_PACKAGE_usbmuxd=y\nCONFIG_PACKAGE_usbutils=y\nCONFIG_PACKAGE_wget-ssl=y\nCONFIG_PACKAGE_wireguard-tools=y\nCONFIG_PACKAGE_wireless-regdb=y\nCONFIG_PACKAGE_wireless-tools=y\nCONFIG_PACKAGE_wpad-openssl=y\nCONFIG_PACKAGE_wrtbwmon=y\nCONFIG_PACKAGE_xray-core=y\nCONFIG_PACKAGE_yq=y\nCONFIG_PACKAGE_zerotier=y\nCONFIG_PACKAGE_zlib=y\nCONFIG_SQLITE3_DYNAMIC_EXTENSIONS=y\nCONFIG_SQLITE3_FTS3=y\nCONFIG_SQLITE3_FTS4=y\nCONFIG_SQLITE3_FTS5=y\nCONFIG_SQLITE3_JSON1=y\nCONFIG_SQLITE3_RTREE=y\nCONFIG_TARGET_KERNEL_PARTSIZE=20\nCONFIG_TARGET_OPTIONS=y\nCONFIG_TARGET_ROOTFS_PARTSIZE=1024\nCONFIG_TESTING_KERNEL=y\nCONFIG_WPA_MSG_MIN_PRIORITY=3\nCONFIG_boost-compile-visibility-hidden=y\nCONFIG_boost-runtime-shared=y\nCONFIG_boost-static-and-shared-libs=y\nCONFIG_boost-variant-release=y\n"
  },
  {
    "path": "step/00-prepare_5.10.sh",
    "content": "#!/bin/bash\nclear\n#Update feed\n#sed -i '4s/src-git/#src-git/g' ./feeds.conf.default\n#sed -i '5s/src-git/#src-git/g' ./feeds.conf.default\necho 'src-git addon https://github.com/quintus-lab/openwrt-package' >> ./feeds.conf.default\n./scripts/feeds update -a && ./scripts/feeds install -a\n\n#patch jsonc\npatch -p1 < ../patches/0000-use_json_object_new_int64.patch\n#add upx-ucl support\npatch -p1 < ../patches/0001-tools-add-upx-ucl-support.patch\n\n#rockchip-rk3328-dmc\npatch -p1 < ../patches/0003-rockchip-rk3328-dmc.patch\n\n#add some new support rk33xx\npatch -p1 < ../patches/0004-add-new-rk33xx-support-k510.patch\n\n#Hardware Random Number Generator\npatch -p1 < ../patches/0006-support-rk33xx-HWRNG.patch\n\n# add R4S support\npatch -p1 < ../patches/0007-optimize_for_rk3399.patch\n\n# add AES and GCM with ARMv8 Crypto support\npatch -p1 < ../patches/0008-mbedtls-Implements-AES-and-GCM-with-ARMv8-Crypto-Ext.patch\n# rockchip: add support for OrangePi R1 Plus\npatch -p1 < ../patches/0009-rockchip-add-support-for-OrangePi-R1-Plus.patch\n\n#Fullcone patch\npatch -p1 < ../patches/1002-fw3_fullconenat.patch\npatch -p1 < ../patches/1003-luci-app-firewall_add_fullcone.patch\n#update curl\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/curl package/network/utils/curl\n\n#dnsmasq aaaa filter\npatch -p1 < ../patches/1001-dnsmasq_add_filter_aaaa_option.patch\ncp -f ../patches/910-mini-ttl.patch package/network/services/dnsmasq/patches/\ncp -f ../patches/911-dnsmasq-filter-aaaa.patch package/network/services/dnsmasq/patches/\n\n#Max connection limite\nsed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf\n#nf_conntrack: helper assignment\necho 'net.netfilter.nf_conntrack_helper=1' >> package/kernel/linux/files/sysctl-nf-conntrack.conf\n\nexit 0\n"
  },
  {
    "path": "step/01-prepare_package.sh",
    "content": "#!/bin/bash\nclear\n\n# remove other coremark\nrm -rf feeds/packages/utils/coremark\nrm -rf package/feeds/packages/coremark\n./scripts/feeds update -a && ./scripts/feeds install -a\n\n#OLED display\ngit clone https://github.com/natelol/luci-app-oled package/natelol/luci-app-oled\n\n#SSRP\nsvn co https://github.com/fw876/helloworld/trunk/luci-app-ssr-plus package/lean/luci-app-ssr-plus\nsvn co https://github.com/fw876/helloworld/trunk/tcping package/lean/tcping\nsvn co https://github.com/fw876/helloworld/trunk/naiveproxy package/lean/naiveproxy\nsvn co https://github.com/fw876/helloworld/trunk/shadowsocks-rust package/lean/shadowsocks-rust\nsvn co https://github.com/fw876/helloworld/trunk/shadowsocksr-libev package/lean/shadowsocksr-libev\nsvn co https://github.com/fw876/helloworld/trunk/v2ray-core package/lean/v2ray-core\nsvn co https://github.com/fw876/helloworld/trunk/v2ray-plugin package/lean/v2ray-plugin\n#SSRP dependences\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/pdnsd-alt package/lean/pdnsd\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/srelay package/lean/srelay\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/microsocks package/lean/microsocks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/dns2socks package/lean/dns2socks\nsvn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ipt2socks package/lean/ipt2socks\nsvn co https://github.com/fw876/helloworld/trunk/simple-obfs package/lean/simple-obfs\nsvn co https://github.com/fw876/helloworld/trunk/trojan package/lean/trojan\n#svn co https://github.com/immortalwrt/packages/trunk/net/naiveproxy package/new/naiveproxy\n#wrt bw monitor\ngit clone -b master --single-branch https://github.com/brvphoenix/wrtbwmon package/new/wrtbwmon\ngit clone -b master --single-branch https://github.com/brvphoenix/luci-app-wrtbwmon package/new/luci-app-wrtbwmon\n\n#iputils\nsvn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/iputils package/network/utils/iputils\n\n# Time stamp with $Build_Date=$(date +%Y.%m.%d)\necho -e '\\nQuintus Build@'$(date \"+%Y.%m.%d\")'\\n'  >> package/base-files/files/etc/banner\nsed -i '/DISTRIB_REVISION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_REVISION='$(date \"+%Y.%m.%d\")'\" >> package/base-files/files/etc/openwrt_release\nsed -i '/DISTRIB_DESCRIPTION/d' package/base-files/files/etc/openwrt_release\necho \"DISTRIB_DESCRIPTION='Quintus Build@$(date \"+%Y.%m.%d\")'\" >> package/base-files/files/etc/openwrt_release\nsed -i '/luciversion/d' feeds/luci/modules/luci-base/luasrc/version.lua\n#echo 'luciversion = \"Quintus@🇨🇦🇹🇼🇺🇸🇭🇰\"' >> feeds/luci/modules/luci-base/luasrc/version.lua\n\n#生成默认配置及缓存\nrm -rf .config\n\nexit 0\n"
  },
  {
    "path": "step/02-remove_upx.sh",
    "content": "#!/bin/bash\n# [CTCGFW]Project-OpenWrt\n# Use it under GPLv3, please.\n# --------------------------------------------------------\n# Remove upx commands\n\nmakefile_file=\"$({ find package|grep Makefile |sed \"/Makefile./d\"; } 2>\"/dev/null\")\"\nfor a in ${makefile_file}\ndo\n\t[ -n \"$(grep \"upx\" \"$a\")\" ] && sed -i \"/upx/d\" \"$a\"\ndone\nexit 0"
  },
  {
    "path": "step/03-create_acl_for_luci.sh",
    "content": "#!/bin/bash\n# [CTCGFW]Project-OpenWrt\n# Use it under GPLv3, please.\n# --------------------------------------------------------\n# Script for creating ACL file for each LuCI APP\n\nerror_font=\"\\033[31m[Error]$\\033[0m \"\nsuccess_font=\"\\033[32m[Success]\\033[0m \"\ninfo_font=\"\\033[36m[Info]\\033[0m \"\n\nfunction echo_green_bg(){\n\techo -e \"\\033[42;37m$1\\033[0m\"\n}\n\nfunction echo_yellow_bg(){\n\techo -e \"\\033[43;37m$1\\033[0m\"\n}\n\nfunction echo_red_bg(){\n\techo -e \"\\033[41;37m$1\\033[0m\"\n}\n\nfunction clean_outdated_files(){\n\trm -f \"create_acl_for_luci.err\" \"create_acl_for_luci.warn\" \"create_acl_for_luci.ok\"\n}\n\nfunction check_if_acl_exist(){\n\tls \"$1\"/root/usr/share/rpcd/acl.d/*.json >/dev/null 2>&1 && return 0 || return 1\n}\n\nfunction check_config_files(){\n\t[ \"$(ls \"$1\"/root/etc/config/* 2>/dev/null | wc -l)\" -ne \"1\" ] && return 0 || return 1\n}\n\nfunction get_config_name(){\n\tls \"$1\"/root/etc/config/* 2>/dev/null | awk -F '/' '{print $NF}'\n}\n\nfunction create_acl_file(){\n\tmkdir -p \"$1\"\n\techo -e \"{\n\t\\\"$2\\\": {\n\t\t\\\"description\\\": \\\"Grant UCI access for $2\\\",\n\t\t\\\"read\\\": {\n\t\t\t\\\"uci\\\": [ \\\"$3\\\" ]\n\t\t},\n\t\t\\\"write\\\": {\n\t\t\t\\\"uci\\\": [ \\\"$3\\\" ]\n\t\t}\n\t}\n}\" > \"$1/$2.json\"\n}\n\nfunction auto_create_acl(){\n\tluci_app_list=\"$(find package -maxdepth 2 | grep -Eo \"package/.+/luci-app-[a-zA-Z0-9_-]+\" | sort -s)\"\n\n\t[ \"$(echo -e \"${luci_app_list}\" | wc -l)\" -gt \"0\" ] && for i in ${luci_app_list}\n\tdo\n\t\tif check_if_acl_exist \"$i\"; then\n\t\t\techo_yellow_bg \"$i: has ACL file already, skipping...\" | tee -a create_acl_for_luci.warn\n\t\telif check_config_files \"$i\"; then\n\t\t\techo_red_bg \"$i: has no/multi config file(s), skipping...\" | tee -a create_acl_for_luci.err\n\t\telse\n\t\t\tcreate_acl_file \"$i/root/usr/share/rpcd/acl.d\" \"${i##*/}\" \"$(get_config_name \"$i\")\"\n\t\t\techo_green_bg \"$i: ACL file has been generated.\" | tee -a create_acl_for_luci.ok\n\t\tfi\n\tdone\n}\n\nwhile getopts \"achml:n:p:\" input_arg  \ndo\n\tcase $input_arg in\n\ta)\n\t\tclean_outdated_files\n\t\tauto_create_acl\n\t\texit\n\t\t;;\n\tm)\n\t\tmanual_mode=1\n\t\t;;\n\tp)\n\t\tacl_path=\"$OPTARG\"\n\t\t;;\n\tl)\n\t\tluci_name=\"$OPTARG\"\n\t\t;;\n\tn)\n\t\tconf_name=\"$OPTARG\"\n\t\t;;\n\tc)\n\t\tclean_outdated_files\n\t\texit\n\t\t;;\n\th|?|*)\n\t\techo -e \"${info_font}Usage: $0 [-a|-m (-p <path-to-acl>) -l <luci-name> -n <conf-name>|-c]\"\n\t\texit 2\n\t\t;;\n\tesac\ndone\n\n[ \"$?\" -ne \"0\" ] && exit\n\nif [ \"*${manual_mode}*\" == \"*1*\" ]; then\n\tacl_path=\"${acl_path:-root/usr/share/rpcd/acl.d}\"\n\tif create_acl_file \"${acl_path}\" \"${luci_name}\" \"${conf_name}\"; then\n\t\techo -e \"${success_font}Output file: $(ls \"${acl_path}/${luci_name}.json\")\"\n\t\techo_green_bg \"$(cat \"${acl_path}/${luci_name}.json\")\"\n\t\techo_green_bg \"${luci_name}: ACL file has been generated.\" >> \"create_acl_for_luci.ok\"\n\t\t[ -e \"create_acl_for_luci.err\" ] && sed -i \"/${luci_name}/d\" \"create_acl_for_luci.err\"\n\telse\n\t\techo -e \"${error_font}Failed to create file ${acl_path}/${luci_name}.json\"\n\t\techo_red_bg \"${luci_name}: Failed to create ACL file.\" >> \"create_acl_for_luci.err\"\n\tfi\nelse\n\techo -e \"${info_font}Usage: $0 [-a|-m -p <path-to-acl> -l <luci-name> -n <conf-name>|-c]\"\n\texit 2\nfi"
  },
  {
    "path": "step/04-k5.14.sh",
    "content": "#!/bin/bash\nclear\n#add kernel 5.14 support\npatch -p1 < ../patches/2001-add-5.14-support.patch\n#add rockchip 5.14 support\npatch -p1 < ../patches/2002-rockchip-add-5.14-support.patch\n#mod for 5.14\npatch -p1 < ../patches/2003-mod-for-k514.patch\nexit 0\n"
  }
]