forked from Mirrors/opensbi
lib: utils: Add Implementation ID and Version as RPMI MPXY attributes
The latest frozen RPMI spec has added Implementation ID and Implementation Version as message protocol specific mpxy attributes. Add support for these. Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20250618053854.2577299-1-rpathak@ventanamicro.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -198,6 +198,8 @@ enum rpmi_channel_attribute_id {
|
|||||||
RPMI_CHANNEL_ATTR_RX_TIMEOUT,
|
RPMI_CHANNEL_ATTR_RX_TIMEOUT,
|
||||||
RPMI_CHANNEL_ATTR_SERVICEGROUP_ID,
|
RPMI_CHANNEL_ATTR_SERVICEGROUP_ID,
|
||||||
RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION,
|
RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION,
|
||||||
|
RPMI_CHANNEL_ATTR_IMPL_ID,
|
||||||
|
RPMI_CHANNEL_ATTR_IMPL_VERSION,
|
||||||
RPMI_CHANNEL_ATTR_MAX,
|
RPMI_CHANNEL_ATTR_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -22,7 +22,9 @@
|
|||||||
enum mpxy_msgprot_rpmi_attr_id {
|
enum mpxy_msgprot_rpmi_attr_id {
|
||||||
MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID = SBI_MPXY_ATTR_MSGPROTO_ATTR_START,
|
MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID = SBI_MPXY_ATTR_MSGPROTO_ATTR_START,
|
||||||
MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_VERSION,
|
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 {
|
struct mpxy_rpmi_channel_attrs {
|
||||||
u32 servicegrp_id;
|
u32 servicegrp_id;
|
||||||
u32 servicegrp_ver;
|
u32 servicegrp_ver;
|
||||||
|
u32 impl_id;
|
||||||
|
u32 impl_ver;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Make sure all attributes are packed for direct memcpy */
|
/** 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_id, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID);
|
||||||
assert_field_offset(servicegrp_ver, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_VERSION);
|
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 */
|
/** MPXY RPMI service data for each service group */
|
||||||
struct mpxy_rpmi_service_data {
|
struct mpxy_rpmi_service_data {
|
||||||
|
@@ -523,6 +523,12 @@ static int rpmi_shmem_mbox_get_attribute(struct mbox_chan *chan,
|
|||||||
case RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION:
|
case RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION:
|
||||||
*((u32 *)out_value) = srvgrp_chan->servicegroup_version;
|
*((u32 *)out_value) = srvgrp_chan->servicegroup_version;
|
||||||
break;
|
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:
|
default:
|
||||||
return SBI_ENOTSUPP;
|
return SBI_ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
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 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;
|
const struct mpxy_rpmi_mbox_data *data = match->data;
|
||||||
struct mpxy_rpmi_mbox *rmb;
|
struct mpxy_rpmi_mbox *rmb;
|
||||||
struct mbox_chan *chan;
|
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)
|
if (rc)
|
||||||
goto fail_free_chan;
|
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
|
* The "riscv,sbi-mpxy-channel-id" DT property is mandatory
|
||||||
* for MPXY RPMI mailbox client driver so if this is not
|
* 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 */
|
/* RPMI service group attributes */
|
||||||
rmb->msgprot_attrs.servicegrp_id = data->servicegrp_id;
|
rmb->msgprot_attrs.servicegrp_id = data->servicegrp_id;
|
||||||
rmb->msgprot_attrs.servicegrp_ver = servicegrp_ver;
|
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->mbox_data = data;
|
||||||
rmb->chan = chan;
|
rmb->chan = chan;
|
||||||
|
Reference in New Issue
Block a user