changelog shortlog tags branches changeset files file revisions raw help

Mercurial > hg > plan9front / annotate sys/src/9/bcm64/dat.h

changeset 7235: b1dc95374307
parent: ba62683c0e2d
child: c0e23a8829f7
author: cinap_lenrek@felloff.net
date: Mon, 13 May 2019 19:20:21 +0200
permissions: -rw-r--r--
description: bcm64: implement reboot support
cinap_lenrek@7199 1
 /*
cinap_lenrek@7199 2
  * Time.
cinap_lenrek@7199 3
  *
cinap_lenrek@7199 4
  * HZ should divide 1000 evenly, ideally.
cinap_lenrek@7199 5
  * 100, 125, 200, 250 and 333 are okay.
cinap_lenrek@7199 6
  */
cinap_lenrek@7199 7
 #define	HZ		100			/* clock frequency */
cinap_lenrek@7199 8
 #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
cinap_lenrek@7199 9
 #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
cinap_lenrek@7199 10
 
cinap_lenrek@7199 11
 enum {
cinap_lenrek@7199 12
 	Mhz	= 1000 * 1000,
cinap_lenrek@7199 13
 };
cinap_lenrek@7199 14
 
cinap_lenrek@7199 15
 typedef struct Conf	Conf;
cinap_lenrek@7199 16
 typedef struct Confmem	Confmem;
cinap_lenrek@7199 17
 typedef struct FPsave	FPsave;
cinap_lenrek@7199 18
 typedef struct PFPU	PFPU;
cinap_lenrek@7199 19
 typedef struct ISAConf	ISAConf;
cinap_lenrek@7199 20
 typedef struct Label	Label;
cinap_lenrek@7199 21
 typedef struct Lock	Lock;
cinap_lenrek@7199 22
 typedef struct Memcache	Memcache;
cinap_lenrek@7199 23
 typedef struct MMMU	MMMU;
cinap_lenrek@7199 24
 typedef struct Mach	Mach;
cinap_lenrek@7199 25
 typedef struct Page	Page;
cinap_lenrek@7199 26
 typedef struct PhysUart	PhysUart;
cinap_lenrek@7199 27
 typedef struct PMMU	PMMU;
cinap_lenrek@7199 28
 typedef struct Proc	Proc;
cinap_lenrek@7199 29
 typedef u64int		PTE;
cinap_lenrek@7199 30
 typedef struct Soc	Soc;
cinap_lenrek@7199 31
 typedef struct Uart	Uart;
cinap_lenrek@7199 32
 typedef struct Ureg	Ureg;
cinap_lenrek@7199 33
 typedef uvlong		Tval;
cinap_lenrek@7199 34
 typedef void		KMap;
cinap_lenrek@7199 35
 
cinap_lenrek@7199 36
 #pragma incomplete Ureg
cinap_lenrek@7199 37
 
cinap_lenrek@7199 38
 #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
cinap_lenrek@7199 39
 
cinap_lenrek@7199 40
 /*
cinap_lenrek@7199 41
  *  parameters for sysproc.c
cinap_lenrek@7199 42
  */
cinap_lenrek@7199 43
 #define AOUT_MAGIC	(R_MAGIC)
cinap_lenrek@7199 44
 
cinap_lenrek@7199 45
 struct Lock
cinap_lenrek@7199 46
 {
cinap_lenrek@7199 47
 	ulong	key;
cinap_lenrek@7199 48
 	u32int	sr;
cinap_lenrek@7199 49
 	uintptr	pc;
cinap_lenrek@7199 50
 	Proc*	p;
cinap_lenrek@7199 51
 	Mach*	m;
cinap_lenrek@7199 52
 	int	isilock;
cinap_lenrek@7199 53
 };
cinap_lenrek@7199 54
 
cinap_lenrek@7199 55
 struct Label
cinap_lenrek@7199 56
 {
cinap_lenrek@7199 57
 	uintptr	sp;
cinap_lenrek@7199 58
 	uintptr	pc;
cinap_lenrek@7199 59
 };
cinap_lenrek@7199 60
 
cinap_lenrek@7199 61
 struct FPsave
cinap_lenrek@7199 62
 {
cinap_lenrek@7199 63
 	uvlong	regs[32][2];
cinap_lenrek@7199 64
 
cinap_lenrek@7199 65
 	ulong	control;
cinap_lenrek@7199 66
 	ulong	status;
cinap_lenrek@7199 67
 };
cinap_lenrek@7199 68
 
cinap_lenrek@7199 69
 struct PFPU
cinap_lenrek@7199 70
 {
cinap_lenrek@7199 71
 	FPsave	fpsave[1];
cinap_lenrek@7199 72
 
cinap_lenrek@7199 73
 	int	fpstate;
cinap_lenrek@7199 74
 };
cinap_lenrek@7199 75
 
cinap_lenrek@7199 76
 enum
cinap_lenrek@7199 77
 {
cinap_lenrek@7199 78
 	FPinit,
cinap_lenrek@7199 79
 	FPactive,
cinap_lenrek@7199 80
 	FPinactive,
cinap_lenrek@7199 81
 
cinap_lenrek@7199 82
 	/* bits or'd with the state */
cinap_lenrek@7199 83
 	FPillegal= 0x100,
cinap_lenrek@7199 84
 };
cinap_lenrek@7199 85
 
cinap_lenrek@7199 86
 struct Confmem
cinap_lenrek@7199 87
 {
cinap_lenrek@7199 88
 	uintptr	base;
cinap_lenrek@7199 89
 	usize	npage;
cinap_lenrek@7199 90
 	uintptr	limit;
cinap_lenrek@7199 91
 	uintptr	kbase;
cinap_lenrek@7199 92
 	uintptr	klimit;
cinap_lenrek@7199 93
 };
cinap_lenrek@7199 94
 
cinap_lenrek@7199 95
 struct Conf
cinap_lenrek@7199 96
 {
cinap_lenrek@7199 97
 	ulong	nmach;		/* processors */
cinap_lenrek@7199 98
 	ulong	nproc;		/* processes */
cinap_lenrek@7199 99
 	Confmem	mem[1];		/* physical memory */
cinap_lenrek@7199 100
 	ulong	npage;		/* total physical pages of memory */
cinap_lenrek@7199 101
 	usize	upages;		/* user page pool */
cinap_lenrek@7199 102
 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
cinap_lenrek@7199 103
 	ulong	ialloc;		/* max interrupt time allocation in bytes */
cinap_lenrek@7199 104
 	ulong	pipeqsize;	/* size in bytes of pipe queues */
cinap_lenrek@7199 105
 	ulong	nimage;		/* number of page cache image headers */
cinap_lenrek@7199 106
 	ulong	nswap;		/* number of swap pages */
cinap_lenrek@7199 107
 	int	nswppo;		/* max # of pageouts per segment pass */
cinap_lenrek@7199 108
 	ulong	hz;		/* processor cycle freq */
cinap_lenrek@7199 109
 	ulong	mhz;
cinap_lenrek@7199 110
 	int	monitor;	/* flag */
cinap_lenrek@7199 111
 };
cinap_lenrek@7199 112
 
cinap_lenrek@7199 113
 /*
cinap_lenrek@7199 114
  *  MMU stuff in Mach.
cinap_lenrek@7199 115
  */
cinap_lenrek@7199 116
 struct MMMU
cinap_lenrek@7199 117
 {
cinap_lenrek@7199 118
 	PTE*	mmul1;		/* l1 for this processor */
cinap_lenrek@7199 119
 };
cinap_lenrek@7199 120
 
cinap_lenrek@7199 121
 /*
cinap_lenrek@7199 122
  *  MMU stuff in proc
cinap_lenrek@7199 123
  */
cinap_lenrek@7199 124
 #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
cinap_lenrek@7199 125
 
cinap_lenrek@7199 126
 struct PMMU
cinap_lenrek@7199 127
 {
cinap_lenrek@7199 128
 	Page*	mmul1;
cinap_lenrek@7199 129
 	Page*	mmul1tail;
cinap_lenrek@7199 130
 
cinap_lenrek@7199 131
 	Page*	mmul2;
cinap_lenrek@7199 132
 	Page*	mmul2tail;
cinap_lenrek@7199 133
 
cinap_lenrek@7199 134
 	Page*	mmufree;
cinap_lenrek@7199 135
 
cinap_lenrek@7199 136
 	int	asid;
cinap_lenrek@7199 137
 
cinap_lenrek@7199 138
 	uintptr	tpidr;
cinap_lenrek@7199 139
 };
cinap_lenrek@7199 140
 
cinap_lenrek@7199 141
 #include "../port/portdat.h"
cinap_lenrek@7199 142
 
cinap_lenrek@7199 143
 struct Mach
cinap_lenrek@7199 144
 {
cinap_lenrek@7199 145
 	int	machno;			/* physical id of processor */
cinap_lenrek@7199 146
 	uintptr	splpc;			/* pc of last caller to splhi */
cinap_lenrek@7199 147
 
cinap_lenrek@7199 148
 	Proc*	proc;			/* current process */
cinap_lenrek@7199 149
 
cinap_lenrek@7199 150
 	MMMU;
cinap_lenrek@7199 151
 	int	flushmmu;		/* flush current proc mmu state */
cinap_lenrek@7199 152
 
cinap_lenrek@7199 153
 	ulong	ticks;			/* of the clock since boot time */
cinap_lenrek@7199 154
 	Label	sched;			/* scheduler wakeup */
cinap_lenrek@7199 155
 	Lock	alarmlock;		/* access to alarm list */
cinap_lenrek@7199 156
 	void*	alarm;			/* alarms bound to this clock */
cinap_lenrek@7199 157
 
cinap_lenrek@7199 158
 	Proc*	readied;		/* for runproc */
cinap_lenrek@7199 159
 	ulong	schedticks;		/* next forced context switch */
cinap_lenrek@7199 160
 
cinap_lenrek@7199 161
 	int	cputype;
cinap_lenrek@7199 162
 	ulong	delayloop;
cinap_lenrek@7199 163
 
cinap_lenrek@7199 164
 	/* stats */
cinap_lenrek@7199 165
 	int	tlbfault;
cinap_lenrek@7199 166
 	int	tlbpurge;
cinap_lenrek@7199 167
 	int	pfault;
cinap_lenrek@7199 168
 	int	cs;
cinap_lenrek@7199 169
 	int	syscall;
cinap_lenrek@7199 170
 	int	load;
cinap_lenrek@7199 171
 	int	intr;
cinap_lenrek@7199 172
 	uvlong	fastclock;		/* last sampled value */
cinap_lenrek@7199 173
 	uvlong	inidle;			/* time spent in idlehands() */
cinap_lenrek@7199 174
 	ulong	spuriousintr;
cinap_lenrek@7199 175
 	int	lastintr;
cinap_lenrek@7199 176
 	int	ilockdepth;
cinap_lenrek@7199 177
 	Perf	perf;			/* performance counters */
cinap_lenrek@7199 178
 
cinap_lenrek@7199 179
 	int	cpumhz;
cinap_lenrek@7199 180
 	uvlong	cpuhz;			/* speed of cpu */
cinap_lenrek@7199 181
 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
cinap_lenrek@7199 182
 
cinap_lenrek@7199 183
 	int	stack[1];
cinap_lenrek@7199 184
 };
cinap_lenrek@7199 185
 
cinap_lenrek@7199 186
 struct
cinap_lenrek@7199 187
 {
cinap_lenrek@7199 188
 	char	machs[MAXMACH];		/* active CPUs */
cinap_lenrek@7199 189
 	int	exiting;		/* shutdown */
cinap_lenrek@7199 190
 }active;
cinap_lenrek@7199 191
 
cinap_lenrek@7199 192
 #define MACHP(n)	((Mach*)MACHADDR(n))
cinap_lenrek@7199 193
 
cinap_lenrek@7199 194
 extern register Mach* m;			/* R27 */
cinap_lenrek@7199 195
 extern register Proc* up;			/* R26 */
cinap_lenrek@7199 196
 extern int normalprint;
cinap_lenrek@7199 197
 
cinap_lenrek@7199 198
 /*
cinap_lenrek@7199 199
  *  a parsed plan9.ini line
cinap_lenrek@7199 200
  */
cinap_lenrek@7199 201
 #define NISAOPT		8
cinap_lenrek@7199 202
 
cinap_lenrek@7199 203
 struct ISAConf {
cinap_lenrek@7199 204
 	char	*type;
cinap_lenrek@7199 205
 	ulong	port;
cinap_lenrek@7199 206
 	int	irq;
cinap_lenrek@7199 207
 	ulong	dma;
cinap_lenrek@7199 208
 	ulong	mem;
cinap_lenrek@7199 209
 	ulong	size;
cinap_lenrek@7199 210
 	ulong	freq;
cinap_lenrek@7199 211
 
cinap_lenrek@7199 212
 	int	nopt;
cinap_lenrek@7199 213
 	char	*opt[NISAOPT];
cinap_lenrek@7199 214
 };
cinap_lenrek@7199 215
 
cinap_lenrek@7199 216
 /*
cinap_lenrek@7199 217
  * Horrid. But the alternative is 'defined'.
cinap_lenrek@7199 218
  */
cinap_lenrek@7199 219
 #ifdef _DBGC_
cinap_lenrek@7199 220
 #define DBGFLG		(dbgflg[_DBGC_])
cinap_lenrek@7199 221
 #else
cinap_lenrek@7199 222
 #define DBGFLG		(0)
cinap_lenrek@7199 223
 #endif /* _DBGC_ */
cinap_lenrek@7199 224
 
cinap_lenrek@7199 225
 int vflag;
cinap_lenrek@7199 226
 extern char dbgflg[256];
cinap_lenrek@7199 227
 
cinap_lenrek@7199 228
 #define dbgprint	print		/* for now */
cinap_lenrek@7199 229
 
cinap_lenrek@7199 230
 /*
cinap_lenrek@7199 231
  *  hardware info about a device
cinap_lenrek@7199 232
  */
cinap_lenrek@7199 233
 typedef struct {
cinap_lenrek@7199 234
 	ulong	port;
cinap_lenrek@7199 235
 	int	size;
cinap_lenrek@7199 236
 } Devport;
cinap_lenrek@7199 237
 
cinap_lenrek@7199 238
 struct DevConf
cinap_lenrek@7199 239
 {
cinap_lenrek@7199 240
 	ulong	intnum;			/* interrupt number */
cinap_lenrek@7199 241
 	char	*type;			/* card type, malloced */
cinap_lenrek@7199 242
 	int	nports;			/* Number of ports */
cinap_lenrek@7199 243
 	Devport	*ports;			/* The ports themselves */
cinap_lenrek@7199 244
 };
cinap_lenrek@7199 245
 
cinap_lenrek@7199 246
 struct Soc {			/* SoC dependent configuration */
cinap_lenrek@7199 247
 	ulong	dramsize;
cinap_lenrek@7199 248
 	uintptr	physio;
cinap_lenrek@7199 249
 	uintptr	busdram;
cinap_lenrek@7199 250
 	uintptr	busio;
cinap_lenrek@7199 251
 	uintptr	armlocal;
cinap_lenrek@7199 252
 	u32int	l1ptedramattrs;
cinap_lenrek@7199 253
 	u32int	l2ptedramattrs;
cinap_lenrek@7199 254
 };
cinap_lenrek@7199 255
 extern Soc soc;
cinap_lenrek@7199 256
 
cinap_lenrek@7199 257
 #define BUSUNKNOWN -1
cinap_lenrek@7199 258
 
cinap_lenrek@7199 259
 /*
cinap_lenrek@7199 260
  * GPIO
cinap_lenrek@7199 261
  */
cinap_lenrek@7199 262
 enum {
cinap_lenrek@7199 263
 	Input	= 0x0,
cinap_lenrek@7199 264
 	Output	= 0x1,
cinap_lenrek@7199 265
 	Alt0	= 0x4,
cinap_lenrek@7199 266
 	Alt1	= 0x5,
cinap_lenrek@7199 267
 	Alt2	= 0x6,
cinap_lenrek@7199 268
 	Alt3	= 0x7,
cinap_lenrek@7199 269
 	Alt4	= 0x3,
cinap_lenrek@7199 270
 	Alt5	= 0x2,
cinap_lenrek@7199 271
 };