Lines Matching +full:firmware +full:- +full:initialised
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/arm-smccc.h>
36 * The call to use to reach the firmware.
43 /* entry point from firmware to arch asm code */
56 /* This pointer is handed to firmware as the event argument. */
97 if (err && (atomic_inc_return(&arg->errors) == 1)) in sdei_cross_call_return()
98 arg->first_error = err; in sdei_cross_call_return()
105 return -EOPNOTSUPP; in sdei_to_linux_errno()
107 return -EINVAL; in sdei_to_linux_errno()
109 return -EPERM; in sdei_to_linux_errno()
111 return -EINPROGRESS; in sdei_to_linux_errno()
113 return -ENOMEM; in sdei_to_linux_errno()
126 switch (res->a0) { in sdei_is_err()
154 * sdei_mark_interface_broken(). -EIO is not an error returned in invoke_sdei_fn()
158 err = -EIO; in invoke_sdei_fn()
176 if (e->event_num == event_num) { in sdei_event_find()
212 return ERR_PTR(-ENOMEM); in sdei_event_create()
214 INIT_LIST_HEAD(&event->list); in sdei_event_create()
215 event->event_num = event_num; in sdei_event_create()
223 event->priority = result; in sdei_event_create()
231 event->type = result; in sdei_event_create()
233 if (event->type == SDEI_EVENT_TYPE_SHARED) { in sdei_event_create()
237 return ERR_PTR(-ENOMEM); in sdei_event_create()
240 reg->event_num = event_num; in sdei_event_create()
241 reg->priority = event->priority; in sdei_event_create()
243 reg->callback = cb; in sdei_event_create()
244 reg->callback_arg = cb_arg; in sdei_event_create()
245 event->registered = reg; in sdei_event_create()
253 return ERR_PTR(-ENOMEM); in sdei_event_create()
259 reg->event_num = event->event_num; in sdei_event_create()
260 reg->priority = event->priority; in sdei_event_create()
261 reg->callback = cb; in sdei_event_create()
262 reg->callback_arg = cb_arg; in sdei_event_create()
265 event->private_registered = regs; in sdei_event_create()
269 kfree(event->registered); in sdei_event_create()
271 event = ERR_PTR(-EBUSY); in sdei_event_create()
274 list_add(&event->list, &sdei_list); in sdei_event_create()
286 list_del(&event->list); in sdei_event_destroy()
289 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_event_destroy()
290 kfree(event->registered); in sdei_event_destroy()
292 free_percpu(event->private_registered); in sdei_event_destroy()
309 if (err && err != -EIO) { in sdei_mask_local_cpu()
330 if (err && err != -EIO) { in sdei_unmask_local_cpu()
350 if (err && err != -EIO) in _ipi_private_reset()
363 pr_err("disabling SDEI firmware interface\n"); in sdei_mark_interface_broken()
396 err = sdei_api_event_enable(arg->event->event_num); in _local_event_enable()
403 int err = -EINVAL; in sdei_event_enable()
410 return -ENOENT; in sdei_event_enable()
415 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_event_enable()
416 err = sdei_api_event_enable(event->event_num); in sdei_event_enable()
422 event->reenable = true; in sdei_event_enable()
443 err = sdei_api_event_disable(arg->event->event_num); in _ipi_event_disable()
450 int err = -EINVAL; in sdei_event_disable()
457 return -ENOENT; in sdei_event_disable()
461 event->reenable = false; in sdei_event_disable()
464 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_event_disable()
465 err = sdei_api_event_disable(event->event_num); in sdei_event_disable()
488 err = sdei_api_event_unregister(arg->event->event_num); in _local_event_unregister()
497 if (event->type == SDEI_EVENT_TYPE_SHARED) in _sdei_event_unregister()
498 return sdei_api_event_unregister(event->event_num); in _sdei_event_unregister()
515 err = -ENOENT; in sdei_event_unregister()
520 event->reregister = false; in sdei_event_unregister()
521 event->reenable = false; in sdei_event_unregister()
537 * unregister events, but don't destroy them as they are re-registered by
548 if (event->type != SDEI_EVENT_TYPE_SHARED) in sdei_unregister_shared()
578 reg = per_cpu_ptr(arg->event->private_registered, smp_processor_id()); in _local_event_register()
579 err = sdei_api_event_register(arg->event->event_num, sdei_entry_point, in _local_event_register()
591 if (event->type == SDEI_EVENT_TYPE_SHARED) in _sdei_event_register()
592 return sdei_api_event_register(event->event_num, in _sdei_event_register()
594 event->registered, in _sdei_event_register()
615 err = -EBUSY; in sdei_event_register()
635 event->reregister = true; in sdei_event_register()
654 pr_err("Failed to re-register event %u\n", event->event_num); in sdei_reregister_event()
659 if (event->reenable) { in sdei_reregister_event()
660 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_reregister_event()
661 err = sdei_api_event_enable(event->event_num); in sdei_reregister_event()
667 pr_err("Failed to re-enable event %u\n", event->event_num); in sdei_reregister_event()
680 if (event->type != SDEI_EVENT_TYPE_SHARED) in sdei_reregister_shared()
683 if (event->reregister) { in sdei_reregister_shared()
700 /* un-register private events */ in sdei_cpuhp_down()
703 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_cpuhp_down()
707 /* call the cross-call function locally... */ in sdei_cpuhp_down()
711 event->event_num, arg.first_error); in sdei_cpuhp_down()
723 /* re-register/enable private events */ in sdei_cpuhp_up()
726 if (event->type == SDEI_EVENT_TYPE_SHARED) in sdei_cpuhp_up()
729 if (event->reregister) { in sdei_cpuhp_up()
731 /* call the cross-call function locally... */ in sdei_cpuhp_up()
734 pr_err("Failed to re-register event %u: %d\n", in sdei_cpuhp_up()
735 event->event_num, arg.first_error); in sdei_cpuhp_up()
738 if (event->reenable) { in sdei_cpuhp_up()
742 pr_err("Failed to re-enable event %u: %d\n", in sdei_cpuhp_up()
743 event->event_num, arg.first_error); in sdei_cpuhp_up()
796 * The sequence is freeze->thaw. Reboot. freeze->restore. We unregister
797 * events during freeze, then re-register and re-enable them during thaw
818 /* re-register shared events */ in sdei_device_thaw()
821 pr_warn("Failed to re-register shared events...\n"); in sdei_device_thaw()
829 pr_warn("Failed to re-register CPU hotplug notifier...\n"); in sdei_device_thaw()
893 struct device_node *np = pdev->dev.of_node; in sdei_get_conduit()
935 if (err == -EOPNOTSUPP) in sdei_probe()
936 pr_err("advertised but not implemented in platform firmware\n"); in sdei_probe()
943 pr_info("SDEIv%d.%d (0x%x) detected in firmware.\n", in sdei_probe()
950 return -EINVAL; in sdei_probe()
997 { .compatible = "arm,sdei-1.0" },
1014 fw_np = of_find_node_by_name(NULL, "firmware"); in sdei_present_dt()
1062 * its events. ACPI is initialised from a subsys_initcall(), GHES is initialised
1072 u32 event_num = arg->event_num; in sdei_event_handler()
1077 err = arg->callback(event_num, regs, arg->callback_arg); in sdei_event_handler()