Lines Matching full:dev

50 static void amd_pmf_prepare_args(struct amd_pmf_dev *dev, int cmd,  in amd_pmf_prepare_args()  argument
58 arg->session = dev->session_id; in amd_pmf_prepare_args()
64 param[0].u.memref.shm = dev->fw_shm_pool; in amd_pmf_prepare_args()
68 static void amd_pmf_update_uevents(struct amd_pmf_dev *dev, u16 event) in amd_pmf_update_uevents() argument
70 input_report_key(dev->pmf_idev, event, 1); /* key press */ in amd_pmf_update_uevents()
71 input_sync(dev->pmf_idev); in amd_pmf_update_uevents()
72 input_report_key(dev->pmf_idev, event, 0); /* key release */ in amd_pmf_update_uevents()
73 input_sync(dev->pmf_idev); in amd_pmf_update_uevents()
76 static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_result *out) in amd_pmf_apply_policies() argument
85 if (dev->prev_data->spl != val) { in amd_pmf_apply_policies()
86 amd_pmf_send_cmd(dev, SET_SPL, false, val, NULL); in amd_pmf_apply_policies()
87 dev_dbg(dev->dev, "update SPL: %u\n", val); in amd_pmf_apply_policies()
88 dev->prev_data->spl = val; in amd_pmf_apply_policies()
93 if (dev->prev_data->sppt != val) { in amd_pmf_apply_policies()
94 amd_pmf_send_cmd(dev, SET_SPPT, false, val, NULL); in amd_pmf_apply_policies()
95 dev_dbg(dev->dev, "update SPPT: %u\n", val); in amd_pmf_apply_policies()
96 dev->prev_data->sppt = val; in amd_pmf_apply_policies()
101 if (dev->prev_data->fppt != val) { in amd_pmf_apply_policies()
102 amd_pmf_send_cmd(dev, SET_FPPT, false, val, NULL); in amd_pmf_apply_policies()
103 dev_dbg(dev->dev, "update FPPT: %u\n", val); in amd_pmf_apply_policies()
104 dev->prev_data->fppt = val; in amd_pmf_apply_policies()
109 if (dev->prev_data->sppt_apuonly != val) { in amd_pmf_apply_policies()
110 amd_pmf_send_cmd(dev, SET_SPPT_APU_ONLY, false, val, NULL); in amd_pmf_apply_policies()
111 dev_dbg(dev->dev, "update SPPT_APU_ONLY: %u\n", val); in amd_pmf_apply_policies()
112 dev->prev_data->sppt_apuonly = val; in amd_pmf_apply_policies()
117 if (dev->prev_data->stt_minlimit != val) { in amd_pmf_apply_policies()
118 amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false, val, NULL); in amd_pmf_apply_policies()
119 dev_dbg(dev->dev, "update STT_MIN: %u\n", val); in amd_pmf_apply_policies()
120 dev->prev_data->stt_minlimit = val; in amd_pmf_apply_policies()
125 if (dev->prev_data->stt_skintemp_apu != val) { in amd_pmf_apply_policies()
126 amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false, in amd_pmf_apply_policies()
128 dev_dbg(dev->dev, "update STT_SKINTEMP_APU: %u\n", val); in amd_pmf_apply_policies()
129 dev->prev_data->stt_skintemp_apu = val; in amd_pmf_apply_policies()
134 if (dev->prev_data->stt_skintemp_hs2 != val) { in amd_pmf_apply_policies()
135 amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false, in amd_pmf_apply_policies()
137 dev_dbg(dev->dev, "update STT_SKINTEMP_HS2: %u\n", val); in amd_pmf_apply_policies()
138 dev->prev_data->stt_skintemp_hs2 = val; in amd_pmf_apply_policies()
143 if (dev->prev_data->p3t_limit != val) { in amd_pmf_apply_policies()
144 amd_pmf_send_cmd(dev, SET_P3T, false, val, NULL); in amd_pmf_apply_policies()
145 dev_dbg(dev->dev, "update P3T: %u\n", val); in amd_pmf_apply_policies()
146 dev->prev_data->p3t_limit = val; in amd_pmf_apply_policies()
153 amd_pmf_update_uevents(dev, KEY_SLEEP); in amd_pmf_apply_policies()
156 amd_pmf_update_uevents(dev, KEY_SUSPEND); in amd_pmf_apply_policies()
159 amd_pmf_update_uevents(dev, KEY_SCREENLOCK); in amd_pmf_apply_policies()
162 dev_err(dev->dev, "Invalid PMF policy system state: %d\n", val); in amd_pmf_apply_policies()
165 dev_dbg(dev->dev, "update SYSTEM_STATE: %s\n", in amd_pmf_apply_policies()
170 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(0), 0); in amd_pmf_apply_policies()
174 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(1), 1); in amd_pmf_apply_policies()
178 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(2), 2); in amd_pmf_apply_policies()
182 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(3), 3); in amd_pmf_apply_policies()
186 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(4), 4); in amd_pmf_apply_policies()
190 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(5), 5); in amd_pmf_apply_policies()
194 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(6), 6); in amd_pmf_apply_policies()
198 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(7), 7); in amd_pmf_apply_policies()
202 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(8), 8); in amd_pmf_apply_policies()
206 amd_pmf_smartpc_apply_bios_output(dev, val, BIT(9), 9); in amd_pmf_apply_policies()
212 static int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev) in amd_pmf_invoke_cmd_enact() argument
221 if (!dev->tee_ctx) in amd_pmf_invoke_cmd_enact()
224 memset(dev->shbuf, 0, dev->policy_sz); in amd_pmf_invoke_cmd_enact()
225 ta_sm = dev->shbuf; in amd_pmf_invoke_cmd_enact()
233 amd_pmf_populate_ta_inputs(dev, in); in amd_pmf_invoke_cmd_enact()
234 amd_pmf_prepare_args(dev, TA_PMF_COMMAND_POLICY_BUILDER_ENACT_POLICIES, &arg, param); in amd_pmf_invoke_cmd_enact()
236 ret = tee_client_invoke_func(dev->tee_ctx, &arg, param); in amd_pmf_invoke_cmd_enact()
238 dev_err(dev->dev, "TEE enact cmd failed. err: %x, ret:%d\n", arg.ret, ret); in amd_pmf_invoke_cmd_enact()
243 amd_pmf_dump_ta_inputs(dev, in); in amd_pmf_invoke_cmd_enact()
244 dev_dbg(dev->dev, "action count:%u result:%x\n", out->actions_count, in amd_pmf_invoke_cmd_enact()
246 amd_pmf_apply_policies(dev, out); in amd_pmf_invoke_cmd_enact()
252 static int amd_pmf_invoke_cmd_init(struct amd_pmf_dev *dev) in amd_pmf_invoke_cmd_init() argument
260 if (!dev->tee_ctx) { in amd_pmf_invoke_cmd_init()
261 dev_err(dev->dev, "Failed to get TEE context\n"); in amd_pmf_invoke_cmd_init()
265 dev_dbg(dev->dev, "Policy Binary size: %llu bytes\n", (unsigned long long)dev->policy_sz); in amd_pmf_invoke_cmd_init()
266 memset(dev->shbuf, 0, dev->policy_sz); in amd_pmf_invoke_cmd_init()
267 ta_sm = dev->shbuf; in amd_pmf_invoke_cmd_init()
277 in->policies_table.table_size = dev->policy_sz; in amd_pmf_invoke_cmd_init()
279 memcpy(in->policies_table.table, dev->policy_buf, dev->policy_sz); in amd_pmf_invoke_cmd_init()
280 amd_pmf_prepare_args(dev, TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, &arg, param); in amd_pmf_invoke_cmd_init()
282 ret = tee_client_invoke_func(dev->tee_ctx, &arg, param); in amd_pmf_invoke_cmd_init()
284 dev_err(dev->dev, "Failed to invoke TEE init cmd. err: %x, ret:%d\n", arg.ret, ret); in amd_pmf_invoke_cmd_init()
293 struct amd_pmf_dev *dev = container_of(work, struct amd_pmf_dev, pb_work.work); in amd_pmf_invoke_cmd() local
295 amd_pmf_invoke_cmd_enact(dev); in amd_pmf_invoke_cmd()
296 schedule_delayed_work(&dev->pb_work, msecs_to_jiffies(pb_actions_ms)); in amd_pmf_invoke_cmd()
299 static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev) in amd_pmf_start_policy_engine() argument
304 if (dev->policy_sz < POLICY_COOKIE_OFFSET + sizeof(*header)) in amd_pmf_start_policy_engine()
307 header = (struct cookie_header *)(dev->policy_buf + POLICY_COOKIE_OFFSET); in amd_pmf_start_policy_engine()
310 dev_dbg(dev->dev, "cookie doesn't match\n"); in amd_pmf_start_policy_engine()
314 if (dev->policy_sz < header->length + 512) in amd_pmf_start_policy_engine()
318 dev->policy_sz = header->length + 512; in amd_pmf_start_policy_engine()
319 res = amd_pmf_invoke_cmd_init(dev); in amd_pmf_start_policy_engine()
322 dev->smart_pc_enabled = true; in amd_pmf_start_policy_engine()
327 schedule_delayed_work(&dev->pb_work, msecs_to_jiffies(pb_actions_ms * 3)); in amd_pmf_start_policy_engine()
329 dev_dbg(dev->dev, "ta invoke cmd init failed err: %x\n", res); in amd_pmf_start_policy_engine()
330 dev->smart_pc_enabled = false; in amd_pmf_start_policy_engine()
337 static inline bool amd_pmf_pb_valid(struct amd_pmf_dev *dev) in amd_pmf_pb_valid() argument
339 return memchr_inv(dev->policy_buf, 0xff, dev->policy_sz); in amd_pmf_pb_valid()
343 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) in amd_pmf_hex_dump_pb() argument
345 print_hex_dump_debug("(pb): ", DUMP_PREFIX_OFFSET, 16, 1, dev->policy_buf, in amd_pmf_hex_dump_pb()
346 dev->policy_sz, false); in amd_pmf_hex_dump_pb()
352 struct amd_pmf_dev *dev = filp->private_data; in amd_pmf_get_pb_data() local
365 kfree(dev->policy_buf); in amd_pmf_get_pb_data()
366 dev->policy_buf = new_policy_buf; in amd_pmf_get_pb_data()
367 dev->policy_sz = length; in amd_pmf_get_pb_data()
369 if (!amd_pmf_pb_valid(dev)) { in amd_pmf_get_pb_data()
374 amd_pmf_hex_dump_pb(dev); in amd_pmf_get_pb_data()
375 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_get_pb_data()
382 kfree(dev->policy_buf); in amd_pmf_get_pb_data()
383 dev->policy_buf = NULL; in amd_pmf_get_pb_data()
392 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) in amd_pmf_open_pb() argument
394 dev->esbin = debugfs_create_dir("pb", debugfs_root); in amd_pmf_open_pb()
395 debugfs_create_file("update_policy", 0644, dev->esbin, dev, &pb_fops); in amd_pmf_open_pb()
398 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) in amd_pmf_remove_pb() argument
400 debugfs_remove_recursive(dev->esbin); in amd_pmf_remove_pb()
403 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) {} in amd_pmf_open_pb() argument
404 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) {} in amd_pmf_remove_pb() argument
405 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) {} in amd_pmf_hex_dump_pb() argument
433 static int amd_pmf_register_input_device(struct amd_pmf_dev *dev) in amd_pmf_register_input_device() argument
437 dev->pmf_idev = devm_input_allocate_device(dev->dev); in amd_pmf_register_input_device()
438 if (!dev->pmf_idev) in amd_pmf_register_input_device()
441 dev->pmf_idev->name = "PMF-TA output events"; in amd_pmf_register_input_device()
442 dev->pmf_idev->phys = "amd-pmf/input0"; in amd_pmf_register_input_device()
444 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SLEEP); in amd_pmf_register_input_device()
445 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SCREENLOCK); in amd_pmf_register_input_device()
446 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SUSPEND); in amd_pmf_register_input_device()
448 err = input_register_device(dev->pmf_idev); in amd_pmf_register_input_device()
450 dev_err(dev->dev, "Failed to register input device: %d\n", err); in amd_pmf_register_input_device()
457 static int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid) in amd_pmf_tee_init() argument
462 dev->tee_ctx = tee_client_open_context(NULL, amd_pmf_amdtee_ta_match, NULL, NULL); in amd_pmf_tee_init()
463 if (IS_ERR(dev->tee_ctx)) { in amd_pmf_tee_init()
464 dev_err(dev->dev, "Failed to open TEE context\n"); in amd_pmf_tee_init()
465 return PTR_ERR(dev->tee_ctx); in amd_pmf_tee_init()
468 ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id, uuid); in amd_pmf_tee_init()
470 dev_err(dev->dev, "Failed to open TA session (%d)\n", ret); in amd_pmf_tee_init()
475 size = sizeof(struct ta_pmf_shared_memory) + dev->policy_sz; in amd_pmf_tee_init()
476 dev->fw_shm_pool = tee_shm_alloc_kernel_buf(dev->tee_ctx, size); in amd_pmf_tee_init()
477 if (IS_ERR(dev->fw_shm_pool)) { in amd_pmf_tee_init()
478 dev_err(dev->dev, "Failed to alloc TEE shared memory\n"); in amd_pmf_tee_init()
479 ret = PTR_ERR(dev->fw_shm_pool); in amd_pmf_tee_init()
483 dev->shbuf = tee_shm_get_va(dev->fw_shm_pool, 0); in amd_pmf_tee_init()
484 if (IS_ERR(dev->shbuf)) { in amd_pmf_tee_init()
485 dev_err(dev->dev, "Failed to get TEE virtual address\n"); in amd_pmf_tee_init()
486 ret = PTR_ERR(dev->shbuf); in amd_pmf_tee_init()
489 dev_dbg(dev->dev, "TEE init done\n"); in amd_pmf_tee_init()
494 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_init()
496 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_init()
498 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_init()
503 static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev) in amd_pmf_tee_deinit() argument
505 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_deinit()
506 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_deinit()
507 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_deinit()
510 int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_init_smart_pc() argument
515 ret = apmf_check_smart_pc(dev); in amd_pmf_init_smart_pc()
522 dev_info(dev->dev, "PMF Smart PC not advertised in BIOS!:%d\n", ret); in amd_pmf_init_smart_pc()
526 INIT_DELAYED_WORK(&dev->pb_work, amd_pmf_invoke_cmd); in amd_pmf_init_smart_pc()
528 ret = amd_pmf_set_dram_addr(dev, true); in amd_pmf_init_smart_pc()
532 dev->policy_base = devm_ioremap_resource(dev->dev, dev->res); in amd_pmf_init_smart_pc()
533 if (IS_ERR(dev->policy_base)) { in amd_pmf_init_smart_pc()
534 ret = PTR_ERR(dev->policy_base); in amd_pmf_init_smart_pc()
538 dev->policy_buf = kzalloc(dev->policy_sz, GFP_KERNEL); in amd_pmf_init_smart_pc()
539 if (!dev->policy_buf) { in amd_pmf_init_smart_pc()
544 memcpy_fromio(dev->policy_buf, dev->policy_base, dev->policy_sz); in amd_pmf_init_smart_pc()
546 if (!amd_pmf_pb_valid(dev)) { in amd_pmf_init_smart_pc()
547 dev_info(dev->dev, "No Smart PC policy present\n"); in amd_pmf_init_smart_pc()
552 amd_pmf_hex_dump_pb(dev); in amd_pmf_init_smart_pc()
554 dev->prev_data = kzalloc(sizeof(*dev->prev_data), GFP_KERNEL); in amd_pmf_init_smart_pc()
555 if (!dev->prev_data) { in amd_pmf_init_smart_pc()
561 ret = amd_pmf_tee_init(dev, &amd_pmf_ta_uuid[i]); in amd_pmf_init_smart_pc()
565 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_init_smart_pc()
572 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
577 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
591 amd_pmf_open_pb(dev, dev->dbgfs_dir); in amd_pmf_init_smart_pc()
593 ret = amd_pmf_register_input_device(dev); in amd_pmf_init_smart_pc()
600 if (pb_side_load && dev->esbin) in amd_pmf_init_smart_pc()
601 amd_pmf_remove_pb(dev); in amd_pmf_init_smart_pc()
602 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
604 kfree(dev->prev_data); in amd_pmf_init_smart_pc()
606 kfree(dev->policy_buf); in amd_pmf_init_smart_pc()
608 kfree(dev->buf); in amd_pmf_init_smart_pc()
610 cancel_delayed_work_sync(&dev->pb_work); in amd_pmf_init_smart_pc()
615 void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_deinit_smart_pc() argument
617 if (dev->pmf_idev) in amd_pmf_deinit_smart_pc()
618 input_unregister_device(dev->pmf_idev); in amd_pmf_deinit_smart_pc()
620 if (pb_side_load && dev->esbin) in amd_pmf_deinit_smart_pc()
621 amd_pmf_remove_pb(dev); in amd_pmf_deinit_smart_pc()
623 cancel_delayed_work_sync(&dev->pb_work); in amd_pmf_deinit_smart_pc()
624 kfree(dev->prev_data); in amd_pmf_deinit_smart_pc()
625 dev->prev_data = NULL; in amd_pmf_deinit_smart_pc()
626 kfree(dev->policy_buf); in amd_pmf_deinit_smart_pc()
627 dev->policy_buf = NULL; in amd_pmf_deinit_smart_pc()
628 kfree(dev->buf); in amd_pmf_deinit_smart_pc()
629 dev->buf = NULL; in amd_pmf_deinit_smart_pc()
630 amd_pmf_tee_deinit(dev); in amd_pmf_deinit_smart_pc()