Merge tag 'platform-drivers-x86-v6.8-4' into pdx86/for-next
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 12 Mar 2024 10:51:10 +0000 (12:51 +0200)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 12 Mar 2024 10:51:10 +0000 (12:51 +0200)
Merge tag 'platform-drivers-x86-v6.8-4' fixes into pdx86/for-next to
resolve amd/pmf conflicts.

1  2 
drivers/platform/x86/amd/pmf/core.c
drivers/platform/x86/amd/pmf/pmf.h
drivers/platform/x86/amd/pmf/tee-if.c
drivers/platform/x86/think-lmi.c
drivers/platform/x86/thinkpad_acpi.c
drivers/platform/x86/touchscreen_dmi.c

index 53c0f61e5c5fe8ac5f15ff1a896bf128b0af6440,4f734e049f4a46b60b139cf38ec7c7a2e193a4f6..5d4f80698a8b8824bdb59b4e5632ca5f05982c48
@@@ -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;
  }
  
Simple merge
index 75370431a82ef407e20b4f207994438c3bb59000,dcbe8f85e122947be014778c14478a7374698b49..b438de4d6bfcea2bd8f7b2c39a4df3bea438ddc2
@@@ -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 */
                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)
Simple merge
Simple merge