Lines Matching +full:dma +full:- +full:requests

2  * s390 vfio-pci interfaces
8 * your option) any later version. See the COPYING file in the top-level
19 #include "hw/s390x/s390-pci-bus.h"
20 #include "hw/s390x/s390-pci-clp.h"
21 #include "hw/s390x/s390-pci-vfio.h"
23 #include "hw/vfio/vfio-container.h"
24 #include "hw/vfio/vfio-helpers.h"
27 * Get the current DMA available count from vfio. Returns true if vfio is
28 * limiting DMA requests, false otherwise. The current available count read
44 info->argsz = argsz; in s390_pci_update_dma_avail()
50 if (info->argsz > argsz) { in s390_pci_update_dma_avail()
51 argsz = info->argsz; in s390_pci_update_dma_avail()
65 VFIOPCIDevice *vpdev = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in s390_pci_start_dma_count()
70 if (!vpdev->vbasedev.group) { in s390_pci_start_dma_count()
74 id = vpdev->vbasedev.group->container->fd; in s390_pci_start_dma_count()
80 QTAILQ_FOREACH(cnt, &s->zpci_dma_limit, link) { in s390_pci_start_dma_count()
81 if (cnt->id == id) { in s390_pci_start_dma_count()
82 cnt->users++; in s390_pci_start_dma_count()
88 cnt->id = id; in s390_pci_start_dma_count()
89 cnt->users = 1; in s390_pci_start_dma_count()
90 cnt->avail = avail; in s390_pci_start_dma_count()
91 QTAILQ_INSERT_TAIL(&s->zpci_dma_limit, cnt, link); in s390_pci_start_dma_count()
92 pbdev->iommu->max_dma_limit = avail; in s390_pci_start_dma_count()
100 cnt->users--; in s390_pci_end_dma_count()
101 if (cnt->users == 0) { in s390_pci_end_dma_count()
102 QTAILQ_REMOVE(&s->zpci_dma_limit, cnt, link); in s390_pci_end_dma_count()
111 VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in s390_pci_read_base()
118 trace_s390_pci_clp_cap(vpci->vbasedev.name, in s390_pci_read_base()
124 pbdev->zpci_fn.sdma = cap->start_dma; in s390_pci_read_base()
125 pbdev->zpci_fn.edma = cap->end_dma; in s390_pci_read_base()
126 pbdev->zpci_fn.pchid = cap->pchid; in s390_pci_read_base()
127 pbdev->zpci_fn.vfn = cap->vfn; in s390_pci_read_base()
128 pbdev->zpci_fn.pfgid = cap->gid; in s390_pci_read_base()
130 pbdev->zpci_fn.fmbl = 0; in s390_pci_read_base()
131 pbdev->zpci_fn.pft = 0; in s390_pci_read_base()
132 /* Store function type separately for type-specific behavior */ in s390_pci_read_base()
133 pbdev->pft = cap->pft; in s390_pci_read_base()
139 if (pbdev->pft == ZPCI_PFT_ISM) { in s390_pci_read_base()
140 pbdev->rtr_avail = false; in s390_pci_read_base()
144 * If appropriate, reduce the size of the supported DMA aperture reported in s390_pci_read_base()
145 * to the guest based upon the vfio DMA limit. This is applicable for in s390_pci_read_base()
149 * rely on the vfio DMA limit counting and use RPCIT CC1 / status 16 in s390_pci_read_base()
150 * to request that the guest free DMA mappings as necessary. in s390_pci_read_base()
152 if (!pbdev->rtr_avail) { in s390_pci_read_base()
153 vfio_size = pbdev->iommu->max_dma_limit << TARGET_PAGE_BITS; in s390_pci_read_base()
154 if (vfio_size > 0 && vfio_size < cap->end_dma - cap->start_dma + 1) { in s390_pci_read_base()
155 pbdev->zpci_fn.edma = cap->start_dma + vfio_size - 1; in s390_pci_read_base()
165 VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in get_host_fh()
170 if (hdr == NULL || hdr->version < 2) { in get_host_fh()
171 trace_s390_pci_clp_cap(vpci->vbasedev.name, in get_host_fh()
177 *fh = cap->fh; in get_host_fh()
188 VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in s390_pci_read_group()
189 uint8_t start_gid = pbdev->zpci_fn.pfgid; in s390_pci_read_group()
197 if (hdr == NULL || pbdev->zpci_fn.pfgid >= ZPCI_SIM_GRP_START) { in s390_pci_read_group()
198 trace_s390_pci_clp_cap(vpci->vbasedev.name, in s390_pci_read_group()
200 pbdev->zpci_fn.pfgid = ZPCI_DEFAULT_FN_GRP; in s390_pci_read_group()
201 pbdev->pci_group = s390_group_find(ZPCI_DEFAULT_FN_GRP); in s390_pci_read_group()
212 if (!pbdev->interp) { in s390_pci_read_group()
213 pbdev->pci_group = s390_group_find_host_sim(pbdev->zpci_fn.pfgid); in s390_pci_read_group()
214 if (pbdev->pci_group) { in s390_pci_read_group()
216 pbdev->zpci_fn.pfgid = pbdev->pci_group->id; in s390_pci_read_group()
219 if (s->next_sim_grp == ZPCI_DEFAULT_FN_GRP) { in s390_pci_read_group()
221 trace_s390_pci_clp_cap(vpci->vbasedev.name, in s390_pci_read_group()
223 pbdev->zpci_fn.pfgid = ZPCI_DEFAULT_FN_GRP; in s390_pci_read_group()
224 pbdev->pci_group = s390_group_find(ZPCI_DEFAULT_FN_GRP); in s390_pci_read_group()
228 pbdev->zpci_fn.pfgid = s->next_sim_grp; in s390_pci_read_group()
229 s->next_sim_grp++; in s390_pci_read_group()
236 pbdev->pci_group = s390_group_find(pbdev->zpci_fn.pfgid); in s390_pci_read_group()
238 if (!pbdev->pci_group) { in s390_pci_read_group()
239 pbdev->pci_group = s390_group_create(pbdev->zpci_fn.pfgid, start_gid); in s390_pci_read_group()
241 resgrp = &pbdev->pci_group->zpci_group; in s390_pci_read_group()
242 if (pbdev->rtr_avail) { in s390_pci_read_group()
243 resgrp->fr |= CLP_RSP_QPCIG_MASK_RTR; in s390_pci_read_group()
245 if (cap->flags & VFIO_DEVICE_INFO_ZPCI_FLAG_REFRESH) { in s390_pci_read_group()
246 resgrp->fr |= CLP_RSP_QPCIG_MASK_REFRESH; in s390_pci_read_group()
248 resgrp->dasm = cap->dasm; in s390_pci_read_group()
249 resgrp->msia = cap->msi_addr; in s390_pci_read_group()
250 resgrp->mui = cap->mui; in s390_pci_read_group()
251 resgrp->i = cap->noi; in s390_pci_read_group()
252 if (pbdev->interp && hdr->version >= 2) { in s390_pci_read_group()
253 resgrp->maxstbl = cap->imaxstbl; in s390_pci_read_group()
255 resgrp->maxstbl = cap->maxstbl; in s390_pci_read_group()
257 resgrp->version = cap->version; in s390_pci_read_group()
258 resgrp->dtsm = ZPCI_DTSM; in s390_pci_read_group()
267 VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in s390_pci_read_util()
273 trace_s390_pci_clp_cap(vpci->vbasedev.name, in s390_pci_read_util()
279 if (cap->size > CLP_UTIL_STR_LEN) { in s390_pci_read_util()
280 trace_s390_pci_clp_cap_size(vpci->vbasedev.name, cap->size, in s390_pci_read_util()
285 pbdev->zpci_fn.flags |= CLP_RSP_QPCI_MASK_UTIL; in s390_pci_read_util()
286 memcpy(pbdev->zpci_fn.util_str, cap->util_str, CLP_UTIL_STR_LEN); in s390_pci_read_util()
294 VFIOPCIDevice *vpci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in s390_pci_read_pfip()
300 trace_s390_pci_clp_cap(vpci->vbasedev.name, in s390_pci_read_pfip()
306 if (cap->size > CLP_PFIP_NR_SEGMENTS) { in s390_pci_read_pfip()
307 trace_s390_pci_clp_cap_size(vpci->vbasedev.name, cap->size, in s390_pci_read_pfip()
312 memcpy(pbdev->zpci_fn.pfip, cap->pfip, CLP_PFIP_NR_SEGMENTS); in s390_pci_read_pfip()
317 VFIOPCIDevice *vfio_pci = container_of(pbdev->pdev, VFIOPCIDevice, pdev); in get_device_info()
319 return vfio_get_device_info(vfio_pci->vbasedev.fd); in get_device_info()