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 */
130 * Some platforms don't have explicit SMI handshake
137 "The number of loop iterations to use when using the spin handshake.");
143 * has long since shipped, removing the need for this opt-in parameter. It
144 * now exists as an opt-out parameter for folks defiantly running old
145 * firmware, or unforeseen circumstances. After the change from opt-in to
146 * opt-out has baked sufficiently, this parameter should probably be removed
163 smibuf->start = kmem_cache_alloc(gsmi_dev.mem_pool, GFP_KERNEL); in gsmi_buf_alloc()
164 if (!smibuf->start) { in gsmi_buf_alloc()
171 smibuf->length = GSMI_BUF_SIZE; in gsmi_buf_alloc()
172 smibuf->address = (u32)virt_to_phys(smibuf->start); in gsmi_buf_alloc()
180 if (smibuf->start) in gsmi_buf_free()
181 kmem_cache_free(gsmi_dev.mem_pool, smibuf->start); in gsmi_buf_free()
188 * in-kernel errnos (0 on success, -ERRNO on error).
219 "b" (gsmi_dev.param_buf->address) in gsmi_exec()
225 * hundred-ish usecs to ensure the SMI has triggered. in gsmi_exec()
233 "b" (gsmi_dev.param_buf->address), in gsmi_exec()
248 "b" (gsmi_dev.param_buf->address) in gsmi_exec()
263 rc = -EINVAL; in gsmi_exec()
267 rc = -ENOMEM; in gsmi_exec()
274 rc = -ENOSYS; in gsmi_exec()
278 rc = -EBUSY; in gsmi_exec()
282 rc = -EFAULT; in gsmi_exec()
286 rc = -ENOENT; in gsmi_exec()
290 rc = -ENOSPC; in gsmi_exec()
300 rc = -ENXIO; in gsmi_exec()
316 .name_ptr = gsmi_dev.name_buf->address, in gsmi_get_variable()
317 .data_ptr = gsmi_dev.data_buf->address, in gsmi_get_variable()
333 /* variable name, already in UTF-16 */ in gsmi_get_variable()
334 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length); in gsmi_get_variable()
335 memcpy(gsmi_dev.name_buf->start, name, name_len * 2); in gsmi_get_variable()
338 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_get_variable()
341 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_get_variable()
342 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_get_variable()
353 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param)); in gsmi_get_variable()
357 gsmi_dev.data_buf->length); in gsmi_get_variable()
361 memcpy(data, gsmi_dev.data_buf->start, *data_size); in gsmi_get_variable()
380 .name_ptr = gsmi_dev.name_buf->address, in gsmi_get_next_variable()
381 .name_len = gsmi_dev.name_buf->length, in gsmi_get_next_variable()
391 /* Let's make sure the thing is at least null-terminated */ in gsmi_get_next_variable()
400 /* variable name, already in UTF-16 */ in gsmi_get_next_variable()
401 memcpy(gsmi_dev.name_buf->start, name, *name_size); in gsmi_get_next_variable()
404 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_get_next_variable()
405 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_get_next_variable()
412 /* variable not found -- end of list */ in gsmi_get_next_variable()
416 memcpy(¶m, gsmi_dev.param_buf->start, sizeof(param)); in gsmi_get_next_variable()
419 memcpy(name, gsmi_dev.name_buf->start, GSMI_BUF_SIZE); in gsmi_get_next_variable()
439 .name_ptr = gsmi_dev.name_buf->address, in gsmi_set_variable()
440 .data_ptr = gsmi_dev.data_buf->address, in gsmi_set_variable()
459 /* variable name, already in UTF-16 */ in gsmi_set_variable()
460 memset(gsmi_dev.name_buf->start, 0, gsmi_dev.name_buf->length); in gsmi_set_variable()
461 memcpy(gsmi_dev.name_buf->start, name, name_len * 2); in gsmi_set_variable()
464 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_set_variable()
465 memcpy(gsmi_dev.data_buf->start, data, data_size); in gsmi_set_variable()
468 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_set_variable()
469 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_set_variable()
495 .data_ptr = gsmi_dev.data_buf->address, in eventlog_write()
502 return -EINVAL; in eventlog_write()
507 if ((count - sizeof(u32)) > gsmi_dev.data_buf->length) in eventlog_write()
508 return -EINVAL; in eventlog_write()
509 param.data_len = count - sizeof(u32); in eventlog_write()
514 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in eventlog_write()
515 memcpy(gsmi_dev.data_buf->start, buf, param.data_len); in eventlog_write()
518 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in eventlog_write()
519 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in eventlog_write()
557 return -EINVAL; in gsmi_clear_eventlog_store()
566 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_clear_eventlog_store()
567 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_clear_eventlog_store()
593 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_clear_config_store()
638 memset(gsmi_dev.data_buf->start, 0, gsmi_dev.data_buf->length); in gsmi_shutdown_reason()
639 memcpy(gsmi_dev.data_buf->start, &entry, sizeof(entry)); in gsmi_shutdown_reason()
642 param.data_ptr = gsmi_dev.data_buf->address; in gsmi_shutdown_reason()
643 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_shutdown_reason()
644 memcpy(gsmi_dev.param_buf->start, ¶m, sizeof(param)); in gsmi_shutdown_reason()
709 * to identify a board and provide the appropriate quirk -- mikew@google.com
718 hash -= n; in local_hash_64()
720 hash -= n; in local_hash_64()
724 hash -= n; in local_hash_64()
730 /* High bits are more random, so use them. */ in local_hash_64()
731 return hash >> (64 - bits); in local_hash_64()
764 return -ENODEV; in gsmi_system_valid()
770 * Newer firmware doesn't do that though, so use that as the in gsmi_system_valid()
776 return -ENODEV; in gsmi_system_valid()
786 return -ENODEV; in gsmi_system_valid()
793 return -ENODEV; in gsmi_system_valid()
810 return -ENODEV; in gsmi_system_valid()
821 .id = -1,
840 memset(gsmi_dev.param_buf->start, 0, gsmi_dev.param_buf->length); in gsmi_log_s0ix_info()
928 ret = -ENOMEM; in gsmi_init()
946 * pre-allocate buffers because sometimes we are called when in gsmi_init()
968 * Determine type of handshake used to serialize the SMI in gsmi_init()
975 * behavior, implement a handshake between the kernel driver and the in gsmi_init()
977 * the type of handshake. in gsmi_init()
980 * handshake. Either it doesn't need to, or it's legacy firmware in gsmi_init()
987 * SPIN: The firmware handler does not implement any handshake in gsmi_init()
991 * Finally, the handler will return -ENOSYS if in gsmi_init()
999 if (gsmi_dev.handshake_type == -ENOSYS) in gsmi_init()
1003 /* Remove and clean up gsmi if the handshake could not complete. */ in gsmi_init()
1004 if (gsmi_dev.handshake_type == -ENXIO) { in gsmi_init()
1007 ret = -ENODEV; in gsmi_init()
1012 ret = -ENOMEM; in gsmi_init()