Lines Matching full:chain

34 	/* Guest physical address of the current chain. */
36 /* Count of the valid ccws in chain. */
294 * @head: address of the beginning of a CCW chain
295 * @len: number of CCWs within the chain
297 * Determine whether the address of a CCW (whether a new chain,
319 struct ccwchain *chain; in ccwchain_alloc() local
321 chain = kzalloc(sizeof(*chain), GFP_KERNEL); in ccwchain_alloc()
322 if (!chain) in ccwchain_alloc()
325 chain->ch_ccw = kcalloc(len, sizeof(*chain->ch_ccw), GFP_DMA | GFP_KERNEL); in ccwchain_alloc()
326 if (!chain->ch_ccw) in ccwchain_alloc()
329 chain->ch_pa = kcalloc(len, sizeof(*chain->ch_pa), GFP_KERNEL); in ccwchain_alloc()
330 if (!chain->ch_pa) in ccwchain_alloc()
333 list_add_tail(&chain->next, &cp->ccwchain_list); in ccwchain_alloc()
335 return chain; in ccwchain_alloc()
338 kfree(chain->ch_ccw); in ccwchain_alloc()
339 kfree(chain); in ccwchain_alloc()
343 static void ccwchain_free(struct ccwchain *chain) in ccwchain_free() argument
345 list_del(&chain->next); in ccwchain_free()
346 kfree(chain->ch_pa); in ccwchain_free()
347 kfree(chain->ch_ccw); in ccwchain_free()
348 kfree(chain); in ccwchain_free()
352 static void ccwchain_cda_free(struct ccwchain *chain, int idx) in ccwchain_cda_free() argument
354 struct ccw1 *ccw = &chain->ch_ccw[idx]; in ccwchain_cda_free()
363 * ccwchain_calc_length - calculate the length of the ccw chain.
364 * @iova: guest physical address of the target ccw chain
367 * This is the chain length not considering any TICs.
373 * Returns: the length of the ccw chain or -errno.
386 * that loops back into the current chain. The latter in ccwchain_calc_length()
405 struct ccwchain *chain; in tic_target_chain_exists() local
408 list_for_each_entry(chain, &cp->ccwchain_list, next) { in tic_target_chain_exists()
409 ccw_head = chain->ch_iova; in tic_target_chain_exists()
410 if (is_cpa_within_range(tic->cda, ccw_head, chain->ch_len)) in tic_target_chain_exists()
417 static int ccwchain_loop_tic(struct ccwchain *chain,
424 struct ccwchain *chain; in ccwchain_handle_ccw() local
436 /* Count the CCWs in the current chain */ in ccwchain_handle_ccw()
441 /* Need alloc a new chain for this one. */ in ccwchain_handle_ccw()
442 chain = ccwchain_alloc(cp, len); in ccwchain_handle_ccw()
443 if (!chain) in ccwchain_handle_ccw()
446 chain->ch_len = len; in ccwchain_handle_ccw()
447 chain->ch_iova = cda; in ccwchain_handle_ccw()
449 /* Copy the actual CCWs into the new chain */ in ccwchain_handle_ccw()
450 memcpy(chain->ch_ccw, cp->guest_cp, len * sizeof(struct ccw1)); in ccwchain_handle_ccw()
452 /* Loop for tics on this new chain. */ in ccwchain_handle_ccw()
453 ret = ccwchain_loop_tic(chain, cp); in ccwchain_handle_ccw()
456 ccwchain_free(chain); in ccwchain_handle_ccw()
462 static int ccwchain_loop_tic(struct ccwchain *chain, struct channel_program *cp) in ccwchain_loop_tic() argument
467 for (i = 0; i < chain->ch_len; i++) { in ccwchain_loop_tic()
468 tic = &chain->ch_ccw[i]; in ccwchain_loop_tic()
473 /* May transfer to an existing chain. */ in ccwchain_loop_tic()
753 struct ccwchain *chain, *temp; in cp_free() local
760 list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) { in cp_free()
761 for (i = 0; i < chain->ch_len; i++) { in cp_free()
762 page_array_unpin_free(&chain->ch_pa[i], vdev, idal_is_2k(cp)); in cp_free()
763 ccwchain_cda_free(chain, i); in cp_free()
765 ccwchain_free(chain); in cp_free()
778 * For each chain composing the channel program:
781 * This allows cp_free to find in ch_len the count of CCWs to free in a chain.
784 * as helpers to do ccw chain translation inside the kernel. Basically
808 struct ccwchain *chain; in cp_prefetch() local
817 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_prefetch()
818 len = chain->ch_len; in cp_prefetch()
820 ccw = &chain->ch_ccw[idx]; in cp_prefetch()
821 pa = &chain->ch_pa[idx]; in cp_prefetch()
831 /* Only cleanup the chain elements that were actually translated. */ in cp_prefetch()
832 chain->ch_len = idx; in cp_prefetch()
833 list_for_each_entry_continue(chain, &cp->ccwchain_list, next) { in cp_prefetch()
834 chain->ch_len = 0; in cp_prefetch()
851 struct ccwchain *chain; in cp_get_orb() local
875 chain = list_first_entry(&cp->ccwchain_list, struct ccwchain, next); in cp_get_orb()
876 cpa = chain->ch_ccw; in cp_get_orb()
898 struct ccwchain *chain; in cp_update_scsw() local
911 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_update_scsw()
912 ccw_head = (u32)(u64)chain->ch_ccw; in cp_update_scsw()
915 * of the chain. in cp_update_scsw()
917 if (is_cpa_within_range(cpa, ccw_head, chain->ch_len + 1)) { in cp_update_scsw()
920 * physical ccw to its chain head. in cp_update_scsw()
921 * Adding this value to the guest physical ccw chain in cp_update_scsw()
924 cpa = chain->ch_iova + (cpa - ccw_head); in cp_update_scsw()
933 * cp_iova_pinned() - check if an iova is pinned for a ccw chain.
938 * If the @iova is currently pinned for the ccw chain, return true;
943 struct ccwchain *chain; in cp_iova_pinned() local
949 list_for_each_entry(chain, &cp->ccwchain_list, next) { in cp_iova_pinned()
950 for (i = 0; i < chain->ch_len; i++) in cp_iova_pinned()
951 if (page_array_iova_pinned(&chain->ch_pa[i], iova, length)) in cp_iova_pinned()