/*
<:copyright-BRCM:2016:DUAL/GPL:standard

   Broadcom Proprietary and Confidential.(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.

:>
 */

#ifndef BCMOLT_DEV_LOG_IOCTL_H_
#define BCMOLT_DEV_LOG_IOCTL_H_

#include <linux/ioctl.h>

#include <bcm_dev_log.h>

#define DEV_LOG_CHRDEV_MAX_KERNEL_IDS   32

/* ID descriptor */
typedef struct dev_log_id_info
{
    uint32_t index;
    char name[MAX_DEV_LOG_ID_NAME + 1];
    bcm_dev_log_level default_level;
    bcm_dev_log_id_type default_type;
} dev_log_id_info;

/* ioctl parameters */
typedef union dev_log_io_param
{
    struct
    {
        int num_ids;
        dev_log_id_info ids[DEV_LOG_CHRDEV_MAX_KERNEL_IDS];
    } db_read;

    struct
    {
        uint32_t index;
        bcm_dev_log_level level_print;
        bcm_dev_log_level level_save;
    } level_set;

    struct
    {
        uint32_t index;
        bcm_dev_log_id_type type;
    } type_set;

    struct
    {
        uint32_t offset;
        char msg[MAX_DEV_LOG_STRING_SIZE + 1];
    } msg_read;

} dev_log_io_param;

/* Use 'S' as magic number */
#define DEV_LOG_CHRDEV_IOC_MAGIC  'S'

#define DEV_LOG_CHRDEV_DB_READ          _IOR(DEV_LOG_CHRDEV_IOC_MAGIC, 1, dev_log_io_param)
#define DEV_LOG_CHRDEV_LEVEL_SET        _IOW(DEV_LOG_CHRDEV_IOC_MAGIC, 2, dev_log_io_param)
#define DEV_LOG_CHRDEV_TYPE_SET         _IOW(DEV_LOG_CHRDEV_IOC_MAGIC, 3, dev_log_io_param)
#define DEV_LOG_CHRDEV_MSG_READ         _IOR(DEV_LOG_CHRDEV_IOC_MAGIC, 4, dev_log_io_param)

#endif
