Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
platform
uv
bios_uv.c
Go to the documentation of this file.
1
/*
2
* BIOS run time interface routines.
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*
18
* Copyright (c) 2008-2009 Silicon Graphics, Inc. All Rights Reserved.
19
* Copyright (c) Russ Anderson <
[email protected]
>
20
*/
21
22
#include <
linux/efi.h
>
23
#include <linux/export.h>
24
#include <
asm/efi.h
>
25
#include <
linux/io.h
>
26
#include <
asm/uv/bios.h
>
27
#include <asm/uv/uv_hub.h>
28
29
static
struct
uv_systab
uv_systab
;
30
31
s64
uv_bios_call
(
enum
uv_bios_cmd
which,
u64
a1
,
u64
a2
,
u64
a3
,
u64
a4
,
u64
a5
)
32
{
33
struct
uv_systab
*tab = &
uv_systab
;
34
s64
ret
;
35
36
if
(!tab->
function
)
37
/*
38
* BIOS does not support UV systab
39
*/
40
return
BIOS_STATUS_UNIMPLEMENTED
;
41
42
ret =
efi_call6
((
void
*)
__va
(tab->
function
), (
u64
)which,
43
a1, a2, a3, a4, a5);
44
return
ret
;
45
}
46
EXPORT_SYMBOL_GPL
(
uv_bios_call
);
47
48
s64
uv_bios_call_irqsave
(
enum
uv_bios_cmd
which,
u64
a1
,
u64
a2
,
u64
a3
,
49
u64
a4
,
u64
a5
)
50
{
51
unsigned
long
bios_flags;
52
s64
ret
;
53
54
local_irq_save
(bios_flags);
55
ret =
uv_bios_call
(which, a1, a2, a3, a4, a5);
56
local_irq_restore
(bios_flags);
57
58
return
ret
;
59
}
60
61
s64
uv_bios_call_reentrant
(
enum
uv_bios_cmd
which,
u64
a1
,
u64
a2
,
u64
a3
,
62
u64
a4
,
u64
a5
)
63
{
64
s64
ret
;
65
66
preempt_disable
();
67
ret =
uv_bios_call
(which, a1, a2, a3, a4, a5);
68
preempt_enable
();
69
70
return
ret
;
71
}
72
73
74
long
sn_partition_id
;
75
EXPORT_SYMBOL_GPL
(
sn_partition_id
);
76
long
sn_coherency_id
;
77
EXPORT_SYMBOL_GPL
(
sn_coherency_id
);
78
long
sn_region_size
;
79
EXPORT_SYMBOL_GPL
(
sn_region_size
);
80
long
system_serial_number
;
81
EXPORT_SYMBOL_GPL
(
system_serial_number
);
82
int
uv_type
;
83
EXPORT_SYMBOL_GPL
(
uv_type
);
84
85
86
s64
uv_bios_get_sn_info
(
int
fc
,
int
*uvtype,
long
*
partid
,
long
*coher,
87
long
*
region
,
long
*
ssn
)
88
{
89
s64
ret
;
90
u64
v0
,
v1
;
91
union
partition_info_u
part;
92
93
ret =
uv_bios_call_irqsave
(
UV_BIOS_GET_SN_INFO
, fc,
94
(
u64
)(&v0), (
u64
)(&v1), 0, 0);
95
if
(ret !=
BIOS_STATUS_SUCCESS
)
96
return
ret
;
97
98
part.
val
=
v0
;
99
if
(uvtype)
100
*uvtype = part.
hub_version
;
101
if
(partid)
102
*partid = part.
partition_id
;
103
if
(coher)
104
*coher = part.
coherence_id
;
105
if
(region)
106
*region = part.
region_size
;
107
if
(ssn)
108
*ssn =
v1
;
109
return
ret
;
110
}
111
EXPORT_SYMBOL_GPL
(
uv_bios_get_sn_info
);
112
113
int
114
uv_bios_mq_watchlist_alloc
(
unsigned
long
addr
,
unsigned
int
mq_size,
115
unsigned
long
*intr_mmr_offset)
116
{
117
u64
watchlist;
118
s64
ret
;
119
120
/*
121
* bios returns watchlist number or negative error number.
122
*/
123
ret = (
int
)
uv_bios_call_irqsave
(
UV_BIOS_WATCHLIST_ALLOC
, addr,
124
mq_size, (
u64
)intr_mmr_offset,
125
(
u64
)&watchlist, 0);
126
if
(ret <
BIOS_STATUS_SUCCESS
)
127
return
ret
;
128
129
return
watchlist;
130
}
131
EXPORT_SYMBOL_GPL
(
uv_bios_mq_watchlist_alloc
);
132
133
int
134
uv_bios_mq_watchlist_free
(
int
blade,
int
watchlist_num)
135
{
136
return
(
int
)
uv_bios_call_irqsave
(
UV_BIOS_WATCHLIST_FREE
,
137
blade, watchlist_num, 0, 0, 0);
138
}
139
EXPORT_SYMBOL_GPL
(
uv_bios_mq_watchlist_free
);
140
141
s64
142
uv_bios_change_memprotect
(
u64
paddr
,
u64
len,
enum
uv_memprotect
perms)
143
{
144
return
uv_bios_call_irqsave
(
UV_BIOS_MEMPROTECT
, paddr, len,
145
perms, 0, 0);
146
}
147
EXPORT_SYMBOL_GPL
(
uv_bios_change_memprotect
);
148
149
s64
150
uv_bios_reserved_page_pa
(
u64
buf
,
u64
*
cookie
,
u64
*
addr
,
u64
*len)
151
{
152
s64
ret
;
153
154
ret =
uv_bios_call_irqsave
(
UV_BIOS_GET_PARTITION_ADDR
, (
u64
)cookie,
155
(
u64
)addr, buf, (
u64
)len, 0);
156
return
ret
;
157
}
158
EXPORT_SYMBOL_GPL
(
uv_bios_reserved_page_pa
);
159
160
s64
uv_bios_freq_base
(
u64
clock_type,
u64
*ticks_per_second)
161
{
162
return
uv_bios_call
(
UV_BIOS_FREQ_BASE
, clock_type,
163
(
u64
)ticks_per_second, 0, 0, 0);
164
}
165
EXPORT_SYMBOL_GPL
(
uv_bios_freq_base
);
166
167
/*
168
* uv_bios_set_legacy_vga_target - Set Legacy VGA I/O Target
169
* @decode: true to enable target, false to disable target
170
* @domain: PCI domain number
171
* @bus: PCI bus number
172
*
173
* Returns:
174
* 0: Success
175
* -EINVAL: Invalid domain or bus number
176
* -ENOSYS: Capability not available
177
* -EBUSY: Legacy VGA I/O cannot be retargeted at this time
178
*/
179
int
uv_bios_set_legacy_vga_target
(
bool
decode,
int
domain,
int
bus
)
180
{
181
return
uv_bios_call
(
UV_BIOS_SET_LEGACY_VGA_TARGET
,
182
(
u64
)decode, (
u64
)domain, (
u64
)bus, 0, 0);
183
}
184
EXPORT_SYMBOL_GPL
(
uv_bios_set_legacy_vga_target
);
185
186
187
#ifdef CONFIG_EFI
188
void
uv_bios_init
(
void
)
189
{
190
struct
uv_systab
*tab;
191
192
if
((
efi
.
uv_systab
==
EFI_INVALID_TABLE_ADDR
) ||
193
(
efi
.
uv_systab
== (
unsigned
long
)
NULL
)) {
194
printk
(
KERN_CRIT
"No EFI UV System Table.\n"
);
195
uv_systab
.
function
= (
unsigned
long
)NULL;
196
return
;
197
}
198
199
tab = (
struct
uv_systab
*)
ioremap
(
efi
.
uv_systab
,
200
sizeof
(
struct
uv_systab
));
201
if
(
strncmp
(tab->
signature
,
"UVST"
, 4) != 0)
202
printk
(
KERN_ERR
"bad signature in UV system table!"
);
203
204
/*
205
* Copy table to permanent spot for later use.
206
*/
207
memcpy
(&
uv_systab
, tab,
sizeof
(
struct
uv_systab
));
208
iounmap
(tab);
209
210
printk
(
KERN_INFO
"EFI UV System Table Revision %d\n"
,
211
uv_systab
.
revision
);
212
}
213
#else
/* !CONFIG_EFI */
214
215
void
uv_bios_init
(
void
) { }
216
#endif
Generated on Thu Jan 10 2013 13:21:47 for Linux Kernel by
1.8.2