Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Panfrost
linux
Commits
357d596b
Commit
357d596b
authored
Sep 11, 2005
by
Linus Torvalds
Browse files
Merge branch 'release' of master.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6
parents
e6c69bd3
d67eb16f
Changes
21
Expand all
Hide whitespace changes
Inline
Side-by-side
arch/ia64/hp/sim/boot/boot_head.S
View file @
357d596b
...
...
@@ -4,6 +4,7 @@
*/
#include <asm/asmmacro.h>
#include <asm/pal.h>
.
bss
.
align
16
...
...
@@ -49,7 +50,11 @@ GLOBAL_ENTRY(jmp_to_kernel)
br.sptk.few
b7
END
(
jmp_to_kernel
)
/*
*
r28
contains
the
index
of
the
PAL
function
*
r29
--
31
the
args
*
Return
values
in
ret0
--
3
(
r8
--
11
)
*/
GLOBAL_ENTRY
(
pal_emulator_static
)
mov
r8
=-
1
mov
r9
=
256
...
...
@@ -62,7 +67,7 @@ GLOBAL_ENTRY(pal_emulator_static)
cmp.gtu
p6
,
p7
=
r9
,
r28
(
p6
)
br.cond.sptk.few
stacked
;;
static
:
cmp.eq
p6
,
p7
=
6
,
r28
/*
PAL_PTCE_INFO
*/
static
:
cmp.eq
p6
,
p7
=
PAL_PTCE_INFO
,
r28
(
p7
)
br.cond.sptk.few
1
f
;;
mov
r8
=
0
/*
status
=
0
*/
...
...
@@ -70,21 +75,21 @@ static: cmp.eq p6,p7=6,r28 /* PAL_PTCE_INFO */
movl
r10
=
0x0000000200000003
/*
count
[
0
],
count
[
1
]
*/
movl
r11
=
0x1000000000002000
/*
stride
[
0
],
stride
[
1
]
*/
br.cond.sptk.few
rp
1
:
cmp.eq
p6
,
p7
=
14
,
r28
/*
PAL_FREQ_RATIOS
*/
1
:
cmp.eq
p6
,
p7
=
PAL_FREQ_RATIOS
,
r28
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
movl
r9
=
0x100000064
/*
proc_ratio
(
1
/
100
)
*/
movl
r10
=
0x100000100
/*
bus_ratio
<<
32
(
1
/
256
)
*/
movl
r11
=
0x100000064
/*
itc_ratio
<<
32
(
1
/
100
)
*/
;;
1
:
cmp.eq
p6
,
p7
=
19
,
r28
/*
PAL_RSE_INFO
*/
1
:
cmp.eq
p6
,
p7
=
PAL_RSE_INFO
,
r28
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
mov
r9
=
96
/*
num
phys
stacked
*/
mov
r10
=
0
/*
hints
*/
mov
r11
=
0
br.cond.sptk.few
rp
1
:
cmp.eq
p6
,
p7
=
1
,
r28
/*
PAL_CACHE_FLUSH
*/
1
:
cmp.eq
p6
,
p7
=
PAL_CACHE_FLUSH
,
r28
/*
PAL_CACHE_FLUSH
*/
(
p7
)
br.cond.sptk.few
1
f
mov
r9
=
ar
.
lc
movl
r8
=
524288
/*
flush
512
k
million
cache
lines
(
16
MB
)
*/
...
...
@@ -102,7 +107,7 @@ static: cmp.eq p6,p7=6,r28 /* PAL_PTCE_INFO */
mov
ar
.
lc
=
r9
mov
r8
=
r0
;;
1
:
cmp.eq
p6
,
p7
=
15
,
r28
/*
PAL_PERF_MON_INFO
*/
1
:
cmp.eq
p6
,
p7
=
PAL_PERF_MON_INFO
,
r28
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
movl
r9
=
0x08122f04
/*
generic
=
4
width
=
47
retired
=
8
cycles
=
18
*/
...
...
@@ -138,6 +143,20 @@ static: cmp.eq p6,p7=6,r28 /* PAL_PTCE_INFO */
st8
[
r29
]=
r0
,
16
/*
clear
remaining
bits
*/
st8
[
r18
]=
r0
,
16
/*
clear
remaining
bits
*/
;;
1
:
cmp.eq
p6
,
p7
=
PAL_VM_SUMMARY
,
r28
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
movl
r9
=
0x2044040020F1865
/*
num_tc_levels
=
2
,
num_unique_tcs
=
4
*/
/
*
max_itr_entry
=
64
,
max_dtr_entry
=
64
*/
/
*
hash_tag_id
=
2
,
max_pkr
=
15
*/
/
*
key_size
=
24
,
phys_add_size
=
50
,
vw
=
1
*/
movl
r10
=
0x183C
/*
rid_size
=
24
,
impl_va_msb
=
60
*/
;;
1
:
cmp.eq
p6
,
p7
=
PAL_MEM_ATTRIB
,
r28
(
p7
)
br.cond.sptk.few
1
f
mov
r8
=
0
/*
status
=
0
*/
mov
r9
=
0x80
|0x01 /* NatPage|WB
*/
;;
1
:
br.cond.sptk.few
rp
stacked
:
br.ret.sptk.few
rp
...
...
arch/ia64/kernel/asm-offsets.c
View file @
357d596b
...
...
@@ -211,17 +211,41 @@ void foo(void)
#endif
BLANK
();
DEFINE
(
IA64_MCA_CPU_PROC_STATE_DUMP_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
proc_state_dump
));
DEFINE
(
IA64_MCA_CPU_STACK_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
stack
));
DEFINE
(
IA64_MCA_CPU_STACKFRAME_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
stackframe
));
DEFINE
(
IA64_MCA_CPU_RBSTORE_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
rbstore
));
DEFINE
(
IA64_MCA_CPU_MCA_STACK_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
mca_stack
));
DEFINE
(
IA64_MCA_CPU_INIT_STACK_OFFSET
,
offsetof
(
struct
ia64_mca_cpu
,
init_stack
));
BLANK
();
DEFINE
(
IA64_SAL_OS_STATE_COMMON_OFFSET
,
offsetof
(
struct
ia64_sal_os_state
,
sal_ra
));
DEFINE
(
IA64_SAL_OS_STATE_OS_GP_OFFSET
,
offsetof
(
struct
ia64_sal_os_state
,
os_gp
));
DEFINE
(
IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET
,
offsetof
(
struct
ia64_sal_os_state
,
pal_min_state
));
DEFINE
(
IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET
,
offsetof
(
struct
ia64_sal_os_state
,
proc_state_param
));
DEFINE
(
IA64_SAL_OS_STATE_SIZE
,
sizeof
(
struct
ia64_sal_os_state
));
DEFINE
(
IA64_PMSA_GR_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_gr
));
DEFINE
(
IA64_PMSA_BANK1_GR_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_bank1_gr
));
DEFINE
(
IA64_PMSA_PR_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_pr
));
DEFINE
(
IA64_PMSA_BR0_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_br0
));
DEFINE
(
IA64_PMSA_RSC_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_rsc
));
DEFINE
(
IA64_PMSA_IIP_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_iip
));
DEFINE
(
IA64_PMSA_IPSR_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_ipsr
));
DEFINE
(
IA64_PMSA_IFS_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_ifs
));
DEFINE
(
IA64_PMSA_XIP_OFFSET
,
offsetof
(
struct
pal_min_state_area_s
,
pmsa_xip
));
BLANK
();
/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */
DEFINE
(
IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET
,
offsetof
(
struct
time_interpolator
,
addr
));
DEFINE
(
IA64_TIME_INTERPOLATOR_SOURCE_OFFSET
,
offsetof
(
struct
time_interpolator
,
source
));
...
...
arch/ia64/kernel/ivt.S
View file @
357d596b
...
...
@@ -69,7 +69,6 @@
# define DBG_FAULT(i)
#endif
#define MINSTATE_VIRT /* needed by minstate.h */
#include "minstate.h"
#define FAULT(n) \
...
...
arch/ia64/kernel/mca.c
View file @
357d596b
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/mca_asm.S
View file @
357d596b
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/mca_drv.c
View file @
357d596b
...
...
@@ -4,6 +4,8 @@
*
* Copyright (C) 2004 FUJITSU LIMITED
* Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com)
* Copyright (C) 2005 Silicon Graphics, Inc
* Copyright (C) 2005 Keith Owens <kaos@sgi.com>
*/
#include
<linux/config.h>
#include
<linux/types.h>
...
...
@@ -38,10 +40,6 @@
/* max size of SAL error record (default) */
static
int
sal_rec_max
=
10000
;
/* from mca.c */
static
ia64_mca_sal_to_os_state_t
*
sal_to_os_handoff_state
;
static
ia64_mca_os_to_sal_state_t
*
os_to_sal_handoff_state
;
/* from mca_drv_asm.S */
extern
void
*
mca_handler_bhhook
(
void
);
...
...
@@ -316,7 +314,8 @@ init_record_index_pools(void)
*/
static
mca_type_t
is_mca_global
(
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
)
is_mca_global
(
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
,
struct
ia64_sal_os_state
*
sos
)
{
pal_processor_state_info_t
*
psp
=
(
pal_processor_state_info_t
*
)
peidx_psp
(
peidx
);
...
...
@@ -327,7 +326,7 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci)
* Therefore it is local MCA when rendezvous has not been requested.
* Failed to rendezvous, the system must be down.
*/
switch
(
s
al_to_os_handoff_state
->
imsto_rendez_state
)
{
switch
(
s
os
->
rv_rc
)
{
case
-
1
:
/* SAL rendezvous unsuccessful */
return
MCA_IS_GLOBAL
;
case
0
:
/* SAL rendezvous not required */
...
...
@@ -388,7 +387,8 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci)
*/
static
int
recover_from_read_error
(
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
)
recover_from_read_error
(
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
,
struct
ia64_sal_os_state
*
sos
)
{
sal_log_mod_error_info_t
*
smei
;
pal_min_state_area_t
*
pmsa
;
...
...
@@ -426,7 +426,7 @@ recover_from_read_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_chec
* setup for resume to bottom half of MCA,
* "mca_handler_bhhook"
*/
pmsa
=
(
pal_min_state_area_t
*
)(
sal_to_os_handoff_state
->
pal_min_state
|
(
6ul
<<
61
))
;
pmsa
=
sos
->
pal_min_state
;
/* pass to bhhook as 1st argument (gr8) */
pmsa
->
pmsa_gr
[
8
-
1
]
=
smei
->
target_identifier
;
/* set interrupted return address (but no use) */
...
...
@@ -459,7 +459,8 @@ recover_from_read_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_chec
*/
static
int
recover_from_platform_error
(
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
)
recover_from_platform_error
(
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
,
struct
ia64_sal_os_state
*
sos
)
{
int
status
=
0
;
pal_processor_state_info_t
*
psp
=
(
pal_processor_state_info_t
*
)
peidx_psp
(
peidx
);
...
...
@@ -469,7 +470,7 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_
case
1
:
/* partial read */
case
3
:
/* full line(cpu) read */
case
9
:
/* I/O space read */
status
=
recover_from_read_error
(
slidx
,
peidx
,
pbci
);
status
=
recover_from_read_error
(
slidx
,
peidx
,
pbci
,
sos
);
break
;
case
0
:
/* unknown */
case
2
:
/* partial write */
...
...
@@ -508,7 +509,8 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_
*/
static
int
recover_from_processor_error
(
int
platform
,
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
)
recover_from_processor_error
(
int
platform
,
slidx_table_t
*
slidx
,
peidx_table_t
*
peidx
,
pal_bus_check_info_t
*
pbci
,
struct
ia64_sal_os_state
*
sos
)
{
pal_processor_state_info_t
*
psp
=
(
pal_processor_state_info_t
*
)
peidx_psp
(
peidx
);
...
...
@@ -545,7 +547,7 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, peidx_table_t *
* This means "there are some platform errors".
*/
if
(
platform
)
return
recover_from_platform_error
(
slidx
,
peidx
,
pbci
);
return
recover_from_platform_error
(
slidx
,
peidx
,
pbci
,
sos
);
/*
* On account of strange SAL error record, we cannot recover.
*/
...
...
@@ -562,8 +564,7 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, peidx_table_t *
static
int
mca_try_to_recover
(
void
*
rec
,
ia64_mca_sal_to_os_state_t
*
sal_to_os_state
,
ia64_mca_os_to_sal_state_t
*
os_to_sal_state
)
struct
ia64_sal_os_state
*
sos
)
{
int
platform_err
;
int
n_proc_err
;
...
...
@@ -571,10 +572,6 @@ mca_try_to_recover(void *rec,
peidx_table_t
peidx
;
pal_bus_check_info_t
pbci
;
/* handoff state from/to mca.c */
sal_to_os_handoff_state
=
sal_to_os_state
;
os_to_sal_handoff_state
=
os_to_sal_state
;
/* Make index of SAL error record */
platform_err
=
mca_make_slidx
(
rec
,
&
slidx
);
...
...
@@ -597,11 +594,11 @@ mca_try_to_recover(void *rec,
*
((
u64
*
)
&
pbci
)
=
peidx_check_info
(
&
peidx
,
bus_check
,
0
);
/* Check whether MCA is global or not */
if
(
is_mca_global
(
&
peidx
,
&
pbci
))
if
(
is_mca_global
(
&
peidx
,
&
pbci
,
sos
))
return
0
;
/* Try to recover a processor error */
return
recover_from_processor_error
(
platform_err
,
&
slidx
,
&
peidx
,
&
pbci
);
return
recover_from_processor_error
(
platform_err
,
&
slidx
,
&
peidx
,
&
pbci
,
sos
);
}
/*
...
...
arch/ia64/kernel/minstate.h
View file @
357d596b
...
...
@@ -4,73 +4,6 @@
#include
"entry.h"
/*
* For ivt.s we want to access the stack virtually so we don't have to disable translation
* on interrupts.
*
* On entry:
* r1: pointer to current task (ar.k6)
*/
#define MINSTATE_START_SAVE_MIN_VIRT \
(pUStk) mov ar.rsc=0;
/* set enforced lazy mode, pl 0, little-endian, loadrs=0 */
\
;; \
(pUStk) mov.m r24=ar.rnat; \
(pUStk) addl r22=IA64_RBS_OFFSET,r1;
/* compute base of RBS */
\
(pKStk) mov r1=sp;
/* get sp */
\
;; \
(pUStk) lfetch.fault.excl.nt1 [r22]; \
(pUStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;
/* compute base of memory stack */
\
(pUStk) mov r23=ar.bspstore;
/* save ar.bspstore */
\
;; \
(pUStk) mov ar.bspstore=r22;
/* switch to kernel RBS */
\
(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;
/* if in kernel mode, use sp (r12) */
\
;; \
(pUStk) mov r18=ar.bsp; \
(pUStk) mov ar.rsc=0x3;
/* set eager mode, pl 0, little-endian, loadrs=0 */
#define MINSTATE_END_SAVE_MIN_VIRT \
bsw.1;
/* switch back to bank 1 (must be last in insn group) */
\
;;
/*
* For mca_asm.S we want to access the stack physically since the state is saved before we
* go virtual and don't want to destroy the iip or ipsr.
*/
#define MINSTATE_START_SAVE_MIN_PHYS \
(pKStk) mov r3=IA64_KR(PER_CPU_DATA);; \
(pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \
(pKStk) ld8 r3 = [r3];; \
(pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \
(pKStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \
(pUStk) mov ar.rsc=0;
/* set enforced lazy mode, pl 0, little-endian, loadrs=0 */
\
(pUStk) addl r22=IA64_RBS_OFFSET,r1;
/* compute base of register backing store */
\
;; \
(pUStk) mov r24=ar.rnat; \
(pUStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;
/* compute base of memory stack */
\
(pUStk) mov r23=ar.bspstore;
/* save ar.bspstore */
\
(pUStk) dep r22=-1,r22,61,3;
/* compute kernel virtual addr of RBS */
\
;; \
(pUStk) mov ar.bspstore=r22;
/* switch to kernel RBS */
\
;; \
(pUStk) mov r18=ar.bsp; \
(pUStk) mov ar.rsc=0x3;
/* set eager mode, pl 0, little-endian, loadrs=0 */
\
#define MINSTATE_END_SAVE_MIN_PHYS \
dep r12=-1,r12,61,3;
/* make sp a kernel virtual address */
\
;;
#ifdef MINSTATE_VIRT
# define MINSTATE_GET_CURRENT(reg) mov reg=IA64_KR(CURRENT)
# define MINSTATE_START_SAVE_MIN MINSTATE_START_SAVE_MIN_VIRT
# define MINSTATE_END_SAVE_MIN MINSTATE_END_SAVE_MIN_VIRT
#endif
#ifdef MINSTATE_PHYS
# define MINSTATE_GET_CURRENT(reg) mov reg=IA64_KR(CURRENT);; tpa reg=reg
# define MINSTATE_START_SAVE_MIN MINSTATE_START_SAVE_MIN_PHYS
# define MINSTATE_END_SAVE_MIN MINSTATE_END_SAVE_MIN_PHYS
#endif
/*
* DO_SAVE_MIN switches to the kernel stacks (if necessary) and saves
* the minimum state necessary that allows us to turn psr.ic back
...
...
@@ -97,7 +30,7 @@
* we can pass interruption state as arguments to a handler.
*/
#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA) \
MINSTATE_GET_
CURRENT
(r16
);
/* M
(or M;;I)
*/
\
mov r16=IA64_KR(
CURRENT);
/* M */
\
mov r27=ar.rsc;
/* M */
\
mov r20=r1;
/* A */
\
mov r25=ar.unat;
/* M */
\
...
...
@@ -118,7 +51,21 @@
SAVE_IFS; \
cmp.eq pKStk,pUStk=r0,r17;
/* are we in kernel mode already? */
\
;; \
MINSTATE_START_SAVE_MIN \
(pUStk) mov ar.rsc=0;
/* set enforced lazy mode, pl 0, little-endian, loadrs=0 */
\
;; \
(pUStk) mov.m r24=ar.rnat; \
(pUStk) addl r22=IA64_RBS_OFFSET,r1;
/* compute base of RBS */
\
(pKStk) mov r1=sp;
/* get sp */
\
;; \
(pUStk) lfetch.fault.excl.nt1 [r22]; \
(pUStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;
/* compute base of memory stack */
\
(pUStk) mov r23=ar.bspstore;
/* save ar.bspstore */
\
;; \
(pUStk) mov ar.bspstore=r22;
/* switch to kernel RBS */
\
(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;
/* if in kernel mode, use sp (r12) */
\
;; \
(pUStk) mov r18=ar.bsp; \
(pUStk) mov ar.rsc=0x3;
/* set eager mode, pl 0, little-endian, loadrs=0 */
\
adds r17=2*L1_CACHE_BYTES,r1;
/* really: biggest cache-line size */
\
adds r16=PT(CR_IPSR),r1; \
;; \
...
...
@@ -181,7 +128,8 @@
EXTRA; \
movl r1=__gp;
/* establish kernel global pointer */
\
;; \
MINSTATE_END_SAVE_MIN
bsw.1;
/* switch back to bank 1 (must be last in insn group) */
\
;;
/*
* SAVE_REST saves the remainder of pt_regs (with psr.ic on).
...
...
arch/ia64/kernel/palinfo.c
View file @
357d596b
...
...
@@ -307,11 +307,9 @@ vm_info(char *page)
if
((
status
=
ia64_pal_vm_summary
(
&
vm_info_1
,
&
vm_info_2
))
!=
0
)
{
printk
(
KERN_ERR
"ia64_pal_vm_summary=%ld
\n
"
,
status
);
return
0
;
}
}
else
{
p
+=
sprintf
(
p
,
p
+=
sprintf
(
p
,
"Physical Address Space : %d bits
\n
"
"Virtual Address Space : %d bits
\n
"
"Protection Key Registers(PKR) : %d
\n
"
...
...
@@ -319,92 +317,99 @@ vm_info(char *page)
"Hash Tag ID : 0x%x
\n
"
"Size of RR.rid : %d
\n
"
,
vm_info_1
.
pal_vm_info_1_s
.
phys_add_size
,
vm_info_2
.
pal_vm_info_2_s
.
impl_va_msb
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
max_pkr
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
key_size
,
vm_info_1
.
pal_vm_info_1_s
.
hash_tag_id
,
vm_info_2
.
pal_vm_info_2_s
.
impl_va_msb
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
max_pkr
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
key_size
,
vm_info_1
.
pal_vm_info_1_s
.
hash_tag_id
,
vm_info_2
.
pal_vm_info_2_s
.
rid_size
);
}
if
(
ia64_pal_mem_attrib
(
&
attrib
)
!=
0
)
return
0
;
p
+=
sprintf
(
p
,
"Supported memory attributes : "
);
sep
=
""
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
attrib
&
(
1
<<
i
))
{
p
+=
sprintf
(
p
,
"%s%s"
,
sep
,
mem_attrib
[
i
]);
sep
=
", "
;
if
(
ia64_pal_mem_attrib
(
&
attrib
)
==
0
)
{
p
+=
sprintf
(
p
,
"Supported memory attributes : "
);
sep
=
""
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
attrib
&
(
1
<<
i
))
{
p
+=
sprintf
(
p
,
"%s%s"
,
sep
,
mem_attrib
[
i
]);
sep
=
", "
;
}
}
p
+=
sprintf
(
p
,
"
\n
"
);
}
p
+=
sprintf
(
p
,
"
\n
"
);
if
((
status
=
ia64_pal_vm_page_size
(
&
tr_pages
,
&
vw_pages
))
!=
0
)
{
printk
(
KERN_ERR
"ia64_pal_vm_page_size=%ld
\n
"
,
status
);
return
0
;
}
p
+=
sprintf
(
p
,
"
\n
TLB walker : %simplemented
\n
"
"Number of DTR : %d
\n
"
"Number of ITR : %d
\n
"
"TLB insertable page sizes : "
,
vm_info_1
.
pal_vm_info_1_s
.
vw
?
""
:
"not "
,
vm_info_1
.
pal_vm_info_1_s
.
max_dtr_entry
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
max_itr_entry
+
1
);
}
else
{
p
+=
sprintf
(
p
,
"
\n
TLB walker : %simplemented
\n
"
"Number of DTR : %d
\n
"
"Number of ITR : %d
\n
"
"TLB insertable page sizes : "
,
vm_info_1
.
pal_vm_info_1_s
.
vw
?
""
:
"not "
,
vm_info_1
.
pal_vm_info_1_s
.
max_dtr_entry
+
1
,
vm_info_1
.
pal_vm_info_1_s
.
max_itr_entry
+
1
);
p
=
bitvector_process
(
p
,
tr_pages
);
p
+
=
sprintf
(
p
,
"
\n
TLB purgeable page sizes : "
);
p
=
bitvector_process
(
p
,
tr_pages
);
p
=
bitvector_process
(
p
,
vw_pages
);
p
+
=
sprintf
(
p
,
"
\n
TLB purgeable page sizes : "
);
p
=
bitvector_process
(
p
,
vw_pages
);
}
if
((
status
=
ia64_get_ptce
(
&
ptce
))
!=
0
)
{
printk
(
KERN_ERR
"ia64_get_ptce=%ld
\n
"
,
status
);
return
0
;
}
p
+=
sprintf
(
p
,
}
else
{
p
+=
sprintf
(
p
,
"
\n
Purge base address : 0x%016lx
\n
"
"Purge outer loop count : %d
\n
"
"Purge inner loop count : %d
\n
"
"Purge outer loop stride : %d
\n
"
"Purge inner loop stride : %d
\n
"
,
ptce
.
base
,
ptce
.
count
[
0
],
ptce
.
count
[
1
],
ptce
.
stride
[
0
],
ptce
.
stride
[
1
]);
ptce
.
base
,
ptce
.
count
[
0
],
ptce
.
count
[
1
],
ptce
.
stride
[
0
],
ptce
.
stride
[
1
]);
p
+=
sprintf
(
p
,
p
+=
sprintf
(
p
,
"TC Levels : %d
\n
"
"Unique TC(s) : %d
\n
"
,
vm_info_1
.
pal_vm_info_1_s
.
num_tc_levels
,
vm_info_1
.
pal_vm_info_1_s
.
max_unique_tcs
);
for
(
i
=
0
;
i
<
vm_info_1
.
pal_vm_info_1_s
.
num_tc_levels
;
i
++
)
{
for
(
j
=
2
;
j
>
0
;
j
--
)
{
tc_pages
=
0
;
/* just in case */
for
(
i
=
0
;
i
<
vm_info_1
.
pal_vm_info_1_s
.
num_tc_levels
;
i
++
)
{
for
(
j
=
2
;
j
>
0
;
j
--
)
{
tc_pages
=
0
;
/* just in case */
/* even without unification, some levels may not be present */
if
((
status
=
ia64_pal_vm_info
(
i
,
j
,
&
tc_info
,
&
tc_pages
))
!=
0
)
{
continue
;
}
/* even without unification, some levels may not be present */
if
((
status
=
ia64_pal_vm_info
(
i
,
j
,
&
tc_info
,
&
tc_pages
))
!=
0
)
{
continue
;
}
p
+=
sprintf
(
p
,
p
+=
sprintf
(
p
,
"
\n
%s Translation Cache Level %d:
\n
"
"
\t
Hash sets : %d
\n
"
"
\t
Associativity : %d
\n
"
"
\t
Number of entries : %d
\n
"
"
\t
Flags : "
,
cache_types
[
j
+
tc_info
.
tc_unified
],
i
+
1
,
tc_info
.
tc_num_sets
,
tc_info
.
tc_associativity
,
tc_info
.
tc_num_entries
);
cache_types
[
j
+
tc_info
.
tc_unified
],
i
+
1
,
tc_info
.
tc_num_sets
,
tc_info
.
tc_associativity
,
tc_info
.
tc_num_entries
);
if
(
tc_info
.
tc_pf
)
p
+=
sprintf
(
p
,
"PreferredPageSizeOptimized "
);
if
(
tc_info
.
tc_unified
)
p
+=
sprintf
(
p
,
"Unified "
);
if
(
tc_info
.
tc_reduce_tr
)
p
+=
sprintf
(
p
,
"TCReduction"
);
if
(
tc_info
.
tc_pf
)
p
+=
sprintf
(
p
,
"PreferredPageSizeOptimized "
);
if
(
tc_info
.
tc_unified
)
p
+=
sprintf
(
p
,
"Unified "
);
if
(
tc_info
.
tc_reduce_tr
)
p
+=
sprintf
(
p
,
"TCReduction"
);
p
+=
sprintf
(
p
,
"
\n\t
Supported page sizes: "
);
p
+=
sprintf
(
p
,
"
\n\t
Supported page sizes: "
);
p
=
bitvector_process
(
p
,
tc_pages
);
p
=
bitvector_process
(
p
,
tc_pages
);
/* when unified date (j=2) is enough */
if
(
tc_info
.
tc_unified
)
break
;
/* when unified date (j=2) is enough */
if
(
tc_info
.
tc_unified
)
break
;
}
}
}
p
+=
sprintf
(
p
,
"
\n
"
);
...
...
@@ -440,14 +445,14 @@ register_info(char *page)
p
+=
sprintf
(
p
,
"
\n
"
);
}
if
(
ia64_pal_rse_info
(
&
phys_stacked
,
&
hints
)
!
=
0
)
return
0
;
if
(
ia64_pal_rse_info
(
&
phys_stacked
,
&
hints
)
=
=
0
)
{
p
+=
sprintf
(
p
,
"RSE stacked physical registers : %ld
\n
"
"RSE load/store hints : %ld (%s)
\n
"
,
phys_stacked
,
hints
.
ph_data
,
hints
.
ph_data
<
RSE_HINTS_COUNT
?
rse_hints
[
hints
.
ph_data
]
:
"(??)"
);
}
if
(
ia64_pal_debug_info
(
&
iregs
,
&
dregs
))
return
0
;
...
...
arch/ia64/kernel/salinfo.c
View file @
357d596b
...
...
@@ -22,6 +22,11 @@
*
* Dec 5 2004 kaos@sgi.com
* Standardize which records are cleared automatically.
*
* Aug 18 2005 kaos@sgi.com
* mca.c may not pass a buffer, a NULL buffer just indicates that a new
* record is available in SAL.
* Replace some NR_CPUS by cpus_online, for hotplug cpu.
*/
#include
<linux/types.h>
...
...
@@ -193,7 +198,7 @@ shift1_data_saved (struct salinfo_data *data, int shift)
* The buffer passed from mca.c points to the output from ia64_log_get. This is
* a persistent buffer but its contents can change between the interrupt and
* when user space processes the record. Save the record id to identify
* changes.
* changes.
If the buffer is NULL then just update the bitmap.
*/
void
salinfo_log_wakeup
(
int
type
,
u8
*
buffer
,
u64
size
,
int
irqsafe
)
...
...
@@ -206,27 +211,29 @@ salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe)
BUG_ON
(
type
>=
ARRAY_SIZE
(
salinfo_log_name
));
if
(
irqsafe
)
spin_lock_irqsave
(
&
data_saved_lock
,
flags
);
for
(
i
=
0
,
data_saved
=
data
->
data_saved
;
i
<
saved_size
;
++
i
,
++
data_saved
)
{
if
(
!
data_saved
->
buffer
)
break
;
}
if
(
i
==
saved_size
)
{
if
(
!
data
->
saved_num
)
{
shift1_data_saved
(
data
,
0
);
data_saved
=
data
->
data_saved
+
saved_size
-
1
;
}
else
data_saved
=
NULL
;
}
if
(
data_saved
)
{
data_saved
->
cpu
=
smp_processor_id
();
data_saved
->
id
=
((
sal_log_record_header_t
*
)
buffer
)
->
id
;
data_saved
->
size
=
size
;
data_saved
->
buffer
=
buffer
;
if
(
buffer
)
{
if
(
irqsafe
)
spin_lock_irqsave
(
&
data_saved_lock
,
flags
);
for
(
i
=
0
,
data_saved
=
data
->
data_saved
;
i
<
saved_size
;
++
i
,
++
data_saved
)
{