Subversion Repositories Open64

[/] [sim/] [fsim/] [device_sl1/] [include/] [sl1system.h] - Blame information for rev 2072

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2072 malin
/*
2
 *  File: sl1system.h
3
 *
4
 *  Copyright (c) 2006 Beijing SimpLight Nanoelectornics, Ltd.
5
 *  All rights reserved.
6
 *
7
 *  Redistribution and use in source and binary forms, with or without modification,
8
 *  are permitted provided that the following conditions are met:
9
 *
10
 *  1.Redistributions of source code must retain the above copyright notice,
11
 *    this list of conditions and the following disclaimer.
12
 *  2.Redistributions in binary form must reproduce the above copyright notice,
13
 *    this list of conditions and the following disclaimer in the documentation
14
 *    and/or other materials provided with the distribution.
15
 *
16
 *  THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS
17
 *  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
 *  IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
 *  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
26
 */
27
#ifndef SL1SYSTEM_H_
28
#define SL1SYSTEM_H_
29
 
30
#include "simconfig.h"
31
#include "bmmu.h"
32
#include "regdefs.h"
33
 
34
#include <map>
35
 
36
#define CORE_MAX_THREAD 4
37
class SysCtrl;
38
class SL1Device;
39
 
40
class DeviceScheduler
41
{
42
private:
43
  /* Cycle executed */
44
  unsigned long long _cycle;
45
  unsigned long long _timecycle;
46
 
47
  /* Schedule items container */
48
  typedef multimap<unsigned long long, SL1Device*> DeviceMap;
49
  DeviceMap _devMap;
50
  DeviceMap _timeMap;
51
 
52
public:
53
  DeviceScheduler();
54
 
55
  unsigned long long cycles();
56
  unsigned long long timecycles();
57
  void add(SL1Device* dev, unsigned int cycles);
58
  void addTime(SL1Device* dev, unsigned int cycles);
59
  void remove(SL1Device* dev);
60
  void removeTime(SL1Device* dev);
61
 
62
  /* Call this in every clock cycle in machine */
63
  void clock();
64
  void addCycle(void) { _cycle++;}
65
  void addTimeCycle(void) { _timecycle++;}
66
};
67
 
68
class Serial;
69
class Timer;
70
class PIC;
71
class Keypad;
72
class DMAController;
73
class NetRtl8019;
74
class Net_device;
75
 
76
class SL1System
77
{
78
  /* Friend class for cmodel */
79
  friend class SL1SocCmodel;
80
 
81
public:
82
  enum RESET_ID {
83
    RESET_NORMAL = 0,
84
    RESET_ENABLE = 1,
85
    RESET_DISABLE = -1,
86
  };
87
 
88
  enum STATUS_ID {
89
    STATUS_NORMAL,
90
    STATUS_EXCEPT,
91
  };
92
private:
93
  /* System status array */
94
  STATUS_ID _status[CORE_MAX_THREAD];
95
  STATUS_ID _globalStatus;
96
  RESET_ID _threadReset[CORE_MAX_THREAD];
97
  ADDR _handlerAddr[CORE_MAX_THREAD];
98
  ADDR _handlerBreakAddr[CORE_MAX_THREAD];
99
 
100
  /* Reference for common instances */
101
  BaseMMU& _mmu;
102
  SimConfig& _config;
103
 
104
  /* Class variables */
105
  DeviceScheduler _scheduler;
106
  vector<Timer*> _timers;
107
  vector<Serial*> _serials;
108
  PIC* _picCore;
109
  PIC* _picDsp;
110
  Keypad* _keypad;
111
  SysCtrl* _sysctrl;
112
  DMAController* _dmaController;
113
  NetRtl8019* _netrtl8019;
114
//  Net_device* _net_device;
115
 
116
  bool _enableClock;
117
 
118
  /* wrapper functions for retrieving core modules in the simulator */
119
  SimConfig& config();
120
  DeviceScheduler& scheduler();
121
 
122
  /* Peripherals initialization */
123
  void initTimer(SimConfig& c);
124
  void initSerial(SimConfig& c);
125
  void initPIC(SimConfig& c);
126
  void initDmaController(SimConfig& c);
127
  void initNetRtl8019(SimConfig& c);
128
 
129
public:
130
  enum CORE_TRAP_ID {
131
    TRAP_POWER_RESET  = 0,
132
    TRAP_CPU_EXCEPT   = (1 << INTRC_INDEX_T0_EXCPT),
133
    TRAP_CPU_BREAK    = (1 << INTRC_INDEX_T0_BREAK),
134
    TRAP_EXCEPT   = (1 << INTRC_INDEX_T1_EXCPT),
135
    TRAP_BREAK    = (1 << INTRC_INDEX_T1_BREAK),
136
    TRAP_SIG    = (1 << INTRC_INDEX_T0_SW_INT),
137
    TRAP_SYSCALL    = (1 << INTRC_INDEX_T1_SW_INT),
138
    /* Define peripheral irq for dsp thread here */
139
    //TRAP_INT_ABB_CTRL = (1 << INTRC_INDEX_T1_ABBCTL),
140
    //TRAP_INT_ABB_IQD  = (1 << INTRC_INDEX_T1_ABBIQD),
141
    //TRAP_INT_ABB_CODEC  = (1 << INTRC_INDEX_T1_ABBCODEC),
142
    TRAP_INT_ABB_RFIIQ  = (1 << INTRC_INDEX_T1_RFIIQ),
143
    TRAP_INT_ABB_RFICON = (1 << INTRC_INDEX_T1_RFICON),
144
    TRAP_INT_ABB_GRFIIQ = (1 << INTRC_INDEX_T1_GRFIIQ),
145
    TRAP_INT_ABB_GRFICON  = (1 << INTRC_INDEX_T1_GRFICON),
146
    TRAP_INT_DSP_RESET  = (1 << INTRC_INDEX_T1_DSPRST),
147
    /* Define peripheral irq for core thread here */
148
    TRAP_INT_POFF   = (1 << INTRC_INDEX_T0_POFF),
149
    TRAP_INT_SYSRST   = (1 << INTRC_INDEX_T0_SYSRST),
150
    TRAP_INT_WAKEUP   = (1 << INTRC_INDEX_T0_WKUP),
151
    TRAP_INT_DMA    = (1 << INTRC_INDEX_T0_DMA),
152
    TRAP_INT_PMU    = (1 << INTRC_INDEX_T0_PMU),
153
    TRAP_INT_USB    = (1 << INTRC_INDEX_T0_USB),
154
    TRAP_INT_LCD    = (1 << INTRC_INDEX_T0_LCDC),
155
    TRAP_INT_CPU_RESET  = (1 << INTRC_INDEX_T0_CPURST),
156
    TRAP_INT_UNKNOWN3 = (1 << INTRC_INDEX_T1_UNUSE3),
157
    TRAP_INT_WATCHDOG = (1 << INTRC_INDEX_T0_WDT),
158
    //TRAP_INT_CPU_TIMER0     = (1 << INTRC_INDEX_T0_TIM0),
159
    //TRAP_INT_CPU_TIMER1     = (1 << INTRC_INDEX_T0_TIM1),
160
    TRAP_INT_TIMER0   = (1 << INTRC_INDEX_T1_TIM0),
161
    TRAP_INT_TIMER1   = (1 << INTRC_INDEX_T1_TIM1),
162
    TRAP_INT_TIMER2   = (1 << INTRC_INDEX_T1_TIM2),
163
    TRAP_INT_TIMER3   = (1 << INTRC_INDEX_T1_TIM3),
164
    TRAP_INT_RTC    = (1 << INTRC_INDEX_T0_RTC),
165
    TRAP_INT_CPU_SPI        = (1 << INTRC_INDEX_T0_GSPI),
166
    TRAP_INT_SPI    = (1 << INTRC_INDEX_T1_GSPI),
167
    TRAP_INT_CPU_II   = (1 << INTRC_INDEX_T0_GI2C),
168
    TRAP_INT_IIC    = (1 << INTRC_INDEX_T1_GI2C),
169
    TRAP_INT_CPU_GSSI = (1 << INTRC_INDEX_T0_GSSI),
170
    TRAP_INT_CPU_GPIO0      = (1 << INTRC_INDEX_T0_GPIO0),
171
    TRAP_INT_CPU_GPIO1      = (1 << INTRC_INDEX_T0_GPIO1),
172
    TRAP_INT_CPU_GPIO2      = (1 << INTRC_INDEX_T0_GPIO2),
173
    TRAP_INT_GSSI     = (1 << INTRC_INDEX_T1_GSSI),
174
    TRAP_INT_GPIO0    = (1 << INTRC_INDEX_T1_GPIO0),
175
    TRAP_INT_GPIO1    = (1 << INTRC_INDEX_T1_GPIO1),
176
    TRAP_INT_GPIO2    = (1 << INTRC_INDEX_T1_GPIO2),
177
    TRAP_INT_GPIO3    = (1 << INTRC_INDEX_T1_GPIO3),
178
    TRAP_INT_GPIO4    = (1 << INTRC_INDEX_T1_GPIO4),
179
    //TRAP_INT_CPU_UART1      = (1 << INTRC_INDEX_T0_UART1),
180
    TRAP_INT_CPU_UART2      = (1 << INTRC_INDEX_T0_UART2),
181
    TRAP_INT_CPU_UART3      = (1 << INTRC_INDEX_T0_UART3),
182
    //TRAP_INT_UART1    = (1 << INTRC_INDEX_T1_UART1),
183
    TRAP_INT_UART2    = (1 << INTRC_INDEX_T1_UART2),
184
    TRAP_INT_UART3    = (1 << INTRC_INDEX_T1_UART3),
185
    TRAP_INT_PMW    = (1 << INTRC_INDEX_T0_PWM),
186
    TRAP_INT_SIMC   = (1 << INTRC_INDEX_T0_SIMC),
187
    TRAP_INT_KEYPAD   = (1 << INTRC_INDEX_T0_KEYPAD),
188
  };
189
 
190
 
191
  SL1System(SimConfig& c, BaseMMU& m);
192
 
193
  BaseMMU& mmu();
194
 
195
  DMAController* dma();
196
 
197
  /* Master reset for all peripherals */
198
  void reset();
199
 
200
  /* Exception event */
201
  void trap(CORE_TRAP_ID id);
202
  void trap(int threadid, CORE_TRAP_ID id);
203
  /* Trap complete handler, should be called when executing rete */
204
  void clearTrap(int threadid);
205
 
206
  unsigned long long getCycles();
207
  unsigned long long getTimeCycles();
208
  void addSchedule(SL1Device* dev, unsigned int cycles);
209
  void addTimeSchedule(SL1Device* dev, unsigned int cycles);
210
  void removeSchedule(SL1Device* dev);
211
  void removeTimeSchedule(SL1Device* dev);
212
 
213
  /* Peripheral working cycle */
214
  void clock(void);
215
  void addCycle(int threadid);
216
  /* The system clock can be enable/disable for profiling */
217
  void enableClock(bool enable);
218
 
219
  /* set the status of the system */
220
  void setStatus(int threadid, STATUS_ID status);
221
 
222
  /* return handler address */
223
  ADDR getHandlerAddr(int threadid);
224
  ADDR getHandlerBreakAddr(int threadid);
225
 
226
  /* Return the status of the system */
227
  STATUS_ID getStatus(int threadid);
228
  STATUS_ID getStatus(void);
229
  void setStatusNormal(int threadid);
230
 
231
  /* get/set thread reset */
232
  void setReset(int threadid, RESET_ID b);
233
  RESET_ID getReset(int threadid);
234
 
235
  /* get reset start PC */
236
  ADDR getStartPC(int threadid);
237
};
238
 
239
#endif /* SL1SYSTEM_H_ */