[PATCH 01/12] lib: utils: Split the FDT MPXY RPMI mailbox client into two parts
Samuel Holland
samuel.holland at sifive.com
Sun Jan 19 14:52:01 PST 2025
Hi Anup,
A couple of comments on existing issues in the code. Maybe it makes sense to fix
them in this series to avoid conflicts?
On 2025-01-16 9:56 AM, Anup Patel wrote:
> Instead of having one common FDT MPXY RPMI mailbox client drivers
> for various RPMI service groups, split this driver into two parts:
> 1) Common MPXY RPMI mailbox client library
> 2) MPXY driver for RPMI clock service group
>
> The above split enables having a separate MPXY driver for each
> RPMI clock service group and #1 (above) will allow code sharing
> between various MPXY RPMI drivers.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h | 70 ++++++++
> lib/utils/mpxy/Kconfig | 12 +-
> lib/utils/mpxy/fdt_mpxy_rpmi_clock.c | 88 ++++++++++
> lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c | 169 +++-----------------
> lib/utils/mpxy/objects.mk | 4 +-
> platform/generic/configs/defconfig | 1 +
> 6 files changed, 190 insertions(+), 154 deletions(-)
> create mode 100644 include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> create mode 100644 lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
>
> diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> new file mode 100644
> index 00000000..e4ca0151
> --- /dev/null
> +++ b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> @@ -0,0 +1,70 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2024 Ventana Micro Systems Inc.
> + *
> + * Authors:
> + * Anup Patel <apatel at ventanamicro.com>
> + */
> +
> +#ifndef __FDT_MPXY_RPMI_MBOX_H__
> +#define __FDT_MPXY_RPMI_MBOX_H__
> +
> +#include <sbi/sbi_types.h>
> +#include <sbi/sbi_mpxy.h>
> +#include <sbi_utils/mailbox/rpmi_msgprot.h>
> +#include <sbi_utils/mpxy/fdt_mpxy.h>
> +
> +#define MPXY_RPMI_MAJOR_VER (1)
> +#define MPXY_RPMI_MINOR_VER (0)
> +
> +/** Convert the mpxy attribute ID to attribute array index */
> +#define attr_id2index(attr_id) (attr_id - SBI_MPXY_ATTR_MSGPROTO_ATTR_START)
> +
> +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 message protocol attributes for RPMI
> + * Order of attribute fields must follow the
> + * attribute IDs in `enum mpxy_msgprot_rpmi_attr_id`
> + */
> +struct mpxy_rpmi_channel_attrs {
> + u32 servicegrp_id;
> + u32 servicegrp_ver;
> +};
> +
> +/** Make sure all attributes are packed for direct memcpy */
> +#define assert_field_offset(field, attr_offset) \
> + _Static_assert( \
> + ((offsetof(struct mpxy_rpmi_channel_attrs, field)) / \
> + sizeof(u32)) == (attr_offset - SBI_MPXY_ATTR_MSGPROTO_ATTR_START),\
> + "field " #field \
> + " from struct mpxy_rpmi_channel_attrs invalid offset, expected " #attr_offset)
> +
> +assert_field_offset(servicegrp_id, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID);
Missing assertion for servicegrp_ver?
> +
> +/** MPXY RPMI service data for each service group */
> +struct mpxy_rpmi_service_data {
> + u8 id;
> + u32 min_tx_len;
> + u32 max_tx_len;
> + u32 min_rx_len;
> + u32 max_rx_len;
> +};
> +
> +/** MPXY RPMI mbox data for each service group */
> +struct mpxy_rpmi_mbox_data {
> + u32 servicegrp_id;
> + u32 num_services;
> + u32 notifications_support;
> + struct mpxy_rpmi_service_data *service_data;
> +};
> +
> +/** Common probe function for MPXY RPMI drivers */
> +int mpxy_rpmi_mbox_init(const void *fdt, int nodeoff, const struct fdt_match *match);
> +
> +#endif
> diff --git a/lib/utils/mpxy/Kconfig b/lib/utils/mpxy/Kconfig
> index 131fb91a..ff88f24f 100644
> --- a/lib/utils/mpxy/Kconfig
> +++ b/lib/utils/mpxy/Kconfig
> @@ -7,11 +7,15 @@ config FDT_MPXY
> depends on FDT
> default n
>
> -if FDT_MPXY
> -
> config FDT_MPXY_RPMI_MBOX
> - bool "FDT MPXY mailbox client driver"
> - depends on FDT_MAILBOX
> + bool "MPXY drivers as RPMI mailbox client"
> + depends on FDT_MAILBOX && FDT_MPXY
> + default n
> +
> +if FDT_MPXY_RPMI_MBOX
> +
> +config FDT_MPXY_RPMI_CLOCK
> + bool "MPXY driver for RPMI clock service group"
> default n
>
> endif
> diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c b/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
> new file mode 100644
> index 00000000..1f5c6e75
> --- /dev/null
> +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
> @@ -0,0 +1,88 @@
> +/*
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (c) 2024 Ventana Micro Systems Inc.
> + *
> + * Authors:
> + * Rahul Pathak <rpathak at ventanamicro.com>
> + * Anup Patel <apatel at ventanamicro.com>
> + */
> +
> +#include <sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h>
> +
> +static struct mpxy_rpmi_service_data clock_services[] = {
> +{
> + .id = RPMI_CLOCK_SRV_ENABLE_NOTIFICATION,
> + .min_tx_len = sizeof(struct rpmi_enable_notification_req),
> + .max_tx_len = sizeof(struct rpmi_enable_notification_req),
> + .min_rx_len = sizeof(struct rpmi_enable_notification_resp),
> + .max_rx_len = sizeof(struct rpmi_enable_notification_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_GET_NUM_CLOCKS,
> + .min_tx_len = 0,
> + .max_tx_len = 0,
> + .min_rx_len = sizeof(struct rpmi_clock_get_num_clocks_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_get_num_clocks_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_GET_ATTRIBUTES,
> + .min_tx_len = sizeof(struct rpmi_clock_get_attributes_req),
> + .max_tx_len = sizeof(struct rpmi_clock_get_attributes_req),
> + .min_rx_len = sizeof(struct rpmi_clock_get_attributes_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_get_attributes_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_GET_SUPPORTED_RATES,
> + .min_tx_len = sizeof(struct rpmi_clock_get_supported_rates_req),
> + .max_tx_len = sizeof(struct rpmi_clock_get_supported_rates_req),
> + .min_rx_len = sizeof(struct rpmi_clock_get_supported_rates_resp),
> + .max_rx_len = -1U,
> +},
> +{
> + .id = RPMI_CLOCK_SRV_SET_CONFIG,
> + .min_tx_len = sizeof(struct rpmi_clock_set_config_req),
> + .max_tx_len = sizeof(struct rpmi_clock_set_config_req),
> + .min_rx_len = sizeof(struct rpmi_clock_set_config_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_set_config_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_GET_CONFIG,
> + .min_tx_len = sizeof(struct rpmi_clock_get_config_req),
> + .max_tx_len = sizeof(struct rpmi_clock_get_config_req),
> + .min_rx_len = sizeof(struct rpmi_clock_get_config_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_get_config_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_SET_RATE,
> + .min_tx_len = sizeof(struct rpmi_clock_set_rate_req),
> + .max_tx_len = sizeof(struct rpmi_clock_set_rate_req),
> + .min_rx_len = sizeof(struct rpmi_clock_set_rate_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_set_rate_resp),
> +},
> +{
> + .id = RPMI_CLOCK_SRV_GET_RATE,
> + .min_tx_len = sizeof(struct rpmi_clock_get_rate_req),
> + .max_tx_len = sizeof(struct rpmi_clock_get_rate_req),
> + .min_rx_len = sizeof(struct rpmi_clock_get_rate_resp),
> + .max_rx_len = sizeof(struct rpmi_clock_get_rate_resp),
> +},
> +};
> +
> +static struct mpxy_rpmi_mbox_data clock_data = {
> + .servicegrp_id = RPMI_SRVGRP_CLOCK,
> + .num_services = RPMI_CLOCK_SRV_MAX_COUNT,
> + .notifications_support = 1,
> + .service_data = clock_services,
> +};
> +
> +static const struct fdt_match clock_match[] = {
> + { .compatible = "riscv,rpmi-mpxy-clock", .data = &clock_data },
> + { },
> +};
> +
> +struct fdt_driver fdt_mpxy_rpmi_clock = {
This structure is required to be `const` both by the carray and the declaration
of fdt_mpxy_drivers.
Regards,
Samuel
> + .match_table = clock_match,
> + .init = mpxy_rpmi_mbox_init,
> + .experimental = true,
> +};
> diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> index 78020eae..0d4fd1fe 100644
> --- a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> @@ -11,82 +11,32 @@
> #include <libfdt.h>
> #include <sbi/sbi_error.h>
> #include <sbi/sbi_heap.h>
> -#include <sbi/sbi_mpxy.h>
> #include <sbi_utils/fdt/fdt_helper.h>
> -#include <sbi_utils/mpxy/fdt_mpxy.h>
> +#include <sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h>
> #include <sbi_utils/mailbox/fdt_mailbox.h>
> -#include <sbi_utils/mailbox/rpmi_msgprot.h>
> #include <sbi/sbi_console.h>
>
> -#define RPMI_MAJOR_VER (1)
> -#define RPMI_MINOR_VER (0)
> -
> -/** Convert the mpxy attribute ID to attribute array index */
> -#define attr_id2index(attr_id) (attr_id - SBI_MPXY_ATTR_MSGPROTO_ATTR_START)
> -
> -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 message protocol attributes for RPMI
> - * Order of attribute fields must follow the
> - * attribute IDs in `enum mpxy_msgprot_rpmi_attr_id`
> - */
> -struct mpxy_rpmi_channel_attrs {
> - u32 servicegrp_id;
> - u32 servicegrp_ver;
> -};
> -
> -/* RPMI mbox data per service group */
> -struct mpxy_mbox_data {
> - u32 servicegrp_id;
> - u32 num_services;
> - u32 notifications_support;
> - void *priv_data;
> -};
> -
> -/* RPMI service data per service group */
> -struct rpmi_service_data {
> - u8 id;
> - u32 min_tx_len;
> - u32 max_tx_len;
> - u32 min_rx_len;
> - u32 max_rx_len;
> -};
> -
> /**
> * MPXY mbox instance per MPXY channel. This ties
> * an MPXY channel with an RPMI Service group.
> */
> -struct mpxy_mbox {
> +struct mpxy_rpmi_mbox {
> struct mbox_chan *chan;
> - struct mpxy_mbox_data *mbox_data;
> + struct mpxy_rpmi_mbox_data *mbox_data;
> struct mpxy_rpmi_channel_attrs msgprot_attrs;
> struct sbi_mpxy_channel channel;
> };
>
> -/** Make sure all attributes are packed for direct memcpy */
> -#define assert_field_offset(field, attr_offset) \
> - _Static_assert( \
> - ((offsetof(struct mpxy_rpmi_channel_attrs, field)) / \
> - sizeof(u32)) == (attr_offset - SBI_MPXY_ATTR_MSGPROTO_ATTR_START),\
> - "field " #field \
> - " from struct mpxy_rpmi_channel_attrs invalid offset, expected " #attr_offset)
> -
> -assert_field_offset(servicegrp_id, MPXY_MSGPROT_RPMI_ATTR_SERVICEGROUP_ID);
> -
> /**
> * Discover the RPMI service data using message_id
> * MPXY message_id == RPMI service_id
> */
> -static struct rpmi_service_data *mpxy_find_rpmi_srvid(u32 message_id,
> - struct mpxy_mbox_data *mbox_data)
> +static struct mpxy_rpmi_service_data *mpxy_find_rpmi_srvid(u32 message_id,
> + struct mpxy_rpmi_mbox_data *mbox_data)
> {
> int mid = 0;
> - struct rpmi_service_data *srv = mbox_data->priv_data;
> + struct mpxy_rpmi_service_data *srv = mbox_data->service_data;
> +
> for (mid = 0; srv[mid].id < mbox_data->num_services; mid++) {
> if (srv[mid].id == (u8)message_id)
> return &srv[mid];
> @@ -108,9 +58,8 @@ static int mpxy_mbox_read_attributes(struct sbi_mpxy_channel *channel,
> u32 attr_count)
> {
> u32 end_id;
> - struct mpxy_mbox *rmb =
> - container_of(channel, struct mpxy_mbox, channel);
> -
> + struct mpxy_rpmi_mbox *rmb =
> + container_of(channel, struct mpxy_rpmi_mbox, channel);
> u32 *attr_array = (u32 *)&rmb->msgprot_attrs;
>
> end_id = base_attr_id + attr_count - 1;
> @@ -161,8 +110,8 @@ static int mpxy_mbox_write_attributes(struct sbi_mpxy_channel *channel,
> {
> int ret, mem_idx;
> u32 end_id, attr_val, idx;
> - struct mpxy_mbox *rmb =
> - container_of(channel, struct mpxy_mbox, channel);
> + struct mpxy_rpmi_mbox *rmb =
> + container_of(channel, struct mpxy_rpmi_mbox, channel);
>
> end_id = base_attr_id + attr_count - 1;
>
> @@ -195,9 +144,9 @@ static int __mpxy_mbox_send_message(struct sbi_mpxy_channel *channel,
> u32 rx_len = 0;
> struct mbox_xfer xfer;
> struct rpmi_message_args args = {0};
> - struct mpxy_mbox *rmb =
> - container_of(channel, struct mpxy_mbox, channel);
> - struct rpmi_service_data *srv =
> + struct mpxy_rpmi_mbox *rmb =
> + container_of(channel, struct mpxy_rpmi_mbox, channel);
> + struct mpxy_rpmi_service_data *srv =
> mpxy_find_rpmi_srvid(message_id, rmb->mbox_data);
> if (!srv)
> return SBI_ENOTSUPP;
> @@ -266,15 +215,14 @@ static int mpxy_mbox_get_notifications(struct sbi_mpxy_channel *channel,
> return SBI_ENOTSUPP;
> }
>
> -static int mpxy_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)
> {
> int rc, len;
> const fdt32_t *val;
> u32 channel_id;
> - struct mpxy_mbox *rmb;
> struct mbox_chan *chan;
> - const struct mpxy_mbox_data *data = match->data;
> + struct mpxy_rpmi_mbox *rmb;
> + const struct mpxy_rpmi_mbox_data *data = match->data;
>
> /* Allocate context for RPXY mbox client */
> rmb = sbi_zalloc(sizeof(*rmb));
> @@ -334,7 +282,7 @@ static int mpxy_mbox_init(const void *fdt, int nodeoff,
> rmb->channel.attrs.msg_proto_id = SBI_MPXY_MSGPROTO_RPMI_ID;
> /* RPMI Message Protocol Version */
> rmb->channel.attrs.msg_proto_version =
> - SBI_MPXY_MSGPROTO_VERSION(RPMI_MAJOR_VER, RPMI_MINOR_VER);
> + SBI_MPXY_MSGPROTO_VERSION(MPXY_RPMI_MAJOR_VER, MPXY_RPMI_MINOR_VER);
>
> /* RPMI supported max message data length(bytes), same for
> * all service groups */
> @@ -349,9 +297,9 @@ static int mpxy_mbox_init(const void *fdt, int nodeoff,
> /* RPMI message protocol attributes */
> rmb->msgprot_attrs.servicegrp_id = data->servicegrp_id;
> rmb->msgprot_attrs.servicegrp_ver =
> - SBI_MPXY_MSGPROTO_VERSION(RPMI_MAJOR_VER, RPMI_MINOR_VER);
> + SBI_MPXY_MSGPROTO_VERSION(MPXY_RPMI_MAJOR_VER, MPXY_RPMI_MINOR_VER);
>
> - rmb->mbox_data = (struct mpxy_mbox_data *)data;
> + rmb->mbox_data = (struct mpxy_rpmi_mbox_data *)data;
> rmb->chan = chan;
>
> /* Register RPXY service group */
> @@ -364,80 +312,3 @@ static int mpxy_mbox_init(const void *fdt, int nodeoff,
>
> return SBI_OK;
> }
> -
> -static struct rpmi_service_data clock_services[] = {
> -{
> - .id = RPMI_CLOCK_SRV_ENABLE_NOTIFICATION,
> - .min_tx_len = sizeof(struct rpmi_enable_notification_req),
> - .max_tx_len = sizeof(struct rpmi_enable_notification_req),
> - .min_rx_len = sizeof(struct rpmi_enable_notification_resp),
> - .max_rx_len = sizeof(struct rpmi_enable_notification_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_GET_NUM_CLOCKS,
> - .min_tx_len = 0,
> - .max_tx_len = 0,
> - .min_rx_len = sizeof(struct rpmi_clock_get_num_clocks_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_get_num_clocks_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_GET_ATTRIBUTES,
> - .min_tx_len = sizeof(struct rpmi_clock_get_attributes_req),
> - .max_tx_len = sizeof(struct rpmi_clock_get_attributes_req),
> - .min_rx_len = sizeof(struct rpmi_clock_get_attributes_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_get_attributes_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_GET_SUPPORTED_RATES,
> - .min_tx_len = sizeof(struct rpmi_clock_get_supported_rates_req),
> - .max_tx_len = sizeof(struct rpmi_clock_get_supported_rates_req),
> - .min_rx_len = sizeof(struct rpmi_clock_get_supported_rates_resp),
> - .max_rx_len = -1U,
> -},
> -{
> - .id = RPMI_CLOCK_SRV_SET_CONFIG,
> - .min_tx_len = sizeof(struct rpmi_clock_set_config_req),
> - .max_tx_len = sizeof(struct rpmi_clock_set_config_req),
> - .min_rx_len = sizeof(struct rpmi_clock_set_config_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_set_config_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_GET_CONFIG,
> - .min_tx_len = sizeof(struct rpmi_clock_get_config_req),
> - .max_tx_len = sizeof(struct rpmi_clock_get_config_req),
> - .min_rx_len = sizeof(struct rpmi_clock_get_config_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_get_config_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_SET_RATE,
> - .min_tx_len = sizeof(struct rpmi_clock_set_rate_req),
> - .max_tx_len = sizeof(struct rpmi_clock_set_rate_req),
> - .min_rx_len = sizeof(struct rpmi_clock_set_rate_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_set_rate_resp),
> -},
> -{
> - .id = RPMI_CLOCK_SRV_GET_RATE,
> - .min_tx_len = sizeof(struct rpmi_clock_get_rate_req),
> - .max_tx_len = sizeof(struct rpmi_clock_get_rate_req),
> - .min_rx_len = sizeof(struct rpmi_clock_get_rate_resp),
> - .max_rx_len = sizeof(struct rpmi_clock_get_rate_resp),
> -},
> -};
> -
> -static struct mpxy_mbox_data clock_data = {
> - .servicegrp_id = RPMI_SRVGRP_CLOCK,
> - .num_services = RPMI_CLOCK_SRV_MAX_COUNT,
> - .notifications_support = 1,
> - .priv_data = clock_services,
> -};
> -
> -static const struct fdt_match mpxy_mbox_match[] = {
> - { .compatible = "riscv,rpmi-mpxy-clock", .data = &clock_data },
> - { },
> -};
> -
> -struct fdt_driver fdt_mpxy_rpmi_mbox = {
> - .match_table = mpxy_mbox_match,
> - .init = mpxy_mbox_init,
> - .experimental = true,
> -};
> diff --git a/lib/utils/mpxy/objects.mk b/lib/utils/mpxy/objects.mk
> index ccb28b55..1c9afed9 100644
> --- a/lib/utils/mpxy/objects.mk
> +++ b/lib/utils/mpxy/objects.mk
> @@ -10,5 +10,7 @@
> libsbiutils-objs-$(CONFIG_FDT_MPXY) += mpxy/fdt_mpxy.o
> libsbiutils-objs-$(CONFIG_FDT_MPXY) += mpxy/fdt_mpxy_drivers.carray.o
>
> -carray-fdt_mpxy_drivers-$(CONFIG_FDT_MPXY_RPMI_MBOX) += fdt_mpxy_rpmi_mbox
> libsbiutils-objs-$(CONFIG_FDT_MPXY_RPMI_MBOX) += mpxy/fdt_mpxy_rpmi_mbox.o
> +
> +carray-fdt_mpxy_drivers-$(CONFIG_FDT_MPXY_RPMI_CLOCK) += fdt_mpxy_rpmi_clock
> +libsbiutils-objs-$(CONFIG_FDT_MPXY_RPMI_CLOCK) += mpxy/fdt_mpxy_rpmi_clock.o
> diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
> index e23b38b2..55607a28 100644
> --- a/platform/generic/configs/defconfig
> +++ b/platform/generic/configs/defconfig
> @@ -55,3 +55,4 @@ CONFIG_FDT_TIMER_MTIMER=y
> CONFIG_FDT_TIMER_PLMT=y
> CONFIG_FDT_MPXY=y
> CONFIG_FDT_MPXY_RPMI_MBOX=y
> +CONFIG_FDT_MPXY_RPMI_CLOCK=y
More information about the opensbi
mailing list