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.
40 * Number of TSC cycles that a logical CPU will wait for the other
41 * logical CPU on the core in the WRMSR(ACTIVATE_SCAN).
71 "Exceeded number of Logical Processors (LP) allowed to run Scan-At-Field concurrently",
77 static void message_not_tested(struct device *dev, int cpu, union ifs_status status) in message_not_tested() argument
87 dev_warn(dev, "CPU(s) %*pbl: Scan controller error. Batch: %02x version: 0x%x\n", in message_not_tested()
88 cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version); in message_not_tested()
93 dev_info(dev, "CPU(s) %*pbl: SCAN operation did not start. %s\n", in message_not_tested()
94 cpumask_pr_args(cpu_smt_mask(cpu)), in message_not_tested()
97 dev_info(dev, "CPU(s) %*pbl: software timeout during scan\n", in message_not_tested()
98 cpumask_pr_args(cpu_smt_mask(cpu))); in message_not_tested()
100 dev_info(dev, "CPU(s) %*pbl: %s\n", in message_not_tested()
101 cpumask_pr_args(cpu_smt_mask(cpu)), in message_not_tested()
104 dev_info(dev, "CPU(s) %*pbl: SCAN unknown status %llx\n", in message_not_tested()
105 cpumask_pr_args(cpu_smt_mask(cpu)), status.data); in message_not_tested()
109 static void message_fail(struct device *dev, int cpu, union ifs_status status) in message_fail() argument
117 * repeats on a subsequent test, then it indicates an actual problem in in message_fail()
121 dev_err(dev, "CPU(s) %*pbl: test signature incorrect. Batch: %02x version: 0x%x\n", in message_fail()
122 cpumask_pr_args(cpu_smt_mask(cpu)), ifsd->cur_batch, ifsd->loaded_version); in message_fail()
130 /* Signature for chunk is bad, or scan test failed */ in can_restart()
159 * Simplified cpu sibling rendezvous loop based on microcode loader __wait_for_cpus()
163 int cpu = smp_processor_id(); in wait_for_sibling_cpu() local
164 const struct cpumask *smt_mask = cpu_smt_mask(cpu); in wait_for_sibling_cpu()
172 timeout -= SPINUNIT; in wait_for_sibling_cpu()
183 int cpu = smp_processor_id(), start, stop; in doscan() local
189 ifsd = params->ifsd; in doscan()
191 if (ifsd->generation) { in doscan()
192 start = params->activate->gen2.start; in doscan()
193 stop = params->activate->gen2.stop; in doscan()
195 start = params->activate->gen0.start; in doscan()
196 stop = params->activate->gen0.stop; in doscan()
199 /* Only the first logical CPU on a core reports result */ in doscan()
200 first = cpumask_first(cpu_smt_mask(cpu)); in doscan()
212 wrmsrl(MSR_ACTIVATE_SCAN, params->activate->data); in doscan()
215 trace_ifs_status(ifsd->cur_batch, start, stop, status.data); in doscan()
218 if (cpu == first) in doscan()
219 params->status = status; in doscan()
228 * progress is made, and that the whole test completes in a reasonable time.
230 static void ifs_test_core(int cpu, struct device *dev) in ifs_test_core() argument
247 to_stop = ifsd->valid_chunks - 1; in ifs_test_core()
251 if (ifsd->generation) { in ifs_test_core()
270 stop_core_cpuslocked(cpu, doscan, &params); in ifs_test_core()
278 status_chunk = ifsd->generation ? status.gen2.chunk_num : status.gen0.chunk_num; in ifs_test_core()
281 if (--retries == 0) { in ifs_test_core()
288 if (ifsd->generation) in ifs_test_core()
297 ifsd->scan_details = status.data; in ifs_test_core()
300 ifsd->status = SCAN_TEST_FAIL; in ifs_test_core()
301 message_fail(dev, cpu, status); in ifs_test_core()
303 ifsd->status = SCAN_NOT_TESTED; in ifs_test_core()
304 message_not_tested(dev, cpu, status); in ifs_test_core()
306 ifsd->status = SCAN_TEST_PASS; in ifs_test_core()
313 int cpu = smp_processor_id(); in do_array_test() local
319 * Only one logical CPU on a core needs to trigger the Array test via MSR write. in do_array_test()
321 first = cpumask_first(cpu_smt_mask(cpu)); in do_array_test()
323 if (cpu == first) { in do_array_test()
324 wrmsrl(MSR_ARRAY_BIST, command->data); in do_array_test()
325 /* Pass back the result of the test */ in do_array_test()
326 rdmsrl(MSR_ARRAY_BIST, command->data); in do_array_test()
332 static void ifs_array_test_core(int cpu, struct device *dev) in ifs_array_test_core() argument
350 stop_core_cpuslocked(cpu, do_array_test, &command); in ifs_array_test_core()
356 ifsd->scan_details = command.data; in ifs_array_test_core()
359 ifsd->status = SCAN_TEST_FAIL; in ifs_array_test_core()
361 ifsd->status = SCAN_NOT_TESTED; in ifs_array_test_core()
363 ifsd->status = SCAN_TEST_PASS; in ifs_array_test_core()
371 int cpu = smp_processor_id(); in do_array_test_gen1() local
374 first = cpumask_first(cpu_smt_mask(cpu)); in do_array_test_gen1()
376 if (cpu == first) { in do_array_test_gen1()
384 static void ifs_array_test_gen1(int cpu, struct device *dev) in ifs_array_test_gen1() argument
389 stop_core_cpuslocked(cpu, do_array_test_gen1, &status); in ifs_array_test_gen1()
390 ifsd->scan_details = status; in ifs_array_test_gen1()
393 ifsd->status = SCAN_TEST_FAIL; in ifs_array_test_gen1()
395 ifsd->status = SCAN_TEST_PASS; in ifs_array_test_gen1()
424 [IFS_SBAF_INVALID_BUNDLE_INDEX] = "Non-valid sbaf bundles. Reload test image",
428 …NCURRENT] = "Exceeded number of Logical Processors (LP) allowed to run Scan-At-Field concurrently",
435 static void sbaf_message_not_tested(struct device *dev, int cpu, u64 status_data) in sbaf_message_not_tested() argument
440 dev_info(dev, "CPU(s) %*pbl: SBAF operation did not start. %s\n", in sbaf_message_not_tested()
441 cpumask_pr_args(cpu_smt_mask(cpu)), in sbaf_message_not_tested()
444 dev_info(dev, "CPU(s) %*pbl: software timeout during scan\n", in sbaf_message_not_tested()
445 cpumask_pr_args(cpu_smt_mask(cpu))); in sbaf_message_not_tested()
447 dev_info(dev, "CPU(s) %*pbl: %s\n", in sbaf_message_not_tested()
448 cpumask_pr_args(cpu_smt_mask(cpu)), in sbaf_message_not_tested()
451 dev_info(dev, "CPU(s) %*pbl: SBAF unknown status %llx\n", in sbaf_message_not_tested()
452 cpumask_pr_args(cpu_smt_mask(cpu)), status.data); in sbaf_message_not_tested()
456 static void sbaf_message_fail(struct device *dev, int cpu, union ifs_sbaf_status status) in sbaf_message_fail() argument
460 dev_err(dev, "CPU(s) %*pbl: Failed signature check\n", in sbaf_message_fail()
461 cpumask_pr_args(cpu_smt_mask(cpu))); in sbaf_message_fail()
464 /* Failed to reach end of test */ in sbaf_message_fail()
466 dev_err(dev, "CPU(s) %*pbl: Failed to complete test\n", in sbaf_message_fail()
467 cpumask_pr_args(cpu_smt_mask(cpu))); in sbaf_message_fail()
480 /* Signature for chunk is bad, or scan test failed */ in sbaf_can_restart()
506 * Execute the SBAF test. Called "simultaneously" on all threads of a core
512 int cpu = smp_processor_id(); in dosbaf() local
517 ifsd = run_params->ifsd; in dosbaf()
519 /* Only the first logical CPU on a core reports result */ in dosbaf()
520 first = cpumask_first(cpu_smt_mask(cpu)); in dosbaf()
526 * starts scan of each requested bundle. The core test happens in dosbaf()
529 wrmsrl(MSR_ACTIVATE_SBAF, run_params->activate->data); in dosbaf()
531 trace_ifs_sbaf(ifsd->cur_batch, *run_params->activate, status); in dosbaf()
533 /* Pass back the result of the test */ in dosbaf()
534 if (cpu == first) in dosbaf()
535 run_params->status = status; in dosbaf()
540 static void ifs_sbaf_test_core(int cpu, struct device *dev) in ifs_sbaf_test_core() argument
558 stop_bundle = ifsd->max_bundle; in ifs_sbaf_test_core()
571 stop_core_cpuslocked(cpu, dosbaf, &run_params); in ifs_sbaf_test_core()
588 if (--retries == 0) { in ifs_sbaf_test_core()
602 ifsd->scan_details = status.data; in ifs_sbaf_test_core()
606 ifsd->status = SCAN_TEST_FAIL; in ifs_sbaf_test_core()
607 sbaf_message_fail(dev, cpu, status); in ifs_sbaf_test_core()
610 ifsd->status = SCAN_NOT_TESTED; in ifs_sbaf_test_core()
611 sbaf_message_not_tested(dev, cpu, status.data); in ifs_sbaf_test_core()
613 ifsd->status = SCAN_TEST_PASS; in ifs_sbaf_test_core()
618 * Initiate per core test. It wakes up work queue threads on the target cpu and
619 * its sibling cpu. Once all sibling threads wake up, the scan test gets executed and
620 * wait for all sibling threads to finish the scan test.
622 int do_core_test(int cpu, struct device *dev) in do_core_test() argument
624 const struct ifs_test_caps *test = ifs_get_test_caps(dev); in do_core_test() local
628 /* Prevent CPUs from being taken offline during the scan test */ in do_core_test()
631 if (!cpu_online(cpu)) { in do_core_test()
632 dev_info(dev, "cannot test on the offline cpu %d\n", cpu); in do_core_test()
633 ret = -EINVAL; in do_core_test()
637 switch (test->test_num) { in do_core_test()
639 if (!ifsd->loaded) in do_core_test()
640 ret = -EPERM; in do_core_test()
642 ifs_test_core(cpu, dev); in do_core_test()
645 if (ifsd->array_gen == ARRAY_GEN0) in do_core_test()
646 ifs_array_test_core(cpu, dev); in do_core_test()
648 ifs_array_test_gen1(cpu, dev); in do_core_test()
651 if (!ifsd->loaded) in do_core_test()
652 ret = -EPERM; in do_core_test()
654 ifs_sbaf_test_core(cpu, dev); in do_core_test()
657 ret = -EINVAL; in do_core_test()