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()
338 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) in amd_pmf_hex_dump_pb() argument
340 print_hex_dump_debug("(pb): ", DUMP_PREFIX_OFFSET, 16, 1, dev->policy_buf, in amd_pmf_hex_dump_pb()
341 dev->policy_sz, false); in amd_pmf_hex_dump_pb()
347 struct amd_pmf_dev *dev = filp->private_data; in amd_pmf_get_pb_data() local
360 kfree(dev->policy_buf); in amd_pmf_get_pb_data()
361 dev->policy_buf = new_policy_buf; in amd_pmf_get_pb_data()
362 dev->policy_sz = length; in amd_pmf_get_pb_data()
364 amd_pmf_hex_dump_pb(dev); in amd_pmf_get_pb_data()
365 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_get_pb_data()
377 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) in amd_pmf_open_pb() argument
379 dev->esbin = debugfs_create_dir("pb", debugfs_root); in amd_pmf_open_pb()
380 debugfs_create_file("update_policy", 0644, dev->esbin, dev, &pb_fops); in amd_pmf_open_pb()
383 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) in amd_pmf_remove_pb() argument
385 debugfs_remove_recursive(dev->esbin); in amd_pmf_remove_pb()
388 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) {} in amd_pmf_open_pb() argument
389 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) {} in amd_pmf_remove_pb() argument
390 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) {} in amd_pmf_hex_dump_pb() argument
418 static int amd_pmf_register_input_device(struct amd_pmf_dev *dev) in amd_pmf_register_input_device() argument
422 dev->pmf_idev = devm_input_allocate_device(dev->dev); in amd_pmf_register_input_device()
423 if (!dev->pmf_idev) in amd_pmf_register_input_device()
426 dev->pmf_idev->name = "PMF-TA output events"; in amd_pmf_register_input_device()
427 dev->pmf_idev->phys = "amd-pmf/input0"; in amd_pmf_register_input_device()
429 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SLEEP); in amd_pmf_register_input_device()
430 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SCREENLOCK); in amd_pmf_register_input_device()
431 input_set_capability(dev->pmf_idev, EV_KEY, KEY_SUSPEND); in amd_pmf_register_input_device()
433 err = input_register_device(dev->pmf_idev); in amd_pmf_register_input_device()
435 dev_err(dev->dev, "Failed to register input device: %d\n", err); in amd_pmf_register_input_device()
442 static int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid) in amd_pmf_tee_init() argument
447 dev->tee_ctx = tee_client_open_context(NULL, amd_pmf_amdtee_ta_match, NULL, NULL); in amd_pmf_tee_init()
448 if (IS_ERR(dev->tee_ctx)) { in amd_pmf_tee_init()
449 dev_err(dev->dev, "Failed to open TEE context\n"); in amd_pmf_tee_init()
450 return PTR_ERR(dev->tee_ctx); in amd_pmf_tee_init()
453 ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id, uuid); in amd_pmf_tee_init()
455 dev_err(dev->dev, "Failed to open TA session (%d)\n", ret); in amd_pmf_tee_init()
460 size = sizeof(struct ta_pmf_shared_memory) + dev->policy_sz; in amd_pmf_tee_init()
461 dev->fw_shm_pool = tee_shm_alloc_kernel_buf(dev->tee_ctx, size); in amd_pmf_tee_init()
462 if (IS_ERR(dev->fw_shm_pool)) { in amd_pmf_tee_init()
463 dev_err(dev->dev, "Failed to alloc TEE shared memory\n"); in amd_pmf_tee_init()
464 ret = PTR_ERR(dev->fw_shm_pool); in amd_pmf_tee_init()
468 dev->shbuf = tee_shm_get_va(dev->fw_shm_pool, 0); in amd_pmf_tee_init()
469 if (IS_ERR(dev->shbuf)) { in amd_pmf_tee_init()
470 dev_err(dev->dev, "Failed to get TEE virtual address\n"); in amd_pmf_tee_init()
471 ret = PTR_ERR(dev->shbuf); in amd_pmf_tee_init()
474 dev_dbg(dev->dev, "TEE init done\n"); in amd_pmf_tee_init()
479 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_init()
481 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_init()
483 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_init()
488 static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev) in amd_pmf_tee_deinit() argument
490 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_deinit()
491 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_deinit()
492 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_deinit()
495 int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_init_smart_pc() argument
500 ret = apmf_check_smart_pc(dev); in amd_pmf_init_smart_pc()
507 dev_info(dev->dev, "PMF Smart PC not advertised in BIOS!:%d\n", ret); in amd_pmf_init_smart_pc()
511 INIT_DELAYED_WORK(&dev->pb_work, amd_pmf_invoke_cmd); in amd_pmf_init_smart_pc()
513 ret = amd_pmf_set_dram_addr(dev, true); in amd_pmf_init_smart_pc()
517 dev->policy_base = devm_ioremap_resource(dev->dev, dev->res); in amd_pmf_init_smart_pc()
518 if (IS_ERR(dev->policy_base)) { in amd_pmf_init_smart_pc()
519 ret = PTR_ERR(dev->policy_base); in amd_pmf_init_smart_pc()
523 dev->policy_buf = kzalloc(dev->policy_sz, GFP_KERNEL); in amd_pmf_init_smart_pc()
524 if (!dev->policy_buf) { in amd_pmf_init_smart_pc()
529 memcpy_fromio(dev->policy_buf, dev->policy_base, dev->policy_sz); in amd_pmf_init_smart_pc()
531 amd_pmf_hex_dump_pb(dev); in amd_pmf_init_smart_pc()
533 dev->prev_data = kzalloc(sizeof(*dev->prev_data), GFP_KERNEL); in amd_pmf_init_smart_pc()
534 if (!dev->prev_data) { in amd_pmf_init_smart_pc()
540 ret = amd_pmf_tee_init(dev, &amd_pmf_ta_uuid[i]); in amd_pmf_init_smart_pc()
544 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_init_smart_pc()
551 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
556 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
570 amd_pmf_open_pb(dev, dev->dbgfs_dir); in amd_pmf_init_smart_pc()
572 ret = amd_pmf_register_input_device(dev); in amd_pmf_init_smart_pc()
579 if (pb_side_load && dev->esbin) in amd_pmf_init_smart_pc()
580 amd_pmf_remove_pb(dev); in amd_pmf_init_smart_pc()
581 amd_pmf_tee_deinit(dev); in amd_pmf_init_smart_pc()
583 kfree(dev->prev_data); in amd_pmf_init_smart_pc()
585 kfree(dev->policy_buf); in amd_pmf_init_smart_pc()
587 kfree(dev->buf); in amd_pmf_init_smart_pc()
589 cancel_delayed_work_sync(&dev->pb_work); in amd_pmf_init_smart_pc()
594 void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_deinit_smart_pc() argument
596 if (dev->pmf_idev) in amd_pmf_deinit_smart_pc()
597 input_unregister_device(dev->pmf_idev); in amd_pmf_deinit_smart_pc()
599 if (pb_side_load && dev->esbin) in amd_pmf_deinit_smart_pc()
600 amd_pmf_remove_pb(dev); in amd_pmf_deinit_smart_pc()
602 cancel_delayed_work_sync(&dev->pb_work); in amd_pmf_deinit_smart_pc()
603 kfree(dev->prev_data); in amd_pmf_deinit_smart_pc()
604 dev->prev_data = NULL; in amd_pmf_deinit_smart_pc()
605 kfree(dev->policy_buf); in amd_pmf_deinit_smart_pc()
606 dev->policy_buf = NULL; in amd_pmf_deinit_smart_pc()
607 kfree(dev->buf); in amd_pmf_deinit_smart_pc()
608 dev->buf = NULL; in amd_pmf_deinit_smart_pc()
609 amd_pmf_tee_deinit(dev); in amd_pmf_deinit_smart_pc()