6export module arch.s390x.io.css.subchannel;
7import arch.s390x.io.types;
8import zxfoundation.base.types;
9import zxfoundation.sync.waitqueue.types;
15namespace arch::s390x::io::css {
18 enum class subchannel_state : u8 {
27 using io_completion_sink_fn =
void (*)(
28 u32 sch_index, u32 binding_id, u32 binding_generation,
33 struct subchannel_entry {
34 subchannel_id schid{};
36 subchannel_state state{subchannel_state::free};
37 zxfoundation::sync::waitqueue::wait_head io_wait{};
39 std::atomic<u32> io_done{0};
44 u32 binding_generation{0};
45 u32 active_binding_id{~0U};
48 subchannel_entry()
noexcept =
default;
49 subchannel_entry(
const subchannel_entry&) =
delete;
50 subchannel_entry(subchannel_entry&&) =
delete;
51 auto operator=(
const subchannel_entry&) =
delete;
52 auto operator=(subchannel_entry&&) =
delete;
56 auto init()
noexcept ->
void;
62 [[nodiscard]]
auto start_io(u32 sch_index, orb& orb_ref)
noexcept
63 -> ::std::expected<
void, ::lib::kernel_error>;
66 [[nodiscard]]
auto install_completion_sink(
67 io_completion_sink_fn sink
68 )
noexcept -> ::std::expected<
void, ::lib::kernel_error>;
71 [[nodiscard]]
auto claim_binding(
72 u32 sch_index, u32 binding_id, u32 binding_generation
73 )
noexcept -> ::std::expected<
void, ::lib::kernel_error>;
76 [[nodiscard]]
auto release_binding(
77 u32 sch_index, u32 binding_id, u32 binding_generation
78 )
noexcept -> ::std::expected<
void, ::lib::kernel_error>;
81 [[nodiscard]]
auto available_lpm(u32 sch_index)
noexcept -> u8;
87 [[nodiscard]]
auto test_io(u32 sch_index, irb& irb_ref)
noexcept
88 -> ::std::expected<condition_code, ::lib::kernel_error>;
93 [[nodiscard]]
auto halt_io(u32 sch_index)
noexcept
94 -> ::std::expected<
void, ::lib::kernel_error>;
99 [[nodiscard]]
auto clear_io(u32 sch_index)
noexcept
100 -> ::std::expected<
void, ::lib::kernel_error>;
104 auto io_interrupt(u32 sch_no)
noexcept ->
void;
110 [[nodiscard]]
auto find_device(u16 dev_type, u16 dev_model)
noexcept
111 -> ::std::expected<u32, ::lib::kernel_error>;
114 [[nodiscard]]
auto subchannel_count()
noexcept -> u32;
119 [[nodiscard]]
auto get_entry(u32 index)
noexcept -> subchannel_entry*;