Lines Matching refs:sch

71     SubchDev *sch[MAX_SCHID + 1];  member
599 uint16_t css_build_subchannel_id(SubchDev *sch) in css_build_subchannel_id() argument
601 return css_do_build_subchannel_id(sch->cssid, sch->ssid); in css_build_subchannel_id()
604 void css_inject_io_interrupt(SubchDev *sch) in css_inject_io_interrupt() argument
606 uint8_t isc = (sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ISC) >> 11; in css_inject_io_interrupt()
608 trace_css_io_interrupt(sch->cssid, sch->ssid, sch->schid, in css_inject_io_interrupt()
609 sch->curr_status.pmcw.intparm, isc, ""); in css_inject_io_interrupt()
610 s390_io_interrupt(css_build_subchannel_id(sch), in css_inject_io_interrupt()
611 sch->schid, in css_inject_io_interrupt()
612 sch->curr_status.pmcw.intparm, in css_inject_io_interrupt()
616 void css_conditional_io_interrupt(SubchDev *sch) in css_conditional_io_interrupt() argument
622 if (!(sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ENA)) { in css_conditional_io_interrupt()
630 if (!(sch->curr_status.scsw.ctrl & SCSW_STCTL_STATUS_PEND)) { in css_conditional_io_interrupt()
631 uint8_t isc = (sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_ISC) >> 11; in css_conditional_io_interrupt()
633 trace_css_io_interrupt(sch->cssid, sch->ssid, sch->schid, in css_conditional_io_interrupt()
634 sch->curr_status.pmcw.intparm, isc, in css_conditional_io_interrupt()
636 sch->curr_status.scsw.ctrl &= ~SCSW_CTRL_MASK_STCTL; in css_conditional_io_interrupt()
637 sch->curr_status.scsw.ctrl |= in css_conditional_io_interrupt()
640 s390_io_interrupt(css_build_subchannel_id(sch), in css_conditional_io_interrupt()
641 sch->schid, in css_conditional_io_interrupt()
642 sch->curr_status.pmcw.intparm, in css_conditional_io_interrupt()
695 static void sch_handle_clear_func(SubchDev *sch) in sch_handle_clear_func() argument
697 SCHIB *schib = &sch->curr_status; in sch_handle_clear_func()
709 sch->channel_prog = 0x0; in sch_handle_clear_func()
710 sch->last_cmd_valid = false; in sch_handle_clear_func()
720 static void sch_handle_halt_func(SubchDev *sch) in sch_handle_halt_func() argument
722 SCHIB *schib = &sch->curr_status; in sch_handle_halt_func()
723 hwaddr curr_ccw = sch->channel_prog; in sch_handle_halt_func()
730 sch->channel_prog = 0x0; in sch_handle_halt_func()
731 sch->last_cmd_valid = false; in sch_handle_halt_func()
992 static int css_interpret_ccw(SubchDev *sch, hwaddr ccw_addr, in css_interpret_ccw() argument
1004 if (ccw_addr & (sch->ccw_fmt_1 ? 0x80000007 : 0xff000007)) { in css_interpret_ccw()
1009 ccw = copy_ccw_from_guest(ccw_addr, sch->ccw_fmt_1); in css_interpret_ccw()
1019 if (!sch->ccw_fmt_1 && (ccw.count == 0) && in css_interpret_ccw()
1036 if (sch->ccw_no_data_cnt == 255) { in css_interpret_ccw()
1039 sch->ccw_no_data_cnt++; in css_interpret_ccw()
1043 ccw_dstream_init(&sch->cds, &ccw, &(sch->orb)); in css_interpret_ccw()
1051 if (ccw.count != sizeof(sch->sense_data)) { in css_interpret_ccw()
1056 len = MIN(ccw.count, sizeof(sch->sense_data)); in css_interpret_ccw()
1057 ret = ccw_dstream_write_buf(&sch->cds, sch->sense_data, len); in css_interpret_ccw()
1058 sch->curr_status.scsw.count = ccw_dstream_residual_count(&sch->cds); in css_interpret_ccw()
1060 memset(sch->sense_data, 0, sizeof(sch->sense_data)); in css_interpret_ccw()
1068 copy_sense_id_to_guest(sense_id, &sch->id); in css_interpret_ccw()
1086 ret = ccw_dstream_write_buf(&sch->cds, sense_id, len); in css_interpret_ccw()
1088 sch->curr_status.scsw.count = ccw_dstream_residual_count(&sch->cds); in css_interpret_ccw()
1093 if (sch->last_cmd_valid && (sch->last_cmd.cmd_code == CCW_CMD_TIC)) { in css_interpret_ccw()
1102 sch->channel_prog = ccw.cda; in css_interpret_ccw()
1106 if (sch->ccw_cb) { in css_interpret_ccw()
1108 ret = sch->ccw_cb(sch, ccw); in css_interpret_ccw()
1114 sch->last_cmd = ccw; in css_interpret_ccw()
1115 sch->last_cmd_valid = true; in css_interpret_ccw()
1118 sch->channel_prog += 8; in css_interpret_ccw()
1126 static void sch_handle_start_func_virtual(SubchDev *sch) in sch_handle_start_func_virtual() argument
1128 SCHIB *schib = &sch->curr_status; in sch_handle_start_func_virtual()
1138 ORB *orb = &sch->orb; in sch_handle_start_func_virtual()
1150 sch->ccw_fmt_1 = !!(orb->ctrl0 & ORB_CTRL0_MASK_FMT); in sch_handle_start_func_virtual()
1151 schib->scsw.flags |= (sch->ccw_fmt_1) ? SCSW_FLAGS_MASK_FMT : 0; in sch_handle_start_func_virtual()
1152 sch->ccw_no_data_cnt = 0; in sch_handle_start_func_virtual()
1160 sch->last_cmd_valid = false; in sch_handle_start_func_virtual()
1162 ret = css_interpret_ccw(sch, sch->channel_prog, suspend_allowed); in sch_handle_start_func_virtual()
1174 schib->scsw.cpa = sch->channel_prog + 8; in sch_handle_start_func_virtual()
1184 sch->sense_data[0] = 0x80; in sch_handle_start_func_virtual()
1188 schib->scsw.cpa = sch->channel_prog + 8; in sch_handle_start_func_virtual()
1202 schib->scsw.cpa = sch->channel_prog + 8; in sch_handle_start_func_virtual()
1209 static IOInstEnding sch_handle_halt_func_passthrough(SubchDev *sch) in sch_handle_halt_func_passthrough() argument
1213 ret = s390_ccw_halt(sch); in sch_handle_halt_func_passthrough()
1215 sch_handle_halt_func(sch); in sch_handle_halt_func_passthrough()
1235 static IOInstEnding sch_handle_clear_func_passthrough(SubchDev *sch) in sch_handle_clear_func_passthrough() argument
1239 ret = s390_ccw_clear(sch); in sch_handle_clear_func_passthrough()
1241 sch_handle_clear_func(sch); in sch_handle_clear_func_passthrough()
1259 static IOInstEnding sch_handle_start_func_passthrough(SubchDev *sch) in sch_handle_start_func_passthrough() argument
1261 SCHIB *schib = &sch->curr_status; in sch_handle_start_func_passthrough()
1262 ORB *orb = &sch->orb; in sch_handle_start_func_passthrough()
1267 return s390_ccw_cmd_request(sch); in sch_handle_start_func_passthrough()
1276 IOInstEnding do_subchannel_work_virtual(SubchDev *sch) in do_subchannel_work_virtual() argument
1278 SCHIB *schib = &sch->curr_status; in do_subchannel_work_virtual()
1281 sch_handle_clear_func(sch); in do_subchannel_work_virtual()
1283 sch_handle_halt_func(sch); in do_subchannel_work_virtual()
1286 sch_handle_start_func_virtual(sch); in do_subchannel_work_virtual()
1288 css_inject_io_interrupt(sch); in do_subchannel_work_virtual()
1293 IOInstEnding do_subchannel_work_passthrough(SubchDev *sch) in do_subchannel_work_passthrough() argument
1295 SCHIB *schib = &sch->curr_status; in do_subchannel_work_passthrough()
1298 return sch_handle_clear_func_passthrough(sch); in do_subchannel_work_passthrough()
1300 return sch_handle_halt_func_passthrough(sch); in do_subchannel_work_passthrough()
1302 return sch_handle_start_func_passthrough(sch); in do_subchannel_work_passthrough()
1307 static IOInstEnding do_subchannel_work(SubchDev *sch) in do_subchannel_work() argument
1309 if (!sch->do_subchannel_work) { in do_subchannel_work()
1312 g_assert(sch->curr_status.scsw.ctrl & SCSW_CTRL_MASK_FCTL); in do_subchannel_work()
1313 return sch->do_subchannel_work(sch); in do_subchannel_work()
1376 IOInstEnding css_do_stsch(SubchDev *sch, SCHIB *schib) in css_do_stsch() argument
1385 ret = s390_ccw_store(sch); in css_do_stsch()
1388 copy_schib_to_guest(schib, &sch->curr_status); in css_do_stsch()
1444 IOInstEnding css_do_msch(SubchDev *sch, const SCHIB *orig_schib) in css_do_msch() argument
1446 SCHIB *schib = &sch->curr_status; in css_do_msch()
1483 if (sch->disable_cb && (oldflags & PMCW_FLAGS_MASK_ENA) != 0 in css_do_msch()
1485 sch->disable_cb(sch); in css_do_msch()
1490 IOInstEnding css_do_xsch(SubchDev *sch) in css_do_xsch() argument
1492 SCHIB *schib = &sch->curr_status; in css_do_xsch()
1515 sch->channel_prog = 0x0; in css_do_xsch()
1516 sch->last_cmd_valid = false; in css_do_xsch()
1522 IOInstEnding css_do_csch(SubchDev *sch) in css_do_csch() argument
1524 SCHIB *schib = &sch->curr_status; in css_do_csch()
1534 return do_subchannel_work(sch); in css_do_csch()
1537 IOInstEnding css_do_hsch(SubchDev *sch) in css_do_hsch() argument
1539 SCHIB *schib = &sch->curr_status; in css_do_hsch()
1567 return do_subchannel_work(sch); in css_do_hsch()
1570 static void css_update_chnmon(SubchDev *sch) in css_update_chnmon() argument
1572 if (!(sch->curr_status.pmcw.flags & PMCW_FLAGS_MASK_MME)) { in css_update_chnmon()
1577 if (sch->curr_status.pmcw.chars & PMCW_CHARS_MASK_MBFC) { in css_update_chnmon()
1582 sch->curr_status.mba, in css_update_chnmon()
1586 address_space_stl(&address_space_memory, sch->curr_status.mba, count, in css_update_chnmon()
1593 offset = sch->curr_status.pmcw.mbi << 5; in css_update_chnmon()
1605 IOInstEnding css_do_ssch(SubchDev *sch, ORB *orb) in css_do_ssch() argument
1607 SCHIB *schib = &sch->curr_status; in css_do_ssch()
1625 css_update_chnmon(sch); in css_do_ssch()
1627 sch->orb = *orb; in css_do_ssch()
1628 sch->channel_prog = orb->cpa; in css_do_ssch()
1633 return do_subchannel_work(sch); in css_do_ssch()
1672 static void build_irb_sense_data(SubchDev *sch, IRB *irb) in build_irb_sense_data() argument
1677 memcpy(irb->ecw, sch->sense_data, sizeof(sch->sense_data)); in build_irb_sense_data()
1683 void build_irb_passthrough(SubchDev *sch, IRB *irb) in build_irb_passthrough() argument
1686 irb->esw = sch->esw; in build_irb_passthrough()
1694 build_irb_sense_data(sch, irb); in build_irb_passthrough()
1697 void build_irb_virtual(SubchDev *sch, IRB *irb) in build_irb_virtual() argument
1699 SCHIB *schib = &sch->curr_status; in build_irb_virtual()
1715 build_irb_sense_data(sch, irb); in build_irb_virtual()
1716 irb->esw.erw = ESW_ERW_SENSE | (sizeof(sch->sense_data) << 8); in build_irb_virtual()
1721 int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len) in css_do_tsch_get_irb() argument
1723 SCHIB *schib = &sch->curr_status; in css_do_tsch_get_irb()
1741 if (sch->irb_cb) { in css_do_tsch_get_irb()
1742 sch->irb_cb(sch, &irb); in css_do_tsch_get_irb()
1752 void css_do_tsch_update_subch(SubchDev *sch) in css_do_tsch_update_subch() argument
1754 SCHIB *schib = &sch->curr_status; in css_do_tsch_update_subch()
1795 memset(sch->sense_data, 0 , sizeof(sch->sense_data)); in css_do_tsch_update_subch()
1905 IOInstEnding css_do_rsch(SubchDev *sch) in css_do_rsch() argument
1907 SCHIB *schib = &sch->curr_status; in css_do_rsch()
1925 css_update_chnmon(sch); in css_do_rsch()
1929 return do_subchannel_work(sch); in css_do_rsch()
2027 void css_sch_build_virtual_schib(SubchDev *sch, uint8_t chpid, uint8_t type) in css_sch_build_virtual_schib() argument
2029 SCHIB *schib = &sch->curr_status; in css_sch_build_virtual_schib()
2031 CssImage *css = channel_subsys.css[sch->cssid]; in css_sch_build_virtual_schib()
2036 schib->pmcw.devno = sch->devno; in css_sch_build_virtual_schib()
2043 css_add_chpid(sch->cssid, chpid, type, true); in css_sch_build_virtual_schib()
2067 return channel_subsys.css[real_cssid]->sch_set[ssid]->sch[schid]; in css_find_subch()
2180 bool css_subch_visible(SubchDev *sch) in css_subch_visible() argument
2182 if (sch->ssid > channel_subsys.max_ssid) { in css_subch_visible()
2186 if (sch->cssid != channel_subsys.default_cssid) { in css_subch_visible()
2212 uint16_t devno, SubchDev *sch) in css_subch_assign() argument
2217 trace_css_assign_subch(sch ? "assign" : "deassign", cssid, ssid, schid, in css_subch_assign()
2232 s_set->sch[schid] = sch; in css_subch_assign()
2233 if (sch) { in css_subch_assign()
2359 void css_reset_sch(SubchDev *sch) in css_reset_sch() argument
2361 SCHIB *schib = &sch->curr_status; in css_reset_sch()
2363 if ((schib->pmcw.flags & PMCW_FLAGS_MASK_ENA) != 0 && sch->disable_cb) { in css_reset_sch()
2364 sch->disable_cb(sch); in css_reset_sch()
2372 schib->pmcw.devno = sch->devno; in css_reset_sch()
2386 sch->channel_prog = 0x0; in css_reset_sch()
2387 sch->last_cmd_valid = false; in css_reset_sch()
2388 sch->thinint_active = false; in css_reset_sch()
2493 SubchDev *sch; in css_create_sch() local
2523 sch = g_new0(SubchDev, 1); in css_create_sch()
2524 sch->cssid = bus_id.cssid; in css_create_sch()
2525 sch->ssid = bus_id.ssid; in css_create_sch()
2526 sch->devno = bus_id.devid; in css_create_sch()
2527 sch->schid = schid; in css_create_sch()
2528 css_subch_assign(sch->cssid, sch->ssid, schid, sch->devno, sch); in css_create_sch()
2529 return sch; in css_create_sch()
2532 static int css_sch_get_chpids(SubchDev *sch, CssDevId *dev_id) in css_sch_get_chpids() argument
2538 SCHIB *schib = &sch->curr_status; in css_sch_get_chpids()
2567 static int css_sch_get_path_masks(SubchDev *sch, CssDevId *dev_id) in css_sch_get_path_masks() argument
2572 SCHIB *schib = &sch->curr_status; in css_sch_get_path_masks()
2630 int css_sch_build_schib(SubchDev *sch, CssDevId *dev_id) in css_sch_build_schib() argument
2632 CssImage *css = channel_subsys.css[sch->cssid]; in css_sch_build_schib()
2633 SCHIB *schib = &sch->curr_status; in css_sch_build_schib()
2641 schib->pmcw.devno = sch->devno; in css_sch_build_schib()
2644 ret = css_sch_get_path_masks(sch, dev_id); in css_sch_build_schib()
2650 ret = css_sch_get_chpids(sch, dev_id); in css_sch_build_schib()
2662 css_add_chpid(sch->cssid, schib->pmcw.chpid[i], type, false); in css_sch_build_schib()