mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-24 23:41:23 +01:00

The latest SBI 3.0 spec defines a new sbi_mpxy_get_shmem_size() function and simplifies sbi_mpxy_set_shmem() function so update the MPXY framework and SBI extension accordingly. Signed-off-by: Anup Patel <apatel@ventanamicro.com>
186 lines
5.3 KiB
C
186 lines
5.3 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2024 Ventana Micro Systems Inc.
|
|
*
|
|
* Authors:
|
|
* Rahul Pathak <rpathak@ventanamicro.com>
|
|
*/
|
|
|
|
#ifndef __SBI_MPXY_H__
|
|
#define __SBI_MPXY_H__
|
|
|
|
#include <sbi/sbi_list.h>
|
|
|
|
struct sbi_scratch;
|
|
|
|
#define SBI_MPXY_MSGPROTO_VERSION(Major, Minor) ((Major << 16) | Minor)
|
|
|
|
enum sbi_mpxy_attr_id {
|
|
/* Standard channel attributes managed by MPXY framework */
|
|
SBI_MPXY_ATTR_MSG_PROT_ID = 0x00000000,
|
|
SBI_MPXY_ATTR_MSG_PROT_VER = 0x00000001,
|
|
SBI_MPXY_ATTR_MSG_MAX_LEN = 0x00000002,
|
|
SBI_MPXY_ATTR_MSG_SEND_TIMEOUT = 0x00000003,
|
|
SBI_MPXY_ATTR_MSG_COMPLETION_TIMEOUT = 0x00000004,
|
|
SBI_MPXY_ATTR_CHANNEL_CAPABILITY = 0x00000005,
|
|
SBI_MPXY_ATTR_SSE_EVENT_ID = 0x00000006,
|
|
SBI_MPXY_ATTR_MSI_CONTROL = 0x00000007,
|
|
SBI_MPXY_ATTR_MSI_ADDR_LO = 0x00000008,
|
|
SBI_MPXY_ATTR_MSI_ADDR_HI = 0x00000009,
|
|
SBI_MPXY_ATTR_MSI_DATA = 0x0000000A,
|
|
SBI_MPXY_ATTR_EVENTS_STATE_CONTROL = 0x0000000B,
|
|
SBI_MPXY_ATTR_STD_ATTR_MAX_IDX,
|
|
/* Message protocol specific attributes, managed by
|
|
* message protocol driver */
|
|
SBI_MPXY_ATTR_MSGPROTO_ATTR_START = 0x80000000,
|
|
SBI_MPXY_ATTR_MSGPROTO_ATTR_END = 0xffffffff
|
|
};
|
|
|
|
/**
|
|
* SBI MPXY Message Protocol IDs
|
|
*/
|
|
enum sbi_mpxy_msgproto_id {
|
|
SBI_MPXY_MSGPROTO_RPMI_ID = 0x00000000,
|
|
SBI_MPXY_MSGPROTO_MAX_IDX,
|
|
/** Vendor specific message protocol IDs */
|
|
SBI_MPXY_MSGPROTO_VENDOR_START = 0x80000000,
|
|
SBI_MPXY_MSGPROTO_VENDOR_END = 0xffffffff
|
|
};
|
|
|
|
enum SBI_EXT_MPXY_SHMEM_FLAGS {
|
|
SBI_EXT_MPXY_SHMEM_FLAG_OVERWRITE = 0b00,
|
|
SBI_EXT_MPXY_SHMEM_FLAG_OVERWRITE_RETURN = 0b01,
|
|
SBI_EXT_MPXY_SHMEM_FLAG_MAX_IDX
|
|
};
|
|
|
|
struct sbi_mpxy_msi_info {
|
|
/* MSI target address low 32-bit */
|
|
u32 msi_addr_lo;
|
|
/* MSI target address high 32-bit */
|
|
u32 msi_addr_hi;
|
|
/* MSI data */
|
|
u32 msi_data;
|
|
};
|
|
|
|
/**
|
|
* Channel attributes.
|
|
* NOTE: The sequence of attribute fields are as per the
|
|
* defined sequence in the attribute table in spec(or as
|
|
* per the enum sbi_mpxy_attr_id).
|
|
*/
|
|
struct sbi_mpxy_channel_attrs {
|
|
/* Message protocol ID */
|
|
u32 msg_proto_id;
|
|
/* Message protocol Version */
|
|
u32 msg_proto_version;
|
|
/* Message protocol maximum message data length(bytes) */
|
|
u32 msg_data_maxlen;
|
|
/* Message protocol message send timeout
|
|
* in microseconds */
|
|
u32 msg_send_timeout;
|
|
/* Message protocol message response timeout in
|
|
* microseconds. Its the aggregate of msg_send_timeout
|
|
* and the timeout in receiving the response */
|
|
u32 msg_completion_timeout;
|
|
/* Bit array for channel capabilities */
|
|
u32 capability;
|
|
u32 sse_event_id;
|
|
u32 msi_control;
|
|
struct sbi_mpxy_msi_info msi_info;
|
|
/* Events State Control */
|
|
u32 eventsstate_ctrl;
|
|
};
|
|
|
|
/** A Message proxy channel accessible through SBI interface */
|
|
struct sbi_mpxy_channel {
|
|
/** List head to a set of channels */
|
|
struct sbi_dlist head;
|
|
u32 channel_id;
|
|
struct sbi_mpxy_channel_attrs attrs;
|
|
|
|
/**
|
|
* Read message protocol attributes
|
|
* NOTE: inmem requires little-endian byte-ordering
|
|
*/
|
|
int (*read_attributes)(struct sbi_mpxy_channel *channel,
|
|
u32 *outmem,
|
|
u32 base_attr_id,
|
|
u32 attr_count);
|
|
|
|
/**
|
|
* Write message protocol attributes
|
|
* NOTE: outmem requires little-endian byte-ordering
|
|
*/
|
|
int (*write_attributes)(struct sbi_mpxy_channel *channel,
|
|
u32 *inmem,
|
|
u32 base_attr_id,
|
|
u32 attr_count);
|
|
/**
|
|
* Send a message and wait for response
|
|
* NOTE: msgbuf requires little-endian byte-ordering
|
|
*/
|
|
int (*send_message_with_response)(struct sbi_mpxy_channel *channel,
|
|
u32 msg_id, void *msgbuf, u32 msg_len,
|
|
void *respbuf, u32 resp_max_len,
|
|
unsigned long *resp_len);
|
|
|
|
/** Send message without response */
|
|
int (*send_message_without_response)(struct sbi_mpxy_channel *channel,
|
|
u32 msg_id, void *msgbuf, u32 msg_len);
|
|
|
|
/**
|
|
* Get notifications events if supported on a channel
|
|
* NOTE: eventsbuf requires little-endian byte-ordering
|
|
*/
|
|
int (*get_notification_events)(struct sbi_mpxy_channel *channel,
|
|
void *eventsbuf, u32 bufsize,
|
|
unsigned long *events_len);
|
|
|
|
/**
|
|
* Callback to enable the events state reporting
|
|
* in the message protocol implementation
|
|
*/
|
|
void (*switch_eventsstate)(u32 enable);
|
|
};
|
|
|
|
/** Register a Message proxy channel */
|
|
int sbi_mpxy_register_channel(struct sbi_mpxy_channel *channel);
|
|
|
|
/** Initialize Message proxy subsystem */
|
|
int sbi_mpxy_init(struct sbi_scratch *scratch);
|
|
|
|
/** Check if some Message proxy channel is available */
|
|
bool sbi_mpxy_channel_available(void);
|
|
|
|
/** Get message proxy shared memory size */
|
|
unsigned long sbi_mpxy_get_shmem_size(void);
|
|
|
|
/** Set message proxy shared memory on the calling HART */
|
|
int sbi_mpxy_set_shmem(unsigned long shmem_phys_lo,
|
|
unsigned long shmem_phys_hi,
|
|
unsigned long flags);
|
|
|
|
/** Get channel IDs list */
|
|
int sbi_mpxy_get_channel_ids(u32 start_index);
|
|
|
|
/** Read MPXY channel attributes */
|
|
int sbi_mpxy_read_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count);
|
|
|
|
/** Write MPXY channel attributes */
|
|
int sbi_mpxy_write_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count);
|
|
|
|
/**
|
|
* Send a message over a MPXY channel.
|
|
* In case if response is not expected, resp_data_len will be NULL.
|
|
*/
|
|
int sbi_mpxy_send_message(u32 channel_id, u8 msg_id,
|
|
unsigned long msg_data_len,
|
|
unsigned long *resp_data_len);
|
|
|
|
/** Get Message proxy notification events */
|
|
int sbi_mpxy_get_notification_events(u32 channel_id,
|
|
unsigned long *events_len);
|
|
|
|
#endif
|