18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * channel program interfaces 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2017 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Author(s): Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> 88c2ecf20Sopenharmony_ci * Xiao Feng Ren <renxiaof@linux.vnet.ibm.com> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef _VFIO_CCW_CP_H_ 128c2ecf20Sopenharmony_ci#define _VFIO_CCW_CP_H_ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/cio.h> 158c2ecf20Sopenharmony_ci#include <asm/scsw.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include "orb.h" 188c2ecf20Sopenharmony_ci#include "vfio_ccw_trace.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/* 218c2ecf20Sopenharmony_ci * Max length for ccw chain. 228c2ecf20Sopenharmony_ci * XXX: Limit to 256, need to check more? 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci#define CCWCHAIN_LEN_MAX 256 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/** 278c2ecf20Sopenharmony_ci * struct channel_program - manage information for channel program 288c2ecf20Sopenharmony_ci * @ccwchain_list: list head of ccwchains 298c2ecf20Sopenharmony_ci * @orb: orb for the currently processed ssch request 308c2ecf20Sopenharmony_ci * @mdev: the mediated device to perform page pinning/unpinning 318c2ecf20Sopenharmony_ci * @initialized: whether this instance is actually initialized 328c2ecf20Sopenharmony_ci * 338c2ecf20Sopenharmony_ci * @ccwchain_list is the head of a ccwchain list, that contents the 348c2ecf20Sopenharmony_ci * translated result of the guest channel program that pointed out by 358c2ecf20Sopenharmony_ci * the iova parameter when calling cp_init. 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_cistruct channel_program { 388c2ecf20Sopenharmony_ci struct list_head ccwchain_list; 398c2ecf20Sopenharmony_ci union orb orb; 408c2ecf20Sopenharmony_ci struct device *mdev; 418c2ecf20Sopenharmony_ci bool initialized; 428c2ecf20Sopenharmony_ci struct ccw1 *guest_cp; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ciextern int cp_init(struct channel_program *cp, struct device *mdev, 468c2ecf20Sopenharmony_ci union orb *orb); 478c2ecf20Sopenharmony_ciextern void cp_free(struct channel_program *cp); 488c2ecf20Sopenharmony_ciextern int cp_prefetch(struct channel_program *cp); 498c2ecf20Sopenharmony_ciextern union orb *cp_get_orb(struct channel_program *cp, u32 intparm, u8 lpm); 508c2ecf20Sopenharmony_ciextern void cp_update_scsw(struct channel_program *cp, union scsw *scsw); 518c2ecf20Sopenharmony_ciextern bool cp_iova_pinned(struct channel_program *cp, u64 iova); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#endif 54