Release develop 251115
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 {
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&hdmi_tx {
|
||||
&dhost_0 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
current-speed = <115200>; /* OpenSBI */
|
||||
};
|
||||
|
||||
&uart6 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -89,10 +89,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
current-speed = <115200>; /* OpenSBI */
|
||||
};
|
||||
|
||||
&uart5 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -43,10 +43,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
current-speed = <115200>; /* OpenSBI */
|
||||
};
|
||||
|
||||
&uart5 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -89,10 +89,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
current-speed = <115200>; /* OpenSBI */
|
||||
};
|
||||
|
||||
&uart5 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -405,6 +405,7 @@
|
||||
power-domains = <&power_peri2>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
current-speed = <115200>; /* OpenSBI */
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user