Lines Matching refs:dev
23 * @dev: ISHTP device pointer
30 static inline uint32_t ish_reg_read(const struct ishtp_device *dev,
33 struct ish_hw *hw = to_ish_hw(dev);
40 * @dev: ISHTP device pointer
46 static inline void ish_reg_write(struct ishtp_device *dev,
50 struct ish_hw *hw = to_ish_hw(dev);
57 * @dev: ISHTP device pointer
63 static inline uint32_t _ish_read_fw_sts_reg(struct ishtp_device *dev)
65 return ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
70 * @dev: ISHTP device pointer
76 static bool check_generated_interrupt(struct ishtp_device *dev)
81 if (dev->pdev->device == CHV_DEVICE_ID) {
82 pisr_val = ish_reg_read(dev, IPC_REG_PISR_CHV_AB);
86 pisr_val = ish_reg_read(dev, IPC_REG_PISR_BXT);
90 ish_reg_write(dev, IPC_REG_PISR_BXT, pisr_val);
98 * @dev: ISHTP device pointer
104 static bool ish_is_input_ready(struct ishtp_device *dev)
108 doorbell_val = ish_reg_read(dev, IPC_REG_HOST2ISH_DRBL);
114 * @dev: ISHTP device pointer
118 static void set_host_ready(struct ishtp_device *dev)
120 if (dev->pdev->device == CHV_DEVICE_ID) {
121 if (dev->pdev->revision == REVISION_ID_CHT_A0 ||
122 (dev->pdev->revision & REVISION_ID_SI_MASK) ==
124 ish_reg_write(dev, IPC_REG_HOST_COMM, 0x81);
125 else if (dev->pdev->revision == REVISION_ID_CHT_B0 ||
126 (dev->pdev->revision & REVISION_ID_SI_MASK) ==
128 (dev->pdev->revision & REVISION_ID_SI_MASK) ==
130 (dev->pdev->revision & REVISION_ID_SI_MASK) ==
134 host_comm_val = ish_reg_read(dev, IPC_REG_HOST_COMM);
136 ish_reg_write(dev, IPC_REG_HOST_COMM, host_comm_val);
141 host_pimr_val = ish_reg_read(dev, IPC_REG_PIMR_BXT);
149 ish_reg_write(dev, IPC_REG_PIMR_BXT, host_pimr_val);
155 * @dev: ISHTP device pointer
161 static bool ishtp_fw_is_ready(struct ishtp_device *dev)
163 uint32_t ish_status = _ish_read_fw_sts_reg(dev);
171 * @dev: ISHTP device pointer
175 static void ish_set_host_rdy(struct ishtp_device *dev)
177 uint32_t host_status = ish_reg_read(dev, IPC_REG_HOST_COMM);
180 ish_reg_write(dev, IPC_REG_HOST_COMM, host_status);
185 * @dev: ISHTP device pointer
189 static void ish_clr_host_rdy(struct ishtp_device *dev)
191 uint32_t host_status = ish_reg_read(dev, IPC_REG_HOST_COMM);
194 ish_reg_write(dev, IPC_REG_HOST_COMM, host_status);
197 static bool ish_chk_host_rdy(struct ishtp_device *dev)
199 uint32_t host_status = ish_reg_read(dev, IPC_REG_HOST_COMM);
206 * @dev: ishtp device pointer
215 void ish_set_host_ready(struct ishtp_device *dev)
217 if (ish_chk_host_rdy(dev))
220 ish_set_host_rdy(dev);
221 set_host_ready(dev);
226 * @dev: ISHTP device pointer
232 static uint32_t _ishtp_read_hdr(const struct ishtp_device *dev)
234 return ish_reg_read(dev, IPC_REG_ISH2HOST_MSG);
239 * @dev: ISHTP device pointer
247 static int _ishtp_read(struct ishtp_device *dev, unsigned char *buffer,
256 *r_buf++ = ish_reg_read(dev, msg_offs + i);
263 * @dev: ishtp device pointer
270 static int write_ipc_from_queue(struct ishtp_device *dev)
283 if (dev->dev_state == ISHTP_DEV_DISABLED)
286 spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
287 if (!ish_is_input_ready(dev)) {
288 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
296 if (list_empty(&dev->wr_processing_list)) {
297 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
301 ipc_link = list_first_entry(&dev->wr_processing_list,
331 ish_reg_write(dev, reg_addr, r_buf[i]);
338 ish_reg_write(dev, reg_addr, reg);
340 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, doorbell_val);
343 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
346 ++dev->ipc_tx_cnt;
347 dev->ipc_tx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val);
352 list_add(&ipc_link->link, &dev->wr_free_list);
353 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
367 * @dev: ishtp device instance
381 static int write_ipc_to_queue(struct ishtp_device *dev,
391 spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
392 if (list_empty(&dev->wr_free_list)) {
393 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
396 ipc_link = list_first_entry(&dev->wr_free_list,
405 list_add_tail(&ipc_link->link, &dev->wr_processing_list);
406 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
408 write_ipc_from_queue(dev);
415 * @dev: ishtp device instance
424 static int ipc_send_mng_msg(struct ishtp_device *dev, uint32_t msg_code,
432 return write_ipc_to_queue(dev, NULL, NULL, ipc_msg,
441 * @dev: ISHTP device pointer
451 static int timed_wait_for_timeout(struct ishtp_device *dev, int condition,
459 complete = ishtp_fw_is_ready(dev);
461 complete = ish_is_input_ready(dev);
491 * @dev: ishtp device pointer
497 static int ish_fw_reset_handler(struct ishtp_device *dev)
503 reset_id = ish_reg_read(dev, IPC_REG_ISH2HOST_MSG) & 0xFFFF;
506 spin_lock_irqsave(&dev->wr_processing_spinlock, flags);
507 list_splice_init(&dev->wr_processing_list, &dev->wr_free_list);
508 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags);
511 ishtp_reset_handler(dev);
513 if (!ish_is_input_ready(dev))
514 timed_wait_for_timeout(dev, WAIT_FOR_INPUT_RDY,
518 if (!ish_is_input_ready(dev))
524 ish_set_host_rdy(dev);
526 ipc_send_mng_msg(dev, MNG_RESET_NOTIFY_ACK, &reset_id,
530 timed_wait_for_timeout(dev, WAIT_FOR_FW_RDY,
532 if (!ishtp_fw_is_ready(dev)) {
536 ish_status = _ish_read_fw_sts_reg(dev);
537 dev_err(dev->devc,
573 * @dev: ishtp device pointer
577 static void _ish_sync_fw_clock(struct ishtp_device *dev)
587 ipc_send_mng_msg(dev, MNG_SYNC_FW_CLOCK, &usec, sizeof(uint64_t));
592 * @dev: ishtp device instance
599 static void recv_ipc(struct ishtp_device *dev, uint32_t doorbell_val)
610 if (dev->suspend_flag) {
611 dev->suspend_flag = 0;
612 wake_up_interruptible(&dev->suspend_wait);
614 if (dev->resume_flag) {
615 dev->resume_flag = 0;
616 wake_up_interruptible(&dev->resume_wait);
619 write_ipc_from_queue(dev);
624 ishtp_dev = dev;
630 dev->recvd_hw_ready = 1;
631 wake_up_interruptible(&dev->wait_hw_ready);
646 struct ishtp_device *dev = dev_id;
651 interrupt_generated = check_generated_interrupt(dev);
656 doorbell_val = ish_reg_read(dev, IPC_REG_ISH2HOST_DRBL);
660 if (dev->dev_state == ISHTP_DEV_DISABLED)
665 dev_err(dev->devc,
675 recv_ipc(dev, doorbell_val);
678 ishtp_recv(dev);
684 ++dev->ipc_rx_cnt;
685 dev->ipc_rx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val);
687 ish_reg_write(dev, IPC_REG_ISH2HOST_DRBL, 0);
689 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
696 * @dev: ishtp device pointer
702 int ish_disable_dma(struct ishtp_device *dev)
707 ish_reg_write(dev, IPC_REG_ISH_RMP2, 0);
711 _ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
716 dev_err(dev->devc,
726 * @dev: ishtp device pointer
731 static void ish_wakeup(struct ishtp_device *dev)
734 ish_reg_write(dev, IPC_REG_ISH_RMP2, IPC_RMP2_DMA_ENABLED);
740 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, IPC_DRBL_BUSY_BIT);
743 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
748 * @dev: ishtp device pointer
754 static int _ish_hw_reset(struct ishtp_device *dev)
756 struct pci_dev *pdev = dev->pdev;
765 dev->dev_state = ISHTP_DEV_RESETTING;
768 dev_err(&pdev->dev, "Can't reset - no PM caps\n");
773 if (ish_disable_dma(dev)) {
774 dev_err(&pdev->dev,
792 ish_wakeup(dev);
799 * @dev: ishtp device pointer
805 static int _ish_ipc_reset(struct ishtp_device *dev)
813 set_host_ready(dev);
816 ish_reg_write(dev, IPC_REG_ISH2HOST_DRBL, 0);
818 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
820 dev->recvd_hw_ready = 0;
823 rv = ipc_send_mng_msg(dev, MNG_RESET_NOTIFY, &ipc_mng_msg,
826 dev_err(dev->devc, "Failed to send IPC MNG_RESET_NOTIFY\n");
830 wait_event_interruptible_timeout(dev->wait_hw_ready,
831 dev->recvd_hw_ready, 2 * HZ);
832 if (!dev->recvd_hw_ready) {
833 dev_err(dev->devc, "Timed out waiting for HW ready\n");
842 * @dev: ishtp device pointer
848 int ish_hw_start(struct ishtp_device *dev)
850 ish_set_host_rdy(dev);
852 set_host_ready(dev);
855 ish_wakeup(dev);
858 if (!dev->recvd_hw_ready)
859 wait_event_interruptible_timeout(dev->wait_hw_ready,
860 dev->recvd_hw_ready,
863 if (!dev->recvd_hw_ready) {
864 dev_err(dev->devc,
874 * @dev: ishtp device pointer
882 static uint32_t ish_ipc_get_header(struct ishtp_device *dev, int length,
905 * @dev: ishtp device pointer
910 static bool _dma_no_cache_snooping(struct ishtp_device *dev)
912 return (dev->pdev->device == EHL_Ax_DEVICE_ID ||
913 dev->pdev->device == TGL_LP_DEVICE_ID ||
914 dev->pdev->device == TGL_H_DEVICE_ID ||
915 dev->pdev->device == ADL_S_DEVICE_ID ||
916 dev->pdev->device == ADL_P_DEVICE_ID);
941 struct ishtp_device *dev;
945 dev = devm_kzalloc(&pdev->dev,
948 if (!dev)
951 ishtp_device_init(dev);
953 init_waitqueue_head(&dev->wait_hw_ready);
955 spin_lock_init(&dev->wr_processing_spinlock);
958 INIT_LIST_HEAD(&dev->wr_processing_list);
959 INIT_LIST_HEAD(&dev->wr_free_list);
963 tx_buf = devm_kzalloc(&pdev->dev,
971 dev_err(dev->devc,
976 list_add_tail(&tx_buf->link, &dev->wr_free_list);
979 ret = devm_work_autocancel(&pdev->dev, &fw_reset_work, fw_reset_work_fn);
981 dev_err(dev->devc, "Failed to initialise FW reset work\n");
985 dev->ops = &ish_hw_ops;
986 dev->devc = &pdev->dev;
987 dev->mtu = IPC_PAYLOAD_SIZE - sizeof(struct ishtp_msg_hdr);
988 return dev;
993 * @dev: ISHTP device pointer
997 void ish_device_disable(struct ishtp_device *dev)
999 struct pci_dev *pdev = dev->pdev;
1005 if (ish_disable_dma(dev)) {
1006 dev_err(&pdev->dev,
1014 dev->dev_state = ISHTP_DEV_DISABLED;
1015 ish_clr_host_rdy(dev);