Lines Matching +full:s390 +full:- +full:ccw
2 * S390 IPL (boot) from a real DASD device via vfio framework.
7 * your option) any later version. See the COPYING file in the top-level
13 #include "s390-ccw.h"
14 #include "s390-arch.h"
15 #include "dasd-ipl.h"
31 memcpy((void *)&lowcore->subchannel_id, prefix_page + 0xB8, 12); in disable_prefixing()
34 static bool is_read_tic_ccw_chain(Ccw0 *ccw) in is_read_tic_ccw_chain() argument
36 Ccw0 *next_ccw = ccw + 1; in is_read_tic_ccw_chain()
38 return ((ccw->cmd_code == CCW_CMD_DASD_READ || in is_read_tic_ccw_chain()
39 ccw->cmd_code == CCW_CMD_DASD_READ_MT) && in is_read_tic_ccw_chain()
40 ccw->chain && next_ccw->cmd_code == CCW_CMD_TIC); in is_read_tic_ccw_chain()
50 if (cur_ccw->cmd_code == CCW_CMD_TIC && in dynamic_cp_fixup()
51 cur_ccw->cda == ptr2u32(cur_ccw) - 8) { in dynamic_cp_fixup()
56 if (!cur_ccw->chain) { in dynamic_cp_fixup()
67 *next_cpa = tic_ccw->cda; in dynamic_cp_fixup()
68 cur_ccw->chain = 0; in dynamic_cp_fixup()
86 printf("executing ccw chain at 0x%X\n", cpa); in run_dynamic_ccw_program()
107 /* Create Read IPL ccw at address 0 */ in make_readipl()
108 ccwIplRead->cmd_code = CCW_CMD_READ_IPL; in make_readipl()
109 ccwIplRead->cda = 0x00; /* Read into address 0x00 in main memory */ in make_readipl()
110 ccwIplRead->chain = 0; /* Chain flag */ in make_readipl()
111 ccwIplRead->count = 0x18; /* Read 0x18 bytes of data */ in make_readipl()
121 * format-0 READ and TIC CCWs. Let's sanity check.
128 return (ccwread->cmd_code == CCW_CMD_DASD_READ && in check_ipl1()
129 ccwtic->cmd_code == CCW_CMD_TIC); in check_ipl1()
134 Ccw0 *ccw = u32toptr(ipl2_addr); in check_ipl2() local
136 return (ipl2_addr != 0x00 && ccw->cmd_code != 0x00); in check_ipl2()
143 return ccwtic->cda; in read_ipl2_addr()
159 ccwRead->chain = 0x00; in ipl1_fixup()
161 ccwSeek->cmd_code = CCW_CMD_DASD_SEEK; in ipl1_fixup()
162 ccwSeek->cda = ptr2u32(seekData); in ipl1_fixup()
163 ccwSeek->chain = 1; in ipl1_fixup()
164 ccwSeek->count = sizeof(*seekData); in ipl1_fixup()
165 seekData->reserved = 0x00; in ipl1_fixup()
166 seekData->cyl = 0x00; in ipl1_fixup()
167 seekData->head = 0x00; in ipl1_fixup()
169 ccwSearchID->cmd_code = CCW_CMD_DASD_SEARCH_ID_EQ; in ipl1_fixup()
170 ccwSearchID->cda = ptr2u32(searchData); in ipl1_fixup()
171 ccwSearchID->chain = 1; in ipl1_fixup()
172 ccwSearchID->count = sizeof(*searchData); in ipl1_fixup()
173 searchData->cyl = 0; in ipl1_fixup()
174 searchData->head = 0; in ipl1_fixup()
175 searchData->record = 2; in ipl1_fixup()
177 /* Go back to Search CCW if correct record not yet found */ in ipl1_fixup()
178 ccwSearchTic->cmd_code = CCW_CMD_TIC; in ipl1_fixup()
179 ccwSearchTic->cda = ptr2u32(ccwSearchID); in ipl1_fixup()
195 * Limitations in vfio-ccw support complicate the IPL process. Details can
196 * be found in docs/devel/s390-dasd-ipl.rst
203 /* Construct Read IPL CCW and run it to read IPL1 from boot disk */ in dasd_ipl()
207 return -EIO; in dasd_ipl()
213 puts("IPL1 invalid for DASD-IPL"); in dasd_ipl()
214 return -EINVAL; in dasd_ipl()
218 * Fixup IPL1 channel program to account for vfio-ccw limitations, then run in dasd_ipl()
224 return -EIO; in dasd_ipl()
228 puts("IPL2 invalid for DASD-IPL"); in dasd_ipl()
229 return -EINVAL; in dasd_ipl()
237 return -EIO; in dasd_ipl()
241 pswl->mask |= PSW_MASK_EAMODE; /* Force z-mode */ in dasd_ipl()
242 pswl->addr |= PSW_MASK_BAMODE; /* ... */ in dasd_ipl()
244 return -1; in dasd_ipl()