Lines Matching +full:io +full:- +full:backends
1 // SPDX-License-Identifier: GPL-2.0-only
10 * Copyright (C) 2005-2014 Dell Inc.
23 #include "dell-smbios.h"
76 {0x0000, 19, -1}, /* diagnostics */
77 /* handled by kernel: dell-laptop */
122 /* handled by kernel: dell-laptop */
138 case -1: /* Completed with error */ in dell_smbios_error()
139 return -EIO; in dell_smbios_error()
140 case -2: /* Function not supported */ in dell_smbios_error()
141 return -ENXIO; in dell_smbios_error()
143 return -EINVAL; in dell_smbios_error()
154 return -ENOMEM; in dell_smbios_register_device()
156 priv->device = d; in dell_smbios_register_device()
157 priv->call_fn = call_fn; in dell_smbios_register_device()
159 list_add_tail(&priv->list, &smbios_device_list); in dell_smbios_register_device()
161 dev_dbg(d, "Added device: %s\n", d->driver->name); in dell_smbios_register_device()
172 if (priv->device == d) { in dell_smbios_unregister_device()
173 list_del(&priv->list); in dell_smbios_unregister_device()
179 dev_dbg(d, "Remove device: %s\n", d->driver->name); in dell_smbios_unregister_device()
190 if (buffer->cmd_class > 30) { in dell_smbios_call_filter()
191 dev_dbg(d, "class too big: %u\n", buffer->cmd_class); in dell_smbios_call_filter()
192 return -EINVAL; in dell_smbios_call_filter()
196 if (!(da_supported_commands & (1 << buffer->cmd_class))) { in dell_smbios_call_filter()
199 return -EINVAL; in dell_smbios_call_filter()
204 if (buffer->cmd_class != call_blacklist[i].cmd_class) in dell_smbios_call_filter()
206 if (buffer->cmd_select != call_blacklist[i].cmd_select && in dell_smbios_call_filter()
207 call_blacklist[i].cmd_select != -1) in dell_smbios_call_filter()
210 buffer->cmd_class, buffer->cmd_select); in dell_smbios_call_filter()
211 return -EINVAL; in dell_smbios_call_filter()
216 if ((buffer->cmd_class == CLASS_TOKEN_READ || in dell_smbios_call_filter()
217 buffer->cmd_class == CLASS_TOKEN_WRITE) && in dell_smbios_call_filter()
218 buffer->cmd_select < 3) { in dell_smbios_call_filter()
222 return -EINVAL; in dell_smbios_call_filter()
227 if (da_tokens[i].location != buffer->input[0]) in dell_smbios_call_filter()
236 buffer->input[0]); in dell_smbios_call_filter()
237 return -EINVAL; in dell_smbios_call_filter()
246 return -EINVAL; in dell_smbios_call_filter()
266 if (buffer->cmd_class != call_whitelist[i].cmd_class) in dell_smbios_call_filter()
268 if (buffer->cmd_select != call_whitelist[i].cmd_select) in dell_smbios_call_filter()
273 buffer->cmd_class, buffer->cmd_select); in dell_smbios_call_filter()
278 buffer->cmd_class, buffer->cmd_select); in dell_smbios_call_filter()
285 buffer->cmd_class, buffer->cmd_select); in dell_smbios_call_filter()
289 return -EACCES; in dell_smbios_call_filter()
302 if (!selected_dev || priv->device->id >= selected_dev->id) { in dell_smbios_call()
303 dev_dbg(priv->device, "Trying device ID: %d\n", in dell_smbios_call()
304 priv->device->id); in dell_smbios_call()
305 call_fn = priv->call_fn; in dell_smbios_call()
306 selected_dev = priv->device; in dell_smbios_call()
311 ret = -ENODEV; in dell_smbios_call()
312 pr_err("No dell-smbios drivers are loaded\n"); in dell_smbios_call()
328 buffer->input[0] = arg0; in dell_fill_request()
329 buffer->input[1] = arg1; in dell_fill_request()
330 buffer->input[2] = arg2; in dell_fill_request()
331 buffer->input[3] = arg3; in dell_fill_request()
340 buffer->cmd_class = class; in dell_send_request()
341 buffer->cmd_select = select; in dell_send_request()
345 return dell_smbios_error(buffer->output[0]); in dell_send_request()
397 int tokens = (dm->length-11)/sizeof(struct calling_interface_token)-1; in parse_da_table()
407 if (dm->length < 17) in parse_da_table()
410 da_supported_commands = table->supportedCmds; in parse_da_table()
420 memcpy(da_tokens+da_num_tokens, table->tokens, in parse_da_table()
449 switch (dm->type) { in find_tokens()
450 case 0xd4: /* Indexed IO */ in find_tokens()
466 return -EPERM; in location_show()
468 return sysfs_emit(buf, "%08x", data->token->location); in location_show()
477 return -EPERM; in value_show()
479 return sysfs_emit(buf, "%08x", data->token->value); in value_show()
488 .name = "dell-smbios",
501 return -ENOMEM; in build_tokens_sysfs()
543 ret = sysfs_create_group(&dev->dev.kobj, &smbios_attribute_group); in build_tokens_sysfs()
549 while (i--) { in build_tokens_sysfs()
557 return -ENOMEM; in build_tokens_sysfs()
564 sysfs_remove_group(&pdev->dev.kobj, in free_group()
581 pr_err("Unable to run on non-Dell system\n"); in dell_smbios_init()
582 return -ENODEV; in dell_smbios_init()
591 platform_device = platform_device_alloc("dell-smbios", 0); in dell_smbios_init()
593 ret = -ENOMEM; in dell_smbios_init()
600 /* register backends */ in dell_smbios_init()
608 pr_err("No SMBIOS backends available (wmi: %d, smm: %d)\n", in dell_smbios_init()
610 ret = -ENODEV; in dell_smbios_init()
616 zero_duplicates(&platform_device->dev); in dell_smbios_init()