Lines Matching +full:read +full:- +full:to +full:- +full:read
1 // SPDX-License-Identifier: GPL-2.0-only
12 #include <on-cpus.h>
24 #include "sbi-tests.h"
118 return sse_event_get_info(event_id)->name; in sse_event_name()
123 return sse_event_get_info(event_id)->can_inject; in sse_event_can_inject()
158 unsigned long current_hart = current_thread_info()->hartid; in sse_global_event_set_current_hart()
195 * always be decremented before storing anything on it in sse-entry.S. in sse_alloc_stack()
204 free_page(stack - SSE_STACK_SIZE); in sse_free_stack()
213 sbiret_report_error(&ret, expected_error, "Read %s error", str); in sse_read_write_test()
240 sbiret_report_error(&ret, SBI_SUCCESS, "Read multiple attributes"); in sse_test_attrs()
246 sbiret_report_error(&ret, SBI_SUCCESS, "Read single attribute %s", attr_name); in sse_test_attrs()
248 …report_fail("Attribute 0x%x single value read (0x%lx) differs from the one read with multiple attr… in sse_test_attrs()
256 * but other bits are zero-initialized. in sse_test_attrs()
284 /* Set Hart on local event -> RO */ in sse_test_attrs()
285 value = current_thread_info()->hartid; in sse_test_attrs()
297 value = ARRAY_SIZE(interrupted_attrs) - i; in sse_test_attrs()
324 sbiret_report_error(&ret, SBI_ERR_INVALID_STATE, "unregister non-registered event"); in sse_test_register_error()
361 struct alias_test_params *write, *read; in test_alias() local
378 ret = sbi_sse_write_attrs(write->event_id, write->attr_id, write->attr_count, &write_value); in test_alias()
381 write->str, write->event_id, write->attr_id, write->attr_count); in test_alias()
384 read = ¶ms[r]; in test_alias()
386 ret = sbi_sse_read_attrs(read->event_id, read->attr_id, read->attr_count, &read_value); in test_alias()
389 "Read %s, event 0x%lx attr 0x%lx, attr count 0x%lx", in test_alias()
390 read->str, read->event_id, read->attr_id, read->attr_count); in test_alias()
396 "Read %s, event 0x%lx attr 0x%lx, attr count 0x%lx value %lx", in test_alias()
397 write->str, write->event_id, write->attr_id, in test_alias()
398 write->attr_count, write_value, read->str, in test_alias()
399 read->event_id, read->attr_id, read->attr_count, in test_alias()
416 uint32_t event_id = READ_ONCE(arg->event_id), attr; in sse_simple_handler()
422 report((regs->status & SR_SPP) == SR_SPP, "Interrupted S-mode"); in sse_simple_handler()
423 report(hartid == current_thread_info()->hartid, "Hartid correctly passed"); in sse_simple_handler()
427 /* Read full interrupted state */ in sse_simple_handler()
432 /* Write full modified state and read it */ in sse_simple_handler()
440 sbiret_report_error(&ret, SBI_SUCCESS, "Read full modified state from handler"); in sse_simple_handler()
508 /* Try to change HARTID/Priority while running */ in sse_simple_handler()
510 value = current_thread_info()->hartid; in sse_simple_handler()
519 value = READ_ONCE(arg->expected_a6); in sse_simple_handler()
527 WRITE_ONCE(arg->done, true); in sse_simple_handler()
575 ret = sbi_sse_inject(event_id, current_thread_info()->hartid); in sse_test_inject_simple()
584 * When unmasking the SSE events, we expect it to be injected in sse_test_inject_simple()
614 ret = sbi_sse_inject(event_id, current_thread_info()->hartid); in sse_test_inject_simple()
669 /* For arg content to be visible */ in sse_foreign_cpu_handler()
671 expected_cpu = READ_ONCE(arg->expected_cpu); in sse_foreign_cpu_handler()
672 report(expected_cpu == current_thread_info()->cpu, in sse_foreign_cpu_handler()
673 "Received event on CPU (%d), expected CPU (%d)", current_thread_info()->cpu, in sse_foreign_cpu_handler()
676 WRITE_ONCE(arg->done, true); in sse_foreign_cpu_handler()
677 /* For arg update to be visible for other CPUs */ in sse_foreign_cpu_handler()
692 struct sse_local_per_cpu *cpu_arg = &cpu_args[current_thread_info()->cpu]; in sse_register_enable_local()
693 uint32_t event_id = cpu_arg->handler_arg.event_id; in sse_register_enable_local()
695 ret = sbi_sse_register(event_id, &cpu_arg->args); in sse_register_enable_local()
696 WRITE_ONCE(cpu_arg->ret, ret); in sse_register_enable_local()
699 cpu_arg->state = SBI_SSE_STATE_REGISTERED; in sse_register_enable_local()
702 WRITE_ONCE(cpu_arg->ret, ret); in sse_register_enable_local()
705 cpu_arg->state = SBI_SSE_STATE_ENABLED; in sse_register_enable_local()
712 struct sse_local_per_cpu *cpu_arg = &cpu_args[current_thread_info()->cpu]; in sbi_sse_disable_unregister_local()
713 uint32_t event_id = cpu_arg->handler_arg.event_id; in sbi_sse_disable_unregister_local()
715 switch (cpu_arg->state) { in sbi_sse_disable_unregister_local()
718 WRITE_ONCE(cpu_arg->ret, ret); in sbi_sse_disable_unregister_local()
723 WRITE_ONCE(cpu_arg->ret, ret); in sbi_sse_disable_unregister_local()
756 cpu_arg->handler_arg.event_id = event_id; in sse_test_inject_local()
757 cpu_arg->args.stack = sse_alloc_stack(); in sse_test_inject_local()
758 cpu_arg->args.handler = sse_foreign_cpu_handler; in sse_test_inject_local()
759 cpu_arg->args.handler_data = (void *)&cpu_arg->handler_arg; in sse_test_inject_local()
760 cpu_arg->state = SBI_SSE_STATE_UNUSED; in sse_test_inject_local()
766 ret = cpu_arg->ret; in sse_test_inject_local()
768 report_fail("CPU failed to register/enable event: %ld", ret.error); in sse_test_inject_local()
772 handler_arg = &cpu_arg->handler_arg; in sse_test_inject_local()
773 WRITE_ONCE(handler_arg->expected_cpu, cpu); in sse_test_inject_local()
774 /* For handler_arg content to be visible for other CPUs */ in sse_test_inject_local()
778 report_fail("CPU failed to inject event: %ld", ret.error); in sse_test_inject_local()
788 while (!READ_ONCE(handler_arg->done) && timer_get_cycles() < timeout) { in sse_test_inject_local()
789 /* For handler_arg update to be visible */ in sse_test_inject_local()
793 report(READ_ONCE(handler_arg->done), "Event handled"); in sse_test_inject_local()
794 WRITE_ONCE(handler_arg->done, false); in sse_test_inject_local()
801 ret = READ_ONCE(cpu_arg->ret); in sse_test_inject_local()
803 report_fail("CPU failed to disable/unregister event: %ld", ret.error); in sse_test_inject_local()
808 sse_free_stack(cpu_arg->args.stack); in sse_test_inject_local()
822 WRITE_ONCE(test_arg->expected_cpu, cpu); in sse_test_inject_global_cpu()
823 /* For test_arg content to be visible for other CPUs */ in sse_test_inject_global_cpu()
840 while (!READ_ONCE(test_arg->done) && timer_get_cycles() < timeout) { in sse_test_inject_global_cpu()
846 report(READ_ONCE(test_arg->done), "event handler called"); in sse_test_inject_global_cpu()
847 WRITE_ONCE(test_arg->done, false); in sse_test_inject_global_cpu()
850 /* Wait for event to be back in ENABLED state */ in sse_test_inject_global_cpu()
906 struct priority_test_arg *next = targ->next_event_arg; in sse_hi_priority_test_handler()
908 targ->called = true; in sse_hi_priority_test_handler()
910 sbi_sse_inject(next->event_id, current_thread_info()->hartid); in sse_hi_priority_test_handler()
912 report(!sse_event_pending(next->event_id), "Higher priority event is not pending"); in sse_hi_priority_test_handler()
913 report(next->called, "Higher priority event was handled"); in sse_hi_priority_test_handler()
921 struct priority_test_arg *next = targ->next_event_arg; in sse_low_priority_test_handler()
923 targ->called = true; in sse_low_priority_test_handler()
926 sbi_sse_inject(next->event_id, current_thread_info()->hartid); in sse_low_priority_test_handler()
928 report(sse_event_pending(next->event_id), "Lower priority event is pending"); in sse_low_priority_test_handler()
929 report(!next->called, "Lower priority event %s was not handled before %s", in sse_low_priority_test_handler()
930 sse_event_name(next->event_id), sse_event_name(targ->event_id)); in sse_low_priority_test_handler()
954 arg->state = SBI_SSE_STATE_UNUSED; in sse_test_injection_priority_arg()
955 event_id = arg->event_id; in sse_test_injection_priority_arg()
961 event_args->stack = 0; in sse_test_injection_priority_arg()
971 event_id = arg->event_id; in sse_test_injection_priority_arg()
975 event_arg->handler = handler; in sse_test_injection_priority_arg()
976 event_arg->handler_data = (void *)arg; in sse_test_injection_priority_arg()
977 event_arg->stack = stack; in sse_test_injection_priority_arg()
979 if (i < (args_size - 1)) in sse_test_injection_priority_arg()
980 arg->next_event_arg = args[i + 1]; in sse_test_injection_priority_arg()
982 arg->next_event_arg = NULL; in sse_test_injection_priority_arg()
997 arg->state = SBI_SSE_STATE_REGISTERED; in sse_test_injection_priority_arg()
999 value = arg->prio; in sse_test_injection_priority_arg()
1012 arg->state = SBI_SSE_STATE_ENABLED; in sse_test_injection_priority_arg()
1016 ret = sbi_sse_inject(args[0]->event_id, current_thread_info()->hartid); in sse_test_injection_priority_arg()
1021 report(arg->called, "Event %s handler called", sse_event_name(args[i]->event_id)); in sse_test_injection_priority_arg()
1026 event_id = arg->event_id; in sse_test_injection_priority_arg()
1028 switch (arg->state) { in sse_test_injection_priority_arg()
1046 if (event_arg->stack) in sse_test_injection_priority_arg()
1047 sse_free_stack(event_arg->stack); in sse_test_injection_priority_arg()
1146 "read attr event_id 0x%lx", event_id); in test_invalid_event_id()
1206 unsigned long event_id = info->event_id; in run_inject_test()
1208 if (!info->can_inject) { in run_inject_test()
1255 event_id = info->event_id; in check_sse()
1256 report_prefix_push(info->name); in check_sse()
1257 sse_check_event_availability(event_id, &info->can_inject, &supported); in check_sse()