summaryrefslogtreecommitdiff
path: root/cpu/amd/geode_lx/gplvsa_ii/sysmgr/sysmgr.h
blob: 1d84b33cd9d1238aa1c2ba852c166294c2b71727 (plain)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
* Copyright (c) 2006-2008 Advanced Micro Devices,Inc. ("AMD").
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.

* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA 
*/



// Build flags for various optional features
#define HISTORY		0	// History support (value determines size of history buffer; 0=disabled)
#define CHECKED_BUILD		1	// Perform internal sanity checks

#define SUPPORT_CAPABILITIES	1	// Enables support for PCI capabilities list
#define SUPPORT_PRIORITY	0	// Enables message priority logic
#define SUPPORT_FS2		1	// Enables MBIU1 descriptors so FS2 sees same map as GX2

#define USB_FIX		0	// 0=none 1=old 2=new
#define MAX_INT		0x1B	// Maximum INT vector supported for BIOS callbacks


#define SYS_YIELD		0x40000000L	 // Must be >= bit 24

#define DBG_PORT		0x84
#define VSA_POST		0x84		// I/O port for VSA POST codes

#define EXTRA_SAVE		4		// State saved other than registers
#define VSM_STACK_FRAME	(8*4+EXTRA_SAVE)// PUSHAD + EXTRA_SAVE

#define SPECIAL_LOC		0xA80		// Determines depth of SysMgr's stack
#define STACK_OFFSET		0x94	// Should be: EndSaveArea - StartSaveArea
#define SYSMGRS_STACK		(SPECIAL_LOC-STACK_OFFSET)

#define MAX_REGISTRATIONS	100		// # entries in Events[]

// VSM specific definitions
#define CODE_ATTR		0x9B
#define DATA_ATTR		0x93
#define VSM_CR0		0x00000014
#define VSM_EFLAGS		0x00000002
#define VSM_DR7		0x00000400
#define VSM_STACK_SIZE		0x300		// Size of allocated stack in bytes
#define BIOS_STACK_SIZE	0x100

// VSM States
#define RUN_FLAG_INACTIVE	0x00		// VSM is idle
#define RUN_FLAG_SLEEPING	0x55		// VSM is in Standby/Suspend
#define RUN_FLAG_ACTIVE	0xAA		// VSM is running or scheduled to run
#define RUN_FLAG_WAITING	0xEE		// VSM has yielded control
#define RUN_FLAG_BLOCKED	0xBB		// VSM is blocked
#define RUN_FLAG_READY		0x77		// VSM is ready to execute


// System calls
#define SYS_CODE_EVENT		0x0000		// Event registration
#define SYS_CODE_YIELD		0x0001		// VSM is yielding control
#define SYS_CODE_SW_INT	0x0002		// Software Interrupt (INT xx)
#define SYS_CODE_PASS_EVENT	0x0003		// VSM did not handle an event
#define SYS_CODE_UNLOAD	0x0004		// Unload VSM
#define SYS_CODE_REGISTER	0x0005		// Get/Set special registers
#define SYS_CODE_PCI_ACCESS	0x0006		// Access a PCI dword with trapping disabled
#define SYS_CODE_SET_VIRTUAL	0x0007		// Set virtual register
#define SYS_CODE_GET_VIRTUAL	0x0008		// Get virtual register
#define SYS_CODE_BROADCAST	0x0009		// Broadcast a message to one or more VSMs
#define SYS_CODE_STATE		0x000A		// Save/Restore non-SMM state
#define SYS_CODE_ERROR		0x000B		// Report error
#define SYS_CODE_RESOURCE	0x000C		// Reserve resource
#define SYS_CODE_DECODE	0x000D		// Set resource to be subtractive/positive decode
#define SYS_CODE_DESCRIPTOR	0x000E		// Get descriptor of virtualized PCI BAR
#define SYS_CODE_LOOKUP	0x000F		// Lookup routing for MBus device
#define SYS_CODE_IRQ_MAPPER	0x0010		// Set IRQ mapping (CS5535 only)
#define SYS_CODE_RESULT	0x0011		// Return virtualized result
#define SYS_CODE_DUPLICATE	0x0012		// Duplicate a VSM
#define SYS_CODE_EXIT		0x0013		// Exit to System Manager

#define GET_REG		0x80
#define SET_REG		0x81
#define GET_HDR		0x82
#define SET_HDR		0x83
#define GET_DESCR		0x84
#define SET_DESCR		0x85


// Fields in SMM header flag
#define SMI_FLAGS_CS_WRITABLE	0x0001		// "Cw" bit  CS is writable
#define SMI_FLAGS_OUTPUT       0x0002		// "I" bit   I/O indicator
#define SMI_FLAGS_REP          0x0004		// "P" bit   REP indicator
#define SMI_FLAGS_SMINT        0x0008		// "S" bit	 SMI occured due to a SMINT
#define SMI_FLAGS_HALT         0x0010		// "H" bit   SMI occured during CPU halt
#define SMI_FLAGS_MEMORY       0x0020		// "M" bit   0=I/O, 1=memory
#define SMI_FLAGS_EXT	        0x0040		// "X" bit   External SMI source
#define SMI_FLAGS_VGA          0x0080		// "V" bit   VGA emulation source
#define SMI_FLAGS_NESTED       0x0100		// "N" bit   Nested SMI
#define SMI_FLAGS_CS_READABLE  0x8000		// "Cr" bit  CS is writable




typedef void (* SMI_Handler)(void);

typedef struct {
  SMI_Handler Handler;
  unsigned long SMI_Mask;
} SMI_ENTRY;



typedef struct {
  unsigned long   Vsm;

  union {
    struct {
      unsigned long Param1;
      unsigned long Param2;
      unsigned long Param3;
	};
	struct {		// Timers
      unsigned long Interval;
      unsigned short Handle;
      unsigned char Timer;
      unsigned char Attr;
      unsigned long RemainingInterval;
    };
	struct {		// GPIOs
	  unsigned short Pin;
	  unsigned short Pme;
	  unsigned short Attributes;
	  unsigned short Pm1;
	  unsigned long CurrentEdge;
    };
	struct {		// PCI header
	  unsigned short PCI_Addr;
	  unsigned short Unused;
	  unsigned short PCI_Mask;
	  unsigned short Flags;
    };
	struct {		// I/O trap & timeout
	  unsigned short IO_Base;
	  unsigned short IO_Timeout;
	  unsigned short IO_Range;
    };
	struct {		// Virtual Register
      unsigned long ClassLow;
      unsigned long ClassHigh;
    };

  };

  unsigned long Timestamp[2];
  unsigned char Index;
  unsigned char Link;
  unsigned short Priority;
} EVENT_ENTRY;

typedef struct {
  unsigned long Vsm;
  unsigned long Event;
  unsigned long Param1;
  unsigned long Param2;
  unsigned long Count;
  unsigned long TimeStamp[2];
} EVENT_HISTORY;


typedef struct {
  unsigned short History_Array;
  int * History_Start;
  int * History_End;
  int * History_Wrap;
  unsigned short HistoryEntries;
} HISTORY_INFO;
  






//
// An instance of this structure is found in the System Manager at offset SPECIAL_LOC
//
typedef struct {
  unsigned short Events;		// Events array
  unsigned short Descriptors;		// MBus Descriptors array
  unsigned short Vectors;		// INT vectors
  unsigned short HardwareInfo;		// Hardware structure
  unsigned long  IRQ_Base;		// Used by SYS_GENERATE_IRQ
  unsigned long  IRQ_Mask;		// Used by SYS_GENERATE_IRQ
  unsigned long  SysMgr_VSM;		// Used in SysMgr only
  unsigned long  SMI_Base;		// Used in SysMgr only
  unsigned short Header_Addr;		// Used in SysMgr only
  unsigned short SysMgr_Stack;		// Used in SysMgr only
  unsigned short MSRs;			// Used for DOS_BUILD
  unsigned short NumDescrs;		// Used for DOS_BUILD
} InfoStuff;