@@ -351,6 +351,24 @@ int rmi_mailbox_xfer(struct sbrmi_data *data,
return ret;
}
+static int rmi_register_xfer(struct sbrmi_data *data,
+ struct apml_message *msg)
+{
+ int ret;
+
+ mutex_lock(&data->lock);
+ if (msg->data_in.reg_in[AMD_SBI_RD_FLAG_INDEX])
+ ret = regmap_read(data->regmap,
+ msg->data_in.reg_in[AMD_SBI_REG_OFF_INDEX],
+ &msg->data_out.mb_out[AMD_SBI_RD_WR_DATA_INDEX]);
+ else
+ ret = regmap_write(data->regmap,
+ msg->data_in.reg_in[AMD_SBI_REG_OFF_INDEX],
+ msg->data_in.reg_in[AMD_SBI_REG_VAL_INDEX]);
+ mutex_unlock(&data->lock);
+ return ret;
+}
+
static long sbrmi_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
{
int __user *arguser = (int __user *)arg;
@@ -384,6 +402,10 @@ static long sbrmi_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
/* MCAMSR protocol */
ret = rmi_mca_msr_read(data, &msg);
break;
+ case APML_REG:
+ /* REG R/W */
+ ret = rmi_register_xfer(data, &msg);
+ break;
default:
pr_err("Command:0x%x not recognized\n", msg.cmd);
break;
@@ -10,6 +10,7 @@
enum apml_protocol {
APML_CPUID = 0x1000,
APML_MCA_MSR,
+ APML_REG,
};
/* These are byte indexes into data_in and data_out arrays */
@@ -28,6 +29,7 @@ struct apml_message {
* Mailbox Messages: 0x0 ... 0x999
* APML_CPUID: 0x1000
* APML_MCA_MSR: 0x1001
+ * APML_REG: 0x1002
*/
__u32 cmd;
@@ -45,6 +47,7 @@ struct apml_message {
/*
* [0]...[3] mailbox 32bit input
* cpuid & mca msr,
+ * rmi rd/wr: reg_offset
* [4][5] cpuid & mca msr: thread
* [4] rmi reg wr: value
* [6] cpuid: ext function & read eax/ebx or ecx/edx
@@ -85,6 +88,7 @@ struct apml_message {
* - Mailbox message read/write(0x0~0x999)
* - CPUID read(0x1000)
* - MCAMSR read(0x1001)
+ * - Register read/write(0x1002)
* - returning "-EFAULT" if none of the above
* "-EPROTOTYPE" error is returned to provide additional error details
*/