hc
2024-08-19 a51341d8c7882adfad4f167bc7c3ca616908b53d
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * ARConnect IP Support (Multi core enabler: Cross core IPI, RTC ...)
 *
 * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
 */
 
#ifndef __SOC_ARC_MCIP_H
#define __SOC_ARC_MCIP_H
 
#include <soc/arc/aux.h>
 
#define ARC_REG_MCIP_BCR    0x0d0
#define ARC_REG_MCIP_IDU_BCR    0x0D5
#define ARC_REG_GFRC_BUILD    0x0D6
#define ARC_REG_MCIP_CMD    0x600
#define ARC_REG_MCIP_WDATA    0x601
#define ARC_REG_MCIP_READBACK    0x602
 
struct mcip_cmd {
#ifdef CONFIG_CPU_BIG_ENDIAN
   unsigned int pad:8, param:16, cmd:8;
#else
   unsigned int cmd:8, param:16, pad:8;
#endif
 
#define CMD_INTRPT_GENERATE_IRQ        0x01
#define CMD_INTRPT_GENERATE_ACK        0x02
#define CMD_INTRPT_READ_STATUS        0x03
#define CMD_INTRPT_CHECK_SOURCE        0x04
 
/* Semaphore Commands */
#define CMD_SEMA_CLAIM_AND_READ        0x11
#define CMD_SEMA_RELEASE        0x12
 
#define CMD_DEBUG_SET_MASK        0x34
#define CMD_DEBUG_READ_MASK        0x35
#define CMD_DEBUG_SET_SELECT        0x36
#define CMD_DEBUG_READ_SELECT        0x37
 
#define CMD_GFRC_READ_LO        0x42
#define CMD_GFRC_READ_HI        0x43
#define CMD_GFRC_SET_CORE        0x47
#define CMD_GFRC_READ_CORE        0x48
 
#define CMD_IDU_ENABLE            0x71
#define CMD_IDU_DISABLE            0x72
#define CMD_IDU_SET_MODE        0x74
#define CMD_IDU_READ_MODE        0x75
#define CMD_IDU_SET_DEST        0x76
#define CMD_IDU_ACK_CIRQ        0x79
#define CMD_IDU_SET_MASK        0x7C
 
#define IDU_M_TRIG_LEVEL        0x0
#define IDU_M_TRIG_EDGE            0x1
 
#define IDU_M_DISTRI_RR            0x0
#define IDU_M_DISTRI_DEST        0x2
};
 
struct mcip_bcr {
#ifdef CONFIG_CPU_BIG_ENDIAN
       unsigned int pad4:6, pw_dom:1, pad3:1,
                idu:1, pad2:1, num_cores:6,
                pad:1,  gfrc:1, dbg:1, pw:1,
                msg:1, sem:1, ipi:1, slv:1,
                ver:8;
#else
       unsigned int ver:8,
                slv:1, ipi:1, sem:1, msg:1,
                pw:1, dbg:1, gfrc:1, pad:1,
                num_cores:6, pad2:1, idu:1,
                pad3:1, pw_dom:1, pad4:6;
#endif
};
 
struct mcip_idu_bcr {
#ifdef CONFIG_CPU_BIG_ENDIAN
   unsigned int pad:21, cirqnum:3, ver:8;
#else
   unsigned int ver:8, cirqnum:3, pad:21;
#endif
};
 
 
/*
 * Build register for IDU contains not an actual number of supported common
 * interrupts but an exponent of 2 which must be multiplied by 4 to
 * get a number of supported common interrupts.
 */
#define mcip_idu_bcr_to_nr_irqs(bcr) (4 * (1 << (bcr).cirqnum))
 
/*
 * MCIP programming model
 *
 * - Simple commands write {cmd:8,param:16} to MCIP_CMD aux reg
 *   (param could be irq, common_irq, core_id ...)
 * - More involved commands setup MCIP_WDATA with cmd specific data
 *   before invoking the simple command
 */
static inline void __mcip_cmd(unsigned int cmd, unsigned int param)
{
   struct mcip_cmd buf;
 
   buf.pad = 0;
   buf.cmd = cmd;
   buf.param = param;
 
   WRITE_AUX(ARC_REG_MCIP_CMD, buf);
}
 
/*
 * Setup additional data for a cmd
 * Callers need to lock to ensure atomicity
 */
static inline void __mcip_cmd_data(unsigned int cmd, unsigned int param,
                  unsigned int data)
{
   write_aux_reg(ARC_REG_MCIP_WDATA, data);
 
   __mcip_cmd(cmd, param);
}
 
/*
 * Read MCIP register
 */
static inline unsigned int __mcip_cmd_read(unsigned int cmd, unsigned int param)
{
   __mcip_cmd(cmd, param);
   return read_aux_reg(ARC_REG_MCIP_READBACK);
}
 
#endif