84 cmd.offset = htole32(gas_base + SWITCHTEC_CAP_MULTICAST_OFFSET);
85 cmd.len = htole32(
sizeof(*cap));
92 cap->header = le32toh(cap->header);
93 cap->cap_ctrl = le32toh(cap->cap_ctrl);
94 cap->mc_base_addr = le64toh(cap->mc_base_addr);
95 cap->mc_receive = le64toh(cap->mc_receive);
96 cap->mc_block_all = le64toh(cap->mc_block_all);
97 cap->mc_block_untranslated = le64toh(cap->mc_block_untranslated);
98 cap->mc_overlay_bar = le64toh(cap->mc_overlay_bar);
143 addr = gas_base + SWITCHTEC_CAP_MULTICAST_OFFSET;
146 new_ctrl = SWITCHTEC_MC_CTRL(cap.cap_ctrl);
148 if (set->enable && !set->disable)
149 new_ctrl |= (1 << 15);
150 else if (set->disable)
151 new_ctrl &= ~(1 << 15);
153 if (set->num_group >= 0 && set->num_group <= 63)
154 new_ctrl = (new_ctrl & ~0x3F) | (set->num_group & 0x3F);
156 if (new_ctrl != SWITCHTEC_MC_CTRL(cap.cap_ctrl)) {
158 cmd.offset = htole32(addr +
160 cmd.len = htole32(2);
161 *(uint16_t *)cmd.data = htole16(new_ctrl);
163 sizeof(cmd.offset) +
sizeof(cmd.len) + 2,
169 if (set->set_base_addr || set->index_pos >= 0) {
173 if (set->set_base_addr)
174 new_base = set->base_addr & ~0xFFFULL;
176 new_base = SWITCHTEC_MC_BASE_ADDR(cap.mc_base_addr);
178 if (set->index_pos >= 0 && set->index_pos <= 63)
179 idx = set->index_pos & 0x3F;
181 idx = SWITCHTEC_MC_BASE_INDEX_POS(cap.mc_base_addr);
185 cmd.offset = htole32(addr +
187 cmd.len = htole32(8);
188 *(uint64_t *)cmd.data = htole64(new_base);
190 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
196 if (set->set_receive) {
197 cmd.offset = htole32(addr +
199 cmd.len = htole32(8);
200 *(uint64_t *)cmd.data = htole64(set->receive);
202 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
208 if (set->set_block_all) {
209 cmd.offset = htole32(addr +
211 cmd.len = htole32(8);
212 *(uint64_t *)cmd.data = htole64(set->block_all);
214 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
220 if (set->set_block_untranslated) {
221 cmd.offset = htole32(addr +
223 cmd.len = htole32(8);
224 *(uint64_t *)cmd.data = htole64(set->block_untranslated);
226 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
232 if (set->set_overlay_bar) {
233 uint64_t new_overlay;
236 if (set->overlay_size >= 0 && set->overlay_size <= 63)
237 size = set->overlay_size & 0x3F;
239 size = SWITCHTEC_MC_OVERLAY_SIZE(cap.mc_overlay_bar);
241 new_overlay = (set->overlay_bar & ~0x3FULL) | size;
243 cmd.offset = htole32(addr +
245 cmd.len = htole32(8);
246 *(uint64_t *)cmd.data = htole64(new_overlay);
248 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
252 }
else if (set->overlay_size >= 0) {
253 uint64_t new_overlay = cap.mc_overlay_bar;
255 new_overlay = (new_overlay & ~0x3FULL) |
256 (set->overlay_size & 0x3F);
258 cmd.offset = htole32(addr +
260 cmd.len = htole32(8);
261 *(uint64_t *)cmd.data = htole64(new_overlay);
263 sizeof(cmd.offset) +
sizeof(cmd.len) + 8,
278 has_domain1 = (sscanf(bdf1,
"%x:%x:%x.%x", &d1, &b1, &dv1, &f1) == 4);
285 has_domain2 = (sscanf(bdf2,
"%x:%x:%x.%x", &d2, &b2, &dv2, &f2) == 4);