Lines Matching +full:sb +full:- +full:rmi
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * sbrmi-core.c - file defining SB-RMI protocols compliant
16 #include "rmi-core.h"
76 input->rd_len = CPUID_RD_DATA_LEN; in prepare_cpuid_input_message()
77 input->wr_len = CPUID_WR_DATA_LEN; in prepare_cpuid_input_message()
78 input->proto_cmd = RD_CPUID_CMD; in prepare_cpuid_input_message()
79 input->thread = thread_id << 1; in prepare_cpuid_input_message()
80 input->value = func; in prepare_cpuid_input_message()
81 input->ext = ext_func; in prepare_cpuid_input_message()
87 input->rd_len = MSR_RD_DATA_LEN; in prepare_mca_msr_input_message()
88 input->wr_len = MSR_WR_DATA_LEN; in prepare_mca_msr_input_message()
89 input->proto_cmd = RD_MCA_CMD; in prepare_mca_msr_input_message()
90 input->thread = thread_id << 1; in prepare_mca_msr_input_message()
91 input->value = data_in; in prepare_mca_msr_input_message()
100 ret = regmap_read(data->regmap, offset, &rev); in sbrmi_get_rev()
104 data->rev = rev; in sbrmi_get_rev()
118 mutex_lock(&data->lock); in rmi_cpuid_read()
120 if (!data->rev) { in rmi_cpuid_read()
126 if (data->rev == 0x10) { in rmi_cpuid_read()
127 ret = -EOPNOTSUPP; in rmi_cpuid_read()
131 thread = msg->cpu_in_out >> CPUID_MCA_THRD_INDEX; in rmi_cpuid_read()
135 thread -= 128; in rmi_cpuid_read()
138 ret = regmap_write(data->regmap, SBRMI_THREAD128CS, val); in rmi_cpuid_read()
143 msg->cpu_in_out & CPUID_MCA_FUNC_MASK, in rmi_cpuid_read()
144 msg->cpu_in_out >> CPUID_EXT_FUNC_INDEX); in rmi_cpuid_read()
146 ret = regmap_bulk_write(data->regmap, CPUID_MCA_CMD, in rmi_cpuid_read()
152 * For RMI Rev 0x20, new h/w status bit is introduced. which is used in rmi_cpuid_read()
157 ret = regmap_read_poll_timeout(data->regmap, SBRMI_STATUS, hw_status, in rmi_cpuid_read()
162 ret = regmap_bulk_read(data->regmap, CPUID_MCA_CMD, in rmi_cpuid_read()
167 ret = regmap_write(data->regmap, SBRMI_STATUS, in rmi_cpuid_read()
172 if (output.num_bytes != CPUID_RD_REG_LEN - 1) { in rmi_cpuid_read()
173 ret = -EMSGSIZE; in rmi_cpuid_read()
177 ret = -EPROTOTYPE; in rmi_cpuid_read()
178 msg->fw_ret_code = output.status; in rmi_cpuid_read()
181 msg->cpu_in_out = output.value; in rmi_cpuid_read()
184 msg->cpu_in_out = 0; in rmi_cpuid_read()
185 mutex_unlock(&data->lock); in rmi_cpuid_read()
199 mutex_lock(&data->lock); in rmi_mca_msr_read()
201 if (!data->rev) { in rmi_mca_msr_read()
207 if (data->rev == 0x10) { in rmi_mca_msr_read()
208 ret = -EOPNOTSUPP; in rmi_mca_msr_read()
212 thread = msg->mcamsr_in_out >> CPUID_MCA_THRD_INDEX; in rmi_mca_msr_read()
216 thread -= 128; in rmi_mca_msr_read()
219 ret = regmap_write(data->regmap, SBRMI_THREAD128CS, val); in rmi_mca_msr_read()
224 msg->mcamsr_in_out & CPUID_MCA_FUNC_MASK); in rmi_mca_msr_read()
226 ret = regmap_bulk_write(data->regmap, CPUID_MCA_CMD, in rmi_mca_msr_read()
232 * For RMI Rev 0x20, new h/w status bit is introduced. which is used in rmi_mca_msr_read()
237 ret = regmap_read_poll_timeout(data->regmap, SBRMI_STATUS, hw_status, in rmi_mca_msr_read()
242 ret = regmap_bulk_read(data->regmap, CPUID_MCA_CMD, in rmi_mca_msr_read()
247 ret = regmap_write(data->regmap, SBRMI_STATUS, in rmi_mca_msr_read()
252 if (output.num_bytes != MSR_RD_REG_LEN - 1) { in rmi_mca_msr_read()
253 ret = -EMSGSIZE; in rmi_mca_msr_read()
257 ret = -EPROTOTYPE; in rmi_mca_msr_read()
258 msg->fw_ret_code = output.status; in rmi_mca_msr_read()
261 msg->mcamsr_in_out = output.value; in rmi_mca_msr_read()
264 mutex_unlock(&data->lock); in rmi_mca_msr_read()
276 mutex_lock(&data->lock); in rmi_mailbox_xfer()
278 msg->fw_ret_code = 0; in rmi_mailbox_xfer()
281 ret = regmap_write(data->regmap, SBRMI_INBNDMSG7, START_CMD); in rmi_mailbox_xfer()
286 ret = regmap_write(data->regmap, SBRMI_INBNDMSG0, msg->cmd); in rmi_mailbox_xfer()
296 byte = (msg->mb_in_out >> i * 8) & 0xff; in rmi_mailbox_xfer()
297 ret = regmap_write(data->regmap, SBRMI_INBNDMSG1 + i, byte); in rmi_mailbox_xfer()
306 ret = regmap_write(data->regmap, SBRMI_SW_INTERRUPT, TRIGGER_MAILBOX); in rmi_mailbox_xfer()
315 ret = regmap_read_poll_timeout(data->regmap, SBRMI_STATUS, sw_status, in rmi_mailbox_xfer()
320 ret = regmap_read(data->regmap, SBRMI_OUTBNDMSG7, &ec); in rmi_mailbox_xfer()
325 msg->mb_in_out = 0; in rmi_mailbox_xfer()
333 ret = regmap_read(data->regmap, in rmi_mailbox_xfer()
337 msg->mb_in_out |= bytes << i * 8; in rmi_mailbox_xfer()
345 ret = regmap_write(data->regmap, SBRMI_STATUS, in rmi_mailbox_xfer()
348 ret = -EPROTOTYPE; in rmi_mailbox_xfer()
349 msg->fw_ret_code = ec; in rmi_mailbox_xfer()
352 mutex_unlock(&data->lock); in rmi_mailbox_xfer()
365 return -EFAULT; in apml_rmi_reg_xfer()
367 mutex_lock(&data->lock); in apml_rmi_reg_xfer()
369 ret = regmap_read(data->regmap, msg.reg_addr, &data_read); in apml_rmi_reg_xfer()
373 ret = regmap_write(data->regmap, msg.reg_addr, msg.data_in_out); in apml_rmi_reg_xfer()
376 mutex_unlock(&data->lock); in apml_rmi_reg_xfer()
380 return -EFAULT; in apml_rmi_reg_xfer()
391 return -EFAULT; in apml_mailbox_xfer()
395 if (ret && ret != -EPROTOTYPE) in apml_mailbox_xfer()
399 return -EFAULT; in apml_mailbox_xfer()
410 return -EFAULT; in apml_cpuid_xfer()
414 if (ret && ret != -EPROTOTYPE) in apml_cpuid_xfer()
418 return -EFAULT; in apml_cpuid_xfer()
429 return -EFAULT; in apml_mcamsr_xfer()
433 if (ret && ret != -EPROTOTYPE) in apml_mcamsr_xfer()
437 return -EFAULT; in apml_mcamsr_xfer()
446 data = container_of(fp->private_data, struct sbrmi_data, sbrmi_misc_dev); in sbrmi_ioctl()
457 return -ENOTTY; in sbrmi_ioctl()
470 data->sbrmi_misc_dev.name = devm_kasprintf(dev, in create_misc_rmi_device()
472 "sbrmi-%x", in create_misc_rmi_device()
473 data->dev_static_addr); in create_misc_rmi_device()
474 data->sbrmi_misc_dev.minor = MISC_DYNAMIC_MINOR; in create_misc_rmi_device()
475 data->sbrmi_misc_dev.fops = &sbrmi_fops; in create_misc_rmi_device()
476 data->sbrmi_misc_dev.parent = dev; in create_misc_rmi_device()
477 data->sbrmi_misc_dev.nodename = devm_kasprintf(dev, in create_misc_rmi_device()
479 "sbrmi-%x", in create_misc_rmi_device()
480 data->dev_static_addr); in create_misc_rmi_device()
481 data->sbrmi_misc_dev.mode = 0600; in create_misc_rmi_device()
483 return misc_register(&data->sbrmi_misc_dev); in create_misc_rmi_device()