aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorVasant Hegde <hegdevasant@linux.vnet.ibm.com>2019-05-28 11:17:19 +0530
committerStewart Smith <stewart@linux.ibm.com>2019-06-03 10:28:57 +1000
commitec9f67bdaedcbfb5836677430da3738c3a3eaa84 (patch)
treea3e5768c5b41f46a51a4f06f1452c1941d7bd58c /core
parentbc5584c3145bc2029293674689275b55f87f246e (diff)
downloadskiboot-ec9f67bdaedcbfb5836677430da3738c3a3eaa84.zip
skiboot-ec9f67bdaedcbfb5836677430da3738c3a3eaa84.tar.gz
skiboot-ec9f67bdaedcbfb5836677430da3738c3a3eaa84.tar.bz2
opal-msg: Pass return value to callback handler
Kernel calls opal_get_msg() API to read OPAL message. In this path OPAL calls "callback" handler to inform caller that kernel read the opal message. It assumes that read is always success. This assumption was fine as message was always fixed size. Next patch introduces variable size opal message. In that situation opal_get_msg() may fail due to insufficient buffer size (ex: old kernel and new OPAL combination). So lets add `return value` parameter to "callback" handler. So that caller knows kernel didn't read the message and take appropriate action. Cc: Jeremy Kerr <jk@ozlabs.org> Cc: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Cc: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com> Acked-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'core')
-rw-r--r--core/opal-msg.c16
-rw-r--r--core/test/run-msg.c5
2 files changed, 11 insertions, 10 deletions
diff --git a/core/opal-msg.c b/core/opal-msg.c
index 1971467..d3dd2ae 100644
--- a/core/opal-msg.c
+++ b/core/opal-msg.c
@@ -1,4 +1,4 @@
-/* Copyright 2013-2014 IBM Corp.
+/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
struct opal_msg_entry {
struct list_node link;
- void (*consumed)(void *data);
+ void (*consumed)(void *data, int status);
void *data;
struct opal_msg msg;
};
@@ -35,8 +35,8 @@ static LIST_HEAD(msg_pending_list);
static struct lock opal_msg_lock = LOCK_UNLOCKED;
int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
- void (*consumed)(void *data), size_t num_params,
- const u64 *params)
+ void (*consumed)(void *data, int status),
+ size_t num_params, const u64 *params)
{
struct opal_msg_entry *entry;
@@ -75,7 +75,7 @@ int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
static int64_t opal_get_msg(uint64_t *buffer, uint64_t size)
{
struct opal_msg_entry *entry;
- void (*callback)(void *data);
+ void (*callback)(void *data, int status);
void *data;
if (size < sizeof(struct opal_msg) || !buffer)
@@ -103,7 +103,7 @@ static int64_t opal_get_msg(uint64_t *buffer, uint64_t size)
unlock(&opal_msg_lock);
if (callback)
- callback(data);
+ callback(data, OPAL_SUCCESS);
return OPAL_SUCCESS;
}
@@ -113,7 +113,7 @@ static int64_t opal_check_completion(uint64_t *buffer, uint64_t size,
uint64_t token)
{
struct opal_msg_entry *entry, *next_entry;
- void (*callback)(void *data) = NULL;
+ void (*callback)(void *data, int status) = NULL;
int rc = OPAL_BUSY;
void *data = NULL;
@@ -142,7 +142,7 @@ static int64_t opal_check_completion(uint64_t *buffer, uint64_t size,
unlock(&opal_msg_lock);
if (callback)
- callback(data);
+ callback(data, OPAL_SUCCESS);
return rc;
diff --git a/core/test/run-msg.c b/core/test/run-msg.c
index 67418a9..08e1a01 100644
--- a/core/test/run-msg.c
+++ b/core/test/run-msg.c
@@ -1,4 +1,4 @@
-/* Copyright 2013-2014 IBM Corp.
+/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -61,8 +61,9 @@ void opal_update_pending_evt(uint64_t evt_mask, uint64_t evt_values)
}
static long magic = 8097883813087437089UL;
-static void callback(void *data)
+static void callback(void *data, int status)
{
+ assert(status == OPAL_SUCCESS);
assert(*(uint64_t *)data == magic);
}