Lines Matching +full:- +full:- +full:-
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()
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) { \
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()
102 iic->handle_if_event(ii); in ipmi_kcs_signal()
109 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_handle_event()
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()
206 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_handle_rsp()
208 if (ik->waiting_rsp == msg_id) { in ipmi_kcs_handle_rsp()
209 ik->waiting_rsp++; in ipmi_kcs_handle_rsp()
210 if (rsp_len > sizeof(ik->outmsg)) { in ipmi_kcs_handle_rsp()
211 ik->outmsg[0] = rsp[0]; in ipmi_kcs_handle_rsp()
212 ik->outmsg[1] = rsp[1]; in ipmi_kcs_handle_rsp()
213 ik->outmsg[2] = IPMI_CC_CANNOT_RETURN_REQ_NUM_BYTES; in ipmi_kcs_handle_rsp()
214 ik->outlen = 3; in ipmi_kcs_handle_rsp()
216 memcpy(ik->outmsg, rsp, rsp_len); in ipmi_kcs_handle_rsp()
217 ik->outlen = rsp_len; in ipmi_kcs_handle_rsp()
219 IPMI_KCS_SET_STATE(ik->status_reg, IPMI_KCS_READ_STATE); in ipmi_kcs_handle_rsp()
220 ik->data_in_reg = IPMI_KCS_READ_CMD; in ipmi_kcs_handle_rsp()
230 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_ioport_read()
233 switch (addr & ik->size_mask) { in ipmi_kcs_ioport_read()
235 ret = ik->data_out_reg; in ipmi_kcs_ioport_read()
236 IPMI_KCS_SET_OBF(ik->status_reg, 0); in ipmi_kcs_ioport_read()
237 if (ik->obf_irq_set) { in ipmi_kcs_ioport_read()
238 ik->obf_irq_set = 0; in ipmi_kcs_ioport_read()
239 if (!ik->atn_irq_set) { in ipmi_kcs_ioport_read()
246 ret = ik->status_reg; in ipmi_kcs_ioport_read()
247 if (ik->atn_irq_set) { in ipmi_kcs_ioport_read()
248 ik->atn_irq_set = 0; in ipmi_kcs_ioport_read()
249 if (!ik->obf_irq_set) { in ipmi_kcs_ioport_read()
266 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_ioport_write()
268 if (IPMI_KCS_GET_IBF(ik->status_reg)) { in ipmi_kcs_ioport_write()
272 switch (addr & ik->size_mask) { in ipmi_kcs_ioport_write()
274 ik->data_in_reg = val; in ipmi_kcs_ioport_write()
278 ik->cmd_reg = val; in ipmi_kcs_ioport_write()
285 IPMI_KCS_SET_IBF(ik->status_reg, 1); in ipmi_kcs_ioport_write()
302 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_set_atn()
304 IPMI_KCS_SET_SMS_ATN(ik->status_reg, val); in ipmi_kcs_set_atn()
306 if (irq && !ik->atn_irq_set) { in ipmi_kcs_set_atn()
307 ik->atn_irq_set = 1; in ipmi_kcs_set_atn()
308 if (!ik->obf_irq_set) { in ipmi_kcs_set_atn()
313 if (ik->atn_irq_set) { in ipmi_kcs_set_atn()
314 ik->atn_irq_set = 0; in ipmi_kcs_set_atn()
315 if (!ik->obf_irq_set) { in ipmi_kcs_set_atn()
325 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_set_irq_enable()
327 ik->irqs_enabled = val; in ipmi_kcs_set_irq_enable()
335 IPMIKCS *ik = iic->get_backend_data(ii); in ipmi_kcs_init()
340 ik->size_mask = min_size - 1; in ipmi_kcs_init()
341 ik->io_length = 2; in ipmi_kcs_init()
342 memory_region_init_io(&ik->io, NULL, &ipmi_kcs_io_ops, ii, "ipmi-kcs", in ipmi_kcs_init()
351 if (ik->outpos >= MAX_IPMI_MSG_SIZE || ik->outlen >= MAX_IPMI_MSG_SIZE || in ipmi_kcs_vmstate_post_load()
352 ik->outpos >= ik->outlen) { in ipmi_kcs_vmstate_post_load()
355 ik->outpos, ik->outlen); in ipmi_kcs_vmstate_post_load()
356 ik->outpos = 0; in ipmi_kcs_vmstate_post_load()
357 ik->outlen = 0; in ipmi_kcs_vmstate_post_load()
360 if (ik->inlen >= MAX_IPMI_MSG_SIZE) { in ipmi_kcs_vmstate_post_load()
363 ik->inlen); in ipmi_kcs_vmstate_post_load()
364 ik->inlen = 0; in ipmi_kcs_vmstate_post_load()
402 info->interface_name = "kcs"; in ipmi_kcs_get_fwinfo()
403 info->interface_type = IPMI_SMBIOS_KCS; in ipmi_kcs_get_fwinfo()
404 info->ipmi_spec_major_revision = 2; in ipmi_kcs_get_fwinfo()
405 info->ipmi_spec_minor_revision = 0; in ipmi_kcs_get_fwinfo()
406 info->ipmi_channel_protocol = IPMI_CHANNEL_PROTOCOL_KCS; in ipmi_kcs_get_fwinfo()
407 info->base_address = ik->io_base; in ipmi_kcs_get_fwinfo()
408 info->i2c_slave_address = ik->bmc->slave_addr; in ipmi_kcs_get_fwinfo()
409 info->register_length = ik->io_length; in ipmi_kcs_get_fwinfo()
410 info->register_spacing = 1; in ipmi_kcs_get_fwinfo()
411 info->memspace = IPMI_MEMSPACE_IO; in ipmi_kcs_get_fwinfo()
412 info->irq_type = IPMI_LEVEL_IRQ; in ipmi_kcs_get_fwinfo()
417 iic->init = ipmi_kcs_init; in ipmi_kcs_class_init()
418 iic->set_atn = ipmi_kcs_set_atn; in ipmi_kcs_class_init()
419 iic->handle_rsp = ipmi_kcs_handle_rsp; in ipmi_kcs_class_init()
420 iic->handle_if_event = ipmi_kcs_handle_event; in ipmi_kcs_class_init()
421 iic->set_irq_enable = ipmi_kcs_set_irq_enable; in ipmi_kcs_class_init()