xref: /plan9/sys/src/9/kw/mem.h (revision 12009bff671a91993ae58f16dab833e809f4a6f3)
1154abd99SDavid du Colombier /*
2154abd99SDavid du Colombier  * Memory and machine-specific definitions.  Used in C and assembler.
3154abd99SDavid du Colombier  */
4154abd99SDavid du Colombier #define KiB		1024u			/* Kibi 0x0000000000000400 */
5154abd99SDavid du Colombier #define MiB		1048576u		/* Mebi 0x0000000000100000 */
6154abd99SDavid du Colombier #define GiB		1073741824u		/* Gibi 000000000040000000 */
7154abd99SDavid du Colombier 
8154abd99SDavid du Colombier /*
9154abd99SDavid du Colombier  * Not sure where these macros should go.
10154abd99SDavid du Colombier  * This probably isn't right but will do for now.
11154abd99SDavid du Colombier  * The macro names are problematic too.
12154abd99SDavid du Colombier  */
13154abd99SDavid du Colombier /*
14*12009bffSDavid du Colombier  * In BITN(o), 'o' is the bit offset in the register.
15154abd99SDavid du Colombier  * For multi-bit fields use F(v, o, w) where 'v' is the value
16154abd99SDavid du Colombier  * of the bit-field of width 'w' with LSb at bit offset 'o'.
17154abd99SDavid du Colombier  */
18*12009bffSDavid du Colombier #define BITN(o)		(1<<(o))
19154abd99SDavid du Colombier #define F(v, o, w)	(((v) & ((1<<(w))-1))<<(o))
20154abd99SDavid du Colombier 
21154abd99SDavid du Colombier /*
22154abd99SDavid du Colombier  * Sizes
23154abd99SDavid du Colombier  */
24b1c4f505SDavid du Colombier #define	BY2PG		(4*KiB)			/* bytes per page */
25b1c4f505SDavid du Colombier #define	PGSHIFT		12			/* log(BY2PG) */
26154abd99SDavid du Colombier 
27154abd99SDavid du Colombier #define	MAXMACH		1			/* max # cpus system can run */
28b1c4f505SDavid du Colombier #define	MACHSIZE	BY2PG
29154abd99SDavid du Colombier 
30154abd99SDavid du Colombier #define KSTKSIZE	(8*KiB)
31154abd99SDavid du Colombier #define STACKALIGN(sp)	((sp) & ~3)		/* bug: assure with alloc */
32154abd99SDavid du Colombier 
33154abd99SDavid du Colombier /*
34154abd99SDavid du Colombier  * Address spaces.
35154abd99SDavid du Colombier  * KTZERO is used by kprof and dumpstack (if any).
36154abd99SDavid du Colombier  *
37154abd99SDavid du Colombier  * KZERO is mapped to physical 0.
38154abd99SDavid du Colombier  * u-boot claims to take 0 - 8MB.
39154abd99SDavid du Colombier  *
40b72bcbbfSDavid du Colombier  * vectors are at 0, plan9.ini is at KZERO+4K and is limited to 16K by
41b72bcbbfSDavid du Colombier  * devenv.  L2 PTEs for trap vectors & i/o regs are stored from KZERO+56K
42b72bcbbfSDavid du Colombier  * to L1-MACHSIZE (KZERO+60K).  cpu0's Mach struct is at L1 - MACHSIZE(4K)
43b72bcbbfSDavid du Colombier  * to L1 (KZERO+60K to KZERO+64K).  L1 PTEs are stored from L1 to L1+32K
44b72bcbbfSDavid du Colombier  * (KZERO+64K to KZERO+96K).  KTZERO may be anywhere after KZERO+96K.
45154abd99SDavid du Colombier  */
46154abd99SDavid du Colombier 
47154abd99SDavid du Colombier #define	KSEG0		0x60000000		/* kernel segment */
488a12d8dfSDavid du Colombier /* mask to check segment; good for 512MB dram */
498a12d8dfSDavid du Colombier #define	KSEGM		0xE0000000
50154abd99SDavid du Colombier #define	KZERO		KSEG0			/* kernel address space */
51b72bcbbfSDavid du Colombier #define CONFADDR	(KZERO+4*KiB)		/* unparsed plan9.ini */
52b72bcbbfSDavid du Colombier #define L1		(KZERO+64*KiB)		/* tt ptes: 16KiB aligned */
53154abd99SDavid du Colombier #define	KTZERO		(KZERO+0x800000)	/* kernel text start */
54154abd99SDavid du Colombier 
55154abd99SDavid du Colombier #define	UZERO		0			/* user segment */
56154abd99SDavid du Colombier #define	UTZERO		(UZERO+BY2PG)		/* user text start */
57*12009bffSDavid du Colombier #define UTROUND(t)	ROUNDUP((t), BY2PG)
58154abd99SDavid du Colombier #define	USTKTOP		KZERO			/* user segment end +1 */
59154abd99SDavid du Colombier #define	USTKSIZE	(8*1024*1024)		/* user stack size */
60154abd99SDavid du Colombier #define	TSTKTOP		(USTKTOP-USTKSIZE)	/* sysexec temporary stack */
61154abd99SDavid du Colombier #define	TSTKSIZ	 	256
62154abd99SDavid du Colombier 
638a12d8dfSDavid du Colombier /* address at which to copy and execute rebootcode */
648a12d8dfSDavid du Colombier #define	REBOOTADDR	KADDR(0x100)
658a12d8dfSDavid du Colombier 
66154abd99SDavid du Colombier /*
67154abd99SDavid du Colombier  * Time.
68154abd99SDavid du Colombier  * Does this need to be here? Used in assembler?
69154abd99SDavid du Colombier  */
70154abd99SDavid du Colombier #define	HZ		100			/* clock frequency */
71154abd99SDavid du Colombier #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
72154abd99SDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
73154abd99SDavid du Colombier 
74154abd99SDavid du Colombier /*
75154abd99SDavid du Colombier  * More accurate time
76154abd99SDavid du Colombier  */
77154abd99SDavid du Colombier #define CLOCKFREQ	(200*1000*1000)		/* TCLK on sheeva: 200MHz */
78154abd99SDavid du Colombier //#define MS2TMR(t)	((ulong)(((uvlong)(t)*CLOCKFREQ)/1000))
79154abd99SDavid du Colombier //#define US2TMR(t)	((ulong)(((uvlong)(t)*CLOCKFREQ)/1000000))
80154abd99SDavid du Colombier 
81154abd99SDavid du Colombier /*
82154abd99SDavid du Colombier  * Legacy...
83154abd99SDavid du Colombier  */
84154abd99SDavid du Colombier #define BLOCKALIGN	32			/* only used in allocb.c */
85154abd99SDavid du Colombier #define KSTACK		KSTKSIZE
86154abd99SDavid du Colombier 
87154abd99SDavid du Colombier /*
88154abd99SDavid du Colombier  * Sizes
89154abd99SDavid du Colombier  */
90154abd99SDavid du Colombier #define BI2BY		8			/* bits per byte */
91154abd99SDavid du Colombier #define BY2SE		4
92154abd99SDavid du Colombier #define BY2WD		4
93154abd99SDavid du Colombier #define BY2V		8			/* only used in xalloc.c */
94154abd99SDavid du Colombier 
95ffc08dc1SDavid du Colombier #define CACHELINESZ	32
96154abd99SDavid du Colombier #define	PTEMAPMEM	(1024*1024)
97154abd99SDavid du Colombier #define	PTEPERTAB	(PTEMAPMEM/BY2PG)
98154abd99SDavid du Colombier #define	SEGMAPSIZE	1984
99154abd99SDavid du Colombier #define	SSEGMAPSIZE	16
100154abd99SDavid du Colombier #define	PPN(x)		((x)&~(BY2PG-1))
101154abd99SDavid du Colombier 
102154abd99SDavid du Colombier /*
103154abd99SDavid du Colombier  * With a little work these move to port.
104154abd99SDavid du Colombier  */
105154abd99SDavid du Colombier #define	PTEVALID	(1<<0)
106154abd99SDavid du Colombier #define	PTERONLY	0
107154abd99SDavid du Colombier #define	PTEWRITE	(1<<1)
108154abd99SDavid du Colombier #define	PTEUNCACHED	(1<<2)
109154abd99SDavid du Colombier #define PTEKERNEL	(1<<3)
110154abd99SDavid du Colombier 
111154abd99SDavid du Colombier /*
112154abd99SDavid du Colombier  * Physical machine information from here on.
113154abd99SDavid du Colombier  */
114154abd99SDavid du Colombier #define PHYSDRAM	0
1159f2e9820SDavid du Colombier 
116003c0964SDavid du Colombier /* from 0x80000000 up is uncached by L2 (see archkw.c) */
1177bc319fbSDavid du Colombier #define PHYSCESASRAM	0xc8010000
118409b3affSDavid du Colombier #define PHYSNAND2	0xd8000000		/* guru */
119409b3affSDavid du Colombier #define PHYSSPIFLASH	0xe8000000		/* optional spi flash (dream) */
1208a12d8dfSDavid du Colombier /* this address is configured by u-boot, and is 0xd0000000 at reset */
1218a12d8dfSDavid du Colombier #define PHYSIO		0xf1000000		/* internal registers */
1228a12d8dfSDavid du Colombier #define PHYSCONS	(PHYSIO + 0x12000)	/* uart */
12306f6463aSDavid du Colombier #define PHYSNAND1	0xf9000000		/* sheeva/openrd (remapped) */
1249f2e9820SDavid du Colombier #define PHYSBOOTROM	0xffff0000		/* boot rom */
1259f2e9820SDavid du Colombier 
126154abd99SDavid du Colombier #define VIRTIO		PHYSIO
127