diff --git a/include/sbi_utils/mailbox/rpmi_msgprot.h b/include/sbi_utils/mailbox/rpmi_msgprot.h index e0d73882..a761b560 100644 --- a/include/sbi_utils/mailbox/rpmi_msgprot.h +++ b/include/sbi_utils/mailbox/rpmi_msgprot.h @@ -198,6 +198,8 @@ enum rpmi_channel_attribute_id { RPMI_CHANNEL_ATTR_RX_TIMEOUT, RPMI_CHANNEL_ATTR_SERVICEGROUP_ID, RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION, + RPMI_CHANNEL_ATTR_IMPL_ID, + RPMI_CHANNEL_ATTR_IMPL_VERSION, RPMI_CHANNEL_ATTR_MAX, }; diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h index 068a1a55..3a1c1177 100644 --- a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h +++ b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h @@ -22,7 +22,9 @@ enum mpxy_msgprot_rpmi_attr_id { MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID = SBI_MPXY_ATTR_MSGPROTO_ATTR_START, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_VERSION, - MPXY_MSGPROT_RPMI_ATTR_MAX_ID, + MPXY_MSGPROT_RPMI_ATTR_IMPL_ID, + MPXY_MSGPROT_RPMI_ATTR_IMPL_VERSION, + MPXY_MSGPROT_RPMI_ATTR_MAX_ID }; /** @@ -33,6 +35,8 @@ enum mpxy_msgprot_rpmi_attr_id { struct mpxy_rpmi_channel_attrs { u32 servicegrp_id; u32 servicegrp_ver; + u32 impl_id; + u32 impl_ver; }; /** Make sure all attributes are packed for direct memcpy */ @@ -45,6 +49,8 @@ struct mpxy_rpmi_channel_attrs { assert_field_offset(servicegrp_id, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID); assert_field_offset(servicegrp_ver, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_VERSION); +assert_field_offset(impl_id, MPXY_MSGPROT_RPMI_ATTR_IMPL_ID); +assert_field_offset(impl_ver, MPXY_MSGPROT_RPMI_ATTR_IMPL_VERSION); /** MPXY RPMI service data for each service group */ struct mpxy_rpmi_service_data { diff --git a/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c b/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c index aad68b5a..fdb04915 100644 --- a/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c +++ b/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c @@ -523,6 +523,12 @@ static int rpmi_shmem_mbox_get_attribute(struct mbox_chan *chan, case RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION: *((u32 *)out_value) = srvgrp_chan->servicegroup_version; break; + case RPMI_CHANNEL_ATTR_IMPL_ID: + *((u32 *)out_value) = mctl->impl_id; + break; + case RPMI_CHANNEL_ATTR_IMPL_VERSION: + *((u32 *)out_value) = mctl->impl_version; + break; default: return SBI_ENOTSUPP; } diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c index 48dfe476..84b7a67d 100644 --- a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c @@ -213,6 +213,7 @@ static int mpxy_mbox_send_message_withoutresp(struct sbi_mpxy_channel *channel, int mpxy_rpmi_mbox_init(const void *fdt, int nodeoff, const struct fdt_match *match) { u32 channel_id, servicegrp_ver, pro_ver, max_data_len, tx_tout, rx_tout; + u32 impl_id, impl_ver; const struct mpxy_rpmi_mbox_data *data = match->data; struct mpxy_rpmi_mbox *rmb; struct mbox_chan *chan; @@ -270,6 +271,18 @@ int mpxy_rpmi_mbox_init(const void *fdt, int nodeoff, const struct fdt_match *ma if (rc) goto fail_free_chan; + /* Get channel implementation id */ + rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_IMPL_ID, + &impl_id); + if (rc) + goto fail_free_chan; + + /* Get channel implementation version */ + rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_IMPL_VERSION, + &impl_ver); + if (rc) + goto fail_free_chan; + /* * The "riscv,sbi-mpxy-channel-id" DT property is mandatory * for MPXY RPMI mailbox client driver so if this is not @@ -316,6 +329,8 @@ int mpxy_rpmi_mbox_init(const void *fdt, int nodeoff, const struct fdt_match *ma /* RPMI service group attributes */ rmb->msgprot_attrs.servicegrp_id = data->servicegrp_id; rmb->msgprot_attrs.servicegrp_ver = servicegrp_ver; + rmb->msgprot_attrs.impl_id = impl_id; + rmb->msgprot_attrs.impl_ver = impl_ver; rmb->mbox_data = data; rmb->chan = chan;