Lines Matching full: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; in ccwchain_alloc() local
321 size = ((sizeof(*chain) + 7L) & -8L) + in ccwchain_alloc()
322 sizeof(*chain->ch_ccw) * len + in ccwchain_alloc()
323 sizeof(*chain->ch_pa) * len; in ccwchain_alloc()
324 chain = kzalloc(size, GFP_DMA | GFP_KERNEL); in ccwchain_alloc()
325 if (!chain) in ccwchain_alloc()
328 data = (u8 *)chain + ((sizeof(*chain) + 7L) & -8L); in ccwchain_alloc()
329 chain->ch_ccw = (struct ccw1 *)data; in ccwchain_alloc()
331 data = (u8 *)(chain->ch_ccw) + sizeof(*chain->ch_ccw) * len; in ccwchain_alloc()
332 chain->ch_pa = (struct pfn_array *)data; in ccwchain_alloc()
334 chain->ch_len = len; in ccwchain_alloc()
336 list_add_tail(&chain->next, &cp->ccwchain_list); in ccwchain_alloc()
338 return chain; in ccwchain_alloc()
341 static void ccwchain_free(struct ccwchain *chain) in ccwchain_free() argument
343 list_del(&chain->next); in ccwchain_free()
344 kfree(chain); in ccwchain_free()
348 static void ccwchain_cda_free(struct ccwchain *chain, int idx) in ccwchain_cda_free() argument
350 struct ccw1 *ccw = chain->ch_ccw + idx; in ccwchain_cda_free()
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 in ccwchain_calc_length()
409 struct ccwchain *chain; in tic_target_chain_exists() local
412 list_for_each_entry(chain, &cp->ccwchain_list, next) { in tic_target_chain_exists()
413 ccw_head = chain->ch_iova; in tic_target_chain_exists()
414 if (is_cpa_within_range(tic->cda, ccw_head, chain->ch_len)) in tic_target_chain_exists()
421 static int ccwchain_loop_tic(struct ccwchain *chain,
426 struct ccwchain *chain; in ccwchain_handle_ccw() local
439 /* Count the CCWs in the current chain */ in ccwchain_handle_ccw()
444 /* Need alloc a new chain for this one. */ in ccwchain_handle_ccw()
445 chain = ccwchain_alloc(cp, len); in ccwchain_handle_ccw()
446 if (!chain) in ccwchain_handle_ccw()
448 chain->ch_iova = cda; in ccwchain_handle_ccw()
450 /* Copy the actual CCWs into the new chain */ in ccwchain_handle_ccw()
451 memcpy(chain->ch_ccw, cp->guest_cp, len * sizeof(struct ccw1)); in ccwchain_handle_ccw()
453 /* Loop for tics on this new chain. */ in ccwchain_handle_ccw()
454 ret = ccwchain_loop_tic(chain, cp); in ccwchain_handle_ccw()
457 ccwchain_free(chain); in ccwchain_handle_ccw()
463 static int ccwchain_loop_tic(struct ccwchain *chain, struct channel_program *cp) in ccwchain_loop_tic() argument
468 for (i = 0; i < chain->ch_len; i++) { in ccwchain_loop_tic()
469 tic = chain->ch_ccw + i; in ccwchain_loop_tic()
474 /* May transfer to an existing chain. */ in ccwchain_loop_tic()
487 static int ccwchain_fetch_tic(struct ccwchain *chain, in ccwchain_fetch_tic() argument
491 struct ccw1 *ccw = chain->ch_ccw + idx; in ccwchain_fetch_tic()
507 static int ccwchain_fetch_direct(struct ccwchain *chain, in ccwchain_fetch_direct() argument
520 ccw = chain->ch_ccw + idx; in ccwchain_fetch_direct()
551 pa = chain->ch_pa + idx; in ccwchain_fetch_direct()
607 static int ccwchain_fetch_one(struct ccwchain *chain, in ccwchain_fetch_one() argument
611 struct ccw1 *ccw = chain->ch_ccw + idx; in ccwchain_fetch_one()
614 return ccwchain_fetch_tic(chain, idx, cp); in ccwchain_fetch_one()
616 return ccwchain_fetch_direct(chain, idx, cp); in ccwchain_fetch_one()
681 struct ccwchain *chain, *temp; in cp_free() local
688 list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) { in cp_free()
689 for (i = 0; i < chain->ch_len; i++) { in cp_free()
690 pfn_array_unpin_free(chain->ch_pa + i, cp->mdev); in cp_free()
691 ccwchain_cda_free(chain, i); in cp_free()
693 ccwchain_free(chain); in cp_free()
706 * For each chain composing the channel program:
709 * This allows cp_free to find in ch_len the count of CCWs to free in a chain.
712 * as helpers to do ccw chain translation inside the kernel. Basically
736 struct ccwchain *chain; in cp_prefetch() local
743 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_prefetch()
744 len = chain->ch_len; in cp_prefetch()
746 ret = ccwchain_fetch_one(chain, idx, cp); in cp_prefetch()
754 /* Only cleanup the chain elements that were actually translated. */ in cp_prefetch()
755 chain->ch_len = idx; in cp_prefetch()
756 list_for_each_entry_continue(chain, &cp->ccwchain_list, next) { in cp_prefetch()
757 chain->ch_len = 0; in cp_prefetch()
775 struct ccwchain *chain; in cp_get_orb() local
791 chain = list_first_entry(&cp->ccwchain_list, struct ccwchain, next); in cp_get_orb()
792 cpa = chain->ch_ccw; in cp_get_orb()
814 struct ccwchain *chain; in cp_update_scsw() local
827 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_update_scsw()
828 ccw_head = (u32)(u64)chain->ch_ccw; in cp_update_scsw()
831 * of the chain. in cp_update_scsw()
833 if (is_cpa_within_range(cpa, ccw_head, chain->ch_len + 1)) { in cp_update_scsw()
836 * physical ccw to its chain head. in cp_update_scsw()
837 * Adding this value to the guest physical ccw chain in cp_update_scsw()
840 cpa = chain->ch_iova + (cpa - ccw_head); in cp_update_scsw()
849 * cp_iova_pinned() - check if an iova is pinned for a ccw chain.
853 * If the @iova is currently pinned for the ccw chain, return true;
858 struct ccwchain *chain; in cp_iova_pinned() local
864 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_iova_pinned()
865 for (i = 0; i < chain->ch_len; i++) in cp_iova_pinned()
866 if (pfn_array_iova_pinned(chain->ch_pa + i, iova)) in cp_iova_pinned()