Lines Matching +full:use +full:- +full:handshake
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Re-worked to expose sysfs APIs by mikew@google.com (Mike Waychison)
19 #include <linux/dma-mapping.h>
40 #define GSMI_SHUTDOWN_DIE 4 /* Die -- No longer meaningful */
131 * Some platforms don't have explicit SMI handshake
138 "The number of loop iterations to use when using the spin handshake.");
142 * avoid any side-effects of generating an SMI for S0ix logging, use the S0ix
160 smibuf->start = dma_pool_alloc(gsmi_dev.dma_pool, GFP_KERNEL, in gsmi_buf_alloc()
161 &smibuf->handle); in gsmi_buf_alloc()
162 if (!smibuf->start) { in gsmi_buf_alloc()
169 smibuf->length = GSMI_BUF_SIZE; in gsmi_buf_alloc()
170 smibuf->address = (u32)virt_to_phys(smibuf->start); in gsmi_buf_alloc()
178 if (smibuf->start) in gsmi_buf_free()
179 dma_pool_free(gsmi_dev.dma_pool, smibuf->start, in gsmi_buf_free()
180 smibuf->handle); in gsmi_buf_free()
187 * in-kernel errnos (0 on success, -ERRNO on error).
218 "b" (gsmi_dev.param_buf->address) in gsmi_exec()
224 * hundred-ish usecs to ensure the SMI has triggered. in gsmi_exec()
232 "b" (gsmi_dev.param_buf->address), in gsmi_exec()
247 "b" (gsmi_dev.param_buf->address) in gsmi_exec()
262 rc = -EINVAL; in gsmi_exec()
266 rc = -ENOMEM; in gsmi_exec()
273 rc = -ENOSYS; in gsmi_exec()
277 rc = -EBUSY; in gsmi_exec()
281 rc = -EFAULT; in gsmi_exec()
285 rc = -ENOENT; in gsmi_exec()
289 rc = -ENOSPC; in gsmi_exec()
299 rc = -ENXIO; in gsmi_exec()
315 .name_ptr = gsmi_dev.name_buf->address, in gsmi_get_variable()
316 .data_ptr = gsmi_dev.data_buf->address, in gsmi_get_variable()
332 /* variable name, already in UTF-16 */ in gsmi_get_variable()
333 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length); in gsmi_get_variable()
334 memcpy(gsmi_dev.name_buf->start, name, name_len * 2); in gsmi_get_variable()
337 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_get_variable()
340 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_get_variable()
341 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_get_variable()
352 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param)); in gsmi_get_variable()
356 gsmi_dev.data_buf->length); in gsmi_get_variable()
360 memcpy(data, gsmi_dev.data_buf->start, *data_size); in gsmi_get_variable()
379 .name_ptr = gsmi_dev.name_buf->address, in gsmi_get_next_variable()
380 .name_len = gsmi_dev.name_buf->length, in gsmi_get_next_variable()
390 /* Let's make sure the thing is at least null-terminated */ in gsmi_get_next_variable()
399 /* variable name, already in UTF-16 */ in gsmi_get_next_variable()
400 memcpy(gsmi_dev.name_buf->start, name, *name_size); in gsmi_get_next_variable()
403 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_get_next_variable()
404 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_get_next_variable()
411 /* variable not found -- end of list */ in gsmi_get_next_variable()
415 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param)); in gsmi_get_next_variable()
418 memcpy(name, gsmi_dev.name_buf->start, GSMI_BUF_SIZE); in gsmi_get_next_variable()
438 .name_ptr = gsmi_dev.name_buf->address, in gsmi_set_variable()
439 .data_ptr = gsmi_dev.data_buf->address, in gsmi_set_variable()
458 /* variable name, already in UTF-16 */ in gsmi_set_variable()
459 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length); in gsmi_set_variable()
460 memcpy(gsmi_dev.name_buf->start, name, name_len * 2); in gsmi_set_variable()
463 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_set_variable()
464 memcpy(gsmi_dev.data_buf->start, data, data_size); in gsmi_set_variable()
467 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_set_variable()
468 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_set_variable()
494 .data_ptr = gsmi_dev.data_buf->address, in eventlog_write()
501 return -EINVAL; in eventlog_write()
506 if ((count - sizeof(u32)) > gsmi_dev.data_buf->length) in eventlog_write()
507 return -EINVAL; in eventlog_write()
508 param.data_len = count - sizeof(u32); in eventlog_write()
513 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in eventlog_write()
514 memcpy(gsmi_dev.data_buf->start, buf, param.data_len); in eventlog_write()
517 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in eventlog_write()
518 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in eventlog_write()
556 return -EINVAL; in gsmi_clear_eventlog_store()
565 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_clear_eventlog_store()
566 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_clear_eventlog_store()
592 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_clear_config_store()
637 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_shutdown_reason()
638 memcpy(gsmi_dev.data_buf->start, &entry, sizeof(entry)); in gsmi_shutdown_reason()
641 param.data_ptr = gsmi_dev.data_buf->address; in gsmi_shutdown_reason()
642 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_shutdown_reason()
643 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_shutdown_reason()
708 * to identify a board and provide the appropriate quirk -- mikew@google.com
717 hash -= n; in local_hash_64()
719 hash -= n; in local_hash_64()
723 hash -= n; in local_hash_64()
729 /* High bits are more random, so use them. */ in local_hash_64()
730 return hash >> (64 - bits); in local_hash_64()
763 return -ENODEV; in gsmi_system_valid()
769 * Newer firmware doesn't do that though, so use that as the in gsmi_system_valid()
775 return -ENODEV; in gsmi_system_valid()
785 return -ENODEV; in gsmi_system_valid()
792 return -ENODEV; in gsmi_system_valid()
809 return -ENODEV; in gsmi_system_valid()
820 .id = -1,
839 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_log_s0ix_info()
926 ret = -ENOMEM; in gsmi_init()
927 gsmi_dev.dma_pool = dma_pool_create("gsmi", &gsmi_dev.pdev->dev, in gsmi_init()
933 * pre-allocate buffers because sometimes we are called when in gsmi_init()
955 * Determine type of handshake used to serialize the SMI in gsmi_init()
962 * behavior, implement a handshake between the kernel driver and the in gsmi_init()
964 * the type of handshake. in gsmi_init()
967 * handshake. Either it doesn't need to, or it's legacy firmware in gsmi_init()
974 * SPIN: The firmware handler does not implement any handshake in gsmi_init()
978 * Finally, the handler will return -ENOSYS if in gsmi_init()
986 if (gsmi_dev.handshake_type == -ENOSYS) in gsmi_init()
990 /* Remove and clean up gsmi if the handshake could not complete. */ in gsmi_init()
991 if (gsmi_dev.handshake_type == -ENXIO) { in gsmi_init()
994 ret = -ENODEV; in gsmi_init()
999 ret = -ENOMEM; in gsmi_init()