Lines Matching refs:ik

70 static void ipmi_kcs_raise_irq(IPMIKCS *ik)  in ipmi_kcs_raise_irq()  argument
72 if (ik->use_irq && ik->irqs_enabled && ik->raise_irq) { in ipmi_kcs_raise_irq()
73 ik->raise_irq(ik); in ipmi_kcs_raise_irq()
77 static void ipmi_kcs_lower_irq(IPMIKCS *ik) in ipmi_kcs_lower_irq() argument
79 if (ik->lower_irq) { in ipmi_kcs_lower_irq()
80 ik->lower_irq(ik); in ipmi_kcs_lower_irq()
86 IPMI_KCS_SET_OBF(ik->status_reg, 1); \
87 if (!ik->obf_irq_set) { \
88 ik->obf_irq_set = 1; \
89 if (!ik->atn_irq_set) { \
90 ipmi_kcs_raise_irq(ik); \
95 static void ipmi_kcs_signal(IPMIKCS *ik, IPMIInterface *ii) in ipmi_kcs_signal() argument
99 ik->do_wake = 1; in ipmi_kcs_signal()
100 while (ik->do_wake) { in ipmi_kcs_signal()
101 ik->do_wake = 0; in ipmi_kcs_signal()
109 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_handle_event() local
111 if (ik->cmd_reg == IPMI_KCS_ABORT_STATUS_CMD) { in ipmi_kcs_handle_event()
112 if (IPMI_KCS_GET_STATE(ik->status_reg) != IPMI_KCS_ERROR_STATE) { in ipmi_kcs_handle_event()
113 ik->waiting_rsp++; /* Invalidate the message */ in ipmi_kcs_handle_event()
114 ik->outmsg[0] = IPMI_KCS_STATUS_ABORTED_ERR; in ipmi_kcs_handle_event()
115 ik->outlen = 1; in ipmi_kcs_handle_event()
116 ik->outpos = 0; in ipmi_kcs_handle_event()
117 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_ERROR_STATE); in ipmi_kcs_handle_event()
123 switch (IPMI_KCS_GET_STATE(ik->status_reg)) { in ipmi_kcs_handle_event()
125 if (ik->cmd_reg == IPMI_KCS_WRITE_START_CMD) { in ipmi_kcs_handle_event()
126 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_WRITE_STATE); in ipmi_kcs_handle_event()
127 ik->cmd_reg = -1; in ipmi_kcs_handle_event()
128 ik->write_end = 0; in ipmi_kcs_handle_event()
129 ik->inlen = 0; in ipmi_kcs_handle_event()
136 if (ik->outpos >= ik->outlen) { in ipmi_kcs_handle_event()
137 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_IDLE_STATE); in ipmi_kcs_handle_event()
139 } else if (ik->data_in_reg == IPMI_KCS_READ_CMD) { in ipmi_kcs_handle_event()
140 ik->data_out_reg = ik->outmsg[ik->outpos]; in ipmi_kcs_handle_event()
141 ik->outpos++; in ipmi_kcs_handle_event()
144 ik->outmsg[0] = IPMI_KCS_STATUS_BAD_CC_ERR; in ipmi_kcs_handle_event()
145 ik->outlen = 1; in ipmi_kcs_handle_event()
146 ik->outpos = 0; in ipmi_kcs_handle_event()
147 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_ERROR_STATE); in ipmi_kcs_handle_event()
154 if (ik->data_in_reg != -1) { in ipmi_kcs_handle_event()
159 if (ik->inlen < sizeof(ik->inmsg)) { in ipmi_kcs_handle_event()
160 ik->inmsg[ik->inlen] = ik->data_in_reg; in ipmi_kcs_handle_event()
162 ik->inlen++; in ipmi_kcs_handle_event()
164 if (ik->write_end) { in ipmi_kcs_handle_event()
165 IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ik->bmc); in ipmi_kcs_handle_event()
166 ik->outlen = 0; in ipmi_kcs_handle_event()
167 ik->write_end = 0; in ipmi_kcs_handle_event()
168 ik->outpos = 0; in ipmi_kcs_handle_event()
169 bk->handle_command(ik->bmc, ik->inmsg, ik->inlen, sizeof(ik->inmsg), in ipmi_kcs_handle_event()
170 ik->waiting_rsp); in ipmi_kcs_handle_event()
172 } else if (ik->cmd_reg == IPMI_KCS_WRITE_END_CMD) { in ipmi_kcs_handle_event()
173 ik->cmd_reg = -1; in ipmi_kcs_handle_event()
174 ik->write_end = 1; in ipmi_kcs_handle_event()
180 if (ik->data_in_reg != -1) { in ipmi_kcs_handle_event()
181 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_READ_STATE); in ipmi_kcs_handle_event()
182 ik->data_in_reg = IPMI_KCS_READ_CMD; in ipmi_kcs_handle_event()
188 if (ik->cmd_reg != -1) { in ipmi_kcs_handle_event()
190 ik->outmsg[0] = IPMI_KCS_STATUS_BAD_CC_ERR; in ipmi_kcs_handle_event()
191 ik->outlen = 1; in ipmi_kcs_handle_event()
192 ik->outpos = 0; in ipmi_kcs_handle_event()
193 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_ERROR_STATE); in ipmi_kcs_handle_event()
197 ik->cmd_reg = -1; in ipmi_kcs_handle_event()
198 ik->data_in_reg = -1; in ipmi_kcs_handle_event()
199 IPMI_KCS_SET_IBF(ik->status_reg, 0); in ipmi_kcs_handle_event()
208 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_handle_rsp() local
210 if (ik->waiting_rsp == msg_id) { in ipmi_kcs_handle_rsp()
211 ik->waiting_rsp++; in ipmi_kcs_handle_rsp()
212 if (rsp_len > sizeof(ik->outmsg)) { in ipmi_kcs_handle_rsp()
213 ik->outmsg[0] = rsp[0]; in ipmi_kcs_handle_rsp()
214 ik->outmsg[1] = rsp[1]; in ipmi_kcs_handle_rsp()
215 ik->outmsg[2] = IPMI_CC_CANNOT_RETURN_REQ_NUM_BYTES; in ipmi_kcs_handle_rsp()
216 ik->outlen = 3; in ipmi_kcs_handle_rsp()
218 memcpy(ik->outmsg, rsp, rsp_len); in ipmi_kcs_handle_rsp()
219 ik->outlen = rsp_len; in ipmi_kcs_handle_rsp()
221 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_READ_STATE); in ipmi_kcs_handle_rsp()
222 ik->data_in_reg = IPMI_KCS_READ_CMD; in ipmi_kcs_handle_rsp()
223 ipmi_kcs_signal(ik, ii); in ipmi_kcs_handle_rsp()
232 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_ioport_read() local
235 switch (addr & ik->size_mask) { in ipmi_kcs_ioport_read()
237 ret = ik->data_out_reg; in ipmi_kcs_ioport_read()
238 IPMI_KCS_SET_OBF(ik->status_reg, 0); in ipmi_kcs_ioport_read()
239 if (ik->obf_irq_set) { in ipmi_kcs_ioport_read()
240 ik->obf_irq_set = 0; in ipmi_kcs_ioport_read()
241 if (!ik->atn_irq_set) { in ipmi_kcs_ioport_read()
242 ipmi_kcs_lower_irq(ik); in ipmi_kcs_ioport_read()
248 ret = ik->status_reg; in ipmi_kcs_ioport_read()
249 if (ik->atn_irq_set) { in ipmi_kcs_ioport_read()
250 ik->atn_irq_set = 0; in ipmi_kcs_ioport_read()
251 if (!ik->obf_irq_set) { in ipmi_kcs_ioport_read()
252 ipmi_kcs_lower_irq(ik); in ipmi_kcs_ioport_read()
268 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_ioport_write() local
270 if (IPMI_KCS_GET_IBF(ik->status_reg)) { in ipmi_kcs_ioport_write()
274 switch (addr & ik->size_mask) { in ipmi_kcs_ioport_write()
276 ik->data_in_reg = val; in ipmi_kcs_ioport_write()
280 ik->cmd_reg = val; in ipmi_kcs_ioport_write()
287 IPMI_KCS_SET_IBF(ik->status_reg, 1); in ipmi_kcs_ioport_write()
288 ipmi_kcs_signal(ik, ii); in ipmi_kcs_ioport_write()
304 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_set_atn() local
306 IPMI_KCS_SET_SMS_ATN(ik->status_reg, val); in ipmi_kcs_set_atn()
308 if (irq && !ik->atn_irq_set) { in ipmi_kcs_set_atn()
309 ik->atn_irq_set = 1; in ipmi_kcs_set_atn()
310 if (!ik->obf_irq_set) { in ipmi_kcs_set_atn()
311 ipmi_kcs_raise_irq(ik); in ipmi_kcs_set_atn()
315 if (ik->atn_irq_set) { in ipmi_kcs_set_atn()
316 ik->atn_irq_set = 0; in ipmi_kcs_set_atn()
317 if (!ik->obf_irq_set) { in ipmi_kcs_set_atn()
318 ipmi_kcs_lower_irq(ik); in ipmi_kcs_set_atn()
327 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_set_irq_enable() local
329 ik->irqs_enabled = val; in ipmi_kcs_set_irq_enable()
337 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_init() local
342 ik->size_mask = min_size - 1; in ipmi_kcs_init()
343 ik->io_length = 2; in ipmi_kcs_init()
344 memory_region_init_io(&ik->io, NULL, &ipmi_kcs_io_ops, ii, "ipmi-kcs", in ipmi_kcs_init()
350 IPMIKCS *ik = opaque; in ipmi_kcs_vmstate_post_load() local
353 if (ik->outpos >= MAX_IPMI_MSG_SIZE || ik->outlen >= MAX_IPMI_MSG_SIZE || in ipmi_kcs_vmstate_post_load()
354 ik->outpos >= ik->outlen) { in ipmi_kcs_vmstate_post_load()
357 ik->outpos, ik->outlen); in ipmi_kcs_vmstate_post_load()
358 ik->outpos = 0; in ipmi_kcs_vmstate_post_load()
359 ik->outlen = 0; in ipmi_kcs_vmstate_post_load()
362 if (ik->inlen >= MAX_IPMI_MSG_SIZE) { in ipmi_kcs_vmstate_post_load()
365 ik->inlen); in ipmi_kcs_vmstate_post_load()
366 ik->inlen = 0; in ipmi_kcs_vmstate_post_load()
402 void ipmi_kcs_get_fwinfo(IPMIKCS *ik, IPMIFwInfo *info) in ipmi_kcs_get_fwinfo() argument
408 info->base_address = ik->io_base; in ipmi_kcs_get_fwinfo()
409 info->i2c_slave_address = ik->bmc->slave_addr; in ipmi_kcs_get_fwinfo()
410 info->register_length = ik->io_length; in ipmi_kcs_get_fwinfo()