summaryrefslogtreecommitdiff
path: root/bsp/phytium/libraries/standalone/drivers/gic/fgic/fgic.h
blob: e08236e9160cb17a813d03bf052595a06916308b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * 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