From: Ilpo Järvinen Date: Tue, 12 Mar 2024 10:51:10 +0000 (+0200) Subject: Merge tag 'platform-drivers-x86-v6.8-4' into pdx86/for-next X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=1c0a50de025d0d52825dfa5d7749c56ad6c4fa00;p=linux.git Merge tag 'platform-drivers-x86-v6.8-4' into pdx86/for-next Merge tag 'platform-drivers-x86-v6.8-4' fixes into pdx86/for-next to resolve amd/pmf conflicts. --- 1c0a50de025d0d52825dfa5d7749c56ad6c4fa00 diff --cc drivers/platform/x86/amd/pmf/core.c index 53c0f61e5c5fe,4f734e049f4a4..5d4f80698a8b8 --- a/drivers/platform/x86/amd/pmf/core.c +++ b/drivers/platform/x86/amd/pmf/core.c @@@ -297,11 -296,9 +297,12 @@@ static int amd_pmf_suspend_handler(stru { struct amd_pmf_dev *pdev = dev_get_drvdata(dev); - kfree(pdev->buf); + if (pdev->smart_pc_enabled) + cancel_delayed_work_sync(&pdev->pb_work); + if (is_apmf_func_supported(pdev, APMF_FUNC_SBIOS_HEARTBEAT_V2)) + amd_pmf_notify_sbios_heartbeat_event_v2(pdev, ON_SUSPEND); + return 0; } @@@ -316,9 -313,9 +317,12 @@@ static int amd_pmf_resume_handler(struc return ret; } + if (is_apmf_func_supported(pdev, APMF_FUNC_SBIOS_HEARTBEAT_V2)) + amd_pmf_notify_sbios_heartbeat_event_v2(pdev, ON_RESUME); + + if (pdev->smart_pc_enabled) + schedule_delayed_work(&pdev->pb_work, msecs_to_jiffies(2000)); + return 0; } diff --cc drivers/platform/x86/amd/pmf/tee-if.c index 75370431a82ef,dcbe8f85e1229..b438de4d6bfce --- a/drivers/platform/x86/amd/pmf/tee-if.c +++ b/drivers/platform/x86/amd/pmf/tee-if.c @@@ -246,22 -246,19 +246,24 @@@ static void amd_pmf_invoke_cmd(struct w static int amd_pmf_start_policy_engine(struct amd_pmf_dev *dev) { - u32 cookie, length; + struct cookie_header *header; int res; - cookie = readl(dev->policy_buf + POLICY_COOKIE_OFFSET); - length = readl(dev->policy_buf + POLICY_COOKIE_LEN); + if (dev->policy_sz < POLICY_COOKIE_OFFSET + sizeof(*header)) + return -EINVAL; + + header = (struct cookie_header *)(dev->policy_buf + POLICY_COOKIE_OFFSET); - if (header->sign != POLICY_SIGN_COOKIE || !header->length) - if (cookie != POLICY_SIGN_COOKIE || !length) { ++ if (header->sign != POLICY_SIGN_COOKIE || !header->length) { + dev_dbg(dev->dev, "cookie doesn't match\n"); return -EINVAL; + } + if (dev->policy_sz < header->length + 512) + return -EINVAL; + /* Update the actual length */ - dev->policy_sz = length + 512; + dev->policy_sz = header->length + 512; res = amd_pmf_invoke_cmd_init(dev); if (res == TA_PMF_TYPE_SUCCESS) { /* Now its safe to announce that smart pc is enabled */ @@@ -273,8 -270,8 +275,8 @@@ 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->smart_pc_enabled = PMF_SMART_PC_DISABLED; + dev->smart_pc_enabled = false; - return res; + return -EIO; } return 0; @@@ -458,13 -436,46 +441,46 @@@ int amd_pmf_init_smart_pc(struct amd_pm return ret; INIT_DELAYED_WORK(&dev->pb_work, amd_pmf_invoke_cmd); - amd_pmf_set_dram_addr(dev, true); - amd_pmf_get_bios_buffer(dev); + + ret = amd_pmf_set_dram_addr(dev, true); + if (ret) + goto error; + + dev->policy_base = devm_ioremap(dev->dev, dev->policy_addr, dev->policy_sz); + if (!dev->policy_base) { + ret = -ENOMEM; + goto error; + } + + dev->policy_buf = kzalloc(dev->policy_sz, GFP_KERNEL); + if (!dev->policy_buf) { + ret = -ENOMEM; + goto error; + } + - memcpy(dev->policy_buf, dev->policy_base, dev->policy_sz); ++ memcpy_fromio(dev->policy_buf, dev->policy_base, dev->policy_sz); + + amd_pmf_hex_dump_pb(dev); + dev->prev_data = kzalloc(sizeof(*dev->prev_data), GFP_KERNEL); - if (!dev->prev_data) - return -ENOMEM; + if (!dev->prev_data) { + ret = -ENOMEM; + goto error; + } + + ret = amd_pmf_start_policy_engine(dev); + if (ret) + goto error; + + if (pb_side_load) + amd_pmf_open_pb(dev, dev->dbgfs_dir); + + return 0; - return dev->smart_pc_enabled; + error: + amd_pmf_deinit_smart_pc(dev); + + return ret; } void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev)