blob: 4b1b7119b9112296cae430370718dd4bde84bfa6 [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
**************************************************************************
*/
/*
* @file nss_project.h
* NSS project interface definitions.
*/
#ifndef __NSS_PROJECT_H
#define __NSS_PROJECT_H
/**
* @addtogroup nss_project_subsystem
* @{
*/
/**
* Maximum number of IRQs for which a message will have statistics.
*
* Must be defined on firmware and host such that NSS_PROJECT_IRQS_PER_MESSAGE *
* sizeof(struct nss_project_irq_stats) + 8 + sizeof(struct nss_cmn_msg) is smaller
* than the maximum payload size of an sk_buff (1792), 8 being the number of
* bytes needed to store the thread number and number of statistics written.
*/
#define NSS_PROJECT_IRQS_PER_MESSAGE 32
/**
* nss_project_message_types
* Project message types.
*/
enum nss_project_message_types {
NSS_PROJECT_MSG_WT_STATS_ENABLE,
/**< Message to enable or disable worker thread statistics. */
NSS_PROJECT_MSG_WT_STATS_NOTIFY,
/**< NSS to HLOS message containing worker thread statistics. */
NSS_PROJECT_MSG_MAX,
};
/**
* nss_project_error_types
* Project error types.
*/
enum nss_project_error_types {
NSS_PROJECT_ERROR_UNKNOWN_MSG,
/**< Unrecognized message type. */
NSS_PROJECT_ERROR_WT_STATS_UNSUPPORTED,
/**< The firmware does not support worker thread statistics. */
NSS_PROJECT_ERROR_WT_STATS_REDUNDANT_ENABLE,
/**< The firmware received a redundant request to enable worker thread statistics. */
NSS_PROJECT_ERROR_MAX,
};
/**
* nss_project_msg_wt_stats_enable
* Enables or disables worker thread statistics collection.
*/
struct nss_project_msg_wt_stats_enable {
/*
* NSS to HLOS
*/
uint32_t worker_thread_count;
/**< Number of worker threads supported by this core. */
uint32_t irq_count;
/**< Number of IRQs supported by this core. */
/*
* HLOS to NSS
*/
bool enable; /**< True to enable, false to disable. */
};
/**
* nss_project_irq_stats
* Statistics for an individual IRQ on a worker thread.
*/
struct nss_project_irq_stats {
uint64_t count; /**< Number of times callback has been executed */
uint32_t callback; /**< Address of the callback function */
uint32_t irq; /**< IRQ number to which callback function is bound */
uint32_t ticks_min; /**< Fewest ticks taken in callback function */
uint32_t ticks_avg; /**< Exponential moving average of ticks */
uint32_t ticks_max; /**< Maximum ticks */
uint32_t insn_min; /**< Fewest instructions executed in callback function */
uint32_t insn_avg; /**< Exponential moving average of instruction count */
uint32_t insn_max; /**< Maximum instructions */
};
/**
* nss_project_msg_wt_stats_notify
* Message containing statistics for active worker_thread IRQs.
*/
struct nss_project_msg_wt_stats_notify {
uint32_t threadno; /**< The thread whose stats are contained. */
uint32_t stats_written; /**< The number of statistics written to the array. */
struct nss_project_irq_stats stats[NSS_PROJECT_IRQS_PER_MESSAGE];
/**< The per-IRQ statistics for the worker thread */
};
/**
* nss_project_msg
* General message structure for project messages.
*/
struct nss_project_msg {
struct nss_cmn_msg cm; /**< Common message header. */
/**
* Payload of a message to or from the project code.
*/
union {
struct nss_project_msg_wt_stats_enable wt_stats_enable;
/**< Enable or disable worker thread statistics. */
struct nss_project_msg_wt_stats_notify wt_stats_notify;
/**< One-way worker thread statistics message. */
} msg; /**< Message payload. */
};
/**
* Callback function for receiving project messages.
*
* @datatypes
* nss_project_msg
*
* @param[in] app_data Pointer to the application context of the message.
* @param[in] msg Pointer to the project message.
*/
typedef void (*nss_project_msg_callback_t)(void *app_data, struct nss_project_msg *msg);
/**
* nss_project_register_sysctl
* Registers the project sysctl table to the sysctl tree.
*
* @return
* None.
*/
void nss_project_register_sysctl(void);
/**
* nss_project_unregister_sysctl
* De-registers the project sysctl table from the sysctl tree.
*
* @return
* None.
*
* @dependencies
* The system control must have been previously registered.
*/
void nss_project_unregister_sysctl(void);
/**
* nss_project_register_handler
* Registers the project message handler.
*
* @return
* None.
*/
void nss_project_register_handler(struct nss_ctx_instance *nss_ctx);
/**
* @}
*/
#endif /* __NSS_PROJECT_H */