diff options
author | Vasant Hegde <hegdevasant@linux.vnet.ibm.com> | 2016-03-15 15:53:54 +0530 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-03-31 15:19:31 +1100 |
commit | 23d7cf764cdded53d673714b2339d22a925190ad (patch) | |
tree | 6bb555c2beca0333798db9660784562cf690b1d2 /hw/ipmi | |
parent | 634add7df941011816cd65e03507e1d9e69e38f5 (diff) | |
download | skiboot-23d7cf764cdded53d673714b2339d22a925190ad.zip skiboot-23d7cf764cdded53d673714b2339d22a925190ad.tar.gz skiboot-23d7cf764cdded53d673714b2339d22a925190ad.tar.bz2 |
Move ipmi-opal.c from hw/ipmi to core
ipmi-opal.c contain OPAL API related functions. Commit a561cf7b added IPMI
support for FSP based system. Now FSP and AMI BMC based system makes use of
these functions. Hence move this file from hw specific dir to core dir.
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Acked-by: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/ipmi')
-rw-r--r-- | hw/ipmi/Makefile.inc | 2 | ||||
-rw-r--r-- | hw/ipmi/ipmi-opal.c | 141 |
2 files changed, 1 insertions, 142 deletions
diff --git a/hw/ipmi/Makefile.inc b/hw/ipmi/Makefile.inc index 6325369..a54602c 100644 --- a/hw/ipmi/Makefile.inc +++ b/hw/ipmi/Makefile.inc @@ -1,6 +1,6 @@ SUBDIRS += hw/ipmi -IPMI_OBJS = ipmi-rtc.o ipmi-power.o ipmi-opal.o ipmi-fru.o ipmi-sel.o +IPMI_OBJS = ipmi-rtc.o ipmi-power.o ipmi-fru.o ipmi-sel.o IPMI_OBJS += ipmi-watchdog.o ipmi-sensor.o ipmi-attn.o IPMI = hw/ipmi/built-in.o diff --git a/hw/ipmi/ipmi-opal.c b/hw/ipmi/ipmi-opal.c deleted file mode 100644 index 1b28aa6..0000000 --- a/hw/ipmi/ipmi-opal.c +++ /dev/null @@ -1,141 +0,0 @@ -/* Copyright 2013-2014 IBM Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdlib.h> -#include <string.h> -#include <ipmi.h> -#include <lock.h> -#include <opal.h> -#include <device.h> -#include <ccan/list/list.h> - -static struct lock msgq_lock = LOCK_UNLOCKED; -static struct list_head msgq = LIST_HEAD_INIT(msgq); - -static void opal_send_complete(struct ipmi_msg *msg) -{ - lock(&msgq_lock); - list_add_tail(&msgq, &msg->link); - opal_update_pending_evt(ipmi_backend->opal_event_ipmi_recv, - ipmi_backend->opal_event_ipmi_recv); - unlock(&msgq_lock); -} - -static int64_t opal_ipmi_send(uint64_t interface, - struct opal_ipmi_msg *opal_ipmi_msg, uint64_t msg_len) -{ - struct ipmi_msg *msg; - - if (opal_ipmi_msg->version != OPAL_IPMI_MSG_FORMAT_VERSION_1) { - prerror("OPAL IPMI: Incorrect version\n"); - return OPAL_UNSUPPORTED; - } - - msg_len -= sizeof(struct opal_ipmi_msg); - if (msg_len > IPMI_MAX_REQ_SIZE) { - prerror("OPAL IPMI: Invalid request length\n"); - return OPAL_PARAMETER; - } - - prlog(PR_DEBUG, "opal_ipmi_send(cmd: 0x%02x netfn: 0x%02x len: 0x%02llx)\n", - opal_ipmi_msg->cmd, opal_ipmi_msg->netfn >> 2, msg_len); - - msg = ipmi_mkmsg(interface, - IPMI_CODE(opal_ipmi_msg->netfn >> 2, opal_ipmi_msg->cmd), - opal_send_complete, NULL, opal_ipmi_msg->data, - msg_len, IPMI_MAX_RESP_SIZE); - if (!msg) - return OPAL_RESOURCE; - - msg->complete = opal_send_complete; - msg->error = opal_send_complete; - return ipmi_queue_msg(msg); -} - -static int64_t opal_ipmi_recv(uint64_t interface, - struct opal_ipmi_msg *opal_ipmi_msg, uint64_t *msg_len) -{ - struct ipmi_msg *msg; - int64_t rc; - - lock(&msgq_lock); - msg = list_top(&msgq, struct ipmi_msg, link); - - if (!msg) { - rc = OPAL_EMPTY; - goto out_unlock; - } - - if (opal_ipmi_msg->version != OPAL_IPMI_MSG_FORMAT_VERSION_1) { - prerror("OPAL IPMI: Incorrect version\n"); - rc = OPAL_UNSUPPORTED; - goto out_del_msg; - } - - if (interface != IPMI_DEFAULT_INTERFACE) { - prerror("IPMI: Invalid interface 0x%llx in opal_ipmi_recv\n", interface); - rc = OPAL_PARAMETER; - goto out_del_msg; - } - - if (*msg_len - sizeof(struct opal_ipmi_msg) < msg->resp_size + 1) { - rc = OPAL_RESOURCE; - goto out_del_msg; - } - - list_del(&msg->link); - if (list_empty(&msgq)) - opal_update_pending_evt(ipmi_backend->opal_event_ipmi_recv, 0); - unlock(&msgq_lock); - - opal_ipmi_msg->cmd = msg->cmd; - opal_ipmi_msg->netfn = msg->netfn; - opal_ipmi_msg->data[0] = msg->cc; - memcpy(&opal_ipmi_msg->data[1], msg->data, msg->resp_size); - - prlog(PR_DEBUG, "opal_ipmi_recv(cmd: 0x%02x netfn: 0x%02x resp_size: 0x%02x)\n", - msg->cmd, msg->netfn >> 2, msg->resp_size); - - /* Add one as the completion code is returned in the message data */ - *msg_len = msg->resp_size + sizeof(struct opal_ipmi_msg) + 1; - ipmi_free_msg(msg); - - return OPAL_SUCCESS; - -out_del_msg: - list_del(&msg->link); - if (list_empty(&msgq)) - opal_update_pending_evt(ipmi_backend->opal_event_ipmi_recv, 0); - ipmi_free_msg(msg); -out_unlock: - unlock(&msgq_lock); - return rc; -} - -void ipmi_opal_init(void) -{ - struct dt_node *opal_ipmi; - - opal_ipmi = dt_new(opal_node, "ipmi"); - dt_add_property_strings(opal_ipmi, "compatible", "ibm,opal-ipmi"); - dt_add_property_cells(opal_ipmi, "ibm,ipmi-interface-id", - IPMI_DEFAULT_INTERFACE); - dt_add_property_cells(opal_ipmi, "interrupts", - ilog2(ipmi_backend->opal_event_ipmi_recv)); - - opal_register(OPAL_IPMI_SEND, opal_ipmi_send, 3); - opal_register(OPAL_IPMI_RECV, opal_ipmi_recv, 3); -} |