Lines Matching refs:dev

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