Lines Matching +full:enable +full:- +full:soft +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2018 Intel Corporation, Inc.
20 #include <linux/fpga-dfl.h>
22 #include "dfl-afu.h"
28 * __afu_port_enable - enable a port by clear reset
31 * Enable Port by clear the port soft reset bit, which is set by default.
32 * The AFU is unable to respond to any MMIO access while in reset.
43 WARN_ON(!fdata->disable_count); in __afu_port_enable()
45 if (--fdata->disable_count != 0) in __afu_port_enable()
50 /* Clear port soft reset */ in __afu_port_enable()
57 * of reset. in __afu_port_enable()
62 dev_err(fdata->dfl_cdev->parent, in __afu_port_enable()
63 "timeout, failure to enable device\n"); in __afu_port_enable()
64 return -ETIMEDOUT; in __afu_port_enable()
71 * __afu_port_disable - disable a port by hold reset
74 * Disable Port by setting the port soft reset bit, it puts the port into reset.
83 if (fdata->disable_count++ != 0) in __afu_port_disable()
88 /* Set port soft reset */ in __afu_port_disable()
95 * on this port and minimum soft reset pulse width has elapsed. in __afu_port_disable()
96 * Driver polls port_soft_reset_ack to determine if reset done by HW. in __afu_port_disable()
101 dev_err(fdata->dfl_cdev->parent, in __afu_port_disable()
103 return -ETIMEDOUT; in __afu_port_disable()
111 * __port_disable and __port_enable (set port soft reset bit and then clear
112 * it). Userspace can do Port reset at any time, e.g. during DMA or Partial
117 * Note: the accelerator (AFU) is not accessible when its port is in reset
118 * (disabled). Any attempts on MMIO access to AFU while in reset, will
134 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in port_reset()
137 mutex_lock(&fdata->lock); in port_reset()
139 mutex_unlock(&fdata->lock); in port_reset()
172 mutex_lock(&fdata->lock); in ltr_show()
174 mutex_unlock(&fdata->lock); in ltr_show()
189 return -EINVAL; in ltr_store()
193 mutex_lock(&fdata->lock); in ltr_store()
198 mutex_unlock(&fdata->lock); in ltr_store()
213 mutex_lock(&fdata->lock); in ap1_event_show()
215 mutex_unlock(&fdata->lock); in ap1_event_show()
229 return -EINVAL; in ap1_event_store()
233 mutex_lock(&fdata->lock); in ap1_event_store()
235 mutex_unlock(&fdata->lock); in ap1_event_store()
251 mutex_lock(&fdata->lock); in ap2_event_show()
253 mutex_unlock(&fdata->lock); in ap2_event_show()
267 return -EINVAL; in ap2_event_store()
271 mutex_lock(&fdata->lock); in ap2_event_store()
273 mutex_unlock(&fdata->lock); in ap2_event_store()
288 mutex_lock(&fdata->lock); in power_state_show()
290 mutex_unlock(&fdata->lock); in power_state_show()
305 return -EINVAL; in userclk_freqcmd_store()
309 mutex_lock(&fdata->lock); in userclk_freqcmd_store()
311 mutex_unlock(&fdata->lock); in userclk_freqcmd_store()
326 return -EINVAL; in userclk_freqcntrcmd_store()
330 mutex_lock(&fdata->lock); in userclk_freqcntrcmd_store()
332 mutex_unlock(&fdata->lock); in userclk_freqcntrcmd_store()
348 mutex_lock(&fdata->lock); in userclk_freqsts_show()
350 mutex_unlock(&fdata->lock); in userclk_freqsts_show()
366 mutex_lock(&fdata->lock); in userclk_freqcntrsts_show()
368 mutex_unlock(&fdata->lock); in userclk_freqcntrsts_show()
393 umode_t mode = attr->mode; in port_hdr_attrs_visible()
439 ret = -EINVAL; in port_hdr_ioctl()
442 dev_dbg(&pdev->dev, "%x cmd not handled", cmd); in port_hdr_ioctl()
443 ret = -ENODEV; in port_hdr_ioctl()
468 mutex_lock(&fdata->lock); in afu_id_show()
469 if (fdata->disable_count) { in afu_id_show()
470 mutex_unlock(&fdata->lock); in afu_id_show()
471 return -EBUSY; in afu_id_show()
476 mutex_unlock(&fdata->lock); in afu_id_show()
501 return attr->mode; in port_afu_attrs_visible()
512 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in port_afu_init()
513 struct resource *res = &pdev->resource[feature->resource_index]; in port_afu_init()
517 resource_size(res), res->start, in port_afu_init()
534 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in port_stp_init()
535 struct resource *res = &pdev->resource[feature->resource_index]; in port_stp_init()
539 resource_size(res), res->start, in port_stp_init()
563 dev_dbg(&pdev->dev, "%x cmd not handled", cmd); in port_uint_ioctl()
564 return -ENODEV; in port_uint_ioctl()
606 struct platform_device *fdev = fdata->dev; in afu_open()
609 mutex_lock(&fdata->lock); in afu_open()
610 ret = dfl_feature_dev_use_begin(fdata, filp->f_flags & O_EXCL); in afu_open()
612 dev_dbg(&fdev->dev, "Device File Opened %d Times\n", in afu_open()
614 filp->private_data = fdev; in afu_open()
616 mutex_unlock(&fdata->lock); in afu_open()
623 struct platform_device *pdev = filp->private_data; in afu_release()
627 dev_dbg(&pdev->dev, "Device File Release\n"); in afu_release()
629 fdata = to_dfl_feature_dev_data(&pdev->dev); in afu_release()
631 mutex_lock(&fdata->lock); in afu_release()
637 feature->nr_irqs, NULL); in afu_release()
641 mutex_unlock(&fdata->lock); in afu_release()
663 return -EFAULT; in afu_ioctl_get_info()
666 return -EINVAL; in afu_ioctl_get_info()
668 mutex_lock(&fdata->lock); in afu_ioctl_get_info()
671 info.num_regions = afu->num_regions; in afu_ioctl_get_info()
672 info.num_umsgs = afu->num_umsgs; in afu_ioctl_get_info()
673 mutex_unlock(&fdata->lock); in afu_ioctl_get_info()
676 return -EFAULT; in afu_ioctl_get_info()
692 return -EFAULT; in afu_ioctl_get_region_info()
695 return -EINVAL; in afu_ioctl_get_region_info()
706 return -EFAULT; in afu_ioctl_get_region_info()
721 return -EFAULT; in afu_ioctl_dma_map()
724 return -EINVAL; in afu_ioctl_dma_map()
732 return -EFAULT; in afu_ioctl_dma_map()
735 dev_dbg(&fdata->dev->dev, "dma map: ua=%llx, len=%llx, iova=%llx\n", in afu_ioctl_dma_map()
752 return -EFAULT; in afu_ioctl_dma_unmap()
755 return -EINVAL; in afu_ioctl_dma_unmap()
762 struct platform_device *pdev = filp->private_data; in afu_ioctl()
767 dev_dbg(&pdev->dev, "%s cmd 0x%x\n", __func__, cmd); in afu_ioctl()
769 fdata = to_dfl_feature_dev_data(&pdev->dev); in afu_ioctl()
786 * Let sub-feature's ioctl function to handle the cmd in afu_ioctl()
787 * Sub-feature's ioctl returns -ENODEV when cmd is not in afu_ioctl()
792 if (f->ops && f->ops->ioctl) { in afu_ioctl()
793 ret = f->ops->ioctl(pdev, f, cmd, arg); in afu_ioctl()
794 if (ret != -ENODEV) in afu_ioctl()
799 return -EINVAL; in afu_ioctl()
810 struct platform_device *pdev = filp->private_data; in afu_mmap()
811 u64 size = vma->vm_end - vma->vm_start; in afu_mmap()
817 if (!(vma->vm_flags & VM_SHARED)) in afu_mmap()
818 return -EINVAL; in afu_mmap()
820 fdata = to_dfl_feature_dev_data(&pdev->dev); in afu_mmap()
822 offset = vma->vm_pgoff << PAGE_SHIFT; in afu_mmap()
828 return -EINVAL; in afu_mmap()
830 if ((vma->vm_flags & VM_READ) && !(region.flags & DFL_PORT_REGION_READ)) in afu_mmap()
831 return -EPERM; in afu_mmap()
833 if ((vma->vm_flags & VM_WRITE) && in afu_mmap()
835 return -EPERM; in afu_mmap()
838 vma->vm_ops = &afu_vma_ops; in afu_mmap()
840 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in afu_mmap()
842 return remap_pfn_range(vma, vma->vm_start, in afu_mmap()
843 (region.phys + (offset - region.offset)) >> PAGE_SHIFT, in afu_mmap()
844 size, vma->vm_page_prot); in afu_mmap()
857 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in afu_dev_init()
860 afu = devm_kzalloc(&pdev->dev, sizeof(*afu), GFP_KERNEL); in afu_dev_init()
862 return -ENOMEM; in afu_dev_init()
864 mutex_lock(&fdata->lock); in afu_dev_init()
868 mutex_unlock(&fdata->lock); in afu_dev_init()
875 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in afu_dev_destroy()
877 mutex_lock(&fdata->lock); in afu_dev_destroy()
881 mutex_unlock(&fdata->lock); in afu_dev_destroy()
886 static int port_enable_set(struct dfl_feature_dev_data *fdata, bool enable) in port_enable_set() argument
890 mutex_lock(&fdata->lock); in port_enable_set()
891 if (enable) in port_enable_set()
895 mutex_unlock(&fdata->lock); in port_enable_set()
911 dev_dbg(&pdev->dev, "%s\n", __func__); in afu_probe()
937 dev_dbg(&pdev->dev, "%s\n", __func__); in afu_remove()
986 MODULE_ALIAS("platform:dfl-port");