Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
bcdd3a91
Commit
bcdd3a91
authored
Aug 29, 2005
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull ngam-maule-steiner into release branch
parents
b946ecbb
d1e079b3
Changes
27
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
2385 additions
and
294 deletions
+2385
-294
arch/ia64/sn/include/tio.h
arch/ia64/sn/include/tio.h
+5
-1
arch/ia64/sn/include/xtalk/hubdev.h
arch/ia64/sn/include/xtalk/hubdev.h
+8
-3
arch/ia64/sn/kernel/bte.c
arch/ia64/sn/kernel/bte.c
+52
-31
arch/ia64/sn/kernel/huberror.c
arch/ia64/sn/kernel/huberror.c
+1
-1
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/io_init.c
+29
-6
arch/ia64/sn/kernel/irq.c
arch/ia64/sn/kernel/irq.c
+39
-36
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+3
-4
arch/ia64/sn/kernel/sn2/ptc_deadlock.S
arch/ia64/sn/kernel/sn2/ptc_deadlock.S
+9
-4
arch/ia64/sn/kernel/sn2/sn2_smp.c
arch/ia64/sn/kernel/sn2/sn2_smp.c
+233
-23
arch/ia64/sn/kernel/sn2/sn_hwperf.c
arch/ia64/sn/kernel/sn2/sn_hwperf.c
+260
-52
arch/ia64/sn/kernel/sn2/sn_proc_fs.c
arch/ia64/sn/kernel/sn2/sn_proc_fs.c
+2
-2
arch/ia64/sn/kernel/sn2/timer_interrupt.c
arch/ia64/sn/kernel/sn2/timer_interrupt.c
+12
-10
arch/ia64/sn/pci/Makefile
arch/ia64/sn/pci/Makefile
+1
-1
arch/ia64/sn/pci/pcibr/pcibr_dma.c
arch/ia64/sn/pci/pcibr/pcibr_dma.c
+36
-24
arch/ia64/sn/pci/pcibr/pcibr_provider.c
arch/ia64/sn/pci/pcibr/pcibr_provider.c
+28
-12
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioca_provider.c
+5
-2
arch/ia64/sn/pci/tioce_provider.c
arch/ia64/sn/pci/tioce_provider.c
+771
-0
include/asm-ia64/sn/addrs.h
include/asm-ia64/sn/addrs.h
+59
-20
include/asm-ia64/sn/geo.h
include/asm-ia64/sn/geo.h
+1
-2
include/asm-ia64/sn/intr.h
include/asm-ia64/sn/intr.h
+1
-2
include/asm-ia64/sn/nodepda.h
include/asm-ia64/sn/nodepda.h
+2
-1
include/asm-ia64/sn/pcibus_provider_defs.h
include/asm-ia64/sn/pcibus_provider_defs.h
+6
-2
include/asm-ia64/sn/pda.h
include/asm-ia64/sn/pda.h
+0
-1
include/asm-ia64/sn/sn2/sn_hwperf.h
include/asm-ia64/sn/sn2/sn_hwperf.h
+10
-0
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/sn/sn_sal.h
+6
-54
include/asm-ia64/sn/tioce.h
include/asm-ia64/sn/tioce.h
+740
-0
include/asm-ia64/sn/tioce_provider.h
include/asm-ia64/sn/tioce_provider.h
+66
-0
No files found.
arch/ia64/sn/include/tio.h
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2000-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 2000-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _ASM_IA64_SN_TIO_H
...
...
@@ -26,6 +26,10 @@
#define TIO_ITTE_VALID_MASK 0x1
#define TIO_ITTE_VALID_SHIFT 16
#define TIO_ITTE_WIDGET(itte) \
(((itte) >> TIO_ITTE_WIDGET_SHIFT) & TIO_ITTE_WIDGET_MASK)
#define TIO_ITTE_VALID(itte) \
(((itte) >> TIO_ITTE_VALID_SHIFT) & TIO_ITTE_VALID_MASK)
#define TIO_ITTE_PUT(nasid, bigwin, widget, addr, valid) \
REMOTE_HUB_S((nasid), TIO_ITTE(bigwin), \
...
...
arch/ia64/sn/include/xtalk/hubdev.h
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1992 - 1997, 2000-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 1992 - 1997, 2000-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _ASM_IA64_SN_XTALK_HUBDEV_H
#define _ASM_IA64_SN_XTALK_HUBDEV_H
...
...
@@ -16,6 +16,9 @@
#define IIO_ITTE_WIDGET_MASK ((1<<IIO_ITTE_WIDGET_BITS)-1)
#define IIO_ITTE_WIDGET_SHIFT 8
#define IIO_ITTE_WIDGET(itte) \
(((itte) >> IIO_ITTE_WIDGET_SHIFT) & IIO_ITTE_WIDGET_MASK)
/*
* Use the top big window as a surrogate for the first small window
*/
...
...
@@ -34,7 +37,8 @@ struct sn_flush_device_list {
unsigned
long
sfdl_force_int_addr
;
unsigned
long
sfdl_flush_value
;
volatile
unsigned
long
*
sfdl_flush_addr
;
uint64_t
sfdl_persistent_busnum
;
uint32_t
sfdl_persistent_busnum
;
uint32_t
sfdl_persistent_segment
;
struct
pcibus_info
*
sfdl_pcibus_info
;
spinlock_t
sfdl_flush_lock
;
};
...
...
@@ -58,7 +62,8 @@ struct hubdev_info {
void
*
hdi_nodepda
;
void
*
hdi_node_vertex
;
void
*
hdi_xtalk_vertex
;
uint32_t
max_segment_number
;
uint32_t
max_pcibus_number
;
};
extern
void
hubdev_init_node
(
nodepda_t
*
,
cnodeid_t
);
...
...
arch/ia64/sn/kernel/bte.c
View file @
bcdd3a91
...
...
@@ -29,16 +29,30 @@
/* two interfaces on two btes */
#define MAX_INTERFACES_TO_TRY 4
#define MAX_NODES_TO_TRY 2
static
struct
bteinfo_s
*
bte_if_on_node
(
nasid_t
nasid
,
int
interface
)
{
nodepda_t
*
tmp_nodepda
;
if
(
nasid_to_cnodeid
(
nasid
)
==
-
1
)
return
(
struct
bteinfo_s
*
)
NULL
;;
tmp_nodepda
=
NODEPDA
(
nasid_to_cnodeid
(
nasid
));
return
&
tmp_nodepda
->
bte_if
[
interface
];
}
static
inline
void
bte_start_transfer
(
struct
bteinfo_s
*
bte
,
u64
len
,
u64
mode
)
{
if
(
is_shub2
())
{
BTE_CTRL_STORE
(
bte
,
(
IBLS_BUSY
|
((
len
)
|
(
mode
)
<<
24
)));
}
else
{
BTE_LNSTAT_STORE
(
bte
,
len
);
BTE_CTRL_STORE
(
bte
,
mode
);
}
}
/************************************************************************
* Block Transfer Engine copy related functions.
*
...
...
@@ -67,13 +81,15 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
{
u64
transfer_size
;
u64
transfer_stat
;
u64
notif_phys_addr
;
struct
bteinfo_s
*
bte
;
bte_result_t
bte_status
;
unsigned
long
irq_flags
;
unsigned
long
itc_end
=
0
;
struct
bteinfo_s
*
btes_to_try
[
MAX_INTERFACES_TO_TRY
];
int
bte_if_index
;
int
bte_pri
,
bte_sec
;
int
nasid_to_try
[
MAX_NODES_TO_TRY
];
int
my_nasid
=
get_nasid
();
int
bte_if_index
,
nasid_index
;
int
bte_first
,
btes_per_node
=
BTES_PER_NODE
;
BTE_PRINTK
((
"bte_copy(0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%p)
\n
"
,
src
,
dest
,
len
,
mode
,
notification
));
...
...
@@ -86,36 +102,26 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
(
src
&
L1_CACHE_MASK
)
||
(
dest
&
L1_CACHE_MASK
));
BUG_ON
(
!
(
len
<
((
BTE_LEN_MASK
+
1
)
<<
L1_CACHE_SHIFT
)));
/* CPU 0 (per node) tries bte0 first, CPU 1 try bte1 first */
if
(
cpuid_to_subnode
(
smp_processor_id
())
==
0
)
{
bte_pri
=
0
;
bte_sec
=
1
;
}
else
{
bte_pri
=
1
;
bte_sec
=
0
;
}
/*
* Start with interface corresponding to cpu number
*/
bte_first
=
raw_smp_processor_id
()
%
btes_per_node
;
if
(
mode
&
BTE_USE_DEST
)
{
/* try remote then local */
btes_to_try
[
0
]
=
bte_if_on_node
(
NASID_GET
(
dest
),
bte_pri
);
btes_to_try
[
1
]
=
bte_if_on_node
(
NASID_GET
(
dest
),
bte_sec
);
nasid_to_try
[
0
]
=
NASID_GET
(
dest
);
if
(
mode
&
BTE_USE_ANY
)
{
btes_to_try
[
2
]
=
bte_if_on_node
(
get_nasid
(),
bte_pri
);
btes_to_try
[
3
]
=
bte_if_on_node
(
get_nasid
(),
bte_sec
);
nasid_to_try
[
1
]
=
my_nasid
;
}
else
{
btes_to_try
[
2
]
=
NULL
;
btes_to_try
[
3
]
=
NULL
;
nasid_to_try
[
1
]
=
(
int
)
NULL
;
}
}
else
{
/* try local then remote */
btes_to_try
[
0
]
=
bte_if_on_node
(
get_nasid
(),
bte_pri
);
btes_to_try
[
1
]
=
bte_if_on_node
(
get_nasid
(),
bte_sec
);
nasid_to_try
[
0
]
=
my_nasid
;
if
(
mode
&
BTE_USE_ANY
)
{
btes_to_try
[
2
]
=
bte_if_on_node
(
NASID_GET
(
dest
),
bte_pri
);
btes_to_try
[
3
]
=
bte_if_on_node
(
NASID_GET
(
dest
),
bte_sec
);
nasid_to_try
[
1
]
=
NASID_GET
(
dest
);
}
else
{
btes_to_try
[
2
]
=
NULL
;
btes_to_try
[
3
]
=
NULL
;
nasid_to_try
[
1
]
=
(
int
)
NULL
;
}
}
...
...
@@ -123,11 +129,12 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
do
{
local_irq_save
(
irq_flags
);
bte_if_index
=
0
;
bte_if_index
=
bte_first
;
nasid_index
=
0
;
/* Attempt to lock one of the BTE interfaces. */
while
(
bte_if_index
<
MAX_INTERFAC
ES_TO_TRY
)
{
bte
=
bte
s_to_try
[
bte_if_index
++
]
;
while
(
nasid_index
<
MAX_NOD
ES_TO_TRY
)
{
bte
=
bte
_if_on_node
(
nasid_to_try
[
nasid_index
],
bte_if_index
)
;
if
(
bte
==
NULL
)
{
continue
;
...
...
@@ -143,6 +150,15 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
break
;
}
}
bte_if_index
=
(
bte_if_index
+
1
)
%
btes_per_node
;
/* Next interface */
if
(
bte_if_index
==
bte_first
)
{
/*
* We've tried all interfaces on this node
*/
nasid_index
++
;
}
bte
=
NULL
;
}
...
...
@@ -169,7 +185,13 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
/* Initialize the notification to a known value. */
*
bte
->
most_rcnt_na
=
BTE_WORD_BUSY
;
notif_phys_addr
=
TO_PHYS
(
ia64_tpa
((
unsigned
long
)
bte
->
most_rcnt_na
));
if
(
is_shub2
())
{
src
=
SH2_TIO_PHYS_TO_DMA
(
src
);
dest
=
SH2_TIO_PHYS_TO_DMA
(
dest
);
notif_phys_addr
=
SH2_TIO_PHYS_TO_DMA
(
notif_phys_addr
);
}
/* Set the source and destination registers */
BTE_PRINTKV
((
"IBSA = 0x%lx)
\n
"
,
(
TO_PHYS
(
src
))));
BTE_SRC_STORE
(
bte
,
TO_PHYS
(
src
));
...
...
@@ -177,14 +199,12 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
BTE_DEST_STORE
(
bte
,
TO_PHYS
(
dest
));
/* Set the notification register */
BTE_PRINTKV
((
"IBNA = 0x%lx)
\n
"
,
TO_PHYS
(
ia64_tpa
((
unsigned
long
)
bte
->
most_rcnt_na
))));
BTE_NOTIF_STORE
(
bte
,
TO_PHYS
(
ia64_tpa
((
unsigned
long
)
bte
->
most_rcnt_na
)));
BTE_PRINTKV
((
"IBNA = 0x%lx)
\n
"
,
notif_phys_addr
));
BTE_NOTIF_STORE
(
bte
,
notif_phys_addr
);
/* Initiate the transfer */
BTE_PRINTK
((
"IBCT = 0x%lx)
\n
"
,
BTE_VALID_MODE
(
mode
)));
BTE_START_TRANSFER
(
bte
,
transfer_size
,
BTE_VALID_MODE
(
mode
));
bte_start_transfer
(
bte
,
transfer_size
,
BTE_VALID_MODE
(
mode
));
itc_end
=
ia64_get_itc
()
+
(
40000000
*
local_cpu_data
->
cyc_per_usec
);
...
...
@@ -195,6 +215,7 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
}
while
((
transfer_stat
=
*
bte
->
most_rcnt_na
)
==
BTE_WORD_BUSY
)
{
cpu_relax
();
if
(
ia64_get_itc
()
>
itc_end
)
{
BTE_PRINTK
((
"BTE timeout nasid 0x%x bte%d IBLS = 0x%lx na 0x%lx
\n
"
,
NASID_GET
(
bte
->
bte_base_addr
),
bte
->
bte_num
,
...
...
arch/ia64/sn/kernel/huberror.c
View file @
bcdd3a91
...
...
@@ -76,7 +76,7 @@ void hubiio_crb_free(struct hubdev_info *hubdev_info, int crbnum)
*/
REMOTE_HUB_S
(
hubdev_info
->
hdi_nasid
,
IIO_ICDR
,
(
IIO_ICDR_PND
|
crbnum
));
while
(
REMOTE_HUB_L
(
hubdev_info
->
hdi_nasid
,
IIO_ICDR
)
&
IIO_ICDR_PND
)
udelay
(
1
);
cpu_relax
(
);
}
...
...
arch/ia64/sn/kernel/io_init.c
View file @
bcdd3a91
...
...
@@ -18,6 +18,7 @@
#include <asm/sn/simulator.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/tioca_provider.h>
#include <asm/sn/tioce_provider.h>
#include "xtalk/hubdev.h"
#include "xtalk/xwidgetdev.h"
...
...
@@ -44,6 +45,9 @@ int sn_ioif_inited = 0; /* SN I/O infrastructure initialized? */
struct
sn_pcibus_provider
*
sn_pci_provider
[
PCIIO_ASIC_MAX_TYPES
];
/* indexed by asic type */
static
int
max_segment_number
=
0
;
/* Default highest segment number */
static
int
max_pcibus_number
=
255
;
/* Default highest pci bus number */
/*
* Hooks and struct for unsupported pci providers
*/
...
...
@@ -157,13 +161,28 @@ static void sn_fixup_ionodes(void)
uint64_t
nasid
;
int
i
,
widget
;
/*
* Get SGI Specific HUB chipset information.
* Inform Prom that this kernel can support domain bus numbering.
*/
for
(
i
=
0
;
i
<
numionodes
;
i
++
)
{
hubdev
=
(
struct
hubdev_info
*
)(
NODEPDA
(
i
)
->
pdinfo
);
nasid
=
cnodeid_to_nasid
(
i
);
hubdev
->
max_segment_number
=
0xffffffff
;
hubdev
->
max_pcibus_number
=
0xff
;
status
=
sal_get_hubdev_info
(
nasid
,
(
uint64_t
)
__pa
(
hubdev
));
if
(
status
)
continue
;
/* Save the largest Domain and pcibus numbers found. */
if
(
hubdev
->
max_segment_number
)
{
/*
* Dealing with a Prom that supports segments.
*/
max_segment_number
=
hubdev
->
max_segment_number
;
max_pcibus_number
=
hubdev
->
max_pcibus_number
;
}
/* Attach the error interrupt handlers */
if
(
nasid
&
1
)
ice_error_init
(
hubdev
);
...
...
@@ -230,7 +249,7 @@ void sn_pci_unfixup_slot(struct pci_dev *dev)
void
sn_pci_fixup_slot
(
struct
pci_dev
*
dev
)
{
int
idx
;
int
segment
=
0
;
int
segment
=
pci_domain_nr
(
dev
->
bus
)
;
int
status
=
0
;
struct
pcibus_bussoft
*
bs
;
struct
pci_bus
*
host_pci_bus
;
...
...
@@ -283,9 +302,9 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
* PCI host_pci_dev struct and set up host bus linkages
*/
bus_no
=
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
>>
32
;
bus_no
=
(
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
>>
32
)
&
0xff
;
devfn
=
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
&
0xffffffff
;
host_pci_bus
=
pci_find_bus
(
pci_domain_nr
(
dev
->
bus
)
,
bus_no
);
host_pci_bus
=
pci_find_bus
(
segment
,
bus_no
);
host_pci_dev
=
pci_get_slot
(
host_pci_bus
,
devfn
);
SN_PCIDEV_INFO
(
dev
)
->
host_pci_dev
=
host_pci_dev
;
...
...
@@ -333,6 +352,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
prom_bussoft_ptr
=
__va
(
prom_bussoft_ptr
);
controller
=
kcalloc
(
1
,
sizeof
(
struct
pci_controller
),
GFP_KERNEL
);
controller
->
segment
=
segment
;
if
(
!
controller
)
BUG
();
...
...
@@ -390,7 +410,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
if
(
controller
->
node
>=
num_online_nodes
())
{
struct
pcibus_bussoft
*
b
=
SN_PCIBUS_BUSSOFT
(
bus
);
printk
(
KERN_WARNING
"Device ASIC=%u XID=%u PBUSNUM=%
l
u"
printk
(
KERN_WARNING
"Device ASIC=%u XID=%u PBUSNUM=%u"
"L_IO=%lx L_MEM=%lx BASE=%lx
\n
"
,
b
->
bs_asic_type
,
b
->
bs_xid
,
b
->
bs_persist_busnum
,
b
->
bs_legacy_io
,
b
->
bs_legacy_mem
,
b
->
bs_base
);
...
...
@@ -445,6 +465,7 @@ void sn_bus_free_sysdata(void)
static
int
__init
sn_pci_init
(
void
)
{
int
i
=
0
;
int
j
=
0
;
struct
pci_dev
*
pci_dev
=
NULL
;
extern
void
sn_init_cpei_timer
(
void
);
#ifdef CONFIG_PROC_FS
...
...
@@ -464,6 +485,7 @@ static int __init sn_pci_init(void)
pcibr_init_provider
();
tioca_init_provider
();
tioce_init_provider
();
/*
* This is needed to avoid bounce limit checks in the blk layer
...
...
@@ -479,8 +501,9 @@ static int __init sn_pci_init(void)
#endif
/* busses are not known yet ... */
for
(
i
=
0
;
i
<
PCI_BUSES_TO_SCAN
;
i
++
)
sn_pci_controller_fixup
(
0
,
i
,
NULL
);
for
(
i
=
0
;
i
<=
max_segment_number
;
i
++
)
for
(
j
=
0
;
j
<=
max_pcibus_number
;
j
++
)
sn_pci_controller_fixup
(
i
,
j
,
NULL
);
/*
* Generic Linux PCI Layer has created the pci_bus and pci_dev
...
...
arch/ia64/sn/kernel/irq.c
View file @
bcdd3a91
...
...
@@ -5,7 +5,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (c) 2000-200
4
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
5
Silicon Graphics, Inc. All Rights Reserved.
*/
#include <linux/irq.h>
...
...
@@ -76,15 +76,13 @@ static void sn_enable_irq(unsigned int irq)
static
void
sn_ack_irq
(
unsigned
int
irq
)
{
uint64_t
event_occurred
,
mask
=
0
;
int
nasid
;
u64
event_occurred
,
mask
=
0
;
irq
=
irq
&
0xff
;
nasid
=
get_nasid
();
event_occurred
=
HUB_L
((
u
int64_t
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_EVENT_OCCURRED
));
HUB_L
((
u
64
*
)
LOCAL_MMR_ADDR
(
SH_EVENT_OCCURRED
));
mask
=
event_occurred
&
SH_ALL_INT_MASK
;
HUB_S
((
u
int64_t
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_EVENT_OCCURRED_ALIAS
),
HUB_S
((
u
64
*
)
LOCAL_MMR_ADDR
(
SH_EVENT_OCCURRED_ALIAS
),
mask
);
__set_bit
(
irq
,
(
volatile
void
*
)
pda
->
sn_in_service_ivecs
);
...
...
@@ -93,15 +91,12 @@ static void sn_ack_irq(unsigned int irq)
static
void
sn_end_irq
(
unsigned
int
irq
)
{
int
nasid
;
int
ivec
;
u
int64_t
event_occurred
;
u
64
event_occurred
;
ivec
=
irq
&
0xff
;
if
(
ivec
==
SGI_UART_VECTOR
)
{
nasid
=
get_nasid
();
event_occurred
=
HUB_L
((
uint64_t
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_EVENT_OCCURRED
));
event_occurred
=
HUB_L
((
u64
*
)
LOCAL_MMR_ADDR
(
SH_EVENT_OCCURRED
));
/* If the UART bit is set here, we may have received an
* interrupt from the UART that the driver missed. To
* make sure, we IPI ourselves to force us to look again.
...
...
@@ -132,6 +127,7 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
int
local_widget
,
status
;
nasid_t
local_nasid
;
struct
sn_irq_info
*
new_irq_info
;
struct
sn_pcibus_provider
*
pci_provider
;
new_irq_info
=
kmalloc
(
sizeof
(
struct
sn_irq_info
),
GFP_ATOMIC
);
if
(
new_irq_info
==
NULL
)
...
...
@@ -171,8 +167,9 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
new_irq_info
->
irq_cpuid
=
cpuid
;
register_intr_pda
(
new_irq_info
);
if
(
IS_PCI_BRIDGE_ASIC
(
new_irq_info
->
irq_bridge_type
))
pcibr_change_devices_irq
(
new_irq_info
);
pci_provider
=
sn_pci_provider
[
new_irq_info
->
irq_bridge_type
];
if
(
pci_provider
&&
pci_provider
->
target_interrupt
)
(
pci_provider
->
target_interrupt
)(
new_irq_info
);
spin_lock
(
&
sn_irq_info_lock
);
list_replace_rcu
(
&
sn_irq_info
->
list
,
&
new_irq_info
->
list
);
...
...
@@ -317,6 +314,16 @@ void sn_irq_unfixup(struct pci_dev *pci_dev)
pci_dev_put
(
pci_dev
);
}
static
inline
void
sn_call_force_intr_provider
(
struct
sn_irq_info
*
sn_irq_info
)
{
struct
sn_pcibus_provider
*
pci_provider
;
pci_provider
=
sn_pci_provider
[
sn_irq_info
->
irq_bridge_type
];
if
(
pci_provider
&&
pci_provider
->
force_interrupt
)
(
*
pci_provider
->
force_interrupt
)(
sn_irq_info
);
}
static
void
force_interrupt
(
int
irq
)
{
struct
sn_irq_info
*
sn_irq_info
;
...
...
@@ -325,11 +332,9 @@ static void force_interrupt(int irq)
return
;
rcu_read_lock
();
list_for_each_entry_rcu
(
sn_irq_info
,
sn_irq_lh
[
irq
],
list
)
{
if
(
IS_PCI_BRIDGE_ASIC
(
sn_irq_info
->
irq_bridge_type
)
&&
(
sn_irq_info
->
irq_bridge
!=
NULL
))
pcibr_force_interrupt
(
sn_irq_info
);
}
list_for_each_entry_rcu
(
sn_irq_info
,
sn_irq_lh
[
irq
],
list
)
sn_call_force_intr_provider
(
sn_irq_info
);
rcu_read_unlock
();
}
...
...
@@ -351,6 +356,14 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
struct
pcidev_info
*
pcidev_info
;
struct
pcibus_info
*
pcibus_info
;
/*
* Bridge types attached to TIO (anything but PIC) do not need this WAR
* since they do not target Shub II interrupt registers. If that
* ever changes, this check needs to accomodate.
*/
if
(
sn_irq_info
->
irq_bridge_type
!=
PCIIO_ASIC_TYPE_PIC
)
return
;
pcidev_info
=
(
struct
pcidev_info
*
)
sn_irq_info
->
irq_pciioinfo
;
if
(
!
pcidev_info
)
return
;
...
...
@@ -377,16 +390,12 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
break
;
}
if
(
!
test_bit
(
irr_bit
,
&
irr_reg
))
{
if
(
!
test_bit
(
irq
,
pda
->
sn_soft_irr
))
{
if
(
!
test_bit
(
irq
,
pda
->
sn_in_service_ivecs
))
{
regval
&=
0xff
;
if
(
sn_irq_info
->
irq_int_bit
&
regval
&
sn_irq_info
->
irq_last_intr
)
{
regval
&=
~
(
sn_irq_info
->
irq_int_bit
&
regval
);
pcibr_force_interrupt
(
sn_irq_info
);
}
regval
&=
~
(
sn_irq_info
->
irq_int_bit
&
regval
);
sn_call_force_intr_provider
(
sn_irq_info
);
}
}
}
...
...
@@ -404,12 +413,6 @@ void sn_lb_int_war_check(void)
rcu_read_lock
();
for
(
i
=
pda
->
sn_first_irq
;
i
<=
pda
->
sn_last_irq
;
i
++
)
{
list_for_each_entry_rcu
(
sn_irq_info
,
sn_irq_lh
[
i
],
list
)
{
/*
* Only call for PCI bridges that are fully
* initialized.
*/
if
(
IS_PCI_BRIDGE_ASIC
(
sn_irq_info
->
irq_bridge_type
)
&&
(
sn_irq_info
->
irq_bridge
!=
NULL
))
sn_check_intr
(
i
,
sn_irq_info
);
}
}
...
...
arch/ia64/sn/kernel/setup.c
View file @
bcdd3a91
...
...
@@ -80,8 +80,6 @@ EXPORT_PER_CPU_SYMBOL(__sn_cnodeid_to_nasid);
DEFINE_PER_CPU
(
struct
nodepda_s
*
,
__sn_nodepda
);
EXPORT_PER_CPU_SYMBOL
(
__sn_nodepda
);
partid_t
sn_partid
=
-
1
;
EXPORT_SYMBOL
(
sn_partid
);
char
sn_system_serial_number_string
[
128
];
EXPORT_SYMBOL
(
sn_system_serial_number_string
);
u64
sn_partition_serial_number
;
...
...
@@ -403,6 +401,7 @@ static void __init sn_init_pdas(char **cmdline_p)
memset
(
nodepdaindr
[
cnode
],
0
,
sizeof
(
nodepda_t
));
memset
(
nodepdaindr
[
cnode
]
->
phys_cpuid
,
-
1
,
sizeof
(
nodepdaindr
[
cnode
]
->
phys_cpuid
));
spin_lock_init
(
&
nodepdaindr
[
cnode
]
->
ptc_lock
);
}
/*
...
...
@@ -532,8 +531,8 @@ void __init sn_cpu_init(void)
*/
{
u64
pio1
[]
=
{
SH1_PIO_WRITE_STATUS_0
,
0
,
SH1_PIO_WRITE_STATUS_1
,
0
};
u64
pio2
[]
=
{
SH2_PIO_WRITE_STATUS_0
,
SH2_PIO_WRITE_STATUS_
1
,
SH2_PIO_WRITE_STATUS_
2
,
SH2_PIO_WRITE_STATUS_3
};
u64
pio2
[]
=
{
SH2_PIO_WRITE_STATUS_0
,
SH2_PIO_WRITE_STATUS_
2
,
SH2_PIO_WRITE_STATUS_
1
,
SH2_PIO_WRITE_STATUS_3
};
u64
*
pio
;
pio
=
is_shub1
()
?
pio1
:
pio2
;
pda
->
pio_write_status_addr
=
(
volatile
unsigned
long
*
)
LOCAL_MMR_ADDR
(
pio
[
slice
]);
...
...
arch/ia64/sn/kernel/sn2/ptc_deadlock.S
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
*
License
.
See
the
file
"COPYING"
in
the
main
directory
of
this
archive
*
for
more
details
.
*
*
Copyright
(
C
)
2000
-
200
4
Silicon
Graphics
,
Inc
.
All
rights
reserved
.
*
Copyright
(
C
)
2000
-
200
5
Silicon
Graphics
,
Inc
.
All
rights
reserved
.
*/
#include <asm/types.h>
...
...
@@ -11,7 +11,7 @@
#define DEADLOCKBIT SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_SHFT
#define WRITECOUNTMASK SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK
#define ALIAS_OFFSET
(SH1_PIO_WRITE_STATUS_0_ALIAS-SH1_PIO_WRITE_STATUS_0)
#define ALIAS_OFFSET
8
.
global
sn2_ptc_deadlock_recovery_core
...
...
@@ -36,13 +36,15 @@ sn2_ptc_deadlock_recovery_core:
extr.u
piowcphy
=
piowc
,
0
,
61
;; // Convert piowc to uncached physical address
dep
piowcphy
=-
1
,
piowcphy
,
63
,
1
movl
mask
=
WRITECOUNTMASK
mov
r8
=
r0
1
:
add
scr2
=
ALIAS_OFFSET
,
piowc
//
Address
of
WRITE_STATUS
alias
register
mov
scr1
=
7
;; // Clear DEADLOCK, WRITE_ERROR, MULTI_WRITE_ERROR
st8.rel
[
scr2
]=
scr1
;;
;;
ld8.acq
scr1
=[
scr2
]
;;
5
:
ld8.acq
scr1
=[
piowc
]
;; // Wait for PIOs to complete.
hint
@
pause
and
scr2
=
scr1
,
mask
;; // mask of writecount bits
cmp.ne
p6
,
p0
=
zeroval
,
scr2
(
p6
)
br.cond.sptk
5
b
...
...
@@ -57,6 +59,7 @@ sn2_ptc_deadlock_recovery_core:
st8.rel
[
ptc0
]=
data0
//
Write
PTC0
&
wait
for
completion
.
5
:
ld8.acq
scr1
=[
piowcphy
]
;; // Wait for PIOs to complete.
hint
@
pause
and
scr2
=
scr1
,
mask
;; // mask of writecount bits
cmp.ne
p6
,
p0
=
zeroval
,
scr2
(
p6
)
br.cond.sptk
5
b
;;
...
...
@@ -67,6 +70,7 @@ sn2_ptc_deadlock_recovery_core:
(
p7
)
st8.rel
[
ptc1
]=
data1
;; // Now write PTC1.
5
:
ld8.acq
scr1
=[
piowcphy
]
;; // Wait for PIOs to complete.
hint
@
pause
and
scr2
=
scr1
,
mask
;; // mask of writecount bits
cmp.ne
p6
,
p0
=
zeroval
,
scr2
(
p6
)
br.cond.sptk
5
b
...
...
@@ -77,6 +81,7 @@ sn2_ptc_deadlock_recovery_core:
srlz.i
;;
//////////////
END
PHYSICAL
MODE
////////////////////
(
p8
)
add
r8
=
1
,
r8
(
p8
)
br.cond.spnt
1
b
;; // Repeat if DEADLOCK occurred.
br.ret.sptk
rp
...
...
arch/ia64/sn/kernel/sn2/sn2_smp.c
View file @
bcdd3a91
...
...
@@ -5,7 +5,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2000-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 2000-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#include <linux/init.h>
...
...
@@ -20,6 +20,8 @@
#include <linux/module.h>
#include <linux/bitops.h>
#include <linux/nodemask.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <asm/processor.h>
#include <asm/irq.h>
...
...
@@ -39,12 +41,120 @@
#include <asm/sn/nodepda.h>
#include <asm/sn/rw_mmr.h>
void
sn2_ptc_deadlock_recovery
(
volatile
unsigned
long
*
,
unsigned
long
data0
,
volatile
unsigned
long
*
,
unsigned
long
data1
);
DEFINE_PER_CPU
(
struct
ptc_stats
,
ptcstats
);
DECLARE_PER_CPU
(
struct
ptc_stats
,
ptcstats
);
static
__cacheline_aligned
DEFINE_SPINLOCK
(
sn2_global_ptc_lock
);
static
unsigned
long
sn2_ptc_deadlock_count
;
void
sn2_ptc_deadlock_recovery
(
short
*
,
short
,
int
,
volatile
unsigned
long
*
,
unsigned
long
data0
,
volatile
unsigned
long
*
,
unsigned
long
data1
);
#ifdef DEBUG_PTC
/*
* ptctest:
*
* xyz - 3 digit hex number:
* x - Force PTC purges to use shub:
* 0 - no force
* 1 - force
* y - interupt enable
* 0 - disable interrupts
* 1 - leave interuupts enabled
* z - type of lock:
* 0 - global lock
* 1 - node local lock
* 2 - no lock
*
* Note: on shub1, only ptctest == 0 is supported. Don't try other values!
*/
static
unsigned
int
sn2_ptctest
=
0
;
static
int
__init
ptc_test
(
char
*
str
)
{
get_option
(
&
str
,
&
sn2_ptctest
);
return
1
;
}
__setup
(
"ptctest="
,
ptc_test
);
static
inline
int
ptc_lock
(
unsigned
long
*
flagp
)
{
unsigned
long
opt
=
sn2_ptctest
&
255
;
switch
(
opt
)
{
case
0x00
:
spin_lock_irqsave
(
&
sn2_global_ptc_lock
,
*
flagp
);
break
;
case
0x01
:
spin_lock_irqsave
(
&
sn_nodepda
->
ptc_lock
,
*
flagp
);
break
;
case
0x02
:
local_irq_save
(
*
flagp
);
break
;
case
0x10
:
spin_lock
(
&
sn2_global_ptc_lock
);
break
;
case
0x11
:
spin_lock
(
&
sn_nodepda
->
ptc_lock
);
break
;
case
0x12
:
break
;
default:
BUG
();
}
return
opt
;
}
static
inline
void
ptc_unlock
(
unsigned
long
flags
,
int
opt
)
{
switch
(
opt
)
{
case
0x00
:
spin_unlock_irqrestore
(
&
sn2_global_ptc_lock
,
flags
);
break
;
case
0x01
:
spin_unlock_irqrestore
(
&
sn_nodepda
->
ptc_lock
,
flags
);
break
;
case
0x02
:
local_irq_restore
(
flags
);
break
;
case
0x10
:
spin_unlock
(
&
sn2_global_ptc_lock
);
break
;
case
0x11
:
spin_unlock
(
&
sn_nodepda
->
ptc_lock
);
break
;
case
0x12
:
break
;
default:
BUG
();
}
}
#else
#define sn2_ptctest 0
static
inline
int
ptc_lock
(
unsigned
long
*
flagp
)
{
spin_lock_irqsave
(
&
sn2_global_ptc_lock
,
*
flagp
);
return
0
;
}
static
inline
void
ptc_unlock
(
unsigned
long
flags
,
int
opt
)
{
spin_unlock_irqrestore
(
&
sn2_global_ptc_lock
,
flags
);
}
#endif
struct
ptc_stats
{
unsigned
long
ptc_l
;
unsigned
long
change_rid
;
unsigned
long
shub_ptc_flushes
;
unsigned
long
nodes_flushed
;
unsigned
long
deadlocks
;
unsigned
long
lock_itc_clocks
;
unsigned
long
shub_itc_clocks
;
unsigned
long
shub_itc_clocks_max
;
};
static
inline
unsigned
long
wait_piowc
(
void
)
{
...
...
@@ -89,9 +199,9 @@ void
sn2_global_tlb_purge
(
unsigned
long
start
,
unsigned
long
end
,
unsigned
long
nbits
)
{
int
i
,
shub1
,
cnode
,
mynasid
,
cpu
,
lcpu
=
0
,
nasid
,
flushed
=
0
;
int
i
,
opt
,
shub1
,
cnode
,
mynasid
,
cpu
,
lcpu
=
0
,
nasid
,
flushed
=
0
;
volatile
unsigned
long
*
ptc0
,
*
ptc1
;
unsigned
long
flags
=
0
,
data0
=
0
,
data1
=
0
;
unsigned
long
itc
,
itc2
,
flags
,
data0
=
0
,
data1
=
0
;
struct
mm_struct
*
mm
=
current
->
active_mm
;
short
nasids
[
MAX_NUMNODES
],
nix
;
nodemask_t
nodes_flushed
;
...
...
@@ -114,16 +224,19 @@ sn2_global_tlb_purge(unsigned long start, unsigned long end,
start
+=
(
1UL
<<
nbits
);
}
while
(
start
<
end
);
ia64_srlz_i
();
__get_cpu_var
(
ptcstats
).
ptc_l
++
;
preempt_enable
();
return
;
}
if
(
atomic_read
(
&
mm
->
mm_users
)
==
1
)
{
flush_tlb_mm
(
mm
);
__get_cpu_var
(
ptcstats
).
change_rid
++
;
preempt_enable
();
return
;
}
itc
=
ia64_get_itc
();
nix
=
0
;
for_each_node_mask
(
cnode
,
nodes_flushed
)
nasids
[
nix
++
]
=
cnodeid_to_nasid
(
cnode
);
...
...
@@ -148,7 +261,12 @@ sn2_global_tlb_purge(unsigned long start, unsigned long end,
mynasid
=
get_nasid
();
spin_lock_irqsave
(
&
sn2_global_ptc_lock
,
flags
);
itc
=
ia64_get_itc
();
opt
=
ptc_lock
(
&
flags
);
itc2
=
ia64_get_itc
();
__get_cpu_var
(
ptcstats
).
lock_itc_clocks
+=
itc2
-
itc
;
__get_cpu_var
(
ptcstats
).
shub_ptc_flushes
++
;
__get_cpu_var
(
ptcstats
).
nodes_flushed
+=
nix
;
do
{
if
(
shub1
)
...
...
@@ -157,7 +275,7 @@ sn2_global_tlb_purge(unsigned long start, unsigned long end,
data0
=
(
data0
&
~
SH2_PTC_ADDR_MASK
)
|
(
start
&
SH2_PTC_ADDR_MASK
);
for
(
i
=
0
;
i
<
nix
;
i
++
)
{
nasid
=
nasids
[
i
];
if
(
unlikely
(
nasid
==
mynasid
))
{
if
(
(
!
(
sn2_ptctest
&
3
))
&&
unlikely
(
nasid
==
mynasid
))
{
ia64_ptcga
(
start
,
nbits
<<
2
);
ia64_srlz_i
();
}
else
{
...
...
@@ -169,18 +287,22 @@ sn2_global_tlb_purge(unsigned long start, unsigned long end,
flushed
=
1
;
}
}
if
(
flushed
&&
(
wait_piowc
()
&
SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK
))
{
sn2_ptc_deadlock_recovery
(
ptc0
,
data0
,
ptc1
,
data1
);
(
SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK
)
))
{
sn2_ptc_deadlock_recovery
(
nasids
,
nix
,
mynasid
,
ptc0
,
data0
,
ptc1
,
data1
);
}
start
+=
(
1UL
<<
nbits
);
}
while
(
start
<
end
);
spin_unlock_irqrestore
(
&
sn2_global_ptc_lock
,
flags
);
itc2
=
ia64_get_itc
()
-
itc2
;
__get_cpu_var
(
ptcstats
).
shub_itc_clocks
+=
itc2
;
if
(
itc2
>
__get_cpu_var
(
ptcstats
).
shub_itc_clocks_max
)
__get_cpu_var
(
ptcstats
).
shub_itc_clocks_max
=
itc2
;
ptc_unlock
(
flags
,
opt
);
preempt_enable
();
}
...
...
@@ -192,31 +314,29 @@ sn2_global_tlb_purge(unsigned long start, unsigned long end,
* TLB flush transaction. The recovery sequence is somewhat tricky & is
* coded in assembly language.
*/
void
sn2_ptc_deadlock_recovery
(
volatile
unsigned
long
*
ptc0
,
unsigned
long
data0
,
void
sn2_ptc_deadlock_recovery
(
short
*
nasids
,
short
nix
,
int
mynasid
,
volatile
unsigned
long
*
ptc0
,
unsigned
long
data0
,
volatile
unsigned
long
*
ptc1
,
unsigned
long
data1
)
{
extern
void
sn2_ptc_deadlock_recovery_core
(
volatile
unsigned
long
*
,
unsigned
long
,
volatile
unsigned
long
*
,
unsigned
long
,
volatile
unsigned
long
*
,
unsigned
long
);
int
cnode
,
mycnode
,
nasid
;
volatile
unsigned
long
*
piows
;
volatile
unsigned
long
zeroval
;
short
nasid
,
i
;
unsigned
long
*
piows
,
zeroval
;
sn2_ptc_deadlock_count
++
;
__get_cpu_var
(
ptcstats
).
deadlocks
++
;
piows
=
pda
->
pio_write_status_addr
;
piows
=
(
unsigned
long
*
)
pda
->
pio_write_status_addr
;
zeroval
=
pda
->
pio_write_status_val
;
mycnode
=
numa_node_id
();
for_each_online_node
(
cnode
)
{
if
(
is_headless_node
(
cnode
)
||
cnode
==
mycnode
)
for
(
i
=
0
;
i
<
nix
;
i
++
)
{
nasid
=
nasids
[
i
];
if
(
!
(
sn2_ptctest
&
3
)
&&
nasid
==
mynasid
)
continue
;
nasid
=
cnodeid_to_nasid
(
cnode
);
ptc0
=
CHANGE_NASID
(
nasid
,
ptc0
);
if
(
ptc1
)
ptc1
=
CHANGE_NASID
(
nasid
,
ptc1
);
sn2_ptc_deadlock_recovery_core
(
ptc0
,
data0
,
ptc1
,
data1
,
piows
,
zeroval
);
}
}
/**
...
...
@@ -293,3 +413,93 @@ void sn2_send_IPI(int cpuid, int vector, int delivery_mode, int redirect)
sn_send_IPI_phys
(
nasid
,
physid
,
vector
,
delivery_mode
);
}
#ifdef CONFIG_PROC_FS
#define PTC_BASENAME "sgi_sn/ptc_statistics"
static
void
*
sn2_ptc_seq_start
(
struct
seq_file
*
file
,
loff_t
*
offset
)
{
if
(
*
offset
<
NR_CPUS
)
return
offset
;
return
NULL
;
}
static
void
*
sn2_ptc_seq_next
(
struct
seq_file
*
file
,
void
*
data
,
loff_t
*
offset
)
{
(
*
offset
)
++
;
if
(
*
offset
<
NR_CPUS
)
return
offset
;
return
NULL
;
}
static
void
sn2_ptc_seq_stop
(
struct
seq_file
*
file
,
void
*
data
)
{
}
static
int
sn2_ptc_seq_show
(
struct
seq_file
*
file
,
void
*
data
)
{
struct
ptc_stats
*
stat
;
int
cpu
;
cpu
=
*
(
loff_t
*
)
data
;
if
(
!
cpu
)
{
seq_printf
(
file
,
"# ptc_l change_rid shub_ptc_flushes shub_nodes_flushed deadlocks lock_nsec shub_nsec shub_nsec_max
\n
"
);
seq_printf
(
file
,
"# ptctest %d
\n
"
,
sn2_ptctest
);
}
if
(
cpu
<
NR_CPUS
&&
cpu_online
(
cpu
))
{
stat
=
&
per_cpu
(
ptcstats
,
cpu
);
seq_printf
(
file
,
"cpu %d %ld %ld %ld %ld %ld %ld %ld %ld
\n
"
,
cpu
,
stat
->
ptc_l
,
stat
->
change_rid
,
stat
->
shub_ptc_flushes
,
stat
->
nodes_flushed
,
stat
->
deadlocks
,
1000
*
stat
->
lock_itc_clocks
/
per_cpu
(
cpu_info
,
cpu
).
cyc_per_usec
,
1000
*
stat
->
shub_itc_clocks
/
per_cpu
(
cpu_info
,
cpu
).
cyc_per_usec
,
1000
*
stat
->
shub_itc_clocks_max
/
per_cpu
(
cpu_info
,
cpu
).
cyc_per_usec
);
}
return
0
;
}
static
struct
seq_operations
sn2_ptc_seq_ops
=
{
.
start
=
sn2_ptc_seq_start
,
.
next
=
sn2_ptc_seq_next
,
.
stop
=
sn2_ptc_seq_stop
,
.
show
=
sn2_ptc_seq_show
};
int
sn2_ptc_proc_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
sn2_ptc_seq_ops
);
}
static
struct
file_operations
proc_sn2_ptc_operations
=
{
.
open
=
sn2_ptc_proc_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
static
struct
proc_dir_entry
*
proc_sn2_ptc
;
static
int
__init
sn2_ptc_init
(
void
)
{
if
(
!
(
proc_sn2_ptc
=
create_proc_entry
(
PTC_BASENAME
,
0444
,
NULL
)))
{
printk
(
KERN_ERR
"unable to create %s proc entry"
,
PTC_BASENAME
);
return
-
EINVAL
;
}
proc_sn2_ptc
->
proc_fops
=
&
proc_sn2_ptc_operations
;
spin_lock_init
(
&
sn2_global_ptc_lock
);
return
0
;
}
static
void
__exit
sn2_ptc_exit
(
void
)
{
remove_proc_entry
(
PTC_BASENAME
,
NULL
);
}
module_init
(
sn2_ptc_init
);
module_exit
(
sn2_ptc_exit
);
#endif
/* CONFIG_PROC_FS */
arch/ia64/sn/kernel/sn2/sn_hwperf.c
View file @
bcdd3a91
This diff is collapsed.
Click to expand it.
arch/ia64/sn/kernel/sn2/sn_proc_fs.c
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2000-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 2000-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#include <linux/config.h>
#include <asm/uaccess.h>
...
...
@@ -15,7 +15,7 @@
static
int
partition_id_show
(
struct
seq_file
*
s
,
void
*
p
)
{
seq_printf
(
s
,
"%d
\n
"
,
sn_
local_partid
()
);
seq_printf
(
s
,
"%d
\n
"
,
sn_
partition_id
);
return
0
;
}
...
...
arch/ia64/sn/kernel/sn2/timer_interrupt.c
View file @
bcdd3a91
/*
*
*
* Copyright (c) 200
3
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 200
5
Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License
...
...
@@ -50,6 +50,7 @@ void sn_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
LED_CPU_HEARTBEAT
,
LED_CPU_HEARTBEAT
);
}
if
(
is_shub1
())
{
if
(
enable_shub_wars_1_1
())
{
/* Bugfix code for SHUB 1.1 */
if
(
pda
->
pio_shub_war_cam_addr
)
...
...
@@ -60,4 +61,5 @@ void sn_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
pda
->
sn_lb_int_war_ticks
++
;
if
(
pda
->
sn_lb_int_war_ticks
>=
SN_LB_INT_WAR_INTERVAL
)
pda
->
sn_lb_int_war_ticks
=
0
;
}
}
arch/ia64/sn/pci/Makefile
View file @
bcdd3a91
...
...
@@ -7,4 +7,4 @@
#
# Makefile for the sn pci general routines.
obj-y
:=
pci_dma.o tioca_provider.o
pcibr/
obj-y
:=
pci_dma.o tioca_provider.o
tioce_provider.o pcibr/
arch/ia64/sn/pci/pcibr/pcibr_dma.c
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2001-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 2001-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#include <linux/types.h>
...
...
@@ -215,8 +215,8 @@ void sn_dma_flush(uint64_t addr)
int
is_tio
;
int
wid_num
;
int
i
,
j
;
int
bwin
;
uint64_t
flags
;
uint64_t
itte
;
struct
hubdev_info
*
hubinfo
;
volatile
struct
sn_flush_device_list
*
p
;
struct
sn_flush_nasid_entry
*
flush_nasid_list
;
...
...
@@ -233,31 +233,36 @@ void sn_dma_flush(uint64_t addr)
if
(
!
hubinfo
)
{
BUG
();
}
is_tio
=
(
nasid
&
1
);
if
(
is_tio
)
{
wid_num
=
TIO_SWIN_WIDGETNUM
(
addr
);
bwin
=
TIO_BWIN_WINDOWNUM
(
addr
);
}
else
{
wid_num
=
SWIN_WIDGETNUM
(
addr
);
bwin
=
BWIN_WINDOWNUM
(
addr
);
}
flush_nasid_list
=
&
hubinfo
->
hdi_flush_nasid_list
;
if
(
flush_nasid_list
->
widget_p
==
NULL
)
return
;
if
(
bwin
>
0
)
{
uint64_t
itte
=
flush_nasid_list
->
iio_itte
[
bwin
];
is_tio
=
(
nasid
&
1
);
if
(
is_tio
)
{
wid_num
=
(
itte
>>
TIO_ITTE_WIDGET_SHIFT
)
&
TIO_ITTE_WIDGET_MASK
;
int
itte_index
;
if
(
TIO_HWIN
(
addr
))
itte_index
=
0
;
else
if
(
TIO_BWIN_WINDOWNUM
(
addr
))
itte_index
=
TIO_BWIN_WINDOWNUM
(
addr
);
else
itte_index
=
-
1
;
if
(
itte_index
>=
0
)
{
itte
=
flush_nasid_list
->
iio_itte
[
itte_index
];
if
(
!
TIO_ITTE_VALID
(
itte
))
return
;
wid_num
=
TIO_ITTE_WIDGET
(
itte
);
}
else
wid_num
=
TIO_SWIN_WIDGETNUM
(
addr
);
}
else
{
wid_num
=
(
itte
>>
IIO_ITTE_WIDGET_SHIFT
)
&
IIO_ITTE_WIDGET_MASK
;
}
if
(
BWIN_WINDOWNUM
(
addr
))
{
itte
=
flush_nasid_list
->
iio_itte
[
BWIN_WINDOWNUM
(
addr
)];
wid_num
=
IIO_ITTE_WIDGET
(
itte
);
}
else
wid_num
=
SWIN_WIDGETNUM
(
addr
);
}
if
(
flush_nasid_list
->
widget_p
==
NULL
)
return
;
if
(
flush_nasid_list
->
widget_p
[
wid_num
]
==
NULL
)
return
;
p
=
&
flush_nasid_list
->
widget_p
[
wid_num
][
0
];
...
...
@@ -283,10 +288,16 @@ void sn_dma_flush(uint64_t addr)
/*
* For TIOCP use the Device(x) Write Request Buffer Flush Bridge
* register since it ensures the data has entered the coherence
* domain, unlike PIC
* domain, unlike PIC
.
*/
if
(
is_tio
)
{
uint32_t
tio_id
=
REMOTE_HUB_L
(
nasid
,
TIO_NODE_ID
);
/*
* Note: devices behind TIOCE should never be matched in the
* above code, and so the following code is PIC/CP centric.
* If CE ever needs the sn_dma_flush mechanism, we will have
* to account for that here and in tioce_bus_fixup().
*/
uint32_t
tio_id
=
HUB_L
(
TIO_IOSPACE_ADDR
(
nasid
,
TIO_NODE_ID
));
uint32_t
revnum
=
XWIDGET_PART_REV_NUM
(
tio_id
);
/* TIOCP BRINGUP WAR (PV907516): Don't write buffer flush reg */
...
...
@@ -306,7 +317,8 @@ void sn_dma_flush(uint64_t addr)
*
(
volatile
uint32_t
*
)(
p
->
sfdl_force_int_addr
)
=
1
;
/* wait for the interrupt to come back. */
while
(
*
(
p
->
sfdl_flush_addr
)
!=
0x10f
)
;
while
(
*
(
p
->
sfdl_flush_addr
)
!=
0x10f
)
cpu_relax
();
/* okay, everything is synched up. */
spin_unlock_irqrestore
((
spinlock_t
*
)
&
p
->
sfdl_flush_lock
,
flags
);
...
...
arch/ia64/sn/pci/pcibr/pcibr_provider.c
View file @
bcdd3a91
...
...
@@ -15,6 +15,7 @@
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/sn2/sn_hwperf.h>
#include "xtalk/xwidgetdev.h"
#include "xtalk/hubdev.h"
...
...
@@ -60,7 +61,7 @@ static int sal_pcibr_error_interrupt(struct pcibus_info *soft)
ret_stuff
.
status
=
0
;
ret_stuff
.
v0
=
0
;
segment
=
0
;
segment
=
soft
->
pbi_buscommon
.
bs_persist_segment
;
busnum
=
soft
->
pbi_buscommon
.
bs_persist_busnum
;
SAL_CALL_NOLOCK
(
ret_stuff
,
(
u64
)
SN_SAL_IOIF_ERROR_INTERRUPT
,
...
...
@@ -88,6 +89,7 @@ void *
pcibr_bus_fixup
(
struct
pcibus_bussoft
*
prom_bussoft
,
struct
pci_controller
*
controller
)
{
int
nasid
,
cnode
,
j
;
cnodeid_t
near_cnode
;
struct
hubdev_info
*
hubdev_info
;
struct
pcibus_info
*
soft
;
struct
sn_flush_device_list
*
sn_flush_device_list
;
...
...
@@ -115,7 +117,7 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
/*
* register the bridge's error interrupt handler
*/
if
(
request_irq
(
SGI_PCI
BR
_ERROR
,
(
void
*
)
pcibr_error_intr_handler
,
if
(
request_irq
(
SGI_PCI
ASIC
_ERROR
,
(
void
*
)
pcibr_error_intr_handler
,
SA_SHIRQ
,
"PCIBR error"
,
(
void
*
)(
soft
)))
{
printk
(
KERN_WARNING
"pcibr cannot allocate interrupt for error handler
\n
"
);
...
...
@@ -142,9 +144,12 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
j
++
,
sn_flush_device_list
++
)
{
if
(
sn_flush_device_list
->
sfdl_slot
==
-
1
)
continue
;
if
(
sn_flush_device_list
->
if
((
sn_flush_device_list
->
sfdl_persistent_segment
==
soft
->
pbi_buscommon
.
bs_persist_segment
)
&&
(
sn_flush_device_list
->
sfdl_persistent_busnum
==
soft
->
pbi_buscommon
.
bs_persist_busnum
)
soft
->
pbi_buscommon
.
bs_persist_busnum
)
)
sn_flush_device_list
->
sfdl_pcibus_info
=
soft
;
}
...
...
@@ -158,12 +163,18 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
memset
(
soft
->
pbi_int_ate_resource
.
ate
,
0
,
(
soft
->
pbi_int_ate_size
*
sizeof
(
uint64_t
)));
if
(
prom_bussoft
->
bs_asic_type
==
PCIIO_ASIC_TYPE_TIOCP
)
/*
* TIO PCI Bridge with no closest node information.
* FIXME: Find another way to determine the closest node
*/
controller
->
node
=
-
1
;
if
(
prom_bussoft
->
bs_asic_type
==
PCIIO_ASIC_TYPE_TIOCP
)
{
/* TIO PCI Bridge: find nearest node with CPUs */
int
e
=
sn_hwperf_get_nearest_node
(
cnode
,
NULL
,
&
near_cnode
);
if
(
e
<
0
)
{
near_cnode
=
(
cnodeid_t
)
-
1
;
/* use any node */
printk
(
KERN_WARNING
"pcibr_bus_fixup: failed to find "
"near node with CPUs to TIO node %d, err=%d
\n
"
,
cnode
,
e
);
}
controller
->
node
=
near_cnode
;
}
else
controller
->
node
=
cnode
;
return
soft
;
...
...
@@ -175,6 +186,9 @@ void pcibr_force_interrupt(struct sn_irq_info *sn_irq_info)
struct
pcibus_info
*
pcibus_info
;
int
bit
=
sn_irq_info
->
irq_int_bit
;
if
(
!
sn_irq_info
->
irq_bridge
)
return
;
pcidev_info
=
(
struct
pcidev_info
*
)
sn_irq_info
->
irq_pciioinfo
;
if
(
pcidev_info
)
{
pcibus_info
=
...
...
@@ -184,7 +198,7 @@ void pcibr_force_interrupt(struct sn_irq_info *sn_irq_info)
}
}
void
pcibr_
change_devices_irq
(
struct
sn_irq_info
*
sn_irq_info
)
void
pcibr_
target_interrupt
(
struct
sn_irq_info
*
sn_irq_info
)
{
struct
pcidev_info
*
pcidev_info
;
struct
pcibus_info
*
pcibus_info
;
...
...
@@ -219,6 +233,8 @@ struct sn_pcibus_provider pcibr_provider = {
.
dma_map_consistent
=
pcibr_dma_map_consistent
,
.
dma_unmap
=
pcibr_dma_unmap
,
.
bus_fixup
=
pcibr_bus_fixup
,
.
force_interrupt
=
pcibr_force_interrupt
,
.
target_interrupt
=
pcibr_target_interrupt
};
int
...
...
arch/ia64/sn/pci/tioca_provider.c
View file @
bcdd3a91
...
...
@@ -559,7 +559,7 @@ tioca_error_intr_handler(int irq, void *arg, struct pt_regs *pt)
ret_stuff
.
status
=
0
;
ret_stuff
.
v0
=
0
;
segment
=
0
;
segment
=
soft
->
ca_common
.
bs_persist_segment
;
busnum
=
soft
->
ca_common
.
bs_persist_busnum
;
SAL_CALL_NOLOCK
(
ret_stuff
,
...
...
@@ -622,7 +622,8 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont
nasid_to_cnodeid
(
tioca_common
->
ca_closest_nasid
);
tioca_common
->
ca_kernel_private
=
(
uint64_t
)
tioca_kern
;
bus
=
pci_find_bus
(
0
,
tioca_common
->
ca_common
.
bs_persist_busnum
);
bus
=
pci_find_bus
(
tioca_common
->
ca_common
.
bs_persist_segment
,
tioca_common
->
ca_common
.
bs_persist_busnum
);
BUG_ON
(
!
bus
);
tioca_kern
->
ca_devices
=
&
bus
->
devices
;
...
...
@@ -656,6 +657,8 @@ static struct sn_pcibus_provider tioca_pci_interfaces = {
.
dma_map_consistent
=
tioca_dma_map
,
.
dma_unmap
=
tioca_dma_unmap
,
.
bus_fixup
=
tioca_bus_fixup
,
.
force_interrupt
=
NULL
,
.
target_interrupt
=
NULL
};
/**
...
...
arch/ia64/sn/pci/tioce_provider.c
0 → 100644
View file @
bcdd3a91
This diff is collapsed.
Click to expand it.
include/asm-ia64/sn/addrs.h
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (c) 1992-1999,2001-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (c) 1992-1999,2001-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _ASM_IA64_SN_ADDRS_H
...
...
@@ -126,6 +126,7 @@
#define GLOBAL_MMR_PHYS_ADDR(n,a) (GLOBAL_PHYS_MMR_SPACE | REMOTE_ADDR(n,a))
#define GLOBAL_CAC_ADDR(n,a) (CAC_BASE | REMOTE_ADDR(n,a))
#define CHANGE_NASID(n,x) ((void *)(((u64)(x) & ~NASID_MASK) | NASID_SPACE(n)))
#define IS_TIO_NASID(n) ((n) & 1)
/* non-II mmr's start at top of big window space (4G) */
...
...
@@ -155,10 +156,28 @@
* the chiplet id is zero. If we implement TIO-TIO dma, we might need
* to insert a chiplet id into this macro. However, it is our belief
* right now that this chiplet id will be ICE, which is also zero.
* Nasid starts on bit 40.
*/
#define PHYS_TO_TIODMA(x) ( (((u64)(NASID_GET(x))) << 40) | NODE_OFFSET(x))
#define PHYS_TO_DMA(x) ( (((u64)(x) & NASID_MASK) >> 2) | NODE_OFFSET(x))
#define SH1_TIO_PHYS_TO_DMA(x) \
((((u64)(NASID_GET(x))) << 40) | NODE_OFFSET(x))
#define SH2_NETWORK_BANK_OFFSET(x) \
((u64)(x) & ((1UL << (sn_hub_info->nasid_shift - 4)) -1))
#define SH2_NETWORK_BANK_SELECT(x) \
((((u64)(x) & (0x3UL << (sn_hub_info->nasid_shift - 4))) \
>> (sn_hub_info->nasid_shift - 4)) << 36)
#define SH2_NETWORK_ADDRESS(x) \
(SH2_NETWORK_BANK_OFFSET(x) | SH2_NETWORK_BANK_SELECT(x))
#define SH2_TIO_PHYS_TO_DMA(x) \
(((u64)(NASID_GET(x)) << 40) | SH2_NETWORK_ADDRESS(x))
#define PHYS_TO_TIODMA(x) \
(is_shub1() ? SH1_TIO_PHYS_TO_DMA(x) : SH2_TIO_PHYS_TO_DMA(x))
#define PHYS_TO_DMA(x) \
((((u64)(x) & NASID_MASK) >> 2) | NODE_OFFSET(x))
/*
...
...
@@ -187,11 +206,13 @@
#define RAW_NODE_SWIN_BASE(n, w) (NODE_IO_BASE(n) + ((u64) (w) << SWIN_SIZE_BITS))
#define BWIN_WIDGET_MASK 0x7
#define BWIN_WINDOWNUM(x) (((x) >> BWIN_SIZE_BITS) & BWIN_WIDGET_MASK)
#define SH1_IS_BIG_WINDOW_ADDR(x) ((x) & BWIN_TOP)
#define TIO_BWIN_WINDOW_SELECT_MASK 0x7
#define TIO_BWIN_WINDOWNUM(x) (((x) >> TIO_BWIN_SIZE_BITS) & TIO_BWIN_WINDOW_SELECT_MASK)
#define TIO_HWIN_SHIFT_BITS 33
#define TIO_HWIN(x) (NODE_OFFSET(x) >> TIO_HWIN_SHIFT_BITS)
/*
* The following definitions pertain to the IO special address
...
...
@@ -216,10 +237,6 @@
#define TIO_SWIN_WIDGETNUM(x) (((x) >> TIO_SWIN_SIZE_BITS) & TIO_SWIN_WIDGET_MASK)
#define TIO_IOSPACE_ADDR(n,x) \
/* Move in the Chiplet ID for TIO Local Block MMR */
\
(REMOTE_ADDR(n,x) | 1UL << (NASID_SHIFT - 2))
/*
* The following macros produce the correct base virtual address for
* the hub registers. The REMOTE_HUB_* macro produce
...
...
@@ -234,18 +251,40 @@
* Otherwise, the recommended approach is to use *_HUB_L() and *_HUB_S().
* They're always safe.
*/
/* Shub1 TIO & MMR addressing macros */
#define SH1_TIO_IOSPACE_ADDR(n,x) \
GLOBAL_MMR_ADDR(n,x)
#define SH1_REMOTE_BWIN_MMR(n,x) \
GLOBAL_MMR_ADDR(n,x)
#define SH1_REMOTE_SWIN_MMR(n,x) \
(NODE_SWIN_BASE(n,1) + 0x800000UL + (x))
#define SH1_REMOTE_MMR(n,x) \
(SH1_IS_BIG_WINDOW_ADDR(x) ? SH1_REMOTE_BWIN_MMR(n,x) : \
SH1_REMOTE_SWIN_MMR(n,x))
/* Shub1 TIO & MMR addressing macros */
#define SH2_TIO_IOSPACE_ADDR(n,x) \
((UNCACHED | REMOTE_ADDR(n,x) | 1UL << (NASID_SHIFT - 2)))
#define SH2_REMOTE_MMR(n,x) \
GLOBAL_MMR_ADDR(n,x)
/* TIO & MMR addressing macros that work on both shub1 & shub2 */
#define TIO_IOSPACE_ADDR(n,x) \
((u64 *)(is_shub1() ? SH1_TIO_IOSPACE_ADDR(n,x) : \
SH2_TIO_IOSPACE_ADDR(n,x)))
#define SH_REMOTE_MMR(n,x) \
(is_shub1() ? SH1_REMOTE_MMR(n,x) : SH2_REMOTE_MMR(n,x))
#define REMOTE_HUB_ADDR(n,x) \
((n & 1) ? \
/* TIO: */
\
(is_shub2() ? \
/* TIO on Shub2 */
\
(volatile u64 *)(TIO_IOSPACE_ADDR(n,x)) \
:
/* TIO on shub1 */
\
(volatile u64 *)(GLOBAL_MMR_ADDR(n,x))) \
\
:
/* SHUB1 and SHUB2 MMRs: */
\
(((x) & BWIN_TOP) ? ((volatile u64 *)(GLOBAL_MMR_ADDR(n,x))) \
: ((volatile u64 *)(NODE_SWIN_BASE(n,1) + 0x800000 + (x)))))
(IS_TIO_NASID(n) ? ((volatile u64*)TIO_IOSPACE_ADDR(n,x)) : \
((volatile u64*)SH_REMOTE_MMR(n,x)))
#define HUB_L(x) (*((volatile typeof(*x) *)x))
#define HUB_S(x,d) (*((volatile typeof(*x) *)x) = (d))
...
...
include/asm-ia64/sn/geo.h
View file @
bcdd3a91
...
...
@@ -3,7 +3,7 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1992 - 1997, 2000-200
4
Silicon Graphics, Inc. All rights reserved.
* Copyright (C) 1992 - 1997, 2000-200
5
Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _ASM_IA64_SN_GEO_H
...
...
@@ -108,7 +108,6 @@ typedef union geoid_u {
#define INVALID_SLAB (slabid_t)-1
#define INVALID_SLOT (slotid_t)-1
#define INVALID_MODULE ((moduleid_t)-1)
#define INVALID_PARTID ((partid_t)-1)
static
inline
slabid_t
geo_slab
(
geoid_t
g
)
{
...
...
include/asm-ia64/sn/intr.h
View file @
bcdd3a91
...
...
@@ -12,13 +12,12 @@
#include <linux/rcupdate.h>
#define SGI_UART_VECTOR (0xe9)
#define SGI_PCIBR_ERROR (0x33)
/* Reserved IRQs : Note, not to exceed IA64_SN2_FIRST_DEVICE_VECTOR */
#define SGI_XPC_ACTIVATE (0x30)
#define SGI_II_ERROR (0x31)
#define SGI_XBOW_ERROR (0x32)
#define SGI_PCI
BR_ERROR
(0x33)
#define SGI_PCI
ASIC_ERROR
(0x33)
#define SGI_ACPI_SCI_INT (0x34)
#define SGI_TIOCA_ERROR (0x35)
#define SGI_TIO_ERROR (0x36)
...
...
include/asm-ia64/sn/nodepda.h
View file @
bcdd3a91
...
...
@@ -37,7 +37,6 @@ struct phys_cpuid {
struct
nodepda_s
{
void
*
pdinfo
;
/* Platform-dependent per-node info */
spinlock_t
bist_lock
;
/*
* The BTEs on this node are shared by the local cpus
...
...
@@ -55,6 +54,8 @@ struct nodepda_s {
* Array of physical cpu identifiers. Indexed by cpuid.
*/
struct
phys_cpuid
phys_cpuid
[
NR_CPUS
];
spinlock_t
ptc_lock
____cacheline_aligned_in_smp
;
spinlock_t
bist_lock
;
};
typedef
struct
nodepda_s
nodepda_t
;
...
...
include/asm-ia64/sn/pcibus_provider_defs.h
View file @
bcdd3a91
...
...
@@ -18,8 +18,9 @@
#define PCIIO_ASIC_TYPE_PIC 2
#define PCIIO_ASIC_TYPE_TIOCP 3
#define PCIIO_ASIC_TYPE_TIOCA 4
#define PCIIO_ASIC_TYPE_TIOCE 5
#define PCIIO_ASIC_MAX_TYPES
5
#define PCIIO_ASIC_MAX_TYPES
6
/*
* Common pciio bus provider data. There should be one of these as the
...
...
@@ -30,7 +31,8 @@
struct
pcibus_bussoft
{
uint32_t
bs_asic_type
;
/* chipset type */
uint32_t
bs_xid
;
/* xwidget id */
uint64_t
bs_persist_busnum
;
/* Persistent Bus Number */
uint32_t
bs_persist_busnum
;
/* Persistent Bus Number */
uint32_t
bs_persist_segment
;
/* Segment Number */
uint64_t
bs_legacy_io
;
/* legacy io pio addr */
uint64_t
bs_legacy_mem
;
/* legacy mem pio addr */
uint64_t
bs_base
;
/* widget base */
...
...
@@ -47,6 +49,8 @@ struct sn_pcibus_provider {
dma_addr_t
(
*
dma_map_consistent
)(
struct
pci_dev
*
,
unsigned
long
,
size_t
);
void
(
*
dma_unmap
)(
struct
pci_dev
*
,
dma_addr_t
,
int
);
void
*
(
*
bus_fixup
)(
struct
pcibus_bussoft
*
,
struct
pci_controller
*
);
void
(
*
force_interrupt
)(
struct
sn_irq_info
*
);
void
(
*
target_interrupt
)(
struct
sn_irq_info
*
);
};
extern
struct
sn_pcibus_provider
*
sn_pci_provider
[];
...
...
include/asm-ia64/sn/pda.h
View file @
bcdd3a91
...
...
@@ -39,7 +39,6 @@ typedef struct pda_s {
unsigned
long
pio_write_status_val
;
volatile
unsigned
long
*
pio_shub_war_cam_addr
;
unsigned
long
sn_soft_irr
[
4
];
unsigned
long
sn_in_service_ivecs
[
4
];
int
sn_lb_int_war_ticks
;
int
sn_last_irq
;
...
...
include/asm-ia64/sn/sn2/sn_hwperf.h
View file @
bcdd3a91
...
...
@@ -43,6 +43,7 @@ struct sn_hwperf_object_info {
/* macros for object classification */
#define SN_HWPERF_IS_NODE(x) ((x) && strstr((x)->name, "SHub"))
#define SN_HWPERF_IS_NODE_SHUB2(x) ((x) && strstr((x)->name, "SHub 2."))
#define SN_HWPERF_IS_IONODE(x) ((x) && strstr((x)->name, "TIO"))
#define SN_HWPERF_IS_ROUTER(x) ((x) && strstr((x)->name, "Router"))
#define SN_HWPERF_IS_NL3ROUTER(x) ((x) && strstr((x)->name, "NL3Router"))
...
...
@@ -214,6 +215,15 @@ struct sn_hwperf_ioctl_args {
*/
#define SN_HWPERF_GET_NODE_NASID (102|SN_HWPERF_OP_MEM_COPYOUT)
/*
* Given a node id, determine the id of the nearest node with CPUs
* and the id of the nearest node that has memory. The argument
* node would normally be a "headless" node, e.g. an "IO node".
* Return 0 on success.
*/
extern
int
sn_hwperf_get_nearest_node
(
cnodeid_t
node
,
cnodeid_t
*
near_mem
,
cnodeid_t
*
near_cpu
);
/* return codes */
#define SN_HWPERF_OP_OK 0
#define SN_HWPERF_OP_NOMEM 1
...
...
include/asm-ia64/sn/sn_sal.h
View file @
bcdd3a91
...
...
@@ -55,7 +55,6 @@
#define SN_SAL_BUS_CONFIG 0x02000037
#define SN_SAL_SYS_SERIAL_GET 0x02000038
#define SN_SAL_PARTITION_SERIAL_GET 0x02000039
#define SN_SAL_SYSCTL_PARTITION_GET 0x0200003a
#define SN_SAL_SYSTEM_POWER_DOWN 0x0200003b
#define SN_SAL_GET_MASTER_BASEIO_NASID 0x0200003c
#define SN_SAL_COHERENCE 0x0200003d
...
...
@@ -78,7 +77,8 @@
#define SN_SAL_HUB_ERROR_INTERRUPT 0x02000060
#define SN_SAL_BTE_RECOVER 0x02000061
#define SN_SAL_IOIF_GET_PCI_TOPOLOGY 0x02000062
#define SN_SAL_RESERVED_DO_NOT_USE 0x02000062
#define SN_SAL_IOIF_GET_PCI_TOPOLOGY 0x02000064
/*
* Service-specific constants
...
...
@@ -585,35 +585,6 @@ sn_partition_serial_number_val(void) {
return
sn_partition_serial_number
;
}
/*
* Returns the partition id of the nasid passed in as an argument,
* or INVALID_PARTID if the partition id cannot be retrieved.
*/
static
inline
partid_t
ia64_sn_sysctl_partition_get
(
nasid_t
nasid
)
{
struct
ia64_sal_retval
ret_stuff
;
ia64_sal_oemcall_nolock
(
&
ret_stuff
,
SN_SAL_SYSCTL_PARTITION_GET
,
nasid
,
0
,
0
,
0
,
0
,
0
,
0
);
if
(
ret_stuff
.
status
!=
0
)
return
INVALID_PARTID
;
return
((
partid_t
)
ret_stuff
.
v0
);
}
/*
* Returns the partition id of the current processor.
*/
extern
partid_t
sn_partid
;
static
inline
partid_t
sn_local_partid
(
void
)
{
if
(
unlikely
(
sn_partid
<
0
))
{
sn_partid
=
ia64_sn_sysctl_partition_get
(
cpuid_to_nasid
(
smp_processor_id
()));
}
return
sn_partid
;
}
/*
* Returns the physical address of the partition's reserved page through
* an iterative number of calls.
...
...
@@ -749,7 +720,8 @@ ia64_sn_power_down(void)
{
struct
ia64_sal_retval
ret_stuff
;
SAL_CALL
(
ret_stuff
,
SN_SAL_SYSTEM_POWER_DOWN
,
0
,
0
,
0
,
0
,
0
,
0
,
0
);
while
(
1
);
while
(
1
)
cpu_relax
();
/* never returns */
}
...
...
@@ -1018,24 +990,6 @@ ia64_sn_get_sn_info(int fc, u8 *shubtype, u16 *nasid_bitmask, u8 *nasid_shift,
ret_stuff
.
v2
=
0
;
SAL_CALL_NOLOCK
(
ret_stuff
,
SN_SAL_GET_SN_INFO
,
fc
,
0
,
0
,
0
,
0
,
0
,
0
);
/***** BEGIN HACK - temp til old proms no longer supported ********/
if
(
ret_stuff
.
status
==
SALRET_NOT_IMPLEMENTED
)
{
int
nasid
=
get_sapicid
()
&
0xfff
;;
#define SH_SHUB_ID_NODES_PER_BIT_MASK 0x001f000000000000UL
#define SH_SHUB_ID_NODES_PER_BIT_SHFT 48
if
(
shubtype
)
*
shubtype
=
0
;
if
(
nasid_bitmask
)
*
nasid_bitmask
=
0x7ff
;
if
(
nasid_shift
)
*
nasid_shift
=
38
;
if
(
systemsize
)
*
systemsize
=
11
;
if
(
sharing_domain_size
)
*
sharing_domain_size
=
9
;
if
(
partid
)
*
partid
=
ia64_sn_sysctl_partition_get
(
nasid
);
if
(
coher
)
*
coher
=
nasid
>>
9
;
if
(
reg
)
*
reg
=
(
HUB_L
((
u64
*
)
LOCAL_MMR_ADDR
(
SH1_SHUB_ID
))
&
SH_SHUB_ID_NODES_PER_BIT_MASK
)
>>
SH_SHUB_ID_NODES_PER_BIT_SHFT
;
return
0
;
}
/***** END HACK *******/
if
(
ret_stuff
.
status
<
0
)
return
ret_stuff
.
status
;
...
...
@@ -1068,12 +1022,10 @@ ia64_sn_hwperf_op(nasid_t nasid, u64 opcode, u64 a0, u64 a1, u64 a2,
}
static
inline
int
ia64_sn_ioif_get_pci_topology
(
u64
rack
,
u64
bay
,
u64
slot
,
u64
slab
,
u64
buf
,
u64
len
)
ia64_sn_ioif_get_pci_topology
(
u64
buf
,
u64
len
)
{
struct
ia64_sal_retval
rv
;
SAL_CALL_NOLOCK
(
rv
,
SN_SAL_IOIF_GET_PCI_TOPOLOGY
,
rack
,
bay
,
slot
,
slab
,
buf
,
len
,
0
);
SAL_CALL_NOLOCK
(
rv
,
SN_SAL_IOIF_GET_PCI_TOPOLOGY
,
buf
,
len
,
0
,
0
,
0
,
0
,
0
);
return
(
int
)
rv
.
status
;
}
...
...
include/asm-ia64/sn/tioce.h
0 → 100644
View file @
bcdd3a91
This diff is collapsed.
Click to expand it.
include/asm-ia64/sn/tioce_provider.h
0 → 100644
View file @
bcdd3a91
/**************************************************************************
* Copyright (C) 2005, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#ifndef _ASM_IA64_SN_CE_PROVIDER_H
#define _ASM_IA64_SN_CE_PROVIDER_H
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/tioce.h>
/*
* Common TIOCE structure shared between the prom and kernel
*
* DO NOT CHANGE THIS STRUCT WITHOUT MAKING CORRESPONDING CHANGES TO THE
* PROM VERSION.
*/
struct
tioce_common
{
struct
pcibus_bussoft
ce_pcibus
;
/* common pciio header */
uint32_t
ce_rev
;
uint64_t
ce_kernel_private
;
uint64_t
ce_prom_private
;
};
struct
tioce_kernel
{
struct
tioce_common
*
ce_common
;
spinlock_t
ce_lock
;
struct
list_head
ce_dmamap_list
;
uint64_t
ce_ate40_shadow
[
TIOCE_NUM_M40_ATES
];
uint64_t
ce_ate3240_shadow
[
TIOCE_NUM_M3240_ATES
];
uint32_t
ce_ate3240_pagesize
;
uint8_t
ce_port1_secondary
;
/* per-port resources */
struct
{
int
dirmap_refcnt
;
uint64_t
dirmap_shadow
;
}
ce_port
[
TIOCE_NUM_PORTS
];
};
struct
tioce_dmamap
{
struct
list_head
ce_dmamap_list
;
/* headed by tioce_kernel */
uint32_t
refcnt
;
uint64_t
nbytes
;
/* # bytes mapped */
uint64_t
ct_start
;
/* coretalk start address */
uint64_t
pci_start
;
/* bus start address */
uint64_t
*
ate_hw
;
/* hw ptr of first ate in map */
uint64_t
*
ate_shadow
;
/* shadow ptr of firat ate */
uint16_t
ate_count
;
/* # ate's in the map */
};
extern
int
tioce_init_provider
(
void
);
#endif
/* __ASM_IA64_SN_CE_PROVIDER_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment