Skip to content

Commit

Permalink
HID: intel-ish-hid: ipc: Address EHL Sx resume issues
Browse files Browse the repository at this point in the history
When OOB is disabled, FW will be power gated when system is in S3/S4/S5
which is the same behavior with legacy ISH FW.
When OOB is enabled, FW will always power on which is totally different
comparing to legacy ISH FW.

So NO_D3 flag is not enough to check FW's status after resume.
Here we can use IPC FW status register to check host link status.
If it is false, it means FW get reset after power gated, need go through
the whole initialization flow; If it is true, it means FW is alive, just
set host ready bit to let fw know host is up.

Co-developed-by: Wei Jiang <[email protected]>
Signed-off-by: Wei Jiang <[email protected]>
Signed-off-by: Even Xu <[email protected]>
Signed-off-by: Zhang Lixu <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
  • Loading branch information
lixuzha authored and Jiri Kosina committed Jan 6, 2021
1 parent 2e23a70 commit 2f4ec15
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
1 change: 1 addition & 0 deletions drivers/hid/intel-ish-hid/ipc/hw-ish.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,6 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev);
int ish_hw_start(struct ishtp_device *dev);
void ish_device_disable(struct ishtp_device *dev);
int ish_disable_dma(struct ishtp_device *dev);
void ish_set_host_ready(struct ishtp_device *dev);

#endif /* _ISHTP_HW_ISH_H_ */
27 changes: 27 additions & 0 deletions drivers/hid/intel-ish-hid/ipc/ipc.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,33 @@ static void ish_clr_host_rdy(struct ishtp_device *dev)
ish_reg_write(dev, IPC_REG_HOST_COMM, host_status);
}

static bool ish_chk_host_rdy(struct ishtp_device *dev)
{
uint32_t host_status = ish_reg_read(dev, IPC_REG_HOST_COMM);

return (host_status & IPC_HOSTCOMM_READY_BIT);
}

/**
* ish_set_host_ready() - reconfig ipc host registers
* @dev: ishtp device pointer
*
* Set host to ready state
* This API is called in some case:
* fw is still on, but ipc is powered down.
* such as OOB case.
*
* Return: 0 for success else error fault code
*/
void ish_set_host_ready(struct ishtp_device *dev)
{
if (ish_chk_host_rdy(dev))
return;

ish_set_host_rdy(dev);
set_host_ready(dev);
}

/**
* _ishtp_read_hdr() - Read message header
* @dev: ISHTP device pointer
Expand Down
6 changes: 5 additions & 1 deletion drivers/hid/intel-ish-hid/ipc/pci-ish.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,11 +259,15 @@ static void __maybe_unused ish_resume_handler(struct work_struct *work)
{
struct pci_dev *pdev = to_pci_dev(ish_resume_device);
struct ishtp_device *dev = pci_get_drvdata(pdev);
uint32_t fwsts = dev->ops->get_fw_status(dev);
int ret;

if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag) {
if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag
&& IPC_IS_ISH_ILUP(fwsts)) {
disable_irq_wake(pdev->irq);

ish_set_host_ready(dev);

ishtp_send_resume(dev);

/* Waiting to get resume response */
Expand Down

0 comments on commit 2f4ec15

Please sign in to comment.