Re: [PATCH] rfim: add new test for verifying RFIM sysfs interface

Andrea Cervesato via ltp <[email protected]>
Newsgroups gmane.linux.ltp
Message-ID <[email protected]>
Hi Piotr,

> diff --git a/runtest/power_management_tests b/runtest/power_management_tests
> index 4da57ee72..8ebbcff84 100644
> --- a/runtest/power_management_tests
> +++ b/runtest/power_management_tests
> @@ -1,5 +1,6 @@
>  #POWER_MANAGEMENT
>  high_freq_hwp_cap_cppc high_freq_hwp_cap_cppc
> +rfim rfim

Use rfim01 instead. We might want to add more tests in the future.

>  runpwtests03 runpwtests03.sh
>  runpwtests04 runpwtests04.sh
>  runpwtests06 runpwtests06.sh
> diff --git a/testcases/kernel/power_management/.gitignore b/testcases/kernel/power_management/.gitignore
> index 03f0c83e4..ecc2931fa 100644
> --- a/testcases/kernel/power_management/.gitignore
> +++ b/testcases/kernel/power_management/.gitignore
> @@ -1 +1,2 @@
>  high_freq_hwp_cap_cppc
> +rfim
> diff --git a/testcases/kernel/power_management/rfim.c b/testcases/kernel/power_management/rfim.c
> new file mode 100644
> index 000000000..06bc144a2
> --- /dev/null
> +++ b/testcases/kernel/power_management/rfim.c
> @@ -0,0 +1,165 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2026 Piotr Kubaj <[email protected]>
> + */
> +
> +/*\
> + * Validate presence and permissions of RFIM attributes.
> + * The test checks first validity of general RFIM attributes,
> + * and then checks either DLVR or FIVR, depending on hardware.
> + */
> +
> +#include "tst_test.h"
> +
> +#define RFIM_ROOT "/sys/bus/pci/devices/0000:00:04.0"
> +
> +enum rfim_variant {
> +	RFIM_FIVR,
> +	RFIM_DLVR,
> +};
> +
> +static enum rfim_variant variant;
> +
> +static void setup(void)
> +{
> +	struct stat stats;
> +
> +	if (!stat(RFIM_ROOT"/dlvr", &stats)) {
> +		if (S_ISDIR(stats.st_mode))
> +			variant = RFIM_DLVR;
> +		else
> +			tst_brk(TBROK, "%s exists but is not a directory", RFIM_ROOT"/dlvr");
> +	} else if (!stat(RFIM_ROOT"/fivr", &stats)) {
> +		if (S_ISDIR(stats.st_mode))
> +			variant = RFIM_FIVR;
> +		else
> +			tst_brk(TBROK, "%s exists but is not a directory", RFIM_ROOT"/fivr");
> +	} else
> +		tst_brk(TCONF, "Neither %s nor %s exists", RFIM_ROOT"/dlvr", RFIM_ROOT"/fivr");

Avoid too many nesting. Use if() -> TBROK or TCONF, instead of having else
everywhere. First, handle the error, then proceed with the test.

> +}
> +
> +static void check_read_only(const char *path)
> +{
> +	tst_res(TDEBUG, "Checking whether %s is read-only", path);
> +
> +	if (access(path, F_OK)) {
> +		tst_res(TFAIL | TERRNO, "%s does not exist", path);
> +		return;
> +	}
> +
> +	int fd = open(path, O_RDONLY);
> +
> +	if (fd == -1) {
> +		tst_res(TFAIL | TERRNO, "%s can't be read", path);
> +		return;
> +	}
> +	close(fd);
> +
> +	fd = open(path, O_WRONLY);
> +	if (fd != -1) {
> +		close(fd);
> +		tst_res(TFAIL, "%s is writable", path);
> +		return;
> +	}
> +
> +	tst_res(TPASS, "%s is read-only", path);
> +}

This function can be easily replaced by access().

TST_EXP_PASS(access(path, R_OK));
TST_EXP_FAIL(access(path, W_OK), ..);

> +
> +static void check_read_write(const char *path)
> +{
> +	tst_res(TDEBUG, "Checking whether %s is read-write", path);
> +
> +	if (access(path, F_OK)) {
> +		tst_res(TFAIL | TERRNO, "%s does not exist", path);

TERRNO already show the message. Either you use TERRNO or you specify
a message error by hand, not both. This is valid in general for all
other messages as well.

> +		return;
> +	}
> +
> +	int fd = open(path, O_RDWR);
> +
> +	if (fd != -1) {
> +		close(fd);
> +		tst_res(TPASS, "%s is read-write", path);
> +	} else
> +		tst_res(TFAIL | TERRNO, "%s is not read-write", path);
> +}

This one as well can be replaced with access().

> +
> +static void run(void)
> +{
> +	const char * const fivr_nodes[] = {
> +		RFIM_ROOT"/fivr/vco_ref_code_lo",
> +		RFIM_ROOT"/fivr/vco_ref_code_hi",
> +		RFIM_ROOT"/fivr/spread_spectrum_pct",
> +		RFIM_ROOT"/fivr/spread_spectrum_clk_enable",
> +		RFIM_ROOT"/fivr/rfi_vco_ref_code",
> +		RFIM_ROOT"/fivr/fivr_fffc_rev",
> +		NULL
> +	};
> +
> +	const char * const ro_general_nodes[] = {
> +		RFIM_ROOT"/dvfs/ddr_data_rate_point_0",
> +		RFIM_ROOT"/dvfs/ddr_data_rate_point_1",
> +		RFIM_ROOT"/dvfs/ddr_data_rate_point_2",
> +		RFIM_ROOT"/dvfs/ddr_data_rate_point_3",
> +		NULL
> +	};
> +
> +	const char * const ro_dlvr_nodes[] = {
> +		RFIM_ROOT"/dlvr/dlvr_hardware_rev",
> +		RFIM_ROOT"/dlvr/dlvr_freq_mhz",
> +		RFIM_ROOT"/dlvr/dlvr_pll_busy",
> +		NULL
> +	};
> +
> +	const char * const rw_dlvr_nodes[] = {
> +		RFIM_ROOT"/dlvr/dlvr_freq_select",
> +		RFIM_ROOT"/dlvr/dlvr_rfim_enable",
> +		RFIM_ROOT"/dlvr/dlvr_spread_spectrum_pct",
> +		RFIM_ROOT"/dlvr/dlvr_control_mode",
> +		RFIM_ROOT"/dlvr/dlvr_control_lock",
> +		NULL
> +	};
> +
> +	const char * const rw_general_nodes[] = {
> +		RFIM_ROOT"/dvfs/rfi_restriction_run_busy",
> +		RFIM_ROOT"/dvfs/rfi_restriction_err_code",
> +		RFIM_ROOT"/dvfs/rfi_restriction_data_rate_base",
> +		RFIM_ROOT"/dvfs/rfi_restriction_data_rate",
> +		NULL
> +	};

Please define them out as static arrays.

Regards,
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato-IBi9RG/[email protected]

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.