Lines Matching full:dev
47 static void amd_pmf_prepare_args(struct amd_pmf_dev *dev, int cmd, in amd_pmf_prepare_args() argument
55 arg->session = dev->session_id; in amd_pmf_prepare_args()
61 param[0].u.memref.shm = dev->fw_shm_pool; in amd_pmf_prepare_args()
65 static int amd_pmf_update_uevents(struct amd_pmf_dev *dev, u16 event) in amd_pmf_update_uevents() argument
73 kobject_uevent_env(&dev->dev->kobj, KOBJ_CHANGE, envp); in amd_pmf_update_uevents()
79 static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_result *out) in amd_pmf_apply_policies() argument
88 if (dev->prev_data->spl != val) { in amd_pmf_apply_policies()
89 amd_pmf_send_cmd(dev, SET_SPL, false, val, NULL); in amd_pmf_apply_policies()
90 dev_dbg(dev->dev, "update SPL: %u\n", val); in amd_pmf_apply_policies()
91 dev->prev_data->spl = val; in amd_pmf_apply_policies()
96 if (dev->prev_data->sppt != val) { in amd_pmf_apply_policies()
97 amd_pmf_send_cmd(dev, SET_SPPT, false, val, NULL); in amd_pmf_apply_policies()
98 dev_dbg(dev->dev, "update SPPT: %u\n", val); in amd_pmf_apply_policies()
99 dev->prev_data->sppt = val; in amd_pmf_apply_policies()
104 if (dev->prev_data->fppt != val) { in amd_pmf_apply_policies()
105 amd_pmf_send_cmd(dev, SET_FPPT, false, val, NULL); in amd_pmf_apply_policies()
106 dev_dbg(dev->dev, "update FPPT: %u\n", val); in amd_pmf_apply_policies()
107 dev->prev_data->fppt = val; in amd_pmf_apply_policies()
112 if (dev->prev_data->sppt_apuonly != val) { in amd_pmf_apply_policies()
113 amd_pmf_send_cmd(dev, SET_SPPT_APU_ONLY, false, val, NULL); in amd_pmf_apply_policies()
114 dev_dbg(dev->dev, "update SPPT_APU_ONLY: %u\n", val); in amd_pmf_apply_policies()
115 dev->prev_data->sppt_apuonly = val; in amd_pmf_apply_policies()
120 if (dev->prev_data->stt_minlimit != val) { in amd_pmf_apply_policies()
121 amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, false, val, NULL); in amd_pmf_apply_policies()
122 dev_dbg(dev->dev, "update STT_MIN: %u\n", val); in amd_pmf_apply_policies()
123 dev->prev_data->stt_minlimit = val; in amd_pmf_apply_policies()
128 if (dev->prev_data->stt_skintemp_apu != val) { in amd_pmf_apply_policies()
129 amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, false, val, NULL); in amd_pmf_apply_policies()
130 dev_dbg(dev->dev, "update STT_SKINTEMP_APU: %u\n", val); in amd_pmf_apply_policies()
131 dev->prev_data->stt_skintemp_apu = val; in amd_pmf_apply_policies()
136 if (dev->prev_data->stt_skintemp_hs2 != val) { in amd_pmf_apply_policies()
137 amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, false, val, NULL); in amd_pmf_apply_policies()
138 dev_dbg(dev->dev, "update STT_SKINTEMP_HS2: %u\n", val); in amd_pmf_apply_policies()
139 dev->prev_data->stt_skintemp_hs2 = val; in amd_pmf_apply_policies()
144 if (dev->prev_data->p3t_limit != val) { in amd_pmf_apply_policies()
145 amd_pmf_send_cmd(dev, SET_P3T, false, val, NULL); in amd_pmf_apply_policies()
146 dev_dbg(dev->dev, "update P3T: %u\n", val); in amd_pmf_apply_policies()
147 dev->prev_data->p3t_limit = val; in amd_pmf_apply_policies()
152 amd_pmf_update_uevents(dev, val); in amd_pmf_apply_policies()
153 dev_dbg(dev->dev, "update SYSTEM_STATE: %s\n", in amd_pmf_apply_policies()
160 static int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev) in amd_pmf_invoke_cmd_enact() argument
169 if (!dev->tee_ctx) in amd_pmf_invoke_cmd_enact()
172 memset(dev->shbuf, 0, dev->policy_sz); in amd_pmf_invoke_cmd_enact()
173 ta_sm = dev->shbuf; in amd_pmf_invoke_cmd_enact()
181 amd_pmf_populate_ta_inputs(dev, in); in amd_pmf_invoke_cmd_enact()
182 amd_pmf_prepare_args(dev, TA_PMF_COMMAND_POLICY_BUILDER_ENACT_POLICIES, &arg, param); in amd_pmf_invoke_cmd_enact()
184 ret = tee_client_invoke_func(dev->tee_ctx, &arg, param); in amd_pmf_invoke_cmd_enact()
186 dev_err(dev->dev, "TEE enact cmd failed. err: %x, ret:%d\n", arg.ret, ret); in amd_pmf_invoke_cmd_enact()
191 amd_pmf_dump_ta_inputs(dev, in); in amd_pmf_invoke_cmd_enact()
192 dev_dbg(dev->dev, "action count:%u result:%x\n", out->actions_count, in amd_pmf_invoke_cmd_enact()
194 amd_pmf_apply_policies(dev, out); in amd_pmf_invoke_cmd_enact()
200 static int amd_pmf_invoke_cmd_init(struct amd_pmf_dev *dev) in amd_pmf_invoke_cmd_init() argument
208 if (!dev->tee_ctx) { in amd_pmf_invoke_cmd_init()
209 dev_err(dev->dev, "Failed to get TEE context\n"); in amd_pmf_invoke_cmd_init()
213 dev_dbg(dev->dev, "Policy Binary size: %u bytes\n", dev->policy_sz); in amd_pmf_invoke_cmd_init()
214 memset(dev->shbuf, 0, dev->policy_sz); in amd_pmf_invoke_cmd_init()
215 ta_sm = dev->shbuf; in amd_pmf_invoke_cmd_init()
225 in->policies_table.table_size = dev->policy_sz; in amd_pmf_invoke_cmd_init()
227 memcpy(in->policies_table.table, dev->policy_buf, dev->policy_sz); in amd_pmf_invoke_cmd_init()
228 amd_pmf_prepare_args(dev, TA_PMF_COMMAND_POLICY_BUILDER_INITIALIZE, &arg, param); in amd_pmf_invoke_cmd_init()
230 ret = tee_client_invoke_func(dev->tee_ctx, &arg, param); in amd_pmf_invoke_cmd_init()
232 dev_err(dev->dev, "Failed to invoke TEE init cmd. err: %x, ret:%d\n", arg.ret, ret); in amd_pmf_invoke_cmd_init()
241 struct amd_pmf_dev *dev = container_of(work, struct amd_pmf_dev, pb_work.work); in amd_pmf_invoke_cmd() local
243 amd_pmf_invoke_cmd_enact(dev); in amd_pmf_invoke_cmd()
244 schedule_delayed_work(&dev->pb_work, msecs_to_jiffies(pb_actions_ms)); in amd_pmf_invoke_cmd()
247 static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev) in amd_pmf_start_policy_engine() argument
252 cookie = readl(dev->policy_buf + POLICY_COOKIE_OFFSET); in amd_pmf_start_policy_engine()
253 length = readl(dev->policy_buf + POLICY_COOKIE_LEN); in amd_pmf_start_policy_engine()
256 dev_dbg(dev->dev, "cookie doesn't match\n"); in amd_pmf_start_policy_engine()
261 dev->policy_sz = length + 512; in amd_pmf_start_policy_engine()
262 res = amd_pmf_invoke_cmd_init(dev); in amd_pmf_start_policy_engine()
265 dev->smart_pc_enabled = true; in amd_pmf_start_policy_engine()
270 schedule_delayed_work(&dev->pb_work, msecs_to_jiffies(pb_actions_ms * 3)); in amd_pmf_start_policy_engine()
272 dev_err(dev->dev, "ta invoke cmd init failed err: %x\n", res); in amd_pmf_start_policy_engine()
273 dev->smart_pc_enabled = false; in amd_pmf_start_policy_engine()
281 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) in amd_pmf_hex_dump_pb() argument
283 print_hex_dump_debug("(pb): ", DUMP_PREFIX_OFFSET, 16, 1, dev->policy_buf, in amd_pmf_hex_dump_pb()
284 dev->policy_sz, false); in amd_pmf_hex_dump_pb()
290 struct amd_pmf_dev *dev = filp->private_data; in amd_pmf_get_pb_data() local
308 kfree(dev->policy_buf); in amd_pmf_get_pb_data()
309 dev->policy_buf = new_policy_buf; in amd_pmf_get_pb_data()
310 dev->policy_sz = length; in amd_pmf_get_pb_data()
312 amd_pmf_hex_dump_pb(dev); in amd_pmf_get_pb_data()
313 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_get_pb_data()
325 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) in amd_pmf_open_pb() argument
327 dev->esbin = debugfs_create_dir("pb", debugfs_root); in amd_pmf_open_pb()
328 debugfs_create_file("update_policy", 0644, dev->esbin, dev, &pb_fops); in amd_pmf_open_pb()
331 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) in amd_pmf_remove_pb() argument
333 debugfs_remove_recursive(dev->esbin); in amd_pmf_remove_pb()
336 static void amd_pmf_open_pb(struct amd_pmf_dev *dev, struct dentry *debugfs_root) {} in amd_pmf_open_pb() argument
337 static void amd_pmf_remove_pb(struct amd_pmf_dev *dev) {} in amd_pmf_remove_pb() argument
338 static void amd_pmf_hex_dump_pb(struct amd_pmf_dev *dev) {} in amd_pmf_hex_dump_pb() argument
366 static int amd_pmf_tee_init(struct amd_pmf_dev *dev) in amd_pmf_tee_init() argument
371 dev->tee_ctx = tee_client_open_context(NULL, amd_pmf_amdtee_ta_match, NULL, NULL); in amd_pmf_tee_init()
372 if (IS_ERR(dev->tee_ctx)) { in amd_pmf_tee_init()
373 dev_err(dev->dev, "Failed to open TEE context\n"); in amd_pmf_tee_init()
374 return PTR_ERR(dev->tee_ctx); in amd_pmf_tee_init()
377 ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id); in amd_pmf_tee_init()
379 dev_err(dev->dev, "Failed to open TA session (%d)\n", ret); in amd_pmf_tee_init()
384 size = sizeof(struct ta_pmf_shared_memory) + dev->policy_sz; in amd_pmf_tee_init()
385 dev->fw_shm_pool = tee_shm_alloc_kernel_buf(dev->tee_ctx, size); in amd_pmf_tee_init()
386 if (IS_ERR(dev->fw_shm_pool)) { in amd_pmf_tee_init()
387 dev_err(dev->dev, "Failed to alloc TEE shared memory\n"); in amd_pmf_tee_init()
388 ret = PTR_ERR(dev->fw_shm_pool); in amd_pmf_tee_init()
392 dev->shbuf = tee_shm_get_va(dev->fw_shm_pool, 0); in amd_pmf_tee_init()
393 if (IS_ERR(dev->shbuf)) { in amd_pmf_tee_init()
394 dev_err(dev->dev, "Failed to get TEE virtual address\n"); in amd_pmf_tee_init()
395 ret = PTR_ERR(dev->shbuf); in amd_pmf_tee_init()
398 dev_dbg(dev->dev, "TEE init done\n"); in amd_pmf_tee_init()
403 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_init()
405 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_init()
407 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_init()
412 static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev) in amd_pmf_tee_deinit() argument
414 tee_shm_free(dev->fw_shm_pool); in amd_pmf_tee_deinit()
415 tee_client_close_session(dev->tee_ctx, dev->session_id); in amd_pmf_tee_deinit()
416 tee_client_close_context(dev->tee_ctx); in amd_pmf_tee_deinit()
419 int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_init_smart_pc() argument
423 ret = apmf_check_smart_pc(dev); in amd_pmf_init_smart_pc()
430 dev_info(dev->dev, "PMF Smart PC not advertised in BIOS!:%d\n", ret); in amd_pmf_init_smart_pc()
434 ret = amd_pmf_tee_init(dev); in amd_pmf_init_smart_pc()
438 INIT_DELAYED_WORK(&dev->pb_work, amd_pmf_invoke_cmd); in amd_pmf_init_smart_pc()
440 ret = amd_pmf_set_dram_addr(dev, true); in amd_pmf_init_smart_pc()
444 dev->policy_base = devm_ioremap(dev->dev, dev->policy_addr, dev->policy_sz); in amd_pmf_init_smart_pc()
445 if (!dev->policy_base) { in amd_pmf_init_smart_pc()
450 dev->policy_buf = kzalloc(dev->policy_sz, GFP_KERNEL); in amd_pmf_init_smart_pc()
451 if (!dev->policy_buf) { in amd_pmf_init_smart_pc()
456 memcpy(dev->policy_buf, dev->policy_base, dev->policy_sz); in amd_pmf_init_smart_pc()
458 amd_pmf_hex_dump_pb(dev); in amd_pmf_init_smart_pc()
460 dev->prev_data = kzalloc(sizeof(*dev->prev_data), GFP_KERNEL); in amd_pmf_init_smart_pc()
461 if (!dev->prev_data) { in amd_pmf_init_smart_pc()
466 ret = amd_pmf_start_policy_engine(dev); in amd_pmf_init_smart_pc()
471 amd_pmf_open_pb(dev, dev->dbgfs_dir); in amd_pmf_init_smart_pc()
476 amd_pmf_deinit_smart_pc(dev); in amd_pmf_init_smart_pc()
481 void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev) in amd_pmf_deinit_smart_pc() argument
483 if (pb_side_load && dev->esbin) in amd_pmf_deinit_smart_pc()
484 amd_pmf_remove_pb(dev); in amd_pmf_deinit_smart_pc()
486 cancel_delayed_work_sync(&dev->pb_work); in amd_pmf_deinit_smart_pc()
487 kfree(dev->prev_data); in amd_pmf_deinit_smart_pc()
488 dev->prev_data = NULL; in amd_pmf_deinit_smart_pc()
489 kfree(dev->policy_buf); in amd_pmf_deinit_smart_pc()
490 dev->policy_buf = NULL; in amd_pmf_deinit_smart_pc()
491 kfree(dev->buf); in amd_pmf_deinit_smart_pc()
492 dev->buf = NULL; in amd_pmf_deinit_smart_pc()
493 amd_pmf_tee_deinit(dev); in amd_pmf_deinit_smart_pc()