blob: 9dc902ec1475698334a606f34de37b557f664f3a [file] [log] [blame]
/*
<: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.
:>
*/
/*
* bcmos_system.h
* Maple System Services
* posix port: simulation
*/
#ifndef BCMOS_SYSTEM_H_
#define BCMOS_SYSTEM_H_
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <ctype.h>
#include <stddef.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <execinfo.h>
#include <limits.h>
#include <stdarg.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
/* posix port has only been tested in linux user space */
#define LINUX_USER_SPACE
/* Re-define GNU typeof as ISO __typeof__ */
#define typeof __typeof__
void _bcmos_backtrace(void);
#define BUG_ON_PRINT(condition, fmt, args...) \
do \
{ \
if (condition) \
{ \
BCMOS_TRACE_ERR(fmt, ##args); \
assert(!(condition)); \
} \
} while (0)
#define BUG_ON(condition) BUG_ON_PRINT((condition), "BUG in %s %d!\n", __FUNCTION__, __LINE__)
#define BUG() BUG_ON(1)
#define BUG_UNLESS(condition) BUG_ON(!(condition))
/* If 'err' is not BCM_ERR_OK, there is a bug in the software - halt and print the specified message */
#define BUG_ON_ERROR(err, fmt, args...) \
BUG_ON_PRINT((err) != BCM_ERR_OK, \
"%s:%d: err=%s (%d): " fmt, \
__FUNCTION__, __LINE__, bcmos_strerror(err), (err), ##args)
/* Specify here which system functions are inlined */
#define BCMOS_FASTLOCK_INLINE
/* #define BCMOS_SEM_WAIT_INLINE */
#define BCMOS_SEM_POST_INLINE
#define BCMOS_TRACE_PRINTF
/* #define BCMOS_BYTE_POOL_ALLOC_FREE_INLINE */
/* #define BCMOS_MALLOC_FREE_INLINE */
/* #define BCMOS_CALLOC_INLINE */
#define BCMOS_DMA_ALLOC_FREE_INLINE
#define BCMOS_VIRT_TO_PHYS_INLINE
#define BCMOS_CACHE_INLINE
#include "bcmos_common.h"
/* posix-specific stuff */
/*
* Synchronization
*/
/** \addtogroup system_mutex
* @{
*/
/** Mutex control block */
struct bcmos_mutex
{
pthread_mutex_t m; /**< pthread mutex */
pthread_mutexattr_t attr; /**< pthread mutex attribute */
};
/** @} system_mutex */
/** \addtogroup system_fastlock
* @{
*/
/** Fast lock control block */
struct bcmos_fastlock
{
bcmos_mutex m;
};
/** Fastlock initializer. Can be used instead of calling bcmos_fastlock_init() */
#define BCMOS_FASTLOCK_INITIALIZER { { PTHREAD_MUTEX_INITIALIZER } }
/* Init fastlock */
static inline void bcmos_fastlock_init(bcmos_fastlock *lock, uint32_t flags)
{
bcmos_mutex_create(&lock->m, 0, NULL);
}
/* Take fast lock */
static inline long bcmos_fastlock_lock(bcmos_fastlock *lock)
{
bcmos_mutex_lock(&lock->m);
return 0;
}
/* Release fast lock */
static inline void bcmos_fastlock_unlock(bcmos_fastlock *lock, long flags)
{
bcmos_mutex_unlock(&lock->m);
}
/** @} system_fastlock */
/** \addtogroup system_sem
* @{
*/
/** Semaphore control block */
struct bcmos_sem
{
sem_t s; /**< pthread semaphore */
};
/* Increment semaphore counter */
static inline void bcmos_sem_post(bcmos_sem *sem)
{
sem_post(&sem->s);
}
/** @} system_sem */
/** \addtogroup system_timer
* @{
*/
/** System timer */
struct bcmos_sys_timer
{
timer_t t; /**< librt timer */
bcmos_sys_timer_handler handler; /**< Timer handler */
void *data; /**< Parameter to be passed to the handler */
};
/** @} system_timer */
/** \addtogroup system_task
* @{
*/
/** OS-specific task control block extension */
typedef struct bcmos_sys_task
{
pthread_t t; /**< posix pthread */
} bcmos_sys_task;
/** @} system_task */
/** \addtogroup byte_pool
* @{
*/
/** Memory pool control block */
struct bcmos_byte_pool
{
bcmos_byte_pool_parm parm; /**< Pool parameters */
uint32_t allocated; /**< Number of bytes allocated */
#ifdef BCMOS_MEM_DEBUG
uint32_t magic; /**< magic number */
#define BCMOS_BYTE_POOL_VALID (('b'<<24) | ('y' << 16) | ('p' << 8) | 'o')
#define BCMOS_BYTE_POOL_DELETED (('b'<<24) | ('y' << 16) | ('p' << 8) | '~')
#endif
};
/** @} */
/* Print */
#define bcmos_sys_vprintf(fmt, args) vprintf(fmt, args)
/* A few macros to enable linux kernel space compilation */
#define EXPORT_SYMBOL(_sym)
/*
* The following low-level functions are mostly for simulation
*/
/*
* DMA-able memory allocation
*/
/* Allocate DMA-able memory */
static inline void *bcmos_dma_alloc(uint8_t device, uint32_t size)
{
return bcmos_alloc(size);
}
/* Release DMA-able memory */
static inline void bcmos_dma_free(uint8_t device, void *ptr)
{
bcmos_free(ptr);
}
/* Convert virtual address to physical address */
static inline unsigned long bcmos_virt_to_phys(void *va)
{
return (unsigned long)(va);
}
/* Invalidate address area in data cache. Dirty cache lines content is discarded. */
static inline void bcmos_dcache_inv(void *start, uint32_t size)
{
}
/* Flush address area in data cache. Dirty cache lines are committed to memory. */
static inline void bcmos_dcache_flush(void *start, uint32_t size)
{
}
/* write barrier */
static inline void bcmos_barrier(void)
{
}
static inline void bcm_pci_write32(volatile uint32_t *address, uint32_t value)
{
}
static inline uint32_t bcm_pci_read32(const volatile uint32_t *address)
{
return -1;
}
/* Check in-irq status */
static inline bcmos_bool is_irq_mode(void)
{
return BCMOS_FALSE;
}
/* Check if interrupts are disabled */
static inline bcmos_bool is_irq_disabled(void)
{
return BCMOS_FALSE;
}
/*
* Internal (to OS abstraction) functions for messaging over domain and UDP sockets
*/
#ifdef BCMOS_MSG_QUEUE_DOMAIN_SOCKET
bcmos_errno bcmos_sys_msg_queue_domain_socket_open(bcmos_msg_queue *queue);
#endif
#ifdef BCMOS_MSG_QUEUE_UDP_SOCKET
bcmos_errno bcmos_sys_msg_queue_udp_socket_open(bcmos_msg_queue *queue);
#endif
/* 2nd part of OS-independent declarations */
#include "bcmos_common2.h"
#endif /* BCMOS_SYSTEM_H_ */