Lines Matching refs: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;
321 chain = kzalloc(sizeof(*chain), GFP_KERNEL);
322 if (!chain)
325 chain->ch_ccw = kcalloc(len, sizeof(*chain->ch_ccw), GFP_DMA | GFP_KERNEL);
326 if (!chain->ch_ccw)
329 chain->ch_pa = kcalloc(len, sizeof(*chain->ch_pa), GFP_KERNEL);
330 if (!chain->ch_pa)
333 list_add_tail(&chain->next, &cp->ccwchain_list);
335 return chain;
338 kfree(chain->ch_ccw);
339 kfree(chain);
343 static void ccwchain_free(struct ccwchain *chain)
345 list_del(&chain->next);
346 kfree(chain->ch_pa);
347 kfree(chain->ch_ccw);
348 kfree(chain);
352 static void ccwchain_cda_free(struct ccwchain *chain, int idx)
354 struct ccw1 *ccw = &chain->ch_ccw[idx];
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
405 struct ccwchain *chain;
408 list_for_each_entry(chain, &cp->ccwchain_list, next) {
409 ccw_head = chain->ch_iova;
410 if (is_cpa_within_range(tic->cda, ccw_head, chain->ch_len))
417 static int ccwchain_loop_tic(struct ccwchain *chain,
424 struct ccwchain *chain;
436 /* Count the CCWs in the current chain */
441 /* Need alloc a new chain for this one. */
442 chain = ccwchain_alloc(cp, len);
443 if (!chain)
446 chain->ch_len = len;
447 chain->ch_iova = cda;
449 /* Copy the actual CCWs into the new chain */
450 memcpy(chain->ch_ccw, cp->guest_cp, len * sizeof(struct ccw1));
452 /* Loop for tics on this new chain. */
453 ret = ccwchain_loop_tic(chain, cp);
456 ccwchain_free(chain);
462 static int ccwchain_loop_tic(struct ccwchain *chain, struct channel_program *cp)
467 for (i = 0; i < chain->ch_len; i++) {
468 tic = &chain->ch_ccw[i];
473 /* May transfer to an existing chain. */
753 struct ccwchain *chain, *temp;
760 list_for_each_entry_safe(chain, temp, &cp->ccwchain_list, next) {
761 for (i = 0; i < chain->ch_len; i++) {
762 page_array_unpin_free(&chain->ch_pa[i], vdev, idal_is_2k(cp));
763 ccwchain_cda_free(chain, i);
765 ccwchain_free(chain);
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;
817 list_for_each_entry(chain, &cp->ccwchain_list, next) {
818 len = chain->ch_len;
820 ccw = &chain->ch_ccw[idx];
821 pa = &chain->ch_pa[idx];
831 /* Only cleanup the chain elements that were actually translated. */
832 chain->ch_len = idx;
833 list_for_each_entry_continue(chain, &cp->ccwchain_list, next) {
834 chain->ch_len = 0;
851 struct ccwchain *chain;
875 chain = list_first_entry(&cp->ccwchain_list, struct ccwchain, next);
876 cpa = chain->ch_ccw;
898 struct ccwchain *chain;
911 list_for_each_entry(chain, &cp->ccwchain_list, next) {
912 ccw_head = (u32)(u64)chain->ch_ccw;
915 * of the chain.
917 if (is_cpa_within_range(cpa, ccw_head, chain->ch_len + 1)) {
920 * physical ccw to its chain head.
921 * Adding this value to the guest physical ccw chain
924 cpa = chain->ch_iova + (cpa - ccw_head);
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;
949 list_for_each_entry(chain, &cp->ccwchain_list, next) {
950 for (i = 0; i < chain->ch_len; i++)
951 if (page_array_iova_pinned(&chain->ch_pa[i], iova, length))