diff options
Diffstat (limited to 'drivers/misc/amd-sbi/rmi-core.c')
| -rw-r--r-- | drivers/misc/amd-sbi/rmi-core.c | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/misc/amd-sbi/rmi-core.c b/drivers/misc/amd-sbi/rmi-core.c index b653a21a909e..3dec2fc00124 100644 --- a/drivers/misc/amd-sbi/rmi-core.c +++ b/drivers/misc/amd-sbi/rmi-core.c @@ -42,7 +42,6 @@  #define RD_MCA_CMD	0x86  /* CPUID MCAMSR mask & index */ -#define CPUID_MCA_THRD_MASK	GENMASK(15, 0)  #define CPUID_MCA_THRD_INDEX	32  #define CPUID_MCA_FUNC_MASK	GENMASK(31, 0)  #define CPUID_EXT_FUNC_INDEX	56 @@ -129,7 +128,7 @@ static int rmi_cpuid_read(struct sbrmi_data *data,  		goto exit_unlock;  	} -	thread = msg->cpu_in_out << CPUID_MCA_THRD_INDEX & CPUID_MCA_THRD_MASK; +	thread = msg->cpu_in_out >> CPUID_MCA_THRD_INDEX;  	/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */  	if (thread > 127) { @@ -210,7 +209,7 @@ static int rmi_mca_msr_read(struct sbrmi_data *data,  		goto exit_unlock;  	} -	thread = msg->mcamsr_in_out << CPUID_MCA_THRD_INDEX & CPUID_MCA_THRD_MASK; +	thread = msg->mcamsr_in_out >> CPUID_MCA_THRD_INDEX;  	/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */  	if (thread > 127) { @@ -321,6 +320,10 @@ int rmi_mailbox_xfer(struct sbrmi_data *data,  	ret = regmap_read(data->regmap, SBRMI_OUTBNDMSG7, &ec);  	if (ret || ec)  		goto exit_clear_alert; + +	/* Clear the input value before updating the output data */ +	msg->mb_in_out = 0; +  	/*  	 * For a read operation, the initiator (BMC) reads the firmware  	 * response Command Data Out[31:0] from SBRMI::OutBndMsg_inst[4:1] @@ -373,7 +376,8 @@ static int apml_rmi_reg_xfer(struct sbrmi_data *data,  	mutex_unlock(&data->lock);  	if (msg.rflag && !ret) -		return copy_to_user(arg, &msg, sizeof(struct apml_reg_xfer_msg)); +		if (copy_to_user(arg, &msg, sizeof(struct apml_reg_xfer_msg))) +			return -EFAULT;  	return ret;  } @@ -391,7 +395,9 @@ static int apml_mailbox_xfer(struct sbrmi_data *data, struct apml_mbox_msg __use  	if (ret && ret != -EPROTOTYPE)  		return ret; -	return copy_to_user(arg, &msg, sizeof(struct apml_mbox_msg)); +	if (copy_to_user(arg, &msg, sizeof(struct apml_mbox_msg))) +		return -EFAULT; +	return ret;  }  static int apml_cpuid_xfer(struct sbrmi_data *data, struct apml_cpuid_msg __user *arg) @@ -408,7 +414,9 @@ static int apml_cpuid_xfer(struct sbrmi_data *data, struct apml_cpuid_msg __user  	if (ret && ret != -EPROTOTYPE)  		return ret; -	return copy_to_user(arg, &msg, sizeof(struct apml_cpuid_msg)); +	if (copy_to_user(arg, &msg, sizeof(struct apml_cpuid_msg))) +		return -EFAULT; +	return ret;  }  static int apml_mcamsr_xfer(struct sbrmi_data *data, struct apml_mcamsr_msg __user *arg) @@ -425,7 +433,9 @@ static int apml_mcamsr_xfer(struct sbrmi_data *data, struct apml_mcamsr_msg __us  	if (ret && ret != -EPROTOTYPE)  		return ret; -	return copy_to_user(arg, &msg, sizeof(struct apml_mcamsr_msg)); +	if (copy_to_user(arg, &msg, sizeof(struct apml_mcamsr_msg))) +		return -EFAULT; +	return ret;  }  static long sbrmi_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)  | 
