Lines Matching +full:os +full:- +full:initiated
4 * Copyright (c) 2014-2016, Intel Corporation.
21 #include "hw-ish.h"
29 * ish_reg_read() - Read register
42 return readl(hw->mem_addr + offset); in ish_reg_read()
46 * ish_reg_write() - Write register
59 writel(value, hw->mem_addr + offset); in ish_reg_write()
63 * _ish_read_fw_sts_reg() - Read FW status register
76 * check_generated_interrupt() - Check if ISH interrupt
88 if (dev->pdev->device == CHV_DEVICE_ID) { in check_generated_interrupt()
95 /* only busy-clear bit is RW, others are RO */ in check_generated_interrupt()
104 * ish_is_input_ready() - Check if FW ready for RX
120 * set_host_ready() - Indicate host ready
127 if (dev->pdev->device == CHV_DEVICE_ID) { in set_host_ready()
128 if (dev->pdev->revision == REVISION_ID_CHT_A0 || in set_host_ready()
129 (dev->pdev->revision & REVISION_ID_SI_MASK) == in set_host_ready()
132 else if (dev->pdev->revision == REVISION_ID_CHT_B0 || in set_host_ready()
133 (dev->pdev->revision & REVISION_ID_SI_MASK) == in set_host_ready()
135 (dev->pdev->revision & REVISION_ID_SI_MASK) == in set_host_ready()
137 (dev->pdev->revision & REVISION_ID_SI_MASK) == in set_host_ready()
161 * ishtp_fw_is_ready() - Check if FW ready
177 * ish_set_host_rdy() - Indicate host ready
191 * ish_clr_host_rdy() - Indicate host not ready
205 * _ishtp_read_hdr() - Read message header
218 * _ishtp_read - Read message
242 * write_ipc_from_queue() - try to write ipc msg from Tx queue to device
245 * Check if DRBL is cleared. if it is - write the first IPC msg, then call
265 if (dev->dev_state == ISHTP_DEV_DISABLED) in write_ipc_from_queue()
266 return -EINVAL; in write_ipc_from_queue()
268 spin_lock_irqsave(&dev->out_ipc_spinlock, out_ipc_flags); in write_ipc_from_queue()
270 spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags); in write_ipc_from_queue()
271 return -EBUSY; in write_ipc_from_queue()
276 spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags); in write_ipc_from_queue()
277 return -EBUSY; in write_ipc_from_queue()
279 spin_unlock_irqrestore(&dev->out_ipc_spinlock, out_ipc_flags); in write_ipc_from_queue()
281 spin_lock_irqsave(&dev->wr_processing_spinlock, flags); in write_ipc_from_queue()
283 * if tx send list is empty - return 0; in write_ipc_from_queue()
286 if (list_empty(&dev->wr_processing_list_head.link)) { in write_ipc_from_queue()
287 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags); in write_ipc_from_queue()
292 ipc_link = list_entry(dev->wr_processing_list_head.link.next, in write_ipc_from_queue()
295 length = ipc_link->length - sizeof(uint32_t); in write_ipc_from_queue()
296 doorbell_val = *(uint32_t *)ipc_link->inline_data; in write_ipc_from_queue()
297 r_buf = (uint32_t *)(ipc_link->inline_data + sizeof(uint32_t)); in write_ipc_from_queue()
335 ++dev->ipc_tx_cnt; in write_ipc_from_queue()
336 dev->ipc_tx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val); in write_ipc_from_queue()
341 ipc_send_compl = ipc_link->ipc_send_compl; in write_ipc_from_queue()
342 ipc_send_compl_prm = ipc_link->ipc_send_compl_prm; in write_ipc_from_queue()
343 list_del_init(&ipc_link->link); in write_ipc_from_queue()
344 list_add_tail(&ipc_link->link, &dev->wr_free_list_head.link); in write_ipc_from_queue()
345 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags); in write_ipc_from_queue()
358 * write_ipc_to_queue() - write ipc msg to Tx queue
366 * Tx-to-write list then try to send the first IPC waiting msg
381 return -EMSGSIZE; in write_ipc_to_queue()
383 spin_lock_irqsave(&dev->wr_processing_spinlock, flags); in write_ipc_to_queue()
384 if (list_empty(&dev->wr_free_list_head.link)) { in write_ipc_to_queue()
385 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags); in write_ipc_to_queue()
386 return -ENOMEM; in write_ipc_to_queue()
388 ipc_link = list_entry(dev->wr_free_list_head.link.next, in write_ipc_to_queue()
390 list_del_init(&ipc_link->link); in write_ipc_to_queue()
392 ipc_link->ipc_send_compl = ipc_send_compl; in write_ipc_to_queue()
393 ipc_link->ipc_send_compl_prm = ipc_send_compl_prm; in write_ipc_to_queue()
394 ipc_link->length = length; in write_ipc_to_queue()
395 memcpy(ipc_link->inline_data, msg, length); in write_ipc_to_queue()
397 list_add_tail(&ipc_link->link, &dev->wr_processing_list_head.link); in write_ipc_to_queue()
398 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags); in write_ipc_to_queue()
406 * ipc_send_mng_msg() - Send management message
432 * timed_wait_for_timeout() - wait special event with timeout
455 ret = -EINVAL; in timed_wait_for_timeout()
463 timeout -= (timeinc - left_time); in timed_wait_for_timeout()
470 ret = -EBUSY; in timed_wait_for_timeout()
482 * ish_fw_reset_handler() - FW reset handler
499 spin_lock_irqsave(&dev->wr_processing_spinlock, flags); in ish_fw_reset_handler()
501 &dev->wr_processing_list_head.link, link) { in ish_fw_reset_handler()
502 list_move_tail(&processing->link, &dev->wr_free_list_head.link); in ish_fw_reset_handler()
504 spin_unlock_irqrestore(&dev->wr_processing_spinlock, flags); in ish_fw_reset_handler()
515 return -EPIPE; in ish_fw_reset_handler()
518 * RESET_NOTIFY_ACK - FW will be checking for it in ish_fw_reset_handler()
533 dev_err(dev->devc, in ish_fw_reset_handler()
534 "[ishtp-ish]: completed reset, ISH is dead (FWSTS = %08X)\n", in ish_fw_reset_handler()
536 return -ENODEV; in ish_fw_reset_handler()
544 * ish_fw_reset_work_fn() - FW reset worker function
555 /* ISH is ILUP & ISHTP-ready. Restart ISHTP */ in fw_reset_work_fn()
557 ishtp_dev->recvd_hw_ready = 1; in fw_reset_work_fn()
558 wake_up_interruptible(&ishtp_dev->wait_hw_ready); in fw_reset_work_fn()
563 dev_err(ishtp_dev->devc, "[ishtp-ish]: FW reset failed (%d)\n", in fw_reset_work_fn()
568 * _ish_sync_fw_clock() -Sync FW clock with the OS clock
571 * Sync FW and OS time
578 if (prev_sync && jiffies - prev_sync < 20 * HZ) in _ish_sync_fw_clock()
587 * recv_ipc() - Receive and process IPC management messages
606 if (dev->suspend_flag) { in recv_ipc()
607 dev->suspend_flag = 0; in recv_ipc()
608 wake_up_interruptible(&dev->suspend_wait); in recv_ipc()
610 if (dev->resume_flag) { in recv_ipc()
611 dev->resume_flag = 0; in recv_ipc()
612 wake_up_interruptible(&dev->resume_wait); in recv_ipc()
627 dev->recvd_hw_ready = 1; in recv_ipc()
628 wake_up_interruptible(&dev->wait_hw_ready); in recv_ipc()
634 * ish_irq_handler() - ISH IRQ handler
657 if (dev->dev_state == ISHTP_DEV_DISABLED) in ish_irq_handler()
662 dev_err(dev->devc, in ish_irq_handler()
663 "IPC hdr - bad length: %u; dropped\n", in ish_irq_handler()
681 ++dev->ipc_rx_cnt; in ish_irq_handler()
682 dev->ipc_rx_bytes_cnt += IPC_HEADER_GET_LENGTH(doorbell_val); in ish_irq_handler()
692 * ish_disable_dma() - disable dma communication between host and ISHFW
713 dev_err(dev->devc, in ish_disable_dma()
715 return -EBUSY; in ish_disable_dma()
722 * ish_wakeup() - wakeup ishfw from waiting-for-host state
726 * it wil wakeup FW from waiting-for-host state.
744 * _ish_hw_reset() - HW reset
753 struct pci_dev *pdev = dev->pdev; in _ish_hw_reset()
758 return -ENODEV; in _ish_hw_reset()
762 dev->dev_state = ISHTP_DEV_RESETTING; in _ish_hw_reset()
764 if (!pdev->pm_cap) { in _ish_hw_reset()
765 dev_err(&pdev->dev, "Can't reset - no PM caps\n"); in _ish_hw_reset()
766 return -EINVAL; in _ish_hw_reset()
771 dev_err(&pdev->dev, in _ish_hw_reset()
772 "Can't reset - stuck with DMA in-progress\n"); in _ish_hw_reset()
773 return -EBUSY; in _ish_hw_reset()
776 pci_read_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, &csr); in _ish_hw_reset()
780 pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, csr); in _ish_hw_reset()
782 mdelay(pdev->d3_delay); in _ish_hw_reset()
786 pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, csr); in _ish_hw_reset()
795 * _ish_ipc_reset() - IPC reset
817 dev->recvd_hw_ready = 0; in _ish_ipc_reset()
823 dev_err(dev->devc, "Failed to send IPC MNG_RESET_NOTIFY\n"); in _ish_ipc_reset()
827 wait_event_interruptible_timeout(dev->wait_hw_ready, in _ish_ipc_reset()
828 dev->recvd_hw_ready, 2 * HZ); in _ish_ipc_reset()
829 if (!dev->recvd_hw_ready) { in _ish_ipc_reset()
830 dev_err(dev->devc, "Timed out waiting for HW ready\n"); in _ish_ipc_reset()
831 rv = -ENODEV; in _ish_ipc_reset()
838 * ish_hw_start() -Start ISH HW
854 /* wait for FW-initiated reset flow */ in ish_hw_start()
855 if (!dev->recvd_hw_ready) in ish_hw_start()
856 wait_event_interruptible_timeout(dev->wait_hw_ready, in ish_hw_start()
857 dev->recvd_hw_ready, in ish_hw_start()
860 if (!dev->recvd_hw_ready) { in ish_hw_start()
861 dev_err(dev->devc, in ish_hw_start()
862 "[ishtp-ish]: Timed out waiting for FW-initiated reset\n"); in ish_hw_start()
863 return -ENODEV; in ish_hw_start()
870 * ish_ipc_get_header() -Get doorbell value
901 * ish_dev_init() -Initialize ISH devoce
913 dev = devm_kzalloc(&pdev->dev, in ish_dev_init()
921 init_waitqueue_head(&dev->wait_hw_ready); in ish_dev_init()
923 spin_lock_init(&dev->wr_processing_spinlock); in ish_dev_init()
924 spin_lock_init(&dev->out_ipc_spinlock); in ish_dev_init()
927 INIT_LIST_HEAD(&dev->wr_processing_list_head.link); in ish_dev_init()
928 INIT_LIST_HEAD(&dev->wr_free_list_head.link); in ish_dev_init()
932 tx_buf = devm_kzalloc(&pdev->dev, in ish_dev_init()
938 * at all - although this shouldn't happen in ish_dev_init()
940 dev_err(dev->devc, in ish_dev_init()
941 "[ishtp-ish]: failure in Tx FIFO allocations (%d)\n", in ish_dev_init()
945 list_add_tail(&tx_buf->link, &dev->wr_free_list_head.link); in ish_dev_init()
948 dev->ops = &ish_hw_ops; in ish_dev_init()
949 dev->devc = &pdev->dev; in ish_dev_init()
950 dev->mtu = IPC_PAYLOAD_SIZE - sizeof(struct ishtp_msg_hdr); in ish_dev_init()
955 * ish_device_disable() - Disable ISH device
962 struct pci_dev *pdev = dev->pdev; in ish_device_disable()
969 dev_err(&pdev->dev, in ish_device_disable()
970 "Can't reset - stuck with DMA in-progress\n"); in ish_device_disable()
977 dev->dev_state = ISHTP_DEV_DISABLED; in ish_device_disable()