Message ID | 20220913102724.65563-12-clombard@linux.vnet.ibm.com |
---|---|
State | Superseded |
Headers | show |
Series | Complete PLDM responder and enable PLDM support | expand |
On Tue, Sep 13, 2022 at 12:27:20PM +0200, Christophe Lombard wrote: > The GetFRURecordTable command is used to get the FRU Record Table data. > This command is defined to allow the FRU Record Table data to be > transferred using a sequence of one or more command/response messages. > > Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Reviewed-by: Abhishek Singh Tomar <abhishek@linux.ibm.com> > --- > core/pldm/pldm-fru-requests.c | 12 ++++++ > core/pldm/pldm-responder.c | 78 +++++++++++++++++++++++++++++++++++ > core/pldm/pldm.h | 2 + > 3 files changed, 92 insertions(+) > > diff --git a/core/pldm/pldm-fru-requests.c b/core/pldm/pldm-fru-requests.c > index 80a13ef1..c90f08b3 100644 > --- a/core/pldm/pldm-fru-requests.c > +++ b/core/pldm/pldm-fru-requests.c > @@ -228,6 +228,18 @@ void pldm_fru_add_record(uint32_t *table_length, > local_fru_table_length = *table_length; > } > > +int pldm_fru_get_local_table(void **fru_record_table_bytes, > + uint32_t *fru_record_table_size) > +{ > + if (!local_fru_record_table) > + return OPAL_PARAMETER; > + > + *fru_record_table_bytes = local_fru_record_table; > + *fru_record_table_size = local_fru_table_length; > + > + return OPAL_SUCCESS; > +} > + > int pldm_fru_init(void) > { > int rc; > diff --git a/core/pldm/pldm-responder.c b/core/pldm/pldm-responder.c > index cd2cbc1c..2c5b3677 100644 > --- a/core/pldm/pldm-responder.c > +++ b/core/pldm/pldm-responder.c > @@ -995,6 +995,83 @@ static struct pldm_cmd pldm_fru_get_record_table_metadata = { > .handler = fru_get_record_table_metadata_handler, > }; > > +/* > + * GetFRURecordTable (0X02) > + * The GetFRURecordTable command is used to get the FRU Record Table > + * data. This command is defined to allow the FRU Record Table data to > + * be transferred using a sequence of one or more command/response > + * messages. > + */ > +static int fru_get_record_table_handler(const struct pldm_rx_data *req) > +{ > + struct pldm_get_fru_record_table_resp *resp; > + void *fru_record_table_bytes; > + uint32_t fru_record_table_size; > + size_t response_length; > + struct pldm_msg *msg; > + char *response_msg; > + int rc; > + > + /* The getFruRecordTable requests do have request data, but it's > + * only related to multi-part transfers which we don't support > + * and which the BMC will not send us. > + */ > + > + /* get local fru record table */ > + rc = pldm_fru_get_local_table(&fru_record_table_bytes, &fru_record_table_size); > + if (rc) { > + prlog(PR_ERR, "Failed to get Fru Record Table\n"); > + cc_resp(req, req->hdrinf.pldm_type, > + req->hdrinf.command, PLDM_ERROR); > + return OPAL_PARAMETER; > + } > + > + /* create a PLDM response message for GetFRURecordTable */ > + response_length = sizeof(struct pldm_msg_hdr) + > + sizeof(struct pldm_get_fru_record_table_resp) + > + fru_record_table_size; > + response_msg = zalloc(response_length); > + memset(response_msg, 0, response_length); > + > + rc = encode_get_fru_record_table_resp( > + req->hdrinf.instance, > + PLDM_SUCCESS, > + 0, // No next transfer handle > + PLDM_START_AND_END, > + (struct pldm_msg *)response_msg); > + if (rc != PLDM_SUCCESS) { > + prlog(PR_ERR, "Encode GetFruRecordTable Error, rc: %d\n", rc); > + cc_resp(req, req->hdrinf.pldm_type, > + req->hdrinf.command, PLDM_ERROR); > + free(response_msg); > + return OPAL_PARAMETER; > + } > + > + msg = (struct pldm_msg *)response_msg; > + resp = (struct pldm_get_fru_record_table_resp *)(msg->payload); > + memcpy(resp->fru_record_table_data, > + fru_record_table_bytes, > + fru_record_table_size); > + > + /* send PLDM message over MCTP */ > + rc = pldm_mctp_message_tx(req->source_eid, response_msg, response_length - 1); > + if (rc) { > + prlog(PR_ERR, "Failed to send GetFruRecordTable response, rc = %d\n", rc); > + free(response_msg); > + return OPAL_HARDWARE; > + } > + > + free(response_msg); > + > + return OPAL_SUCCESS; > +} > + > +static struct pldm_cmd pldm_fru_get_record_table = { > + .name = "PLDM_GET_FRU_RECORD_TABLE", > + .pldm_cmd_id = PLDM_GET_FRU_RECORD_TABLE, > + .handler = fru_get_record_table_handler, > +}; > + > int pldm_responder_handle_request(struct pldm_rx_data *rx) > { > const struct pldm_type *type; > @@ -1046,6 +1123,7 @@ int pldm_responder_init(void) > /* Register fru commands we'll respond to - DSP0257 */ > add_type(&pldm_fru_type); > add_cmd(&pldm_fru_type, &pldm_fru_get_record_table_metadata); > + add_cmd(&pldm_fru_type, &pldm_fru_get_record_table); > > return OPAL_SUCCESS; > } > diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h > index fea06b0b..dd6f2352 100644 > --- a/core/pldm/pldm.h > +++ b/core/pldm/pldm.h > @@ -78,6 +78,8 @@ int pldm_fru_get_bmc_version(void *bv); > void pldm_fru_add_record(uint32_t *fru_table_length, > uint16_t *total_record_set_identifiers, > uint16_t *total_table_records); > +int pldm_fru_get_local_table(void **fru_record_table_bytes, > + uint32_t *fru_record_table_size); > int pldm_fru_init(void); > > int pldm_bios_find_lid_by_attr_name(const char *name, char **lid); > -- > 2.37.3 > > _______________________________________________ > Skiboot mailing list > Skiboot@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/skiboot
diff --git a/core/pldm/pldm-fru-requests.c b/core/pldm/pldm-fru-requests.c index 80a13ef1..c90f08b3 100644 --- a/core/pldm/pldm-fru-requests.c +++ b/core/pldm/pldm-fru-requests.c @@ -228,6 +228,18 @@ void pldm_fru_add_record(uint32_t *table_length, local_fru_table_length = *table_length; } +int pldm_fru_get_local_table(void **fru_record_table_bytes, + uint32_t *fru_record_table_size) +{ + if (!local_fru_record_table) + return OPAL_PARAMETER; + + *fru_record_table_bytes = local_fru_record_table; + *fru_record_table_size = local_fru_table_length; + + return OPAL_SUCCESS; +} + int pldm_fru_init(void) { int rc; diff --git a/core/pldm/pldm-responder.c b/core/pldm/pldm-responder.c index cd2cbc1c..2c5b3677 100644 --- a/core/pldm/pldm-responder.c +++ b/core/pldm/pldm-responder.c @@ -995,6 +995,83 @@ static struct pldm_cmd pldm_fru_get_record_table_metadata = { .handler = fru_get_record_table_metadata_handler, }; +/* + * GetFRURecordTable (0X02) + * The GetFRURecordTable command is used to get the FRU Record Table + * data. This command is defined to allow the FRU Record Table data to + * be transferred using a sequence of one or more command/response + * messages. + */ +static int fru_get_record_table_handler(const struct pldm_rx_data *req) +{ + struct pldm_get_fru_record_table_resp *resp; + void *fru_record_table_bytes; + uint32_t fru_record_table_size; + size_t response_length; + struct pldm_msg *msg; + char *response_msg; + int rc; + + /* The getFruRecordTable requests do have request data, but it's + * only related to multi-part transfers which we don't support + * and which the BMC will not send us. + */ + + /* get local fru record table */ + rc = pldm_fru_get_local_table(&fru_record_table_bytes, &fru_record_table_size); + if (rc) { + prlog(PR_ERR, "Failed to get Fru Record Table\n"); + cc_resp(req, req->hdrinf.pldm_type, + req->hdrinf.command, PLDM_ERROR); + return OPAL_PARAMETER; + } + + /* create a PLDM response message for GetFRURecordTable */ + response_length = sizeof(struct pldm_msg_hdr) + + sizeof(struct pldm_get_fru_record_table_resp) + + fru_record_table_size; + response_msg = zalloc(response_length); + memset(response_msg, 0, response_length); + + rc = encode_get_fru_record_table_resp( + req->hdrinf.instance, + PLDM_SUCCESS, + 0, // No next transfer handle + PLDM_START_AND_END, + (struct pldm_msg *)response_msg); + if (rc != PLDM_SUCCESS) { + prlog(PR_ERR, "Encode GetFruRecordTable Error, rc: %d\n", rc); + cc_resp(req, req->hdrinf.pldm_type, + req->hdrinf.command, PLDM_ERROR); + free(response_msg); + return OPAL_PARAMETER; + } + + msg = (struct pldm_msg *)response_msg; + resp = (struct pldm_get_fru_record_table_resp *)(msg->payload); + memcpy(resp->fru_record_table_data, + fru_record_table_bytes, + fru_record_table_size); + + /* send PLDM message over MCTP */ + rc = pldm_mctp_message_tx(req->source_eid, response_msg, response_length - 1); + if (rc) { + prlog(PR_ERR, "Failed to send GetFruRecordTable response, rc = %d\n", rc); + free(response_msg); + return OPAL_HARDWARE; + } + + free(response_msg); + + return OPAL_SUCCESS; +} + +static struct pldm_cmd pldm_fru_get_record_table = { + .name = "PLDM_GET_FRU_RECORD_TABLE", + .pldm_cmd_id = PLDM_GET_FRU_RECORD_TABLE, + .handler = fru_get_record_table_handler, +}; + int pldm_responder_handle_request(struct pldm_rx_data *rx) { const struct pldm_type *type; @@ -1046,6 +1123,7 @@ int pldm_responder_init(void) /* Register fru commands we'll respond to - DSP0257 */ add_type(&pldm_fru_type); add_cmd(&pldm_fru_type, &pldm_fru_get_record_table_metadata); + add_cmd(&pldm_fru_type, &pldm_fru_get_record_table); return OPAL_SUCCESS; } diff --git a/core/pldm/pldm.h b/core/pldm/pldm.h index fea06b0b..dd6f2352 100644 --- a/core/pldm/pldm.h +++ b/core/pldm/pldm.h @@ -78,6 +78,8 @@ int pldm_fru_get_bmc_version(void *bv); void pldm_fru_add_record(uint32_t *fru_table_length, uint16_t *total_record_set_identifiers, uint16_t *total_table_records); +int pldm_fru_get_local_table(void **fru_record_table_bytes, + uint32_t *fru_record_table_size); int pldm_fru_init(void); int pldm_bios_find_lid_by_attr_name(const char *name, char **lid);
The GetFRURecordTable command is used to get the FRU Record Table data. This command is defined to allow the FRU Record Table data to be transferred using a sequence of one or more command/response messages. Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> --- core/pldm/pldm-fru-requests.c | 12 ++++++ core/pldm/pldm-responder.c | 78 +++++++++++++++++++++++++++++++++++ core/pldm/pldm.h | 2 + 3 files changed, 92 insertions(+)