Lines Matching +full:ipmi +full:- +full:bt
2 * QEMU IPMI BT emulation
28 #include "hw/ipmi/ipmi_bt.h"
83 if (ib->use_irq && ib->irqs_enabled && ib->raise_irq) { in ipmi_bt_raise_irq()
84 ib->raise_irq(ib); in ipmi_bt_raise_irq()
90 if (ib->lower_irq) { in ipmi_bt_lower_irq()
91 ib->lower_irq(ib); in ipmi_bt_lower_irq()
98 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_handle_event()
100 if (ib->inlen < 4) { in ipmi_bt_handle_event()
104 if (ib->inmsg[0] != (ib->inlen - 1)) { in ipmi_bt_handle_event()
106 IPMI_BT_SET_BBUSY(ib->control_reg, 1); in ipmi_bt_handle_event()
107 ib->inlen = 0; in ipmi_bt_handle_event()
110 if ((ib->inmsg[1] == (IPMI_NETFN_APP << 2)) && in ipmi_bt_handle_event()
111 (ib->inmsg[3] == IPMI_CMD_GET_BT_INTF_CAP)) { in ipmi_bt_handle_event()
113 ib->outmsg[0] = 9; in ipmi_bt_handle_event()
114 ib->outmsg[1] = ib->inmsg[1] | 0x04; in ipmi_bt_handle_event()
115 ib->outmsg[2] = ib->inmsg[2]; in ipmi_bt_handle_event()
116 ib->outmsg[3] = ib->inmsg[3]; in ipmi_bt_handle_event()
117 ib->outmsg[4] = 0; in ipmi_bt_handle_event()
118 ib->outmsg[5] = 1; /* Only support 1 outstanding request. */ in ipmi_bt_handle_event()
119 if (sizeof(ib->inmsg) > 0xff) { /* Input buffer size */ in ipmi_bt_handle_event()
120 ib->outmsg[6] = 0xff; in ipmi_bt_handle_event()
122 ib->outmsg[6] = (unsigned char) sizeof(ib->inmsg); in ipmi_bt_handle_event()
124 if (sizeof(ib->outmsg) > 0xff) { /* Output buffer size */ in ipmi_bt_handle_event()
125 ib->outmsg[7] = 0xff; in ipmi_bt_handle_event()
127 ib->outmsg[7] = (unsigned char) sizeof(ib->outmsg); in ipmi_bt_handle_event()
129 ib->outmsg[8] = 10; /* Max request to response time */ in ipmi_bt_handle_event()
130 ib->outmsg[9] = 0; /* Don't recommend retries */ in ipmi_bt_handle_event()
131 ib->outlen = 10; in ipmi_bt_handle_event()
132 IPMI_BT_SET_BBUSY(ib->control_reg, 0); in ipmi_bt_handle_event()
133 IPMI_BT_SET_B2H_ATN(ib->control_reg, 1); in ipmi_bt_handle_event()
134 if (!IPMI_BT_GET_B2H_IRQ(ib->mask_reg) && in ipmi_bt_handle_event()
135 IPMI_BT_GET_B2H_IRQ_EN(ib->mask_reg)) { in ipmi_bt_handle_event()
136 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 1); in ipmi_bt_handle_event()
141 ib->waiting_seq = ib->inmsg[2]; in ipmi_bt_handle_event()
142 ib->inmsg[2] = ib->inmsg[1]; in ipmi_bt_handle_event()
144 IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ib->bmc); in ipmi_bt_handle_event()
145 bk->handle_command(ib->bmc, ib->inmsg + 2, ib->inlen - 2, in ipmi_bt_handle_event()
146 sizeof(ib->inmsg), ib->waiting_rsp); in ipmi_bt_handle_event()
156 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_handle_rsp()
158 if (ib->waiting_rsp == msg_id) { in ipmi_bt_handle_rsp()
159 ib->waiting_rsp++; in ipmi_bt_handle_rsp()
160 if (rsp_len > (sizeof(ib->outmsg) - 2)) { in ipmi_bt_handle_rsp()
161 ib->outmsg[0] = 4; in ipmi_bt_handle_rsp()
162 ib->outmsg[1] = rsp[0]; in ipmi_bt_handle_rsp()
163 ib->outmsg[2] = ib->waiting_seq; in ipmi_bt_handle_rsp()
164 ib->outmsg[3] = rsp[1]; in ipmi_bt_handle_rsp()
165 ib->outmsg[4] = IPMI_CC_CANNOT_RETURN_REQ_NUM_BYTES; in ipmi_bt_handle_rsp()
166 ib->outlen = 5; in ipmi_bt_handle_rsp()
168 ib->outmsg[0] = rsp_len + 1; in ipmi_bt_handle_rsp()
169 ib->outmsg[1] = rsp[0]; in ipmi_bt_handle_rsp()
170 ib->outmsg[2] = ib->waiting_seq; in ipmi_bt_handle_rsp()
171 memcpy(ib->outmsg + 3, rsp + 1, rsp_len - 1); in ipmi_bt_handle_rsp()
172 ib->outlen = rsp_len + 2; in ipmi_bt_handle_rsp()
174 IPMI_BT_SET_BBUSY(ib->control_reg, 0); in ipmi_bt_handle_rsp()
175 IPMI_BT_SET_B2H_ATN(ib->control_reg, 1); in ipmi_bt_handle_rsp()
176 if (!IPMI_BT_GET_B2H_IRQ(ib->mask_reg) && in ipmi_bt_handle_rsp()
177 IPMI_BT_GET_B2H_IRQ_EN(ib->mask_reg)) { in ipmi_bt_handle_rsp()
178 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 1); in ipmi_bt_handle_rsp()
189 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_ioport_read()
192 switch (addr & ib->size_mask) { in ipmi_bt_ioport_read()
194 ret = ib->control_reg; in ipmi_bt_ioport_read()
197 if (ib->outpos < ib->outlen) { in ipmi_bt_ioport_read()
198 ret = ib->outmsg[ib->outpos]; in ipmi_bt_ioport_read()
199 ib->outpos++; in ipmi_bt_ioport_read()
200 if (ib->outpos == ib->outlen) { in ipmi_bt_ioport_read()
201 ib->outpos = 0; in ipmi_bt_ioport_read()
202 ib->outlen = 0; in ipmi_bt_ioport_read()
209 ret = ib->mask_reg; in ipmi_bt_ioport_read()
222 ib->do_wake = 1; in ipmi_bt_signal()
223 while (ib->do_wake) { in ipmi_bt_signal()
224 ib->do_wake = 0; in ipmi_bt_signal()
225 iic->handle_if_event(ii); in ipmi_bt_signal()
234 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_ioport_write()
236 switch (addr & ib->size_mask) { in ipmi_bt_ioport_write()
239 ib->inlen = 0; in ipmi_bt_ioport_write()
242 ib->outpos = 0; in ipmi_bt_ioport_write()
245 IPMI_BT_SET_B2H_ATN(ib->control_reg, 0); in ipmi_bt_ioport_write()
248 IPMI_BT_SET_SMS_ATN(ib->control_reg, 0); in ipmi_bt_ioport_write()
252 IPMI_BT_SET_HBUSY(ib->control_reg, in ipmi_bt_ioport_write()
253 !IPMI_BT_GET_HBUSY(ib->control_reg)); in ipmi_bt_ioport_write()
256 IPMI_BT_SET_BBUSY(ib->control_reg, 1); in ipmi_bt_ioport_write()
262 if (ib->inlen < sizeof(ib->inmsg)) { in ipmi_bt_ioport_write()
263 ib->inmsg[ib->inlen] = val; in ipmi_bt_ioport_write()
265 ib->inlen++; in ipmi_bt_ioport_write()
270 IPMI_BT_GET_B2H_IRQ_EN(ib->mask_reg)) { in ipmi_bt_ioport_write()
272 if (IPMI_BT_GET_B2H_ATN(ib->control_reg) || in ipmi_bt_ioport_write()
273 IPMI_BT_GET_SMS_ATN(ib->control_reg)) { in ipmi_bt_ioport_write()
274 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 1); in ipmi_bt_ioport_write()
277 IPMI_BT_SET_B2H_IRQ_EN(ib->mask_reg, 1); in ipmi_bt_ioport_write()
279 if (IPMI_BT_GET_B2H_IRQ(ib->mask_reg)) { in ipmi_bt_ioport_write()
280 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 0); in ipmi_bt_ioport_write()
283 IPMI_BT_SET_B2H_IRQ_EN(ib->mask_reg, 0); in ipmi_bt_ioport_write()
286 if (IPMI_BT_GET_B2H_IRQ(val) && IPMI_BT_GET_B2H_IRQ(ib->mask_reg)) { in ipmi_bt_ioport_write()
287 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 0); in ipmi_bt_ioport_write()
310 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_set_atn()
312 if (!!val == IPMI_BT_GET_SMS_ATN(ib->control_reg)) { in ipmi_bt_set_atn()
316 IPMI_BT_SET_SMS_ATN(ib->control_reg, val); in ipmi_bt_set_atn()
318 if (irq && !IPMI_BT_GET_B2H_ATN(ib->control_reg) && in ipmi_bt_set_atn()
319 IPMI_BT_GET_B2H_IRQ_EN(ib->mask_reg)) { in ipmi_bt_set_atn()
320 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 1); in ipmi_bt_set_atn()
324 if (!IPMI_BT_GET_B2H_ATN(ib->control_reg) && in ipmi_bt_set_atn()
325 IPMI_BT_GET_B2H_IRQ(ib->mask_reg)) { in ipmi_bt_set_atn()
326 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 0); in ipmi_bt_set_atn()
335 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_handle_reset()
338 /* Disable the BT interrupt on reset */ in ipmi_bt_handle_reset()
339 if (IPMI_BT_GET_B2H_IRQ(ib->mask_reg)) { in ipmi_bt_handle_reset()
340 IPMI_BT_SET_B2H_IRQ(ib->mask_reg, 0); in ipmi_bt_handle_reset()
343 IPMI_BT_SET_B2H_IRQ_EN(ib->mask_reg, 0); in ipmi_bt_handle_reset()
350 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_set_irq_enable()
352 ib->irqs_enabled = val; in ipmi_bt_set_irq_enable()
358 IPMIBT *ib = iic->get_backend_data(ii); in ipmi_bt_init()
363 ib->size_mask = min_size - 1; in ipmi_bt_init()
364 ib->io_length = 3; in ipmi_bt_init()
366 memory_region_init_io(&ib->io, NULL, &ipmi_bt_io_ops, ii, "ipmi-bt", in ipmi_bt_init()
375 if (ib->outpos >= MAX_IPMI_MSG_SIZE || ib->outlen >= MAX_IPMI_MSG_SIZE || in ipmi_bt_vmstate_post_load()
376 ib->outpos >= ib->outlen) { in ipmi_bt_vmstate_post_load()
378 "ipmi:bt: vmstate transfer received bad out values: %d %d\n", in ipmi_bt_vmstate_post_load()
379 ib->outpos, ib->outlen); in ipmi_bt_vmstate_post_load()
380 ib->outpos = 0; in ipmi_bt_vmstate_post_load()
381 ib->outlen = 0; in ipmi_bt_vmstate_post_load()
384 if (ib->inlen >= MAX_IPMI_MSG_SIZE) { in ipmi_bt_vmstate_post_load()
386 "ipmi:bt: vmstate transfer received bad in value: %d\n", in ipmi_bt_vmstate_post_load()
387 ib->inlen); in ipmi_bt_vmstate_post_load()
388 ib->inlen = 0; in ipmi_bt_vmstate_post_load()
395 .name = TYPE_IPMI_INTERFACE_PREFIX "bt",
418 info->interface_name = "bt"; in ipmi_bt_get_fwinfo()
419 info->interface_type = IPMI_SMBIOS_BT; in ipmi_bt_get_fwinfo()
420 info->ipmi_spec_major_revision = 2; in ipmi_bt_get_fwinfo()
421 info->ipmi_spec_minor_revision = 0; in ipmi_bt_get_fwinfo()
422 info->base_address = ib->io_base; in ipmi_bt_get_fwinfo()
423 info->register_length = ib->io_length; in ipmi_bt_get_fwinfo()
424 info->register_spacing = 1; in ipmi_bt_get_fwinfo()
425 info->memspace = IPMI_MEMSPACE_IO; in ipmi_bt_get_fwinfo()
426 info->irq_type = IPMI_LEVEL_IRQ; in ipmi_bt_get_fwinfo()
431 iic->init = ipmi_bt_init; in ipmi_bt_class_init()
432 iic->set_atn = ipmi_bt_set_atn; in ipmi_bt_class_init()
433 iic->handle_rsp = ipmi_bt_handle_rsp; in ipmi_bt_class_init()
434 iic->handle_if_event = ipmi_bt_handle_event; in ipmi_bt_class_init()
435 iic->set_irq_enable = ipmi_bt_set_irq_enable; in ipmi_bt_class_init()
436 iic->reset = ipmi_bt_handle_reset; in ipmi_bt_class_init()