aboutsummarylogtreecommitdiffstats
path: root/9001-v5.16.5-s0ix-patch-2022-02-01.patch
diff options
context:
space:
mode:
Diffstat (limited to '9001-v5.16.5-s0ix-patch-2022-02-01.patch')
-rw-r--r--9001-v5.16.5-s0ix-patch-2022-02-01.patch508
1 files changed, 0 insertions, 508 deletions
diff --git a/9001-v5.16.5-s0ix-patch-2022-02-01.patch b/9001-v5.16.5-s0ix-patch-2022-02-01.patch
deleted file mode 100644
index dd3b29e07172..000000000000
--- a/9001-v5.16.5-s0ix-patch-2022-02-01.patch
+++ /dev/null
@@ -1,508 +0,0 @@
-From 34028bb7dfd0857335aee9c0a4d39af6d2c54de4 Mon Sep 17 00:00:00 2001
-From: Scott B <arglebargle@arglebargle.dev>
-Date: Tue, 1 Feb 2022 01:39:06 -0800
-Subject: [PATCH] v5.16.5 s0ix patch 2022-02-01
-
-Squashed commit of the following:
-
-commit ea664c8be33e351114d8720119ddd0f5f3130f9d
-Author: Mario Limonciello <mario.limonciello@amd.com>
-Date: Fri Jan 28 14:35:03 2022 -0600
-
- ACPI: PM: Revert "Only mark EC GPE for wakeup on Intel systems"
-
- Testing on various upcoming OEM systems shows commit 7b167c4cb48e ("ACPI:
- PM: Only mark EC GPE for wakeup on Intel systems") was short
- sighted and the symptoms were indicative of other problems. Some OEMs
- do have the dedicated GPIOs for the power button but also rely upon
- an interrupt to the EC SCI to let the lid work.
-
- The original commit showed spurious activity on Lenovo systems:
- * On both Lenovo T14 and P14s the keyboard wakeup doesn't work, and
- sometimes the power button event doesn't work.
-
- This was confirmed on my end at that time.
-
- However further development in the kernel showed that the issue was
- actually the IRQ for the GPIO controller was also shared with the EC SCI.
- This was actually fixed by commit 2d54067fcd23 ("pinctrl: amd: Fix
- wakeups when IRQ is shared with SCI").
-
- The original commit also showed problems with AC adapter:
- * On HP 635 G7 detaching or attaching AC during suspend will cause
- the system not to wakeup
- * On Asus vivobook to prevent detaching AC causing resume problems
- * On Lenovo 14ARE05 to prevent detaching AC causing resume problems
- * On HP ENVY x360 to prevent detaching AC causing resume problems
-
- Detaching AC adapter causing problems appears to have been a problem
- because the EC SCI went off to notify the OS of the power adapter change
- but the SCI was ignored and there was no other way to wake up this system
- since GPIO controller wasn't properly enabled. The wakeups were fixed by
- enabling the GPIO controller in commit acd47b9f28e5 ("pinctrl: amd: Handle
- wake-up interrupt").
-
- I've confirmed on a variety of OEM notebooks with the following test
- 1) echo 1 | sudo tee /sys/power/pm_debug_messages
- 2) sudo systemctl suspend
- 3) unplug AC adapter, make sure system is still asleep
- 4) wake system from lid (which is provided by ACPI SCI on some of them)
- 5) dmesg
- a) see the EC GPE dispatched, timekeeping for X seconds (matching ~time
- until AC adapter plug out)
- b) see timekeeping for Y seconds until woke (matching ~time from AC
- adapter until lid event)
- 6) Look at /sys/kernel/debug/amd_pmc/s0ix_stats
- "Time (in us) in S0i3" = X + Y - firmware processing time
-
- Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
- Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
-
-commit e3219ec6a0a52d400dbb78dfcc919f0881e625d5
-Author: Mario Limonciello <mario.limonciello@amd.com>
-Date: Thu Jan 20 11:44:39 2022 -0600
-
- platform/x86: amd-pmc: Correct usage of SMU version
-
- Yellow carp has been outputting versions like `1093.24.0`, but this
- is supposed to be 69.24.0. That is the MSB is being interpreted
- incorrectly.
-
- The MSB is not part of the major version, but has generally been
- treated that way thus far. It's actually the program, and used to
- distinguish between two programs from a similar family but different
- codebase.
-
- Link: https://patchwork.freedesktop.org/patch/469993/
- Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
-
-commit 79455bfa73afb98aafbf1c3f8e8fc1db1eeecfc2
-Author: Sanket Goswami <Sanket.Goswami@amd.com>
-Date: Tue Nov 30 16:53:18 2021 +0530
-
- platform/x86: amd-pmc: Add support for AMD Smart Trace Buffer (v6)
-
- STB (Smart Trace Buffer), is a debug trace buffer that isolates the
- failures by analyzing the last running feature of a system. This
- non-intrusive way always runs in the background and stores the trace
- into the SoC.
-
- This patch enables the STB feature by passing module param
- "enable_stb=1" while loading the driver and provides mechanism to
- access the STB buffer using the read and write routines.
-
- Co-developed-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
- Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
- Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com>
-
-commit 488b95d5909a32226f40b3ad6c3785939ccc6609
-Author: Sanket Goswami <Sanket.Goswami@amd.com>
-Date: Tue Nov 30 16:53:17 2021 +0530
-
- platform/x86: amd-pmc: Simplify error handling and store the pci_dev in amd_pmc_dev structure
-
- Handle error-exits in the amd_pmc_probe() to avoid duplication and store
- the root port information in amd_pmc_probe() so that the information
- can be used across multiple routines.
-
- Suggested-by: Hans de Goede <hdegoede@redhat.com>
- Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com>
-
-commit e59eb4486721ed0d343e424ce011fd077be8833e
-Author: Julian Sikorski <belegdol+github@gmail.com>
-Date: Fri Nov 19 17:52:36 2021 +0100
-
- GFXOFF check patch by Lijo Lazar
-
-commit 9958345a9b27cd6e6f4ac6eab2fcb3e0039250c7
-Author: Mario Limonciello <mario.limonciello@amd.com>
-Date: Fri Sep 24 12:32:06 2021 -0500
-
- ACPI: PM: s2idle: Don't report missing devices as failing constraints
-
- ACPI tables may have entries for devices that are not physically
- present but that can be connected. These devices shouldn't cause
- constraints checking to fail.
-
- Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
- Change-Id: I34f5ca978aab69ff0a0906191eec21649b19fe27
----
- drivers/acpi/x86/s2idle.c | 18 ++-
- drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 5 +-
- drivers/platform/x86/amd-pmc.c | 185 +++++++++++++++++++---
- 3 files changed, 179 insertions(+), 29 deletions(-)
-
-diff --git a/drivers/acpi/x86/s2idle.c b/drivers/acpi/x86/s2idle.c
-index 1c48358b43ba..374aa2e8203f 100644
---- a/drivers/acpi/x86/s2idle.c
-+++ b/drivers/acpi/x86/s2idle.c
-@@ -309,6 +309,12 @@ static void lpi_check_constraints(void)
- continue;
- }
-
-+ if (!acpi_get_first_physical_node(adev)) {
-+ acpi_handle_debug(handle, "LPI: Device is not physically present\n");
-+ lpi_constraints_table[i].handle = NULL;
-+ continue;
-+ }
-+
- if (adev->power.state < lpi_constraints_table[i].min_dstate)
- acpi_handle_info(handle,
- "LPI: Constraint not met; min power state:%s current power state:%s\n",
-@@ -424,15 +430,11 @@ static int lps0_device_attach(struct acpi_device *adev,
- mem_sleep_current = PM_SUSPEND_TO_IDLE;
-
- /*
-- * Some Intel based LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U don't
-- * use intel-hid or intel-vbtn but require the EC GPE to be enabled while
-- * suspended for certain wakeup devices to work, so mark it as wakeup-capable.
-- *
-- * Only enable on !AMD as enabling this universally causes problems for a number
-- * of AMD based systems.
-+ * Some LPS0 systems, like ASUS Zenbook UX430UNR/i7-8550U, require the
-+ * EC GPE to be enabled while suspended for certain wakeup devices to
-+ * work, so mark it as wakeup-capable.
- */
-- if (!acpi_s2idle_vendor_amd())
-- acpi_ec_mark_gpe_for_wake();
-+ acpi_ec_mark_gpe_for_wake();
-
- return 0;
- }
-diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
-index 9d7d64fdf410..37e83df92264 100644
---- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
-+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
-@@ -277,8 +277,11 @@ static int smu_dpm_set_power_gate(void *handle,
- struct smu_context *smu = handle;
- int ret = 0;
-
-- if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
-+ if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) {
-+ WARN(true, "SMU uninitialized but power %s requested for %u!\n",
-+ gate ? "gate" : "ungate", block_type);
- return -EOPNOTSUPP;
-+ }
-
- switch (block_type) {
- /*
-diff --git a/drivers/platform/x86/amd-pmc.c b/drivers/platform/x86/amd-pmc.c
-index 230593ae5d6d..9b6dc15547f5 100644
---- a/drivers/platform/x86/amd-pmc.c
-+++ b/drivers/platform/x86/amd-pmc.c
-@@ -35,6 +35,12 @@
- #define AMD_PMC_SCRATCH_REG_CZN 0x94
- #define AMD_PMC_SCRATCH_REG_YC 0xD14
-
-+/* STB Registers */
-+#define AMD_PMC_STB_INDEX_ADDRESS 0xF8
-+#define AMD_PMC_STB_INDEX_DATA 0xFC
-+#define AMD_PMC_STB_PMI_0 0x03E30600
-+#define AMD_PMC_STB_PREDEF 0xC6000001
-+
- /* Base address of SMU for mapping physical address to virtual address */
- #define AMD_PMC_SMU_INDEX_ADDRESS 0xB8
- #define AMD_PMC_SMU_INDEX_DATA 0xBC
-@@ -82,6 +88,7 @@
- #define SOC_SUBSYSTEM_IP_MAX 12
- #define DELAY_MIN_US 2000
- #define DELAY_MAX_US 3000
-+#define FIFO_SIZE 4096
- enum amd_pmc_def {
- MSG_TEST = 0x01,
- MSG_OS_HINT_PCO,
-@@ -117,18 +124,26 @@ struct amd_pmc_dev {
- u32 cpu_id;
- u32 active_ips;
- /* SMU version information */
-- u16 major;
-- u16 minor;
-- u16 rev;
-+ u8 smu_program;
-+ u8 major;
-+ u8 minor;
-+ u8 rev;
- struct device *dev;
-+ struct pci_dev *rdev;
- struct mutex lock; /* generic mutex lock */
- #if IS_ENABLED(CONFIG_DEBUG_FS)
- struct dentry *dbgfs_dir;
- #endif /* CONFIG_DEBUG_FS */
- };
-
-+static bool enable_stb;
-+module_param(enable_stb, bool, 0644);
-+MODULE_PARM_DESC(enable_stb, "Enable the STB debug mechanism");
-+
- static struct amd_pmc_dev pmc;
- static int amd_pmc_send_cmd(struct amd_pmc_dev *dev, u32 arg, u32 *data, u8 msg, bool ret);
-+static int amd_pmc_write_stb(struct amd_pmc_dev *dev, u32 data);
-+static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf);
-
- static inline u32 amd_pmc_reg_read(struct amd_pmc_dev *dev, int reg_offset)
- {
-@@ -166,15 +181,61 @@ static int amd_pmc_get_smu_version(struct amd_pmc_dev *dev)
- if (rc)
- return rc;
-
-- dev->major = (val >> 16) & GENMASK(15, 0);
-+ dev->smu_program = (val >> 24) & GENMASK(7, 0);
-+ dev->major = (val >> 16) & GENMASK(7, 0);
- dev->minor = (val >> 8) & GENMASK(7, 0);
- dev->rev = (val >> 0) & GENMASK(7, 0);
-
-- dev_dbg(dev->dev, "SMU version is %u.%u.%u\n", dev->major, dev->minor, dev->rev);
-+ dev_dbg(dev->dev, "SMU program %u version is %u.%u.%u\n",
-+ dev->smu_program, dev->major, dev->minor, dev->rev);
-
- return 0;
- }
-
-+static int amd_pmc_stb_debugfs_open(struct inode *inode, struct file *filp)
-+{
-+ struct amd_pmc_dev *dev = filp->f_inode->i_private;
-+ u32 size = FIFO_SIZE * sizeof(u32);
-+ u32 *buf;
-+ int rc;
-+
-+ buf = kzalloc(size, GFP_KERNEL);
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ rc = amd_pmc_read_stb(dev, buf);
-+ if (rc) {
-+ kfree(buf);
-+ return rc;
-+ }
-+
-+ filp->private_data = buf;
-+ return rc;
-+}
-+
-+static ssize_t amd_pmc_stb_debugfs_read(struct file *filp, char __user *buf, size_t size,
-+ loff_t *pos)
-+{
-+ if (!filp->private_data)
-+ return -EINVAL;
-+
-+ return simple_read_from_buffer(buf, size, pos, filp->private_data,
-+ FIFO_SIZE * sizeof(u32));
-+}
-+
-+static int amd_pmc_stb_debugfs_release(struct inode *inode, struct file *filp)
-+{
-+ kfree(filp->private_data);
-+ return 0;
-+}
-+
-+const struct file_operations amd_pmc_stb_debugfs_fops = {
-+ .owner = THIS_MODULE,
-+ .open = amd_pmc_stb_debugfs_open,
-+ .read = amd_pmc_stb_debugfs_read,
-+ .release = amd_pmc_stb_debugfs_release,
-+};
-+
- static int amd_pmc_idlemask_read(struct amd_pmc_dev *pdev, struct device *dev,
- struct seq_file *s)
- {
-@@ -288,6 +349,10 @@ static void amd_pmc_dbgfs_register(struct amd_pmc_dev *dev)
- &s0ix_stats_fops);
- debugfs_create_file("amd_pmc_idlemask", 0644, dev->dbgfs_dir, dev,
- &amd_pmc_idlemask_fops);
-+ /* Enable STB only when the module_param is set */
-+ if (enable_stb)
-+ debugfs_create_file("stb_read", 0644, dev->dbgfs_dir, dev,
-+ &amd_pmc_stb_debugfs_fops);
- }
- #else
- static inline void amd_pmc_dbgfs_register(struct amd_pmc_dev *dev)
-@@ -484,6 +549,13 @@ static int __maybe_unused amd_pmc_suspend(struct device *dev)
- if (rc)
- dev_err(pdev->dev, "suspend failed\n");
-
-+ if (enable_stb)
-+ rc = amd_pmc_write_stb(pdev, AMD_PMC_STB_PREDEF);
-+ if (rc) {
-+ dev_err(pdev->dev, "error writing to STB\n");
-+ return rc;
-+ }
-+
- return rc;
- }
-
-@@ -504,6 +576,14 @@ static int __maybe_unused amd_pmc_resume(struct device *dev)
- /* Dump the IdleMask to see the blockers */
- amd_pmc_idlemask_read(pdev, dev, NULL);
-
-+ /* Write data incremented by 1 to distinguish in stb_read */
-+ if (enable_stb)
-+ rc = amd_pmc_write_stb(pdev, AMD_PMC_STB_PREDEF + 1);
-+ if (rc) {
-+ dev_err(pdev->dev, "error writing to STB\n");
-+ return rc;
-+ }
-+
- return 0;
- }
-
-@@ -521,6 +601,62 @@ static const struct pci_device_id pmc_pci_ids[] = {
- { }
- };
-
-+static int amd_pmc_write_stb(struct amd_pmc_dev *dev, u32 data)
-+{
-+ int err;
-+
-+ err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_ADDRESS, AMD_PMC_STB_PMI_0);
-+ if (err) {
-+ dev_err(dev->dev, "failed to write addr in stb: 0x%X\n",
-+ AMD_PMC_STB_INDEX_ADDRESS);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
-+ }
-+
-+ err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_DATA, data);
-+ if (err) {
-+ dev_err(dev->dev, "failed to write data in stb: 0x%X\n",
-+ AMD_PMC_STB_INDEX_DATA);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
-+ }
-+
-+ return 0;
-+
-+err_pci_dev_put:
-+ pci_dev_put(dev->rdev);
-+ return err;
-+}
-+
-+static int amd_pmc_read_stb(struct amd_pmc_dev *dev, u32 *buf)
-+{
-+ int i, err;
-+
-+ err = pci_write_config_dword(dev->rdev, AMD_PMC_STB_INDEX_ADDRESS, AMD_PMC_STB_PMI_0);
-+ if (err) {
-+ dev_err(dev->dev, "error writing addr to stb: 0x%X\n",
-+ AMD_PMC_STB_INDEX_ADDRESS);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
-+ }
-+
-+ for (i = 0; i < FIFO_SIZE; i++) {
-+ err = pci_read_config_dword(dev->rdev, AMD_PMC_STB_INDEX_DATA, buf++);
-+ if (err) {
-+ dev_err(dev->dev, "error reading data from stb: 0x%X\n",
-+ AMD_PMC_STB_INDEX_DATA);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
-+ }
-+ }
-+
-+ return 0;
-+
-+err_pci_dev_put:
-+ pci_dev_put(dev->rdev);
-+ return err;
-+}
-+
- static int amd_pmc_probe(struct platform_device *pdev)
- {
- struct amd_pmc_dev *dev = &pmc;
-@@ -534,22 +670,23 @@ static int amd_pmc_probe(struct platform_device *pdev)
-
- rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
- if (!rdev || !pci_match_id(pmc_pci_ids, rdev)) {
-- pci_dev_put(rdev);
-- return -ENODEV;
-+ err = -ENODEV;
-+ goto err_pci_dev_put;
- }
-
- dev->cpu_id = rdev->device;
-+ dev->rdev = rdev;
- err = pci_write_config_dword(rdev, AMD_PMC_SMU_INDEX_ADDRESS, AMD_PMC_BASE_ADDR_LO);
- if (err) {
- dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMC_SMU_INDEX_ADDRESS);
-- pci_dev_put(rdev);
-- return pcibios_err_to_errno(err);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
- }
-
- err = pci_read_config_dword(rdev, AMD_PMC_SMU_INDEX_DATA, &val);
- if (err) {
-- pci_dev_put(rdev);
-- return pcibios_err_to_errno(err);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
- }
-
- base_addr_lo = val & AMD_PMC_BASE_ADDR_HI_MASK;
-@@ -557,24 +694,25 @@ static int amd_pmc_probe(struct platform_device *pdev)
- err = pci_write_config_dword(rdev, AMD_PMC_SMU_INDEX_ADDRESS, AMD_PMC_BASE_ADDR_HI);
- if (err) {
- dev_err(dev->dev, "error writing to 0x%x\n", AMD_PMC_SMU_INDEX_ADDRESS);
-- pci_dev_put(rdev);
-- return pcibios_err_to_errno(err);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
- }
-
- err = pci_read_config_dword(rdev, AMD_PMC_SMU_INDEX_DATA, &val);
- if (err) {
-- pci_dev_put(rdev);
-- return pcibios_err_to_errno(err);
-+ err = pcibios_err_to_errno(err);
-+ goto err_pci_dev_put;
- }
-
- base_addr_hi = val & AMD_PMC_BASE_ADDR_LO_MASK;
-- pci_dev_put(rdev);
- base_addr = ((u64)base_addr_hi << 32 | base_addr_lo);
-
- dev->regbase = devm_ioremap(dev->dev, base_addr + AMD_PMC_BASE_ADDR_OFFSET,
- AMD_PMC_MAPPING_SIZE);
-- if (!dev->regbase)
-- return -ENOMEM;
-+ if (!dev->regbase) {
-+ err = -ENOMEM;
-+ goto err_pci_dev_put;
-+ }
-
- mutex_init(&dev->lock);
-
-@@ -583,8 +721,10 @@ static int amd_pmc_probe(struct platform_device *pdev)
- base_addr_hi = FCH_BASE_PHY_ADDR_HIGH;
- fch_phys_addr = ((u64)base_addr_hi << 32 | base_addr_lo);
- dev->fch_virt_addr = devm_ioremap(dev->dev, fch_phys_addr, FCH_SSC_MAPPING_SIZE);
-- if (!dev->fch_virt_addr)
-- return -ENOMEM;
-+ if (!dev->fch_virt_addr) {
-+ err = -ENOMEM;
-+ goto err_pci_dev_put;
-+ }
-
- /* Use SMU to get the s0i3 debug stats */
- err = amd_pmc_setup_smu_logging(dev);
-@@ -595,6 +735,10 @@ static int amd_pmc_probe(struct platform_device *pdev)
- platform_set_drvdata(pdev, dev);
- amd_pmc_dbgfs_register(dev);
- return 0;
-+
-+err_pci_dev_put:
-+ pci_dev_put(rdev);
-+ return err;
- }
-
- static int amd_pmc_remove(struct platform_device *pdev)
-@@ -602,6 +746,7 @@ static int amd_pmc_remove(struct platform_device *pdev)
- struct amd_pmc_dev *dev = platform_get_drvdata(pdev);
-
- amd_pmc_dbgfs_unregister(dev);
-+ pci_dev_put(dev->rdev);
- mutex_destroy(&dev->lock);
- return 0;
- }
---
-2.35.1
-