149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: BSD-3-Clause
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * @file	sys.h
							 | 
						||
| 
								 | 
							
								 * @brief	System primitives for libmetal.
							 | 
						||
| 
								 | 
							
								 * @brief	Top level include internal to libmetal library code.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __METAL_SYS__H__
							 | 
						||
| 
								 | 
							
								#define __METAL_SYS__H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <metal/log.h>
							 | 
						||
| 
								 | 
							
								#include <metal/list.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** \defgroup system Top Level Interfaces
							 | 
						||
| 
								 | 
							
								 *  @{ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Physical address type. */
							 | 
						||
| 
								 | 
							
								typedef unsigned long metal_phys_addr_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Interrupt request number. */
							 | 
						||
| 
								 | 
							
								typedef int metal_irq_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Bad offset into shared memory or I/O region. */
							 | 
						||
| 
								 | 
							
								#define METAL_BAD_OFFSET	((unsigned long)-1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Bad physical address value. */
							 | 
						||
| 
								 | 
							
								#define METAL_BAD_PHYS		((metal_phys_addr_t)-1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Bad virtual address value. */
							 | 
						||
| 
								 | 
							
								#define METAL_BAD_VA		((void *)-1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Bad IRQ. */
							 | 
						||
| 
								 | 
							
								#define METAL_BAD_IRQ		((metal_irq_t)-1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Initialization configuration for libmetal.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								struct metal_init_params {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** log message handler (defaults to stderr). */
							 | 
						||
| 
								 | 
							
									metal_log_handler		log_handler;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** default log message level (defaults to emergency). */
							 | 
						||
| 
								 | 
							
									enum metal_log_level		log_level;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * System independent runtime state for libmetal.  This is part of a system
							 | 
						||
| 
								 | 
							
								 * specific singleton data structure (@see _metal).
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								struct metal_common_state {
							 | 
						||
| 
								 | 
							
									/** Current log level. */
							 | 
						||
| 
								 | 
							
									enum metal_log_level		log_level;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Current log handler (null for none). */
							 | 
						||
| 
								 | 
							
									metal_log_handler		log_handler;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** List of registered buses. */
							 | 
						||
| 
								 | 
							
									struct metal_list		bus_list;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Generic statically defined shared memory segments. */
							 | 
						||
| 
								 | 
							
									struct metal_list		generic_shmem_list;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/** Generic statically defined devices. */
							 | 
						||
| 
								 | 
							
									struct metal_list		generic_device_list;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct metal_state;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <metal/system/generic/sys.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef METAL_INIT_DEFAULTS
							 | 
						||
| 
								 | 
							
								#define METAL_INIT_DEFAULTS				\
							 | 
						||
| 
								 | 
							
								{							\
							 | 
						||
| 
								 | 
							
									.log_handler	= metal_default_log_handler,	\
							 | 
						||
| 
								 | 
							
									.log_level	= METAL_LOG_INFO,		\
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** System specific runtime data. */
							 | 
						||
| 
								 | 
							
								extern struct metal_state _metal;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief	Initialize libmetal.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Initialize the libmetal library.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param[in]	params	Initialization params (@see metal_init_params).
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return	0 on success, or -errno on failure.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @see metal_finish
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								extern int metal_init(const struct metal_init_params *params);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief	Shutdown libmetal.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Shutdown the libmetal library, and release all reserved resources.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @see metal_init
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								extern void metal_finish(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef METAL_INTERNAL
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief	libmetal system initialization.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This function initializes libmetal on Linux or Generic platforms.  This
							 | 
						||
| 
								 | 
							
								 * involves obtaining necessary pieces of system information (sysfs mount path,
							 | 
						||
| 
								 | 
							
								 * page size, etc.).
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param[in]	params	Initialization parameters (@see metal_init_params).
							 | 
						||
| 
								 | 
							
								 * @return	0 on success, or -errno on failure.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								extern int metal_sys_init(const struct metal_init_params *params);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief	libmetal system shutdown.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This function shuts down and releases resources held by libmetal Linux or
							 | 
						||
| 
								 | 
							
								 * Generic platform layers.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @see metal_sys_init
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								extern void metal_sys_finish(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** @} */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __METAL_SYS__H__ */
							 |