changelog shortlog tags branches changeset files file revisions raw help

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

changeset 7234: fc141b91ed8a
parent: f80792d28e0e
child: 55d93e47a2de
author: cinap_lenrek@felloff.net
date: Mon, 13 May 2019 19:12:41 +0200
permissions: -rw-r--r--
description: bcm, bcm64: preserve memsize across reboots, avoid trashing atags while parsing cmdline

we override atag memory on reboot, so preserve
the memsize learned from atag as *maxmem plan9
variable. the global memsize variable is not
needed anymore.

avoid trashing the following atag when zero
terminating the cmdline string.

zero memory after plan9.ini variables.
cinap_lenrek@2323 1
 /*
cinap_lenrek@2323 2
  * Time.
cinap_lenrek@2323 3
  *
cinap_lenrek@2323 4
  * HZ should divide 1000 evenly, ideally.
cinap_lenrek@2323 5
  * 100, 125, 200, 250 and 333 are okay.
cinap_lenrek@2323 6
  */
cinap_lenrek@2323 7
 #define	HZ		100			/* clock frequency */
cinap_lenrek@2323 8
 #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
cinap_lenrek@2323 9
 #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
cinap_lenrek@2323 10
 
cinap_lenrek@2323 11
 enum {
cinap_lenrek@2323 12
 	Mhz	= 1000 * 1000,
cinap_lenrek@2323 13
 };
cinap_lenrek@2323 14
 
cinap_lenrek@2323 15
 typedef struct Conf	Conf;
cinap_lenrek@2323 16
 typedef struct Confmem	Confmem;
cinap_lenrek@2323 17
 typedef struct FPsave	FPsave;
cinap_lenrek@6211 18
 typedef struct PFPU	PFPU;
cinap_lenrek@2323 19
 typedef struct ISAConf	ISAConf;
cinap_lenrek@2323 20
 typedef struct Label	Label;
cinap_lenrek@2323 21
 typedef struct Lock	Lock;
cinap_lenrek@2323 22
 typedef struct Memcache	Memcache;
cinap_lenrek@2323 23
 typedef struct MMMU	MMMU;
cinap_lenrek@2323 24
 typedef struct Mach	Mach;
cinap_lenrek@2323 25
 typedef struct Page	Page;
cinap_lenrek@2323 26
 typedef struct PhysUart	PhysUart;
cinap_lenrek@2323 27
 typedef struct PMMU	PMMU;
cinap_lenrek@2323 28
 typedef struct Proc	Proc;
cinap_lenrek@2323 29
 typedef u32int		PTE;
cinap_lenrek@6832 30
 typedef struct Soc	Soc;
cinap_lenrek@2323 31
 typedef struct Uart	Uart;
cinap_lenrek@2323 32
 typedef struct Ureg	Ureg;
cinap_lenrek@2323 33
 typedef uvlong		Tval;
cinap_lenrek@2323 34
 
cinap_lenrek@2323 35
 #pragma incomplete Ureg
cinap_lenrek@2323 36
 
cinap_lenrek@2323 37
 #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
cinap_lenrek@2323 38
 
cinap_lenrek@2323 39
 /*
cinap_lenrek@2323 40
  *  parameters for sysproc.c
cinap_lenrek@2323 41
  */
cinap_lenrek@2323 42
 #define AOUT_MAGIC	(E_MAGIC)
cinap_lenrek@2323 43
 
cinap_lenrek@2323 44
 struct Lock
cinap_lenrek@2323 45
 {
cinap_lenrek@2323 46
 	ulong	key;
cinap_lenrek@2323 47
 	u32int	sr;
cinap_lenrek@2323 48
 	uintptr	pc;
cinap_lenrek@2323 49
 	Proc*	p;
cinap_lenrek@2323 50
 	Mach*	m;
cinap_lenrek@2323 51
 	int	isilock;
cinap_lenrek@2323 52
 };
cinap_lenrek@2323 53
 
cinap_lenrek@2323 54
 struct Label
cinap_lenrek@2323 55
 {
cinap_lenrek@2323 56
 	uintptr	sp;
cinap_lenrek@2323 57
 	uintptr	pc;
cinap_lenrek@2323 58
 };
cinap_lenrek@2323 59
 
cinap_lenrek@6211 60
 /*
cinap_lenrek@6211 61
  * emulated or vfp3 floating point
cinap_lenrek@6211 62
  */
cinap_lenrek@2323 63
 enum {
cinap_lenrek@2323 64
 	Maxfpregs	= 32,	/* could be 16 or 32, see Mach.fpnregs */
cinap_lenrek@2323 65
 	Nfpctlregs	= 16,
cinap_lenrek@2323 66
 };
cinap_lenrek@2323 67
 
cinap_lenrek@2323 68
 struct FPsave
cinap_lenrek@2323 69
 {
cinap_lenrek@2323 70
 	ulong	status;
cinap_lenrek@2323 71
 	ulong	control;
cinap_lenrek@2323 72
 	/*
cinap_lenrek@2323 73
 	 * vfp3 with ieee fp regs; uvlong is sufficient for hardware but
cinap_lenrek@2323 74
 	 * each must be able to hold an Internal from fpi.h for sw emulation.
cinap_lenrek@2323 75
 	 */
cinap_lenrek@2323 76
 	ulong	regs[Maxfpregs][3];
cinap_lenrek@2323 77
 
cinap_lenrek@2323 78
 	int	fpstate;
cinap_lenrek@2323 79
 	uintptr	pc;		/* of failed fp instr. */
cinap_lenrek@2323 80
 };
cinap_lenrek@2323 81
 
cinap_lenrek@6211 82
 struct PFPU
cinap_lenrek@6211 83
 {
cinap_lenrek@6211 84
 	int	fpstate;
cinap_lenrek@6211 85
 	FPsave	fpsave[1];
cinap_lenrek@6211 86
 };
cinap_lenrek@6211 87
 
cinap_lenrek@2323 88
 enum
cinap_lenrek@2323 89
 {
cinap_lenrek@2323 90
 	FPinit,
cinap_lenrek@2323 91
 	FPactive,
cinap_lenrek@2323 92
 	FPinactive,
cinap_lenrek@2323 93
 	FPemu,
cinap_lenrek@2323 94
 
cinap_lenrek@2323 95
 	/* bits or'd with the state */
cinap_lenrek@2323 96
 	FPillegal= 0x100,
cinap_lenrek@2323 97
 };
cinap_lenrek@2323 98
 
cinap_lenrek@2323 99
 struct Confmem
cinap_lenrek@2323 100
 {
cinap_lenrek@2323 101
 	uintptr	base;
cinap_lenrek@2323 102
 	usize	npage;
cinap_lenrek@2323 103
 	uintptr	limit;
cinap_lenrek@2323 104
 	uintptr	kbase;
cinap_lenrek@2323 105
 	uintptr	klimit;
cinap_lenrek@2323 106
 };
cinap_lenrek@2323 107
 
cinap_lenrek@2323 108
 struct Conf
cinap_lenrek@2323 109
 {
cinap_lenrek@2323 110
 	ulong	nmach;		/* processors */
cinap_lenrek@2323 111
 	ulong	nproc;		/* processes */
cinap_lenrek@2323 112
 	Confmem	mem[1];		/* physical memory */
cinap_lenrek@2323 113
 	ulong	npage;		/* total physical pages of memory */
cinap_lenrek@2323 114
 	usize	upages;		/* user page pool */
cinap_lenrek@2323 115
 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
cinap_lenrek@2323 116
 	ulong	ialloc;		/* max interrupt time allocation in bytes */
cinap_lenrek@2323 117
 	ulong	pipeqsize;	/* size in bytes of pipe queues */
cinap_lenrek@2323 118
 	ulong	nimage;		/* number of page cache image headers */
cinap_lenrek@2323 119
 	ulong	nswap;		/* number of swap pages */
cinap_lenrek@2323 120
 	int	nswppo;		/* max # of pageouts per segment pass */
cinap_lenrek@2323 121
 	ulong	hz;		/* processor cycle freq */
cinap_lenrek@2323 122
 	ulong	mhz;
cinap_lenrek@2323 123
 	int	monitor;	/* flag */
cinap_lenrek@2323 124
 };
cinap_lenrek@2323 125
 
cinap_lenrek@2323 126
 /*
cinap_lenrek@2323 127
  *  MMU stuff in Mach.
cinap_lenrek@2323 128
  */
cinap_lenrek@2323 129
 struct MMMU
cinap_lenrek@2323 130
 {
cinap_lenrek@2323 131
 	PTE*	mmul1;		/* l1 for this processor */
cinap_lenrek@2323 132
 	int	mmul1lo;
cinap_lenrek@2323 133
 	int	mmul1hi;
cinap_lenrek@2323 134
 	int	mmupid;
cinap_lenrek@2323 135
 };
cinap_lenrek@2323 136
 
cinap_lenrek@2323 137
 /*
cinap_lenrek@2323 138
  *  MMU stuff in proc
cinap_lenrek@2323 139
  */
cinap_lenrek@2323 140
 #define NCOLOR	1		/* 1 level cache, don't worry about VCE's */
cinap_lenrek@2323 141
 struct PMMU
cinap_lenrek@2323 142
 {
cinap_lenrek@2323 143
 	Page*	mmul2;
cinap_lenrek@2323 144
 	Page*	mmul2cache;	/* free mmu pages */
cinap_lenrek@2323 145
 };
cinap_lenrek@2323 146
 
cinap_lenrek@2323 147
 #include "../port/portdat.h"
cinap_lenrek@2323 148
 
cinap_lenrek@2323 149
 struct Mach
cinap_lenrek@2323 150
 {
cinap_lenrek@2323 151
 	int	machno;			/* physical id of processor */
cinap_lenrek@2323 152
 	uintptr	splpc;			/* pc of last caller to splhi */
cinap_lenrek@2323 153
 
cinap_lenrek@2323 154
 	Proc*	proc;			/* current process */
cinap_lenrek@2323 155
 
cinap_lenrek@2323 156
 	MMMU;
cinap_lenrek@2323 157
 	int	flushmmu;		/* flush current proc mmu state */
cinap_lenrek@2323 158
 
cinap_lenrek@2323 159
 	ulong	ticks;			/* of the clock since boot time */
cinap_lenrek@2323 160
 	Label	sched;			/* scheduler wakeup */
cinap_lenrek@2323 161
 	Lock	alarmlock;		/* access to alarm list */
cinap_lenrek@2323 162
 	void*	alarm;			/* alarms bound to this clock */
cinap_lenrek@2323 163
 
cinap_lenrek@2323 164
 	Proc*	readied;		/* for runproc */
cinap_lenrek@2323 165
 	ulong	schedticks;		/* next forced context switch */
cinap_lenrek@2323 166
 
cinap_lenrek@2323 167
 	int	cputype;
cinap_lenrek@2323 168
 	ulong	delayloop;
cinap_lenrek@2323 169
 
cinap_lenrek@2323 170
 	/* stats */
cinap_lenrek@2323 171
 	int	tlbfault;
cinap_lenrek@2323 172
 	int	tlbpurge;
cinap_lenrek@2323 173
 	int	pfault;
cinap_lenrek@2323 174
 	int	cs;
cinap_lenrek@2323 175
 	int	syscall;
cinap_lenrek@2323 176
 	int	load;
cinap_lenrek@2323 177
 	int	intr;
cinap_lenrek@2323 178
 	uvlong	fastclock;		/* last sampled value */
cinap_lenrek@2323 179
 	uvlong	inidle;			/* time spent in idlehands() */
cinap_lenrek@2323 180
 	ulong	spuriousintr;
cinap_lenrek@2323 181
 	int	lastintr;
cinap_lenrek@2323 182
 	int	ilockdepth;
cinap_lenrek@2323 183
 	Perf	perf;			/* performance counters */
cinap_lenrek@2323 184
 
cinap_lenrek@2323 185
 
cinap_lenrek@2323 186
 	int	cpumhz;
cinap_lenrek@2323 187
 	uvlong	cpuhz;			/* speed of cpu */
cinap_lenrek@2323 188
 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
cinap_lenrek@2323 189
 
cinap_lenrek@2323 190
 	/* vfp2 or vfp3 fpu */
cinap_lenrek@2323 191
 	int	havefp;
cinap_lenrek@2323 192
 	int	havefpvalid;
cinap_lenrek@2323 193
 	int	fpon;
cinap_lenrek@2323 194
 	int	fpconfiged;
cinap_lenrek@2323 195
 	int	fpnregs;
cinap_lenrek@2323 196
 	ulong	fpscr;			/* sw copy */
cinap_lenrek@2323 197
 	int	fppid;			/* pid of last fault */
cinap_lenrek@2323 198
 	uintptr	fppc;			/* addr of last fault */
cinap_lenrek@2323 199
 	int	fpcnt;			/* how many consecutive at that addr */
cinap_lenrek@2323 200
 
cinap_lenrek@2323 201
 	/* save areas for exceptions, hold R0-R4 */
cinap_lenrek@2323 202
 	u32int	sfiq[5];
cinap_lenrek@2323 203
 	u32int	sirq[5];
cinap_lenrek@2323 204
 	u32int	sund[5];
cinap_lenrek@2323 205
 	u32int	sabt[5];
cinap_lenrek@2323 206
 	u32int	smon[5];		/* probably not needed */
cinap_lenrek@2323 207
 	u32int	ssys[5];
cinap_lenrek@2323 208
 
cinap_lenrek@2323 209
 	int	stack[1];
cinap_lenrek@2323 210
 };
cinap_lenrek@2323 211
 
cinap_lenrek@2323 212
 /*
cinap_lenrek@2323 213
  * Fake kmap.
cinap_lenrek@2323 214
  */
cinap_lenrek@2323 215
 typedef void		KMap;
cinap_lenrek@2323 216
 #define	VA(k)		((uintptr)(k))
cinap_lenrek@2323 217
 #define	kmap(p)		(KMap*)((p)->pa|kseg0)
cinap_lenrek@6832 218
 extern void kunmap(KMap*);
cinap_lenrek@2323 219
 
cinap_lenrek@2323 220
 struct
cinap_lenrek@2323 221
 {
cinap_lenrek@5034 222
 	char	machs[MAXMACH];		/* active CPUs */
cinap_lenrek@2323 223
 	int	exiting;		/* shutdown */
cinap_lenrek@2323 224
 }active;
cinap_lenrek@2323 225
 
cinap_lenrek@2323 226
 extern register Mach* m;			/* R10 */
cinap_lenrek@2323 227
 extern register Proc* up;			/* R9 */
cinap_lenrek@2323 228
 extern uintptr kseg0;
cinap_lenrek@2323 229
 extern Mach* machaddr[MAXMACH];
cinap_lenrek@2323 230
 extern int normalprint;
cinap_lenrek@2323 231
 
cinap_lenrek@2323 232
 /*
cinap_lenrek@2323 233
  *  a parsed plan9.ini line
cinap_lenrek@2323 234
  */
cinap_lenrek@2323 235
 #define NISAOPT		8
cinap_lenrek@2323 236
 
cinap_lenrek@2323 237
 struct ISAConf {
cinap_lenrek@2323 238
 	char	*type;
cinap_lenrek@2323 239
 	ulong	port;
cinap_lenrek@2323 240
 	int	irq;
cinap_lenrek@2323 241
 	ulong	dma;
cinap_lenrek@2323 242
 	ulong	mem;
cinap_lenrek@2323 243
 	ulong	size;
cinap_lenrek@2323 244
 	ulong	freq;
cinap_lenrek@2323 245
 
cinap_lenrek@2323 246
 	int	nopt;
cinap_lenrek@2323 247
 	char	*opt[NISAOPT];
cinap_lenrek@2323 248
 };
cinap_lenrek@2323 249
 
cinap_lenrek@2323 250
 #define	MACHP(n)	(machaddr[n])
cinap_lenrek@2323 251
 
cinap_lenrek@2323 252
 /*
cinap_lenrek@2323 253
  * Horrid. But the alternative is 'defined'.
cinap_lenrek@2323 254
  */
cinap_lenrek@2323 255
 #ifdef _DBGC_
cinap_lenrek@2323 256
 #define DBGFLG		(dbgflg[_DBGC_])
cinap_lenrek@2323 257
 #else
cinap_lenrek@2323 258
 #define DBGFLG		(0)
cinap_lenrek@2323 259
 #endif /* _DBGC_ */
cinap_lenrek@2323 260
 
cinap_lenrek@2323 261
 int vflag;
cinap_lenrek@2323 262
 extern char dbgflg[256];
cinap_lenrek@2323 263
 
cinap_lenrek@2323 264
 #define dbgprint	print		/* for now */
cinap_lenrek@2323 265
 
cinap_lenrek@2323 266
 /*
cinap_lenrek@2323 267
  *  hardware info about a device
cinap_lenrek@2323 268
  */
cinap_lenrek@2323 269
 typedef struct {
cinap_lenrek@2323 270
 	ulong	port;
cinap_lenrek@2323 271
 	int	size;
cinap_lenrek@2323 272
 } Devport;
cinap_lenrek@2323 273
 
cinap_lenrek@2323 274
 struct DevConf
cinap_lenrek@2323 275
 {
cinap_lenrek@2323 276
 	ulong	intnum;			/* interrupt number */
cinap_lenrek@2323 277
 	char	*type;			/* card type, malloced */
cinap_lenrek@2323 278
 	int	nports;			/* Number of ports */
cinap_lenrek@2323 279
 	Devport	*ports;			/* The ports themselves */
cinap_lenrek@2323 280
 };
cinap_lenrek@2323 281
 
cinap_lenrek@6832 282
 struct Soc {			/* SoC dependent configuration */
cinap_lenrek@6832 283
 	ulong	dramsize;
cinap_lenrek@6832 284
 	uintptr	physio;
cinap_lenrek@6832 285
 	uintptr	busdram;
cinap_lenrek@6832 286
 	uintptr	busio;
cinap_lenrek@6832 287
 	uintptr	armlocal;
cinap_lenrek@6832 288
 	u32int	l1ptedramattrs;
cinap_lenrek@6832 289
 	u32int	l2ptedramattrs;
cinap_lenrek@6832 290
 };
cinap_lenrek@6832 291
 extern Soc soc;
cinap_lenrek@6832 292
 
cinap_lenrek@6832 293
 #define BUSUNKNOWN -1
cinap_lenrek@6832 294
 
cinap_lenrek@6832 295
 /*
cinap_lenrek@6832 296
  * GPIO
cinap_lenrek@6832 297
  */
cinap_lenrek@6832 298
 enum {
cinap_lenrek@6832 299
 	Input	= 0x0,
cinap_lenrek@6832 300
 	Output	= 0x1,
cinap_lenrek@6832 301
 	Alt0	= 0x4,
cinap_lenrek@6832 302
 	Alt1	= 0x5,
cinap_lenrek@6832 303
 	Alt2	= 0x6,
cinap_lenrek@6832 304
 	Alt3	= 0x7,
cinap_lenrek@6832 305
 	Alt4	= 0x3,
cinap_lenrek@6832 306
 	Alt5	= 0x2,
cinap_lenrek@6832 307
 };