diff --git a/.cicd/.gitlab-ci.yml b/.cicd/.gitlab-ci.yml index 787aceb49..04e831bf5 100644 --- a/.cicd/.gitlab-ci.yml +++ b/.cicd/.gitlab-ci.yml @@ -1,118 +1,4 @@ -stages: - - build - - test - - deploy - - cleanup - -mr-code-review: - stage: build - script: - - zb gitlab review - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-build-virt: - stage: build - script: - - zb diskimage -ekernel:source-path=$PWD -osubsystem=test -odistro=debian -oboard=virt --tar - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-build-a200-evb: - stage: build - script: - - zb diskimage -ekernel:source-path=$PWD -osubsystem=test -odistro=ubuntu -oboard=a200-evb --tar - - zb gitlab upload build/Release/*.tar.gz # 上传到临时 mr artifactory - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-build-a210-evb: - stage: build - script: - - zb diskimage -ekernel:source-path=$PWD -osubsystem=test -odistro=debian -oboard=a210-evb --tar - - zb gitlab upload build/Release/*.tar.gz # 上传到临时 mr artifactory - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-test-virt: - stage: test - script: - - echo "无需测试" - dependencies: - - mr-build-virt - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-test-a200-evb: - stage: test - script: - - zb gitlab run --timeout 600 --board "p1-*" --board-label "cicd" .cicd/runtest-a200-evb.sh - dependencies: - - mr-build-a200-evb - tags: - - a200-board-runner - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-test-a210-evb: - stage: test - script: - - zb gitlab run --timeout 600 --board "a210-*" --board-label "cicd" .cicd/runtest-a210-evb.sh - dependencies: - - mr-build-a210-evb - tags: - - a210-board-runner - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - -mr-deploy: - stage: deploy - script: - - zb kernel -f -esource-path=$PWD -oboard=a210-evb - - zb kernel -f -esource-path=$PWD -oboard=a200-evb - - zb kernel -f -esource-path=$PWD -oboard=virt - - zb upload kernel --all - rules: - - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - -cleanup-success: - stage: cleanup - script: - - zb gitlab remove "$ARTIFACTS_URL/mr/$CI_PIPELINE_ID" - - zb gitlab message "[SUCCESS] $CI_PIPELINE_SOURCE - $CI_PIPELINE_URL - $CI_COMMIT_TITLE" - tags: - - message-runner - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - when: on_success - -cleanup-failure: - stage: cleanup - script: - - zb gitlab message "[FAILURE] $CI_PIPELINE_SOURCE - $CI_PIPELINE_URL - $CI_COMMIT_TITLE" - tags: - - message-runner - rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" - when: on_failure - -before_script: - - .cicd/version.sh - - - export ZB_CACHE_PATH=$HOME/download_cache - - export SDK_VERSION=${CI_COMMIT_BRANCH:-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME} - - export DISK_IMAGE=diskimage_${SDK_VERSION//\//_} - - - export VIRT_TARGZ=${DISK_IMAGE}_virt-release_test.tar.gz - - - export A200_EVB_IMAGE=${DISK_IMAGE}_a200-evb-release_test_debian.tar.gz - - export A200_EVB_IMAGE_UBUNTU=${DISK_IMAGE}_a200-evb-release_test_ubuntu.tar.gz - - - export A210_EVB_IMAGE=${DISK_IMAGE}_a210-evb-release_test_debian.tar.gz - - export A210_EVB_IMAGE_UBUNTU=${DISK_IMAGE}_a210-evb-release_test_ubuntu.tar.gz - - - export - -variables: - CONAN_USER_HOME: $CI_BUILDS_DIR/$CI_JOB_ID - MERGE_REQUEST_URL: $CI_MERGE_REQUEST_PROJECT_URL/-/merge_requests/$CI_MERGE_REQUEST_IID +include: + - project: 'linux_sdk/cicd-pipeline' + ref: develop + file: '/gitlabci/gitlab-ci.yml' diff --git a/.cicd/runtest-virt.sh b/.cicd/runtest-virt.sh deleted file mode 100755 index 8742ae4f9..000000000 --- a/.cicd/runtest-virt.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -set -e - -SOCAT_FILE=$(mktemp /tmp/socat_XXXXXX) -export SOCAT_FILE - -zb diskimage -zb run --socat=$SOCAT_FILE & -pid=$! - -# 定义清理函数 -cleanup() { - set +e - kill $pid 2>/dev/null - wait $pid 2>/dev/null - rm -rf $SOCAT_FILE - exit 0 -} - -# 设置陷阱,在接收到信号时调用清理函数 -trap 'cleanup' EXIT - -# 不支持并行测试 -pytest $(dirname "$0")/tests -sv --durations=0 -x diff --git a/.cicd/version.sh b/.cicd/version.sh deleted file mode 100755 index 5be981883..000000000 --- a/.cicd/version.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -BRANCH=${CI_COMMIT_BRANCH:-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME} - - -if [ -n "${BRANCH}" ]; then - case "$BRANCH" in - develop|master) zb version _/_ ;; - *) zbuild version $BRANCH ;; - esac -else - zb version _/_ -fi - -zbuild build zbuild -f || true - -# 删除一天前的遗留目录 -find $CI_BUILDS_DIR -maxdepth 1 -type d -name "[0-9]*" -mmin +1440 -exec rm -rf {} \; || true diff --git a/arch/riscv/boot/dts/zhihe/a210-evb-d2d.dts b/arch/riscv/boot/dts/zhihe/a210-evb-d2d.dts index f3442d323..74261daaa 100644 --- a/arch/riscv/boot/dts/zhihe/a210-evb-d2d.dts +++ b/arch/riscv/boot/dts/zhihe/a210-evb-d2d.dts @@ -196,6 +196,17 @@ slew-rate = <0>; }; }; + hdmi_pins: hdmi-0 { + hdmi-pins { + pins = "GPIO2_25", "GPIO2_30", "GPIO2_31"; + function = "hdmi"; + bias-disable; + drive-strength = <3>; + input-enable; + input-schmitt-disable; + slew-rate = <0>; + }; + }; qspi1_pins: qspi1-1 { qspi-pins { pins = "GPIO3_2", "GPIO3_5", "GPIO3_6", "GPIO3_7", "GPIO3_8"; @@ -224,32 +235,6 @@ }; }; -&emmc { - max-frequency = <196608000>; - non-removable; - mmc-hs400-1_8v; - mmc-hs200-1_8v; - io_fixed_1v8; - is_emmc; - no-sdio; - no-sd; - pull_up; - bus-width = <8>; - cap-mmc-highspeed; - clk-delay-mmc-hs200 = <60>; -}; - -&sdhci0 { - pinctrl-names = "default"; - pinctrl-0 = <&sdhci_pins>; - max-frequency = <196608000>; - cap-sd-highspeed; - bus-width = <4>; - sd-uhs-sdr104; - no-sdio; - pull_up; - wprtn_ignore; -}; &qspi0 { cs-gpios = <&gpio0 19 0>; @@ -297,6 +282,38 @@ pinctrl-0 = <&uart4_pins>; }; +&hdmi_tx { + pinctrl-names = "default"; + pinctrl-0 = <&hdmi_pins>; +}; + +&emmc { + max-frequency = <196608000>; + non-removable; + mmc-hs400-1_8v; + mmc-hs200-1_8v; + io_fixed_1v8; + is_emmc; + no-sdio; + no-sd; + pull_up; + bus-width = <8>; + cap-mmc-highspeed; + clk-delay-mmc-hs200 = <60>; +}; + +&sdhci0 { + pinctrl-names = "default"; + pinctrl-0 = <&sdhci_pins>; + max-frequency = <196608000>; + cap-sd-highspeed; + bus-width = <4>; + sd-uhs-sdr104; + no-sdio; + pull_up; + wprtn_ignore; +}; + /* DIE1 */ &peri1_padctrl_die1 { qspi0_pins_die1: qspi0-0 { diff --git a/arch/riscv/boot/dts/zhihe/a210-platform-d2d.dtsi b/arch/riscv/boot/dts/zhihe/a210-platform-d2d.dtsi index 2fcdb1ab5..2965f7aaf 100644 --- a/arch/riscv/boot/dts/zhihe/a210-platform-d2d.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-platform-d2d.dtsi @@ -199,7 +199,7 @@ status = "disabled"; }; -&hdmi_tx { +&dhost_0 { status = "disabled"; }; diff --git a/arch/riscv/boot/dts/zhihe/a210-platform-dev.dtsi b/arch/riscv/boot/dts/zhihe/a210-platform-dev.dtsi index 8a0313a76..9a9058e01 100644 --- a/arch/riscv/boot/dts/zhihe/a210-platform-dev.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-platform-dev.dtsi @@ -14,10 +14,6 @@ status = "disabled"; }; -&uart4 { - current-speed = <115200>; /* OpenSBI */ -}; - &uart6 { status = "disabled"; }; diff --git a/arch/riscv/boot/dts/zhihe/a210-platform-emu.dtsi b/arch/riscv/boot/dts/zhihe/a210-platform-emu.dtsi index 08a76a67a..e4e695388 100644 --- a/arch/riscv/boot/dts/zhihe/a210-platform-emu.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-platform-emu.dtsi @@ -89,10 +89,6 @@ status = "disabled"; }; -&uart4 { - current-speed = <115200>; /* OpenSBI */ -}; - &uart5 { status = "disabled"; }; diff --git a/arch/riscv/boot/dts/zhihe/a210-platform-evb.dtsi b/arch/riscv/boot/dts/zhihe/a210-platform-evb.dtsi index 568153d11..8194b4e64 100644 --- a/arch/riscv/boot/dts/zhihe/a210-platform-evb.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-platform-evb.dtsi @@ -43,10 +43,6 @@ status = "disabled"; }; -&uart4 { - current-speed = <115200>; /* OpenSBI */ -}; - &uart5 { status = "disabled"; }; diff --git a/arch/riscv/boot/dts/zhihe/a210-platform-haps.dtsi b/arch/riscv/boot/dts/zhihe/a210-platform-haps.dtsi index d6485a058..240ea1c2a 100644 --- a/arch/riscv/boot/dts/zhihe/a210-platform-haps.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-platform-haps.dtsi @@ -89,10 +89,6 @@ status = "disabled"; }; -&uart4 { - current-speed = <115200>; /* OpenSBI */ -}; - &uart5 { status = "disabled"; }; diff --git a/arch/riscv/boot/dts/zhihe/a210-soc-peri.dtsi b/arch/riscv/boot/dts/zhihe/a210-soc-peri.dtsi index c9f643c2e..7913f617f 100755 --- a/arch/riscv/boot/dts/zhihe/a210-soc-peri.dtsi +++ b/arch/riscv/boot/dts/zhihe/a210-soc-peri.dtsi @@ -405,6 +405,7 @@ power-domains = <&power_peri2>; reg-shift = <2>; reg-io-width = <4>; + current-speed = <115200>; /* OpenSBI */ status = "okay"; }; diff --git a/drivers/soc/zhihe/a210-memtester.c b/drivers/soc/zhihe/a210-memtester.c index 25169e65c..fe6535279 100644 --- a/drivers/soc/zhihe/a210-memtester.c +++ b/drivers/soc/zhihe/a210-memtester.c @@ -68,6 +68,11 @@ struct zh_memtester_device { unsigned long run_fail_timeout_count; unsigned long run_fail_poll_count; + /* check_en(bit3) rd_en(bit2) wr_en(bit1) for MT_REG_CTRL */ + unsigned int ctrl_mode; + /* range -> mask */ + unsigned int range; + /* distinguish the master */ unsigned int pattern; @@ -152,7 +157,6 @@ void zh_memtester_writespecific(struct device *dev, u64 addr) writel(0x0151000f, mt->reg + MT_REG_CTRL); } - static void check_status_delay_work(struct work_struct *work) { struct zh_memtester_device *mt = @@ -163,25 +167,30 @@ static void check_status_delay_work(struct work_struct *work) v = readl(mt->reg + MT_REG_STATUS); /* no-err */ if ((v & 0x1) == 0) { - /* 1000s / 20 -> 50 s */ - schedule_delayed_work(&mt->check_status_work, HZ / 20); + schedule_delayed_work(&mt->check_status_work, HZ); /* err fail */ } else { mt->fail_status = v; - printk(KERN_EMERG "(%s) catch fail @ %ld", dev_name(mt->dev), mt->check_status_cnt); - cancel_delayed_work_sync(&mt->check_status_work); + printk(KERN_EMERG "(%s) catch fail @ %ld status: 0x%x", dev_name(mt->dev), mt->check_status_cnt, v); + + /* stop */ + v = readl(mt->reg + MT_REG_CTRL); + writel(v & 0xfffffff0, mt->reg + MT_REG_CTRL); + + cancel_delayed_work(&mt->check_status_work); } v = readl(mt->reg + MT_REG_AXI_STATUS); mt->axi_status = v; } -/* addr must be 2M/1M align */ void zh_memtester_writespecific2(struct device *dev, u64 addr) { struct zh_memtester_device *mt = dev_get_drvdata(dev); bool need_shift = false; int v = 0; int mask = 0; + int prbs_sel_bit = (0x5 << 20); + int test_en_bit = (0x1 << 0); static int pattern = 0; if (!mt || !mt->reg) { @@ -189,6 +198,18 @@ void zh_memtester_writespecific2(struct device *dev, u64 addr) return; } + /* disable firstly */ + v = readl(mt->reg + MT_REG_CTRL); + writel(v & 0xfffffff0, mt->reg + MT_REG_CTRL); + cancel_delayed_work_sync(&mt->check_status_work); + writel(0xffffffff, mt->reg + MT_REG_STATUS); + + mt->check_status_cnt = 0; + mt->axi_status = 0; + + if (!addr) + return; + pattern++; if (addr >> 32) need_shift = true; @@ -202,8 +223,8 @@ void zh_memtester_writespecific2(struct device *dev, u64 addr) writel(0x10110100, mt->reg + MT_REG_CFG1); /* axlen: 8 transfer, axsize: 0'b100 -> 16 Bytes */ writel(0x07fc07fc, mt->reg + MT_REG_AXI_ATTR); - /* infinite loop, 4095 xtran */ - writel(0xff000fff, mt->reg + MT_REG_LOOP); + /* infinite loop, 4096 xtran */ + writel(0xff001000, mt->reg + MT_REG_LOOP); writel(0x12153524, mt->reg + MT_REG_PRBS_SEED); if (need_shift) { @@ -214,29 +235,18 @@ void zh_memtester_writespecific2(struct device *dev, u64 addr) if (need_shift) { mask = (addr >> 8); - /* lowest 12bit 0xfff, add 8bit shift, total 20bit 0xfffff*/ - mask = mask | (0x1FFFF); + mask = mask | ((mt->range - 1) >> 8); } else { mask = addr; - /* total 20bit 0xfffff*/ - mask = mask | (0x1FFFFFF); + mask = mask | (mt->range - 1); } - writel(mask, mt->reg + MT_REG_ADDR_MASK); - - /* bit 16 0: fix pattern: 0x01 */ - writel(0x0050000e | (pattern << 24), mt->reg + MT_REG_CTRL); - writel(0x0050000f | (pattern << 24), mt->reg + MT_REG_CTRL); + writel((pattern << 24) | prbs_sel_bit | (mt->ctrl_mode << 1) | test_en_bit, mt->reg + MT_REG_CTRL); mt->pattern = pattern; - mt->start_time = ktime_get_ns(); - v = readl(mt->reg + MT_REG_CTRL); - schedule_delayed_work(&mt->check_status_work, 0); - /* wait & poll */ - v = readl(mt->reg + MT_REG_STATUS); } static ssize_t readonly_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -299,17 +309,109 @@ static ssize_t writespecific_store(struct device *dev, } static DEVICE_ATTR_RW(writespecific); +static ssize_t range_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct zh_memtester_device *mt = dev_get_drvdata(dev); + unsigned long val; + char unit = '\0'; + int ret; + + ret = sscanf(buf, "%lu%c", &val, &unit); + + if (ret == 1) { + /* no unit */ + } else if (ret == 2) { + switch (unit) { + case 'K': + case 'k': + val <<= 10; + break; + case 'M': + case 'm': + val <<= 20; + break; + case 'G': + case 'g': + val <<= 30; + break; + default: + return -EINVAL; + } + } else { + return -EINVAL; + } + + mt->range = val; + + return count; +} + +static ssize_t range_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct zh_memtester_device *mt = dev_get_drvdata(dev); + unsigned long val = mt->range; + unsigned long display = val; + const char *unit = "B"; + + if (val >= (1UL << 30)) { + display = val >> 30; + unit = "G"; + } else if (val >= (1UL << 20)) { + display = val >> 20; + unit = "M"; + } else if (val >= (1UL << 10)) { + display = val >> 10; + unit = "K"; + } + + return scnprintf(buf, PAGE_SIZE, "%lu%s\n", display, unit); +} +static DEVICE_ATTR_RW(range); + +static ssize_t ctrl_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct zh_memtester_device *mt = dev_get_drvdata(dev); + unsigned int ctrl_mode; + + if (kstrtou32(buf, 0, &ctrl_mode) < 0) + return -EINVAL; + + ctrl_mode &= 0x7; + mt->ctrl_mode = ctrl_mode; + return count; +} + +static ssize_t ctrl_mode_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct zh_memtester_device *mt = dev_get_drvdata(dev); + ssize_t len = 0; + + len += scnprintf(buf + len, PAGE_SIZE - len, "ctrl_mode %d\n", mt->ctrl_mode); + len += scnprintf(buf + len, PAGE_SIZE - len, " check_en(bit2): %d\n", !!(mt->ctrl_mode & (0x1 << 2))); + len += scnprintf(buf + len, PAGE_SIZE - len, " rd_en(bit1): %d\n", !!(mt->ctrl_mode & (0x1 << 1))); + len += scnprintf(buf + len, PAGE_SIZE - len, " wr_en(bit0): %d\n", !!(mt->ctrl_mode & (0x1 << 0))); + + return len; +} +static DEVICE_ATTR_RW(ctrl_mode); + static ssize_t writespecific2_show(struct device *dev, struct device_attribute *attr, char *buf) { struct zh_memtester_device *mt = dev_get_drvdata(dev); ssize_t len = 0; int v; - int loops; - u64 total_bytes = 0; - u64 speed_mbps = 0; - - u64 now; u64 delta; + u64 delta_ms; + u64 loops; + u64 speed; + u64 real_size_mb; + int data_width; v = readl(mt->reg + MT_REG_STATUS); if ((v & 0x1) == 0) @@ -322,25 +424,40 @@ static ssize_t writespecific2_show(struct device *dev, struct device_attribute * len += scnprintf(buf + len, PAGE_SIZE - len, "check_status_cnt %ld fail_status: 0x%x\n", mt->check_status_cnt, mt->fail_status); - now = ktime_get_ns(); - delta = now - mt->start_time; + data_width = (v >> 20) & 0x3; + if (data_width == 0) + len += scnprintf(buf + len, PAGE_SIZE - len, "data_width: 64bit\n"); + else if (data_width == 0x1) + len += scnprintf(buf + len, PAGE_SIZE - len, "data_width: 128bit\n"); + else if (data_width == 0x2) + len += scnprintf(buf + len, PAGE_SIZE - len, "data_width: 256bit\n"); + else + len += scnprintf(buf + len, PAGE_SIZE - len, "data_width: invalid\n"); + delta = ktime_get_ns() - mt->start_time; + + /* + * calculate the total size simply: + * 1loop: axlen * axsize * xact_num --> 8 * 16 * 4096 = 512K = 1/2M + * 256loop: MT_REG_LOOP_TIME + 1 + * 1/2M * 256 = 128M + */ loops = readl(mt->reg + MT_REG_LOOP_TIME); - if (!loops) - return len; + /* unit M */ + real_size_mb = loops * 128; + /* scale the real_size_mb by the data_width */ + if (data_width == 0) + real_size_mb >>= 1; + else if (data_width == 2) + real_size_mb <<= 1; - total_bytes = (4096 * 16 * 9) * loops; - if (delta == 0) { - len += scnprintf(buf + len, PAGE_SIZE - len, "delta is zero, cannot calculate speed\n"); - return len; - } - /* bytes / ns = (bytes / 1000 000) M / (delta / 10^9) */ - speed_mbps = (total_bytes * 1000) / delta; - len += scnprintf(buf + len, PAGE_SIZE - len, "start_time %lld now %lld delta %lld\n", - mt->start_time, now, delta); - len += scnprintf(buf + len, PAGE_SIZE - len, "total_bytes %lld\n", total_bytes); - len += scnprintf(buf + len, PAGE_SIZE - len, "speed %lld-MBps loops-%d\n", speed_mbps, loops); + delta_ms = delta /(1000000ul); + speed = (real_size_mb * 1000) / (delta_ms); + + len += scnprintf(buf + len, PAGE_SIZE - len, "total %lld-MB %lld-GB\n", real_size_mb, real_size_mb >> 10); + len += scnprintf(buf + len, PAGE_SIZE - len, "delta %lld-ns %lld-ms\n", delta, delta_ms); + len += scnprintf(buf + len, PAGE_SIZE - len, "speed %lld-MBps %lld-GBps\n", speed, speed >> 10); return len; } @@ -363,6 +480,8 @@ static DEVICE_ATTR_RW(writespecific2); static struct attribute *mt_dev_attrs[] = { &dev_attr_writeonly.attr, &dev_attr_readonly.attr, + &dev_attr_ctrl_mode.attr, + &dev_attr_range.attr, &dev_attr_writespecific.attr, &dev_attr_writespecific2.attr, NULL @@ -506,6 +625,10 @@ static int zh_memtester_probe(struct platform_device *pdev) printk("mapped iova=0x%llx phy=0x%llx vir=0x%px len=%d\n", mt->wr_iova, mt->wr_pa, sg_virt(sg), sg->length); } + /* default, all enable */ + mt->ctrl_mode = 0x7; + mt->range = (1 << 20); + INIT_DELAYED_WORK(&mt->check_status_work, check_status_delay_work); return ret;