Lines Matching +full:test +full:- +full:cpu
1 // SPDX-License-Identifier: GPL-2.0-only
4 #include <linux/cpu.h>
17 * core will update results of the test.
27 * Number of TSC cycles that a logical CPU will wait for the other
28 * logical CPU on the core in the WRMSR(ACTIVATE_SCAN).
58 "Exceeded number of Logical Processors (LP) allowed to run Scan-At-Field concurrently",
64 static void message_not_tested(struct device *dev, int cpu, union ifs_status status) in message_not_tested() argument
67 dev_info(dev, "CPU(s) %*pbl: SCAN operation did not start. %s\n", in message_not_tested()
68 cpumask_pr_args(cpu_smt_mask(cpu)), in message_not_tested()
71 dev_info(dev, "CPU(s) %*pbl: software timeout during scan\n", in message_not_tested()
72 cpumask_pr_args(cpu_smt_mask(cpu))); in message_not_tested()
74 dev_info(dev, "CPU(s) %*pbl: %s\n", in message_not_tested()
75 cpumask_pr_args(cpu_smt_mask(cpu)), in message_not_tested()
78 dev_info(dev, "CPU(s) %*pbl: SCAN unknown status %llx\n", in message_not_tested()
79 cpumask_pr_args(cpu_smt_mask(cpu)), status.data); in message_not_tested()
83 static void message_fail(struct device *dev, int cpu, union ifs_status status) in message_fail() argument
93 …dev_err(dev, "CPU(s) %*pbl: could not execute from loaded scan image. Batch: %02x version: 0x%x\n", in message_fail()
94 cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version); in message_fail()
101 * repeats on a subsequent test, then it indicates an actual problem in in message_fail()
105 dev_err(dev, "CPU(s) %*pbl: test signature incorrect. Batch: %02x version: 0x%x\n", in message_fail()
106 cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version); in message_fail()
114 /* Signature for chunk is bad, or scan test failed */ in can_restart()
143 int cpu = smp_processor_id(); in doscan() local
147 /* Only the first logical CPU on a core reports result */ in doscan()
148 first = cpumask_first(cpu_smt_mask(cpu)); in doscan()
160 if (cpu == first) { in doscan()
172 * progress is made, and that the whole test completes in a reasonable time.
174 static void ifs_test_core(int cpu, struct device *dev) in ifs_test_core() argument
191 to_stop = ifsd->valid_chunks - 1; in ifs_test_core()
193 if (ifsd->generation) { in ifs_test_core()
211 stop_core_cpuslocked(cpu, doscan, msrvals); in ifs_test_core()
215 trace_ifs_status(cpu, to_start, to_stop, status.data); in ifs_test_core()
221 status_chunk = ifsd->generation ? status.gen2.chunk_num : status.gen0.chunk_num; in ifs_test_core()
224 if (--retries == 0) { in ifs_test_core()
231 if (ifsd->generation) in ifs_test_core()
240 ifsd->scan_details = status.data; in ifs_test_core()
243 ifsd->status = SCAN_TEST_FAIL; in ifs_test_core()
244 message_fail(dev, cpu, status); in ifs_test_core()
246 ifsd->status = SCAN_NOT_TESTED; in ifs_test_core()
247 message_not_tested(dev, cpu, status); in ifs_test_core()
249 ifsd->status = SCAN_TEST_PASS; in ifs_test_core()
257 * Simplified cpu sibling rendezvous loop based on microcode loader __wait_for_cpus()
261 int cpu = smp_processor_id(); in wait_for_sibling_cpu() local
262 const struct cpumask *smt_mask = cpu_smt_mask(cpu); in wait_for_sibling_cpu()
270 timeout -= SPINUNIT; in wait_for_sibling_cpu()
278 int cpu = smp_processor_id(); in do_array_test() local
282 * Only one logical CPU on a core needs to trigger the Array test via MSR write. in do_array_test()
284 first = cpumask_first(cpu_smt_mask(cpu)); in do_array_test()
286 if (cpu == first) { in do_array_test()
287 wrmsrl(MSR_ARRAY_BIST, command->data); in do_array_test()
288 /* Pass back the result of the test */ in do_array_test()
289 rdmsrl(MSR_ARRAY_BIST, command->data); in do_array_test()
298 static void ifs_array_test_core(int cpu, struct device *dev) in ifs_array_test_core() argument
316 stop_core_cpuslocked(cpu, do_array_test, &command); in ifs_array_test_core()
322 ifsd->scan_details = command.data; in ifs_array_test_core()
325 ifsd->status = SCAN_TEST_FAIL; in ifs_array_test_core()
327 ifsd->status = SCAN_NOT_TESTED; in ifs_array_test_core()
329 ifsd->status = SCAN_TEST_PASS; in ifs_array_test_core()
337 int cpu = smp_processor_id(); in do_array_test_gen1() local
340 first = cpumask_first(cpu_smt_mask(cpu)); in do_array_test_gen1()
342 if (cpu == first) { in do_array_test_gen1()
350 static void ifs_array_test_gen1(int cpu, struct device *dev) in ifs_array_test_gen1() argument
355 stop_core_cpuslocked(cpu, do_array_test_gen1, &status); in ifs_array_test_gen1()
356 ifsd->scan_details = status; in ifs_array_test_gen1()
359 ifsd->status = SCAN_TEST_FAIL; in ifs_array_test_gen1()
361 ifsd->status = SCAN_TEST_PASS; in ifs_array_test_gen1()
365 * Initiate per core test. It wakes up work queue threads on the target cpu and
366 * its sibling cpu. Once all sibling threads wake up, the scan test gets executed and
367 * wait for all sibling threads to finish the scan test.
369 int do_core_test(int cpu, struct device *dev) in do_core_test() argument
371 const struct ifs_test_caps *test = ifs_get_test_caps(dev); in do_core_test() local
375 /* Prevent CPUs from being taken offline during the scan test */ in do_core_test()
378 if (!cpu_online(cpu)) { in do_core_test()
379 dev_info(dev, "cannot test on the offline cpu %d\n", cpu); in do_core_test()
380 ret = -EINVAL; in do_core_test()
384 switch (test->test_num) { in do_core_test()
386 if (!ifsd->loaded) in do_core_test()
387 ret = -EPERM; in do_core_test()
389 ifs_test_core(cpu, dev); in do_core_test()
392 if (ifsd->array_gen == ARRAY_GEN0) in do_core_test()
393 ifs_array_test_core(cpu, dev); in do_core_test()
395 ifs_array_test_gen1(cpu, dev); in do_core_test()
398 ret = -EINVAL; in do_core_test()