rt-thread/bsp/phytium/libraries/standalone/drivers/gic/fgic/fgic.h

110 lines
4.2 KiB
C
Raw Normal View History

/*
* Copyright : (C) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: fgic.h
* Date: 2022-03-28 09:30:29
* LastEditTime: 2022-03-28 09:30:29
* Description:  This file is for
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
*/
#ifndef DRIVERS_GIC_FGIC_H
#define DRIVERS_GIC_FGIC_H
#include "ftypes.h"
#include "ferror_code.h"
#include "fparameters.h"
#define FGIC_RSGI_AFF1_OFFSET 16
#define FGIC_RSGI_AFF2_OFFSET 32
#define FGIC_RSGI_AFF3_OFFSET 48
#define FGIC_SUCCESS FT_SUCCESS
#define FGIC_CTLR_ERR_TYPE FT_MAKE_ERRCODE(ErrModBsp, ErrGic, 1) /* 错误选择CTLR 寄存器 */
#define FGIC_CTLR_ERR_NUM FT_MAKE_ERRCODE(ErrModBsp, ErrGic, 2) /* 当前控制器不支持此中断id */
#define FGIC_CTLR_ERR_IN_SET FT_MAKE_ERRCODE(ErrModBsp, ErrGic, 3) /* 在设置过程中出现的异常 */
#define FGIC_CTLR_ERR_IN_GET FT_MAKE_ERRCODE(ErrModBsp, ErrGic, 4) /* 在获取过程中出现的异常 */
#define FGIC_ERR_IN_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrGic, 5) /* 超时退出 */
typedef enum
{
TRIGGER_BY_LEVEL_SENSITIVE = 0, /* Corresponding interrupt is level-sensitive. */
TRIGGER_BY_LEVEL_EDGE, /* Corresponding interrupt is edge-triggered. */
} TRIGGER_LEVEL;
typedef enum
{
TWO_SECURITY_STATE = 0, /* */
ONE_NS_SECURITY_STATE, /* */
} SECURITY_STATE;
/* Interrupt Routing Mode. */
typedef enum
{
SGI_ROUTING_TO_SPECIFIC = 0, /* sgi interrupts routed to the PEs specified by affinity level. */
SGI_ROUTING_TO_ANY = (1ULL << 40) /* sgi interrupts routed to all PEs in the system, excluding "self". */
} SGI_ROUTING_MODE;
typedef enum
{
SPI_ROUTING_TO_SPECIFIC = 0, /* spi interrupts routed to the PE specified by affinity level. */
SPI_ROUTING_TO_ANY = (1U << 31) /* spi interrupts routed to any PE defined as a participating node. */
} SPI_ROUTING_MODE;
typedef struct
{
u32 instance_id; /* Id of device*/
uintptr dis_base; /* Distributor base address */
} FGicConfig;
typedef struct
{
FGicConfig config; /* Configuration data structure */
u32 is_ready; /* Device is ininitialized and ready*/
uintptr redis_base; /* Redistributor base address for each core */
SECURITY_STATE security ;
s32 max_spi_num; /* Max value of spi priority */
} FGic;
/* Initialization */
FGicConfig *FGicLookupConfig(u32 instance_id);
FError FGicCfgInitialize(FGic *instance_p, const FGicConfig *input_config_p, uintptr redis_base);
void FGicDistrubutiorInit(FGic *instance_p);
FError FGicRedistrubutiorInit(FGic *instance_p);
void FGicCpuInterfaceInit(void);
/* Operation interface */
FError FGicIntEnable(FGic *instance_p, s32 int_id);
FError FGicIntDisable(FGic *instance_p, s32 int_id);
FError FGicSetPriority(FGic *instance_p, s32 int_id, u32 priority);
u32 FGicGetPriority(FGic *instance_p, s32 int_id);
FError FGicSetTriggerLevel(FGic *instance_p, s32 int_id, TRIGGER_LEVEL trigger_way);
u32 FGicGetTriggerLevel(FGic *instance_p, s32 int_id);
FError FGicSetSpiAffinityRouting(FGic *instance_p, s32 int_id, SPI_ROUTING_MODE route_mode, u64 affinity);
FError FGicGetAffinityRouting(FGic *instance_p, s32 int_id, SPI_ROUTING_MODE *route_mode_p, u64 *affinity_p);
FError FGicGenerateSgi(FGic *instance_p, s32 int_id, u32 target_list, SGI_ROUTING_MODE routing_mode, u64 affinity);
void FGicDeactionInterrupt(FGic *instance_p, s32 int_id);
s32 FGicAcknowledgeInt(FGic *instance_p);
void FGicSetPriorityFilter(FGic *instance_p, u32 priority_mask);
void FGicSetPriorityGroup(FGic *instance_p, u32 binary_point);
u32 FGicGetPriorityFilter(FGic *instance_p);
u32 FGicGetPriorityGroup(FGic *instance_p);
#endif