Release develop 251115

This commit is contained in:
hongyi
2025-11-15 00:17:19 +08:00
parent 47c96ca1c2
commit 5d591b1b36
11 changed files with 214 additions and 246 deletions

View File

@@ -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'

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -199,7 +199,7 @@
status = "disabled";
};
&hdmi_tx {
&dhost_0 {
status = "disabled";
};

View File

@@ -14,10 +14,6 @@
status = "disabled";
};
&uart4 {
current-speed = <115200>; /* OpenSBI */
};
&uart6 {
status = "disabled";
};

View File

@@ -89,10 +89,6 @@
status = "disabled";
};
&uart4 {
current-speed = <115200>; /* OpenSBI */
};
&uart5 {
status = "disabled";
};

View File

@@ -43,10 +43,6 @@
status = "disabled";
};
&uart4 {
current-speed = <115200>; /* OpenSBI */
};
&uart5 {
status = "disabled";
};

View File

@@ -89,10 +89,6 @@
status = "disabled";
};
&uart4 {
current-speed = <115200>; /* OpenSBI */
};
&uart5 {
status = "disabled";
};

View File

@@ -405,6 +405,7 @@
power-domains = <&power_peri2>;
reg-shift = <2>;
reg-io-width = <4>;
current-speed = <115200>; /* OpenSBI */
status = "okay";
};

View File

@@ -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;