Lines Matching refs:chain
34 /* Guest physical address of the current chain. */
36 /* Count of the valid ccws in chain. */
291 * @head: address of the beginning of a CCW chain
292 * @len: number of CCWs within the chain
294 * Determine whether the address of a CCW (whether a new chain,
316 struct ccwchain *chain;
321 size = ((sizeof(*chain) + 7L) & -8L) +
322 sizeof(*chain->ch_ccw) * len +
323 sizeof(*chain->ch_pa) * len;
324 chain = kzalloc(size, GFP_DMA | GFP_KERNEL);
325 if (!chain)
328 data = (u8 *)chain + ((sizeof(*chain) + 7L) & -8L);
329 chain->ch_ccw = (struct ccw1 *)data;
331 data = (u8 *)(chain->ch_ccw) + sizeof(*chain->ch_ccw) * len;
332 chain->ch_pa = (struct pfn_array *)data;
334 chain->ch_len = len;
336 list_add_tail(&chain->next, &cp->ccwchain_list);
338 return chain;
341 static void ccwchain_free(struct ccwchain *chain)
343 list_del(&chain->next);
344 kfree(chain);
348 static void ccwchain_cda_free(struct ccwchain *chain, int idx)
350 struct ccw1 *ccw = chain->ch_ccw + idx;
359 * ccwchain_calc_length - calculate the length of the ccw chain.
360 * @iova: guest physical address of the target ccw chain
363 * This is the chain length not considering any TICs.
369 * Returns: the length of the ccw chain or -errno.
390 * that loops back into the current chain. The latter
409 struct ccwchain *chain;
412 list_for_each_entry(chain, &cp->ccwchain_list, next) {
413 ccw_head = chain->ch_iova;
414 if (is_cpa_within_range(tic->cda, ccw_head, chain->ch_len))
421 static int ccwchain_loop_tic(struct ccwchain *chain,
426 struct ccwchain *chain;
439 /* Count the CCWs in the current chain */
444 /* Need alloc a new chain for this one. */
445 chain = ccwchain_alloc(cp, len);
446 if (!chain)
448 chain->ch_iova = cda;
450 /* Copy the actual CCWs into the new chain */
451 memcpy(chain->ch_ccw, cp->guest_cp, len * sizeof(struct ccw1));
453 /* Loop for tics on this new chain. */
454 ret = ccwchain_loop_tic(chain, cp);
457 ccwchain_free(chain);
463 static int ccwchain_loop_tic(struct ccwchain *chain, struct channel_program *cp)
468 for (i = 0; i < chain->ch_len; i++) {
469 tic = chain->ch_ccw + i;
474 /* May transfer to an existing chain. */
487 static int ccwchain_fetch_tic(struct ccwchain *chain,
491 struct ccw1 *ccw = chain->ch_ccw + idx;
507 static int ccwchain_fetch_direct(struct ccwchain *chain,
520 ccw = chain->ch_ccw + idx;
551 pa = chain->ch_pa + idx;
607 static int ccwchain_fetch_one(struct ccwchain *chain,
611 struct ccw1 *ccw = chain->ch_ccw + idx;
614 return ccwchain_fetch_tic(chain, idx, cp);
616 return ccwchain_fetch_direct(chain, idx, cp);
685 struct ccwchain *chain, *temp;
692 list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
693 for (i = 0; i < chain->ch_len; i++) {
694 pfn_array_unpin_free(chain->ch_pa + i, cp->mdev);
695 ccwchain_cda_free(chain, i);
697 ccwchain_free(chain);
710 * For each chain composing the channel program:
713 * This allows cp_free to find in ch_len the count of CCWs to free in a chain.
716 * as helpers to do ccw chain translation inside the kernel. Basically
740 struct ccwchain *chain;
747 list_for_each_entry(chain, &cp->ccwchain_list, next) {
748 len = chain->ch_len;
750 ret = ccwchain_fetch_one(chain, idx, cp);
758 /* Only cleanup the chain elements that were actually translated. */
759 chain->ch_len = idx;
760 list_for_each_entry_continue(chain, &cp->ccwchain_list, next) {
761 chain->ch_len = 0;
779 struct ccwchain *chain;
795 chain = list_first_entry(&cp->ccwchain_list, struct ccwchain, next);
796 cpa = chain->ch_ccw;
818 struct ccwchain *chain;
831 list_for_each_entry(chain, &cp->ccwchain_list, next) {
832 ccw_head = (u32)(u64)chain->ch_ccw;
835 * of the chain.
837 if (is_cpa_within_range(cpa, ccw_head, chain->ch_len + 1)) {
840 * physical ccw to its chain head.
841 * Adding this value to the guest physical ccw chain
844 cpa = chain->ch_iova + (cpa - ccw_head);
853 * cp_iova_pinned() - check if an iova is pinned for a ccw chain.
857 * If the @iova is currently pinned for the ccw chain, return true;
862 struct ccwchain *chain;
868 list_for_each_entry(chain, &cp->ccwchain_list, next) {
869 for (i = 0; i < chain->ch_len; i++)
870 if (pfn_array_iova_pinned(chain->ch_pa + i, iova))