diff options
Diffstat (limited to 'drivers/misc/mei')
| -rw-r--r-- | drivers/misc/mei/Makefile | 1 | ||||
| -rw-r--r-- | drivers/misc/mei/hw-me-regs.h | 2 | ||||
| -rw-r--r-- | drivers/misc/mei/pci-me.c | 23 | ||||
| -rw-r--r-- | drivers/misc/mei/pci-txe.c | 30 | 
4 files changed, 27 insertions, 29 deletions
| diff --git a/drivers/misc/mei/Makefile b/drivers/misc/mei/Makefile index 12cceb011a23..cd6825afa8e1 100644 --- a/drivers/misc/mei/Makefile +++ b/drivers/misc/mei/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  #  # Makefile - Intel Management Engine Interface (Intel MEI) Linux driver  # Copyright (c) 2010-2014, Intel Corporation. diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h index c8307e8b4c16..0ccccbaf530d 100644 --- a/drivers/misc/mei/hw-me-regs.h +++ b/drivers/misc/mei/hw-me-regs.h @@ -127,6 +127,8 @@  #define MEI_DEV_ID_BXT_M      0x1A9A  /* Broxton M */  #define MEI_DEV_ID_APL_I      0x5A9A  /* Apollo Lake I */ +#define MEI_DEV_ID_GLK        0x319A  /* Gemini Lake */ +  #define MEI_DEV_ID_KBP        0xA2BA  /* Kaby Point */  #define MEI_DEV_ID_KBP_2      0xA2BB  /* Kaby Point 2 */ diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 4ff40d319676..78b3172c8e6e 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c @@ -93,6 +93,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = {  	{MEI_PCI_DEVICE(MEI_DEV_ID_BXT_M, MEI_ME_PCH8_CFG)},  	{MEI_PCI_DEVICE(MEI_DEV_ID_APL_I, MEI_ME_PCH8_CFG)}, +	{MEI_PCI_DEVICE(MEI_DEV_ID_GLK, MEI_ME_PCH8_CFG)}, +  	{MEI_PCI_DEVICE(MEI_DEV_ID_KBP, MEI_ME_PCH8_CFG)},  	{MEI_PCI_DEVICE(MEI_DEV_ID_KBP_2, MEI_ME_PCH8_CFG)}, @@ -226,12 +228,15 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	pdev->dev_flags |= PCI_DEV_FLAGS_NEEDS_RESUME;  	/* -	* For not wake-able HW runtime pm framework -	* can't be used on pci device level. -	* Use domain runtime pm callbacks instead. -	*/ -	if (!pci_dev_run_wake(pdev)) -		mei_me_set_pm_domain(dev); +	 * ME maps runtime suspend/resume to D0i states, +	 * hence we need to go around native PCI runtime service which +	 * eventually brings the device into D3cold/hot state, +	 * but the mei device cannot wake up from D3 unlike from D0i3. +	 * To get around the PCI device native runtime pm, +	 * ME uses runtime pm domain handlers which take precedence +	 * over the driver's pm handlers. +	 */ +	mei_me_set_pm_domain(dev);  	if (mei_pg_is_enabled(dev))  		pm_runtime_put_noidle(&pdev->dev); @@ -271,8 +276,7 @@ static void mei_me_shutdown(struct pci_dev *pdev)  	dev_dbg(&pdev->dev, "shutdown\n");  	mei_stop(dev); -	if (!pci_dev_run_wake(pdev)) -		mei_me_unset_pm_domain(dev); +	mei_me_unset_pm_domain(dev);  	mei_disable_interrupts(dev);  	free_irq(pdev->irq, dev); @@ -300,8 +304,7 @@ static void mei_me_remove(struct pci_dev *pdev)  	dev_dbg(&pdev->dev, "stop\n");  	mei_stop(dev); -	if (!pci_dev_run_wake(pdev)) -		mei_me_unset_pm_domain(dev); +	mei_me_unset_pm_domain(dev);  	mei_disable_interrupts(dev); diff --git a/drivers/misc/mei/pci-txe.c b/drivers/misc/mei/pci-txe.c index e38a5f144373..0566f9bfa7de 100644 --- a/drivers/misc/mei/pci-txe.c +++ b/drivers/misc/mei/pci-txe.c @@ -144,12 +144,14 @@ static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	pdev->dev_flags |= PCI_DEV_FLAGS_NEEDS_RESUME;  	/* -	* For not wake-able HW runtime pm framework -	* can't be used on pci device level. -	* Use domain runtime pm callbacks instead. -	*/ -	if (!pci_dev_run_wake(pdev)) -		mei_txe_set_pm_domain(dev); +	 * TXE maps runtime suspend/resume to own power gating states, +	 * hence we need to go around native PCI runtime service which +	 * eventually brings the device into D3cold/hot state. +	 * But the TXE device cannot wake up from D3 unlike from own +	 * power gating. To get around PCI device native runtime pm, +	 * TXE uses runtime pm domain handlers which take precedence. +	 */ +	mei_txe_set_pm_domain(dev);  	pm_runtime_put_noidle(&pdev->dev); @@ -186,8 +188,7 @@ static void mei_txe_shutdown(struct pci_dev *pdev)  	dev_dbg(&pdev->dev, "shutdown\n");  	mei_stop(dev); -	if (!pci_dev_run_wake(pdev)) -		mei_txe_unset_pm_domain(dev); +	mei_txe_unset_pm_domain(dev);  	mei_disable_interrupts(dev);  	free_irq(pdev->irq, dev); @@ -215,8 +216,7 @@ static void mei_txe_remove(struct pci_dev *pdev)  	mei_stop(dev); -	if (!pci_dev_run_wake(pdev)) -		mei_txe_unset_pm_domain(dev); +	mei_txe_unset_pm_domain(dev);  	mei_disable_interrupts(dev);  	free_irq(pdev->irq, dev); @@ -318,15 +318,7 @@ static int mei_txe_pm_runtime_suspend(struct device *device)  	else  		ret = -EAGAIN; -	/* -	 * If everything is okay we're about to enter PCI low -	 * power state (D3) therefor we need to disable the -	 * interrupts towards host. -	 * However if device is not wakeable we do not enter -	 * D-low state and we need to keep the interrupt kicking -	 */ -	if (!ret && pci_dev_run_wake(pdev)) -		mei_disable_interrupts(dev); +	/* keep irq on we are staying in D0 */  	dev_dbg(&pdev->dev, "rpm: txe: runtime suspend ret=%d\n", ret); |