33 SSTIOImp(uint32_t max_cpus, std::shared_ptr<SSTIoctl> ioctl_interface);
39 uint16_t subcommand, uint32_t subcommand_arg)
override;
41 uint16_t subcommand, uint32_t interface_parameter,
42 uint16_t read_subcommand,
43 uint32_t read_interface_parameter,
44 uint32_t read_mask)
override;
45 int add_mmio_read(uint32_t cpu_index, uint16_t register_offset)
override;
47 uint32_t register_value, uint32_t read_mask)
override;
52 uint64_t
sample(
int batch_idx)
const override;
55 uint16_t subcommand, uint32_t subcommand_arg)
override;
57 uint16_t subcommand, uint32_t interface_parameter,
58 uint16_t read_subcommand,
59 uint32_t read_interface_parameter,
60 uint32_t read_mask, uint64_t write_value,
61 uint64_t write_mask)
override;
62 uint32_t
read_mmio_once(uint32_t cpu_index, uint16_t register_offset)
override;
64 uint32_t register_value, uint32_t read_mask,
65 uint64_t write_value, uint64_t write_mask)
override;
66 void adjust(
int batch_idx, uint64_t write_value, uint64_t write_mask)
override;
76 template<
typename OuterStruct>
78 typename std::remove_all_extents<
decltype(OuterStruct::interfaces)>::type;
84 template<
typename OuterStruct>
85 std::vector<std::unique_ptr<OuterStruct, void (*)(OuterStruct *)> >
86 ioctl_structs_from_vector(
const std::vector<InnerStruct<OuterStruct> > &commands)
89 std::vector<std::unique_ptr<OuterStruct, void (*)(OuterStruct *)> > outer_structs;
91 size_t handled_commands = 0;
92 while (handled_commands < commands.size())
94 size_t batch_size = std::min(
95 static_cast<size_t>(m_batch_command_limit),
96 commands.size() - handled_commands);
102 outer_structs.emplace_back(
reinterpret_cast<OuterStruct *
>(
103 new char[
sizeof(OuterStruct::num_entries) +
104 sizeof(InnerStruct<OuterStruct>) * commands.size()]),
105 [](OuterStruct *outer_struct) {
106 delete[] reinterpret_cast<char *>(outer_struct);
108 outer_structs.back()->num_entries = batch_size;
109 std::copy(commands.data() + handled_commands,
110 commands.data() + handled_commands + batch_size,
111 outer_structs.back()->interfaces);
113 handled_commands += batch_size;
116 return outer_structs;
119 std::shared_ptr<SSTIoctl> m_ioctl;
120 int m_batch_command_limit;
121 std::vector<struct sst_mbox_interface_s> m_mbox_read_interfaces;
122 std::vector<struct sst_mbox_interface_s> m_mbox_write_interfaces;
123 std::vector<struct sst_mbox_interface_s> m_mbox_rmw_interfaces;
124 std::vector<uint32_t> m_mbox_rmw_read_masks;
125 std::vector<uint32_t> m_mbox_rmw_write_masks;
126 std::vector<struct sst_mmio_interface_s> m_mmio_read_interfaces;
127 std::vector<struct sst_mmio_interface_s> m_mmio_write_interfaces;
128 std::vector<struct sst_mmio_interface_s> m_mmio_rmw_interfaces;
129 std::vector<uint32_t> m_mmio_rmw_read_masks;
130 std::vector<uint32_t> m_mmio_rmw_write_masks;
131 std::vector<std::pair<message_type_e, size_t> > m_added_interfaces;
132 std::vector<std::unique_ptr<sst_mbox_interface_batch_s, void(*)(sst_mbox_interface_batch_s*)> > m_mbox_read_batch;
133 std::vector<std::unique_ptr<sst_mbox_interface_batch_s, void(*)(sst_mbox_interface_batch_s*)> > m_mbox_write_batch;
134 std::vector<std::unique_ptr<sst_mmio_interface_batch_s, void(*)(sst_mmio_interface_batch_s*)> > m_mmio_read_batch;
135 std::vector<std::unique_ptr<sst_mmio_interface_batch_s, void(*)(sst_mmio_interface_batch_s*)> > m_mmio_write_batch;
136 std::map<uint32_t, uint32_t> m_cpu_punit_core_map;