diff options
Diffstat (limited to 'drivers/platform/x86/amd/pmf/tee-if.c')
| -rw-r--r-- | drivers/platform/x86/amd/pmf/tee-if.c | 50 | 
1 files changed, 36 insertions, 14 deletions
| diff --git a/drivers/platform/x86/amd/pmf/tee-if.c b/drivers/platform/x86/amd/pmf/tee-if.c index b404764550c4..ceaff1ebb7b9 100644 --- a/drivers/platform/x86/amd/pmf/tee-if.c +++ b/drivers/platform/x86/amd/pmf/tee-if.c @@ -27,8 +27,11 @@ module_param(pb_side_load, bool, 0444);  MODULE_PARM_DESC(pb_side_load, "Sideload policy binaries debug policy failures");  #endif -static const uuid_t amd_pmf_ta_uuid = UUID_INIT(0x6fd93b77, 0x3fb8, 0x524d, -						0xb1, 0x2d, 0xc5, 0x29, 0xb1, 0x3d, 0x85, 0x43); +static const uuid_t amd_pmf_ta_uuid[] = { UUID_INIT(0xd9b39bf2, 0x66bd, 0x4154, 0xaf, 0xb8, 0x8a, +						    0xcc, 0x2b, 0x2b, 0x60, 0xd6), +					  UUID_INIT(0x6fd93b77, 0x3fb8, 0x524d, 0xb1, 0x2d, 0xc5, +						    0x29, 0xb1, 0x3d, 0x85, 0x43), +					};  static const char *amd_pmf_uevent_as_str(unsigned int state)  { @@ -321,7 +324,7 @@ static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev)  		 */  		schedule_delayed_work(&dev->pb_work, msecs_to_jiffies(pb_actions_ms * 3));  	} else { -		dev_err(dev->dev, "ta invoke cmd init failed err: %x\n", res); +		dev_dbg(dev->dev, "ta invoke cmd init failed err: %x\n", res);  		dev->smart_pc_enabled = false;  		return res;  	} @@ -390,12 +393,12 @@ static int amd_pmf_amdtee_ta_match(struct tee_ioctl_version_data *ver, const voi  	return ver->impl_id == TEE_IMPL_ID_AMDTEE;  } -static int amd_pmf_ta_open_session(struct tee_context *ctx, u32 *id) +static int amd_pmf_ta_open_session(struct tee_context *ctx, u32 *id, const uuid_t *uuid)  {  	struct tee_ioctl_open_session_arg sess_arg = {};  	int rc; -	export_uuid(sess_arg.uuid, &amd_pmf_ta_uuid); +	export_uuid(sess_arg.uuid, uuid);  	sess_arg.clnt_login = TEE_IOCTL_LOGIN_PUBLIC;  	sess_arg.num_params = 0; @@ -434,7 +437,7 @@ static int amd_pmf_register_input_device(struct amd_pmf_dev *dev)  	return 0;  } -static int amd_pmf_tee_init(struct amd_pmf_dev *dev) +static int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid)  {  	u32 size;  	int ret; @@ -445,7 +448,7 @@ static int amd_pmf_tee_init(struct amd_pmf_dev *dev)  		return PTR_ERR(dev->tee_ctx);  	} -	ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id); +	ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id, uuid);  	if (ret) {  		dev_err(dev->dev, "Failed to open TA session (%d)\n", ret);  		ret = -EINVAL; @@ -489,7 +492,8 @@ static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev)  int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)  { -	int ret; +	bool status; +	int ret, i;  	ret = apmf_check_smart_pc(dev);  	if (ret) { @@ -502,10 +506,6 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)  		return -ENODEV;  	} -	ret = amd_pmf_tee_init(dev); -	if (ret) -		return ret; -  	INIT_DELAYED_WORK(&dev->pb_work, amd_pmf_invoke_cmd);  	ret = amd_pmf_set_dram_addr(dev, true); @@ -534,8 +534,30 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)  		goto error;  	} -	ret = amd_pmf_start_policy_engine(dev); -	if (ret) +	for (i = 0; i < ARRAY_SIZE(amd_pmf_ta_uuid); i++) { +		ret = amd_pmf_tee_init(dev, &amd_pmf_ta_uuid[i]); +		if (ret) +			return ret; + +		ret = amd_pmf_start_policy_engine(dev); +		switch (ret) { +		case TA_PMF_TYPE_SUCCESS: +			status = true; +			break; +		case TA_ERROR_CRYPTO_INVALID_PARAM: +		case TA_ERROR_CRYPTO_BIN_TOO_LARGE: +			amd_pmf_tee_deinit(dev); +			status = false; +			break; +		default: +			goto error; +		} + +		if (status) +			break; +	} + +	if (!status && !pb_side_load)  		goto error;  	if (pb_side_load) | 
