diff options
author | Anup Patel <apatel@ventanamicro.com> | 2025-01-12 11:22:00 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2025-02-13 11:10:03 +0530 |
commit | 91012b475dafaa21a5fdeebbdea73af2b6733b4f (patch) | |
tree | 451557161f8e79e394434bbc83c81ddea392fbd2 | |
parent | f8272946daf6bfd6d566254a16d9234b3afda1ee (diff) | |
download | opensbi-91012b475dafaa21a5fdeebbdea73af2b6733b4f.zip opensbi-91012b475dafaa21a5fdeebbdea73af2b6733b4f.tar.gz opensbi-91012b475dafaa21a5fdeebbdea73af2b6733b4f.tar.bz2 |
lib: utils: Implement get_attribute() for the RPMI shared memory mailbox
To allow clients query service group version of a RPMI mailbox channel,
implement get_attribute() callback for the RPMI shared memory mailbox
controller.
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
-rw-r--r-- | include/sbi_utils/mailbox/rpmi_msgprot.h | 13 | ||||
-rw-r--r-- | lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c | 35 |
2 files changed, 47 insertions, 1 deletions
diff --git a/include/sbi_utils/mailbox/rpmi_msgprot.h b/include/sbi_utils/mailbox/rpmi_msgprot.h index 9575dc7..17d678a 100644 --- a/include/sbi_utils/mailbox/rpmi_msgprot.h +++ b/include/sbi_utils/mailbox/rpmi_msgprot.h @@ -175,7 +175,7 @@ enum rpmi_error { RPMI_ERR_VENDOR_START = -128, }; -/** RPMI Message Arguments */ +/** RPMI Mailbox Message Arguments */ struct rpmi_message_args { u32 flags; #define RPMI_MSG_FLAGS_NO_TX (1U << 0) @@ -189,6 +189,17 @@ struct rpmi_message_args { u32 rx_data_len; }; +/** RPMI Mailbox Channel Attribute IDs */ +enum rpmi_channel_attribute_id { + RPMI_CHANNEL_ATTR_PROTOCOL_VERSION = 0, + RPMI_CHANNEL_ATTR_MAX_DATA_LEN, + RPMI_CHANNEL_ATTR_TX_TIMEOUT, + RPMI_CHANNEL_ATTR_RX_TIMEOUT, + RPMI_CHANNEL_ATTR_SERVICEGROUP_ID, + RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION, + RPMI_CHANNEL_ATTR_MAX, +}; + /* * RPMI SERVICEGROUPS AND SERVICES */ diff --git a/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c b/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c index b8bd3cd..e9f52c7 100644 --- a/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c +++ b/lib/utils/mailbox/fdt_mailbox_rpmi_shmem.c @@ -490,6 +490,40 @@ static int rpmi_shmem_mbox_xfer(struct mbox_chan *chan, struct mbox_xfer *xfer) return 0; } +static int rpmi_shmem_mbox_get_attribute(struct mbox_chan *chan, + int attr_id, void *out_value) +{ + struct rpmi_shmem_mbox_controller *mctl = + container_of(chan->mbox, + struct rpmi_shmem_mbox_controller, + controller); + struct rpmi_srvgrp_chan *srvgrp_chan = to_srvgrp_chan(chan); + + switch (attr_id) { + case RPMI_CHANNEL_ATTR_PROTOCOL_VERSION: + *((u32 *)out_value) = mctl->spec_version; + break; + case RPMI_CHANNEL_ATTR_MAX_DATA_LEN: + *((u32 *)out_value) = RPMI_MSG_DATA_SIZE(mctl->slot_size); + break; + case RPMI_CHANNEL_ATTR_TX_TIMEOUT: + *((u32 *)out_value) = RPMI_DEF_TX_TIMEOUT; + break; + case RPMI_CHANNEL_ATTR_RX_TIMEOUT: + *((u32 *)out_value) = RPMI_DEF_RX_TIMEOUT; + break; + case RPMI_CHANNEL_ATTR_SERVICEGROUP_ID: + *((u32 *)out_value) = srvgrp_chan->servicegroup_id; + break; + case RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION: + *((u32 *)out_value) = srvgrp_chan->servicegroup_version; + break; + default: + return SBI_ENOTSUPP; + } + + return 0; +} static struct mbox_chan *rpmi_shmem_mbox_request_chan( struct mbox_controller *mbox, @@ -665,6 +699,7 @@ static int rpmi_shmem_mbox_init(const void *fdt, int nodeoff, mctl->controller.request_chan = rpmi_shmem_mbox_request_chan; mctl->controller.free_chan = rpmi_shmem_mbox_free_chan; mctl->controller.xfer = rpmi_shmem_mbox_xfer; + mctl->controller.get_attribute = rpmi_shmem_mbox_get_attribute; ret = mbox_controller_add(&mctl->controller); if (ret) goto fail_free_controller; |