[Skiboot] [PATCH V6 09/21] core/pldm: Implement PLDM requester
Christophe Lombard
clombard at linux.vnet.ibm.com
Thu Apr 13 19:39:01 AEST 2023
Le 12/04/2023 à 17:11, Frederic Barrat a écrit :
>
>
> On 13/09/2022 12:26, Christophe Lombard wrote:
>
>> diff --git a/core/pldm/pldm-requester.c b/core/pldm/pldm-requester.c
>> new file mode 100644
>> index 00000000..412d495a
>> --- /dev/null
>> +++ b/core/pldm/pldm-requester.c
>> @@ -0,0 +1,331 @@
>> +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
>> +// Copyright 2022 IBM Corp.
>> +
>> +#define pr_fmt(fmt) "PLDM: " fmt
>> +
>> +#include <cpu.h>
>> +#include <stdio.h>
>> +#include <string.h>
>> +#include <timebase.h>
>> +#include <ast.h>
>> +#include <pldm/libpldm/utils.h>
>> +#include "pldm.h"
>> +
>> +struct pldm_request {
>> + struct list_node link;
>> +
>> + /* originating request params */
>> + int dest;
>> + int instance;
>> + int cmd_code;
>> + int type;
>> +
>> + /* messages requested */
>> + void *request_msg;
>> + int request_len;
>> +
>> + /* timeout handling */
>> + struct timer timeout;
>> + uint64_t timeout_ms;
>> + uint64_t start_time;
>> +
>> + /* completion callback */
>> + void (*complete)(struct pldm_rx_data *rx, void *data);
>> + void *complete_data;
>> +};
>> +
>> +struct pldm_response {
>> + void **response_msg;
>> + size_t *response_len;
>> + bool done;
>> + int rc;
>> +};
>> +
>> +/* pldm requests queue */
>> +static LIST_HEAD(list_pldm_requests);
>> +struct lock list_lock;
>> +struct timer requests_timer;
>
>
> Make those 2 struct static.
> 'list_lock' is pretty generic. Can we rename or at least have a
> comment to say what it's protecting?
>
>
ok, will do. Thanks
>
>> +/*
>> + * Handle PLDM message received from the PLDM terminus over MCTP
>> + */
>> +int pldm_requester_handle_response(struct pldm_rx_data *rx)
>> +{
>> + /* check the message received */
>> + if (active_request == NULL) {
>> + prlog(PR_ERR, "%s: No active request. "
>> + "Response received t:%d c:%d i:%d\n",
>> + __func__,
>> + rx->hdrinf.pldm_type,
>> + rx->hdrinf.command,
>> + rx->hdrinf.instance);
>> + return OPAL_WRONG_STATE;
>> + }
>> +
>> + if (!matches_request(rx, active_request)) {
>> + prlog(PR_ERR, "%s: Unexpected response! t:%d c:%d i:%d want
>> %d,%d,%d\n",
>> + __func__,
>> + rx->hdrinf.pldm_type,
>> + rx->hdrinf.command,
>> + rx->hdrinf.instance,
>> + active_request->type,
>> + active_request->cmd_code,
>> + active_request->instance
>> + );
>> + return OPAL_WRONG_STATE;
>> + }
>> +
>> + /* The expected message seems correct */
>> + handle_response(rx);
>> +
>> + return OPAL_SUCCESS;
>> +}
>> +
>> +/*
>> + * Send the PLDM request
>> + */
>> +static void requests_poller(struct timer *t __unused,
>> + void *data __unused,
>> + uint64_t now __unused)
>> +{
>
>
> Could probably also be converted to an opal poller and avoid the timer
> management.
yep. Thanks for this info
>
>
>> + int rc = OPAL_SUCCESS;
>> +
>> + lock(&list_lock);
>> +
>> + /* no new request to handle */
>> + if (list_empty(&list_pldm_requests))
>> + goto out;
>> +
>> + /* wait for the end of the processing of the current request */
>> + if (active_request)
>> + goto out;
>> +
>> + /* remove the first entry in a list */
>> + active_request = list_pop(&list_pldm_requests,
>> + struct pldm_request,
>> + link);
>
>
> I think we can shorten the duration of holding the 'list_lock' and
> release it here.
>
> Fred
>
More information about the Skiboot
mailing list