Unverified Commit 72b96ee2 authored by Jithu Joseph's avatar Jithu Joseph Committed by Ilpo Järvinen
Browse files

platform/x86/intel/ifs: Gen2 Scan test support



Width of chunk related bitfields is ACTIVATE_SCAN and SCAN_STATUS MSRs
are different in newer IFS generation compared to gen0.

Make changes to scan test flow such that MSRs are populated
appropriately based on the generation supported by hardware.

Account for the 8/16 bit MSR bitfield width differences between gen0 and
newer generations for the scan test trace event too.

Signed-off-by: default avatarJithu Joseph <jithu.joseph@intel.com>
Reviewed-by: default avatarTony Luck <tony.luck@intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tested-by: default avatarPengfei Xu <pengfei.xu@intel.com>
Link: https://lore.kernel.org/r/20231005195137.3117166-5-jithu.joseph@intel.com


Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 07f47c01
Loading
Loading
Loading
Loading
+22 −6
Original line number Diff line number Diff line
@@ -199,9 +199,17 @@ union ifs_chunks_auth_status_gen2 {
union ifs_scan {
	u64	data;
	struct {
		u32	start	:8;
		u32	stop	:8;
		u32	rsvd	:16;
		union {
			struct {
				u8	start;
				u8	stop;
				u16	rsvd;
			} gen0;
			struct {
				u16	start;
				u16	stop;
			} gen2;
		};
		u32	delay	:31;
		u32	sigmce	:1;
	};
@@ -211,9 +219,17 @@ union ifs_scan {
union ifs_status {
	u64	data;
	struct {
		u32	chunk_num		:8;
		u32	chunk_stop_index	:8;
		u32	rsvd1			:16;
		union {
			struct {
				u8	chunk_num;
				u8	chunk_stop_index;
				u16	rsvd1;
			} gen0;
			struct {
				u16	chunk_num;
				u16	chunk_stop_index;
			} gen2;
		};
		u32	error_code		:8;
		u32	rsvd2			:22;
		u32	control_error		:1;
+22 −7
Original line number Diff line number Diff line
@@ -171,21 +171,31 @@ static void ifs_test_core(int cpu, struct device *dev)
	union ifs_status status;
	unsigned long timeout;
	struct ifs_data *ifsd;
	int to_start, to_stop;
	int status_chunk;
	u64 msrvals[2];
	int retries;

	ifsd = ifs_get_data(dev);

	activate.rsvd = 0;
	activate.gen0.rsvd = 0;
	activate.delay = IFS_THREAD_WAIT;
	activate.sigmce = 0;
	activate.start = 0;
	activate.stop = ifsd->valid_chunks - 1;
	to_start = 0;
	to_stop = ifsd->valid_chunks - 1;

	if (ifsd->generation) {
		activate.gen2.start = to_start;
		activate.gen2.stop = to_stop;
	} else {
		activate.gen0.start = to_start;
		activate.gen0.stop = to_stop;
	}

	timeout = jiffies + HZ / 2;
	retries = MAX_IFS_RETRIES;

	while (activate.start <= activate.stop) {
	while (to_start <= to_stop) {
		if (time_after(jiffies, timeout)) {
			status.error_code = IFS_SW_TIMEOUT;
			break;
@@ -196,13 +206,14 @@ static void ifs_test_core(int cpu, struct device *dev)

		status.data = msrvals[1];

		trace_ifs_status(cpu, activate, status);
		trace_ifs_status(cpu, to_start, to_stop, status.data);

		/* Some cases can be retried, give up for others */
		if (!can_restart(status))
			break;

		if (status.chunk_num == activate.start) {
		status_chunk = ifsd->generation ? status.gen2.chunk_num : status.gen0.chunk_num;
		if (status_chunk == to_start) {
			/* Check for forward progress */
			if (--retries == 0) {
				if (status.error_code == IFS_NO_ERROR)
@@ -211,7 +222,11 @@ static void ifs_test_core(int cpu, struct device *dev)
			}
		} else {
			retries = MAX_IFS_RETRIES;
			activate.start = status.chunk_num;
			if (ifsd->generation)
				activate.gen2.start = status_chunk;
			else
				activate.gen0.start = status_chunk;
			to_start = status_chunk;
		}
	}

+8 −8
Original line number Diff line number Diff line
@@ -10,25 +10,25 @@

TRACE_EVENT(ifs_status,

	TP_PROTO(int cpu, union ifs_scan activate, union ifs_status status),
	TP_PROTO(int cpu, int start, int stop, u64 status),

	TP_ARGS(cpu, activate, status),
	TP_ARGS(cpu, start, stop, status),

	TP_STRUCT__entry(
		__field(	u64,	status	)
		__field(	int,	cpu	)
		__field(	u8,	start	)
		__field(	u8,	stop	)
		__field(	u16,	start	)
		__field(	u16,	stop	)
	),

	TP_fast_assign(
		__entry->cpu	= cpu;
		__entry->start	= activate.start;
		__entry->stop	= activate.stop;
		__entry->status	= status.data;
		__entry->start	= start;
		__entry->stop	= stop;
		__entry->status	= status;
	),

	TP_printk("cpu: %d, start: %.2x, stop: %.2x, status: %llx",
	TP_printk("cpu: %d, start: %.4x, stop: %.4x, status: %.16llx",
		__entry->cpu,
		__entry->start,
		__entry->stop,