linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Zhang Xiaoxu <zhangxiaoxu@huaweicloud.com>
To: zhangxiaoxu5@huawei.com, weiyongjun1@huawei.com,
	linux-kernel@vger.kernel.org, broonie@kernel.org,
	rostedt@goodmis.org, mingo@redhat.com, frowand.list@gmail.com,
	linux-spi@vger.kernel.org
Subject: [PATCH -next 02/14] kddv/core: Allow test case config bpf program
Date: Sat, 18 Nov 2023 18:40:28 +0800	[thread overview]
Message-ID: <20231118104040.386381-3-zhangxiaoxu@huaweicloud.com> (raw)
In-Reply-To: <20231118104040.386381-1-zhangxiaoxu@huaweicloud.com>

From: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>

Allow test case config bpf program read/write regs.

@property
def configs(self):
    return { CFG_REG_MASK: 0x3f }

CFG_REG_MASK: mask reg before use
CFG_REG_RSH: right shift reg before use
CFG_REG_LSH: left shift reg before use
CFG_REG_ORD: swap reg byteorder before use

Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
---
 tools/testing/kddv/kddv/core/consts.py        |  12 ++
 tools/testing/kddv/kddv/core/mockup.py        |  28 +++++
 tools/testing/kddv/kddv/core/model.py         |   4 +
 .../kddv/data/bpf/include/bpf-xfer-conf.h     | 111 ++++++++++++++++++
 4 files changed, 155 insertions(+)
 create mode 100755 tools/testing/kddv/kddv/core/consts.py
 create mode 100644 tools/testing/kddv/kddv/data/bpf/include/bpf-xfer-conf.h

diff --git a/tools/testing/kddv/kddv/core/consts.py b/tools/testing/kddv/kddv/core/consts.py
new file mode 100755
index 000000000000..22abd7fc655c
--- /dev/null
+++ b/tools/testing/kddv/kddv/core/consts.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+#
+# Kernel device driver verification
+#
+# Copyright (C) 2022-2023 Huawei Technologies Co., Ltd
+# Author: Wei Yongjun <weiyongjun1@huawei.com>
+
+CFG_REG_MASK = 0x10
+CFG_REG_RSH = 0x11
+CFG_REG_LSH = 0x12
+CFG_REG_ORD = 0x13
diff --git a/tools/testing/kddv/kddv/core/mockup.py b/tools/testing/kddv/kddv/core/mockup.py
index b5e6c83c9164..8bea2db97232 100755
--- a/tools/testing/kddv/kddv/core/mockup.py
+++ b/tools/testing/kddv/kddv/core/mockup.py
@@ -29,6 +29,7 @@ class Mockup(object):
         self.bpf = p.bpf
         self.addr = p.address
         self.devid = p.device_id
+        self.configs = p.configs
         self.regshift = p.regshift
         self.regbytes = p.regbytes
         self.valbytes = p.valbytes
@@ -103,6 +104,7 @@ class Mockup(object):
     def load(self):
         self.load_bpf()
         self.load_regmaps()
+        self.load_configs()
         self.create_device()
 
     def unload(self):
@@ -116,6 +118,32 @@ class Mockup(object):
     def to_bpf_bytes(self, val, len):
         return list("%d" % n for n in list(val.to_bytes(len, 'little')))
 
+    def write_bpf_map(self, name, addr, val):
+        cmds = [self.bpftool, 'map', 'update']
+        cmds += ['name', name]
+        cmds += ['key']
+        cmds += self.to_bpf_bytes(addr, 4)
+        cmds += ['value']
+        cmds += self.to_bpf_bytes(val, 4)
+        logger.debug(' '.join(cmds))
+        subprocess.check_output(cmds)
+
+    def write_config(self, addr, val):
+        if self.bpf is None:
+            return
+        self.write_bpf_map('bpf_xfer_conf', addr, val)
+
+    def write_configs(self, addr, data):
+        for i in range(len(data)):
+            self.write_config(addr + i, data[i])
+
+    def load_configs(self):
+        for reg, value in self.configs.items():
+            if isinstance(value, list):
+                self.write_configs(reg, value)
+            else:
+                self.write_config(reg, value)
+
     def load_regmaps(self):
         for reg, value in self.regmaps.items():
             if isinstance(value, list):
diff --git a/tools/testing/kddv/kddv/core/model.py b/tools/testing/kddv/kddv/core/model.py
index 9da4716df7dc..494b69566536 100755
--- a/tools/testing/kddv/kddv/core/model.py
+++ b/tools/testing/kddv/kddv/core/model.py
@@ -67,6 +67,10 @@ class DriverModel(object):
     def valbytes(self):
         return 1
 
+    @property
+    def configs(self):
+        return {}
+
     @property
     def regmaps(self):
         return {}
diff --git a/tools/testing/kddv/kddv/data/bpf/include/bpf-xfer-conf.h b/tools/testing/kddv/kddv/data/bpf/include/bpf-xfer-conf.h
new file mode 100644
index 000000000000..49adbcc6a1af
--- /dev/null
+++ b/tools/testing/kddv/kddv/data/bpf/include/bpf-xfer-conf.h
@@ -0,0 +1,111 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * The bpf program of control xfer configuration
+ *
+ * Copyright (C) 2022-2023 Huawei Technologies Co., Ltd
+ */
+
+#ifndef __BPF_XFER_CONF_
+#define __BPF_XFER_CONF_
+
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_core_read.h>
+
+#define CONF_REGS_SIZE		0x100
+
+#define BPF_CONF_REG_MASK	0x10
+#define BPF_CONF_REG_RSHIFT	0x11
+#define BPF_CONF_REG_LSHIFT	0x12
+#define BPF_CONF_REG_XBSWAP	0x13
+
+struct {
+	__uint(type, BPF_MAP_TYPE_ARRAY);
+	__uint(max_entries, CONF_REGS_SIZE);
+	__type(key, __u32);
+	__type(value, __u32);
+} bpf_xfer_conf SEC(".maps");
+
+static u32 bpf_reg_mask, bpf_reg_xbswap;
+static u32 bpf_reg_rshift, bpf_reg_lshift;
+
+static u32 bpf_xfer_read_conf(u32 key)
+{
+	u32 *reg;
+
+	reg = bpf_map_lookup_elem(&bpf_xfer_conf, &key);
+	if (!reg) {
+		bpf_printk("config key %d not exists", key);
+		return 0;
+	}
+
+	return *reg;
+}
+
+static int bpf_xfer_write_conf(u32 key, u32 value)
+{
+	if (bpf_map_update_elem(&bpf_xfer_conf, &key, &value,
+				BPF_EXIST)) {
+		bpf_printk("config key %d not exists", key);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int bpf_xfer_update_config(void)
+{
+	bpf_reg_mask = bpf_xfer_read_conf(BPF_CONF_REG_MASK);
+	bpf_reg_rshift = bpf_xfer_read_conf(BPF_CONF_REG_RSHIFT);
+	bpf_reg_lshift = bpf_xfer_read_conf(BPF_CONF_REG_LSHIFT);
+	bpf_reg_xbswap = bpf_xfer_read_conf(BPF_CONF_REG_XBSWAP);
+
+	return 0;
+}
+
+u8 bpf_xfer_reg_u8(u8 reg)
+{
+	reg = reg & (bpf_reg_mask ? bpf_reg_mask : 0xff);
+	if (bpf_reg_rshift)
+		reg = reg >> bpf_reg_rshift;
+	if (bpf_reg_lshift)
+		reg = reg << bpf_reg_lshift;
+	return reg;
+}
+
+u16 bpf_xfer_reg_u16(u16 reg)
+{
+	if (bpf_reg_xbswap)
+		reg = __builtin_bswap16(reg);
+	reg = reg & (bpf_reg_mask ? bpf_reg_mask : 0x7fff);
+	if (bpf_reg_rshift)
+		reg = reg >> bpf_reg_rshift;
+	if (bpf_reg_lshift)
+		reg = reg << bpf_reg_lshift;
+	return reg;
+}
+
+u32 bpf_xfer_reg_u24(u32 reg)
+{
+	if (bpf_reg_xbswap)
+		reg = __builtin_bswap32(reg);
+	reg = reg & (bpf_reg_mask ? bpf_reg_mask : 0x7fffff);
+	if (bpf_reg_rshift)
+		reg = reg >> bpf_reg_rshift;
+	if (bpf_reg_lshift)
+		reg = reg << bpf_reg_lshift;
+	return reg;
+}
+
+u32 bpf_xfer_reg_u32(u32 reg)
+{
+	if (bpf_reg_xbswap)
+		reg = __builtin_bswap32(reg);
+	reg = reg & (bpf_reg_mask ? bpf_reg_mask : 0x7fffffff);
+	if (bpf_reg_rshift)
+		reg = reg >> bpf_reg_rshift;
+	if (bpf_reg_lshift)
+		reg = reg << bpf_reg_lshift;
+	return reg;
+}
+#endif
-- 
2.34.1


  parent reply	other threads:[~2023-11-18 10:41 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-18 10:40 [PATCH -next 00/14] Implement a ligth weight device driver test framework Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 01/14] kddv/core: " Zhang Xiaoxu
2023-11-18 10:40 ` Zhang Xiaoxu [this message]
2023-11-18 10:40 ` [PATCH -next 03/14] kddv/core: Add io fault support to bpf program Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 04/14] kddv/core: Check kmsg before return from test case Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 05/14] kddv/core: Support kernel memory leak detector Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 06/14] kddv/core: Add page and slab fault inject support Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 07/14] kddv/cmd: Add command to create/remove mockup device Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 08/14] kddv/cmd: Add command to run testcases Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 09/14] kddv/core: Add test support for SPI driver Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 10/14] kddv/tests: Add support for testing hwmon driver Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 11/14] kddv/tests/hwmon: Add test cases for max31722 driver Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 12/14] kddv/tests: Add support for testing mtd driver Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 13/14] kddv/tests/mtd: Add test cases for mchp23k256 driver Zhang Xiaoxu
2023-11-18 10:40 ` [PATCH -next 14/14] kddv: Add document for kddv Zhang Xiaoxu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231118104040.386381-3-zhangxiaoxu@huaweicloud.com \
    --to=zhangxiaoxu@huaweicloud.com \
    --cc=broonie@kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=weiyongjun1@huawei.com \
    --cc=zhangxiaoxu5@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).