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 == PCI_DEVICE_ID_INTEL_ISH_CHV) {
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 == PCI_DEVICE_ID_INTEL_ISH_CHV) {
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,
574 * @dev: ishtp device pointer
578 static void _ish_sync_fw_clock(struct ishtp_device *dev)
588 ipc_send_mng_msg(dev, MNG_SYNC_FW_CLOCK, &usec, sizeof(uint64_t));
593 * @dev: ishtp device instance
600 static void recv_ipc(struct ishtp_device *dev, uint32_t doorbell_val)
611 if (dev->suspend_flag) {
612 dev->suspend_flag = 0;
613 wake_up_interruptible(&dev->suspend_wait);
615 if (dev->resume_flag) {
616 dev->resume_flag = 0;
617 wake_up_interruptible(&dev->resume_wait);
620 write_ipc_from_queue(dev);
625 ishtp_dev = dev;
631 dev->recvd_hw_ready = 1;
632 wake_up_interruptible(&dev->wait_hw_ready);
647 struct ishtp_device *dev = dev_id;
652 interrupt_generated = check_generated_interrupt(dev);
657 doorbell_val = ish_reg_read(dev, IPC_REG_ISH2HOST_DRBL);
661 if (dev->dev_state == ISHTP_DEV_DISABLED)
666 dev_err(dev->devc,
676 recv_ipc(dev, doorbell_val);
679 ishtp_recv(dev);
685 ++dev->ipc_rx_cnt;
686 dev->ipc_rx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val);
688 ish_reg_write(dev, IPC_REG_ISH2HOST_DRBL, 0);
690 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
697 * @dev: ishtp device pointer
703 int ish_disable_dma(struct ishtp_device *dev)
708 ish_reg_write(dev, IPC_REG_ISH_RMP2, 0);
712 _ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
717 dev_err(dev->devc,
727 * @dev: ishtp device pointer
732 static void ish_wakeup(struct ishtp_device *dev)
735 ish_reg_write(dev, IPC_REG_ISH_RMP2, IPC_RMP2_DMA_ENABLED);
741 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, IPC_DRBL_BUSY_BIT);
744 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
749 * @dev: ishtp device pointer
755 static int _ish_hw_reset(struct ishtp_device *dev)
757 struct pci_dev *pdev = dev->pdev;
766 dev->dev_state = ISHTP_DEV_RESETTING;
769 dev_err(&pdev->dev, "Can't reset - no PM caps\n");
774 if (ish_disable_dma(dev)) {
775 dev_err(&pdev->dev,
793 ish_wakeup(dev);
800 * @dev: ishtp device pointer
806 static int _ish_ipc_reset(struct ishtp_device *dev)
814 set_host_ready(dev);
817 ish_reg_write(dev, IPC_REG_ISH2HOST_DRBL, 0);
819 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
821 dev->recvd_hw_ready = 0;
824 rv = ipc_send_mng_msg(dev, MNG_RESET_NOTIFY, &ipc_mng_msg,
827 dev_err(dev->devc, "Failed to send IPC MNG_RESET_NOTIFY\n");
831 wait_event_interruptible_timeout(dev->wait_hw_ready,
832 dev->recvd_hw_ready, 2 * HZ);
833 if (!dev->recvd_hw_ready) {
834 dev_err(dev->devc, "Timed out waiting for HW ready\n");
843 * @dev: ishtp device pointer
849 int ish_hw_start(struct ishtp_device *dev)
851 ish_set_host_rdy(dev);
853 set_host_ready(dev);
856 ish_wakeup(dev);
859 if (!dev->recvd_hw_ready)
860 wait_event_interruptible_timeout(dev->wait_hw_ready,
861 dev->recvd_hw_ready,
864 if (!dev->recvd_hw_ready) {
865 dev_err(dev->devc,
875 * @dev: ishtp device pointer
883 static uint32_t ish_ipc_get_header(struct ishtp_device *dev, int length,
906 * @dev: ishtp device pointer
911 static bool _dma_no_cache_snooping(struct ishtp_device *dev)
913 return (dev->pdev->device == PCI_DEVICE_ID_INTEL_ISH_EHL_Ax ||
914 dev->pdev->device == PCI_DEVICE_ID_INTEL_ISH_TGL_LP ||
915 dev->pdev->device == PCI_DEVICE_ID_INTEL_ISH_TGL_H ||
916 dev->pdev->device == PCI_DEVICE_ID_INTEL_ISH_ADL_S ||
917 dev->pdev->device == PCI_DEVICE_ID_INTEL_ISH_ADL_P);
942 struct ishtp_device *dev;
946 dev = devm_kzalloc(&pdev->dev,
949 if (!dev)
952 dev->devc = &pdev->dev;
953 ishtp_device_init(dev);
955 init_waitqueue_head(&dev->wait_hw_ready);
957 spin_lock_init(&dev->wr_processing_spinlock);
960 INIT_LIST_HEAD(&dev->wr_processing_list);
961 INIT_LIST_HEAD(&dev->wr_free_list);
965 tx_buf = devm_kzalloc(&pdev->dev,
973 dev_err(dev->devc,
978 list_add_tail(&tx_buf->link, &dev->wr_free_list);
981 ret = devm_work_autocancel(&pdev->dev, &fw_reset_work, fw_reset_work_fn);
983 dev_err(dev->devc, "Failed to initialise FW reset work\n");
987 dev->ops = &ish_hw_ops;
988 dev->mtu = IPC_PAYLOAD_SIZE - sizeof(struct ishtp_msg_hdr);
989 return dev;
994 * @dev: ISHTP device pointer
998 void ish_device_disable(struct ishtp_device *dev)
1000 struct pci_dev *pdev = dev->pdev;
1006 if (ish_disable_dma(dev)) {
1007 dev_err(&pdev->dev,
1015 dev->dev_state = ISHTP_DEV_DISABLED;
1016 ish_clr_host_rdy(dev);