blob: 4ea85c5235c4c89f5c80aca5bd72697188935845 [file] [log] [blame]
/******************************************************************************
*
* <:copyright-BRCM:2016:DUAL/GPL:standard
*
* Copyright (c) 2016 Broadcom
* All Rights Reserved
*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2
* (the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and
* to copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module.
* An independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*
* Not withstanding the above, under no circumstances may you combine
* this software in any way with any other Broadcom software provided
* under a license other than the GPL, without Broadcom's express prior
* written consent.
*
* :>
*
*****************************************************************************/
/* Define the top level Doxygen groups. */
/**
* @defgroup core BAL Core Engine
*
* @defgroup apps BAL Utils
*
* @defgroup lib BAL Libraries
*
*/
/**
* @file bal_msg.h
*
* @brief Include files and miscellaneous macros for the BAL messaging
*
*/
#ifndef BALMSG_H
#define BALMSG_H
#include <bal_objs.h>
#include <bal_msg_type.h>
/*******************************************************************
**
** BAL message header helpers
**
*******************************************************************
*/
/*
* Underlying msg_send timeout units in uS (micro seconds)
*/
#define BCMBAL_MSG_TIMEOUT_1_SEC (1000000)
/*
* Get a pointer to the message payload given the bcmos_msg pointer
*/
static inline void *bcmbal_payload_ptr_get(bal_comm_msg_hdr *_m)
{
/* payload starts from BAL communication header */
return (void *)_m;
}
/*
* Get a pointer to the BAL header given the message payload pointer
*/
static inline bal_comm_msg_hdr *bcmbal_bal_hdr_get(void *_msg_payload_ptr)
{
/* payload starts from BAL communication header */
return (bal_comm_msg_hdr *)_msg_payload_ptr;
}
/*
* Get a pointer to the BAL header given the bcmos header pointer
*/
static inline bal_comm_msg_hdr *bcmbal_bal_hdr_get_by_bcmos_hdr(bcmos_msg *m)
{
return container_of(m, bal_comm_msg_hdr, m);
}
/*
* Get a pointer to the BCMOS header given the message payload pointer
*/
static inline bcmos_msg *bcmbal_bcmos_hdr_get(void *_msg_payload_ptr)
{
return &(bcmbal_bal_hdr_get(_msg_payload_ptr)->m);
}
/*
* Set the BAL header parameters given the message payload pointer
*/
static inline void bcmbal_msg_hdr_set(void *_msg_payload_ptr,
bcmos_msg_id _type_major,
bcmbal_msg_type _type_minor,
bal_subsystem _sender_subsys,
bcmbal_obj_id _msg_id_obj,
uint16_t _msg_id_oper,
uint32_t _ex_id)
{
bcmos_msg *os_msg = bcmbal_bcmos_hdr_get(_msg_payload_ptr);
bal_comm_msg_hdr *bal_hdr = bcmbal_bal_hdr_get(_msg_payload_ptr);
/*
* set up the bcmos_msg header fields
*/
os_msg->data = (void *)((char *)(bcmbal_bcmos_hdr_get(_msg_payload_ptr)) + sizeof(bcmos_msg));
os_msg->start = os_msg->data;
os_msg->type = _type_major;
os_msg->instance = 0;
os_msg->sender = BCMOS_MODULE_ID_NONE; /* doesn't matter */
/*
* set up the bal msg header fields
*/
bal_hdr->version_major = BAL_HDR_VERSION_MAJOR;
bal_hdr->version_minor = BAL_HDR_VERSION_MINOR;
bal_hdr->msg_type = _type_minor;
bal_hdr->msg_id = ((bal_hdr->msg_id & 0x0000FFFF) | ((_msg_id_oper & 0x0000FFFF) << 16));
bal_hdr->msg_id = ((bal_hdr->msg_id & 0xFFFF0000) | (_msg_id_obj & 0x0000FFFF));
bal_hdr->ex_id = _ex_id;
bal_hdr->sender = _sender_subsys;
bal_hdr->timestamp = bcmos_timestamp();
}
/*
* Get the sender field in the BAL header given the message pointer
*/
static inline bal_subsystem bcmbal_sender_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->sender;
}
/*
* Set the sender field in the BAL header given the message pointer
*/
static inline void bcmbal_sender_set(void *_msg_payload_ptr, bal_subsystem _sender_subsys)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->sender = _sender_subsys;
}
/*
* Get the top level type field in the BAL header given the message pointer
*/
static inline bcmos_msg_id bcmbal_type_major_get(void *_msg_payload_ptr)
{
return bcmbal_bcmos_hdr_get(_msg_payload_ptr)->type;
}
/*
* Set the top level type field in the BAL header given the message pointer
*/
static inline void bcmbal_type_major_set(void *_msg_payload_ptr, bcmos_msg_id _type_major)
{
bcmbal_bcmos_hdr_get(_msg_payload_ptr)->type = _type_major;
}
/*
* Get the inner type field in the BAL header given the message pointer
*/
static inline bcmbal_msg_type bcmbal_type_minor_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_type;
}
/*
* Set the inner type field in the BAL header given the message pointer
*/
static inline void bcmbal_type_minor_set(void *_msg_payload_ptr, bcmbal_msg_type _type_minor)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_type = _type_minor;
}
/*
* Get the msg_id_oper field in the BAL header given the message pointer
*/
static inline uint16_t bcmbal_msg_id_oper_get(void *_msg_payload_ptr)
{
return ((bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id & 0xFFFF0000) >> 16);
}
/*
* Set the msg_id_oper field in the BAL header given the message pointer
*/
static inline void bcmbal_msg_id_oper_set(void *_msg_payload_ptr, uint16_t _msg_id_oper)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id =
((bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id & 0x0000FFFF) | ((_msg_id_oper & 0x0000FFFF) << 16));
}
/*
* Get the msg_id_obj field in the BAL header given the message pointer
*/
static inline bcmbal_obj_id bcmbal_msg_id_obj_get(void *_msg_payload_ptr)
{
return (bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id & 0x0000FFFF );
}
/*
* Set the msg_id_obj field in the BAL header given the message pointer
*/
static inline void bcmbal_msg_id_obj_set(void *_msg_payload_ptr, bcmbal_obj_id _msg_id_obj)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id =
((bcmbal_bal_hdr_get(_msg_payload_ptr)->msg_id & 0xFFFF0000) | (_msg_id_obj & 0x0000FFFF));
}
/*
* Get the ex_id field in the BAL header given the message pointer
*/
static inline uint32_t bcmbal_ex_id_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->ex_id;
}
/*
* Set the ex_id field in the BAL header given the message pointer
*/
static inline void bcmbal_ex_id_set(void *_msg_payload_ptr, uint32_t _ex_id)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->ex_id = _ex_id;
}
/*
* Get the major version field in the BAL header given the message pointer
*/
static inline uint16_t bcmbal_major_version_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->version_major;
}
/*
* Set the major version field in the BAL header given the message pointer
*/
static inline void bcmbal_major_version_set(void *_msg_payload_ptr, uint16_t _version_major)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->version_major = _version_major;
}
/*
* Get the minor version field in the BAL header given the message pointer
*/
static inline uint16_t bcmbal_minor_version_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->version_minor;
}
/*
* Set the minor version field in the BAL header given the message pointer
*/
static inline void bcmbal_minor_version_set(void *_msg_payload_ptr, uint16_t _version_major)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->version_major = _version_major;
}
/*
* Get the scratchpad field in the BAL header given the message pointer
*/
static inline void *bcmbal_scratchpad_get(void *_msg_payload_ptr)
{
return bcmbal_bal_hdr_get(_msg_payload_ptr)->scratchpad;
}
/*
* Set the scratchpad field in the BAL header given the message pointer
*/
static inline void bcmbal_scratchpad_set(void *_msg_payload_ptr, void *_scratchpad)
{
bcmbal_bal_hdr_get(_msg_payload_ptr)->scratchpad = _scratchpad;
}
/*
* Allocate a BAL message given the payload pointer
*/
static inline void *bcmbal_msg_calloc(uint32_t _msg_payload_size)
{
/* Payload includes comm header */
bal_comm_msg_hdr *m = bcmos_calloc(_msg_payload_size);
if (NULL == m)
return NULL;
return bcmbal_payload_ptr_get(m);
}
/*
* Free a BAL message given the payload pointer
*/
static inline void bcmbal_msg_free(void *msg)
{
return bcmos_msg_free(bcmbal_bcmos_hdr_get(msg));
}
/*
* External functions implemented in bal_msg.c
*/
/*
* Clone BAL message
* Returns payload_ptr of the clone
*/
void *bcmbal_msg_clone(void *bal_obj);
/*
* Send a BAL message given the payload pointer
*/
bcmos_errno bcmbal_msg_send(bcmos_msg_queue *queue, void *msg_payload, bcmos_msg_send_flags flags);
/*
* Call callback in the context of the target module and pass it the BAL message pointer
*/
bcmos_errno bcmbal_msg_call(void *msg_payload, bcmos_module_id module, F_bcmos_msg_handler cb, bcmos_msg_send_flags flags);
/*
* Receive a BAL message given the payload pointer
*
* NOTE: The timeout argument is in units of uS (micro seconds). Use the #defined timeout values above.
*
*/
bcmos_errno bcmbal_msg_recv(bcmos_msg_queue *queue, uint32_t timeout, void **msg_payload);
/** Get packed bal_comm_msg_hdr length */
int32_t bcmbal_bal_msg_hdr_get_packed_length(void);
/** Pack a BAL message header to a byte stream */
bcmos_errno bcmbal_bal_msg_hdr_pack(const bal_comm_msg_hdr *msg, bcmbal_buf *buf);
/** Unpack a BAL message header from a byte stream */
bcmos_errno bcmbal_bal_msg_hdr_unpack(bal_comm_msg_hdr *msg, bcmbal_buf *buf);
/** Peek exchange_id in the received message without unpacking */
bcmos_errno bcmbal_bal_msg_peek_ex_id(bcmos_msg *msg, uint32_t *ex_id);
#endif /* #ifndef BALMSG_H */