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
Kirill Smelkov
linux
Commits
043d0516
Commit
043d0516
authored
Jul 07, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6
parents
c101f313
21517a57
Changes
31
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
1255 additions
and
544 deletions
+1255
-544
arch/ia64/kernel/Makefile
arch/ia64/kernel/Makefile
+1
-0
arch/ia64/kernel/acpi.c
arch/ia64/kernel/acpi.c
+3
-1
arch/ia64/kernel/numa.c
arch/ia64/kernel/numa.c
+57
-0
arch/ia64/kernel/signal.c
arch/ia64/kernel/signal.c
+2
-0
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+0
-41
arch/ia64/kernel/traps.c
arch/ia64/kernel/traps.c
+4
-2
arch/ia64/mm/discontig.c
arch/ia64/mm/discontig.c
+199
-233
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+2
-1
arch/ia64/sn/include/xtalk/hubdev.h
arch/ia64/sn/include/xtalk/hubdev.h
+2
-0
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/io_init.c
+117
-68
arch/ia64/sn/kernel/irq.c
arch/ia64/sn/kernel/irq.c
+135
-120
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+6
-7
arch/ia64/sn/kernel/tiocx.c
arch/ia64/sn/kernel/tiocx.c
+4
-0
arch/ia64/sn/pci/pci_dma.c
arch/ia64/sn/pci/pci_dma.c
+2
-1
arch/ia64/sn/pci/pcibr/pcibr_ate.c
arch/ia64/sn/pci/pcibr/pcibr_ate.c
+1
-1
arch/ia64/sn/pci/pcibr/pcibr_dma.c
arch/ia64/sn/pci/pcibr/pcibr_dma.c
+7
-8
arch/ia64/sn/pci/pcibr/pcibr_provider.c
arch/ia64/sn/pci/pcibr/pcibr_provider.c
+42
-6
arch/ia64/sn/pci/pcibr/pcibr_reg.c
arch/ia64/sn/pci/pcibr/pcibr_reg.c
+4
-4
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioca_provider.c
+1
-2
drivers/pci/hotplug/Kconfig
drivers/pci/hotplug/Kconfig
+3
-2
drivers/pci/hotplug/Makefile
drivers/pci/hotplug/Makefile
+1
-0
drivers/pci/hotplug/sgi_hotplug.c
drivers/pci/hotplug/sgi_hotplug.c
+611
-0
drivers/pci/search.c
drivers/pci/search.c
+1
-0
include/asm-ia64/sn/arch.h
include/asm-ia64/sn/arch.h
+1
-0
include/asm-ia64/sn/intr.h
include/asm-ia64/sn/intr.h
+5
-1
include/asm-ia64/sn/pcibr_provider.h
include/asm-ia64/sn/pcibr_provider.h
+11
-3
include/asm-ia64/sn/pcidev.h
include/asm-ia64/sn/pcidev.h
+13
-3
include/asm-ia64/sn/pic.h
include/asm-ia64/sn/pic.h
+7
-7
include/asm-ia64/sn/sn_cpuid.h
include/asm-ia64/sn/sn_cpuid.h
+0
-5
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/sn/sn_sal.h
+12
-27
include/asm-ia64/sn/tiocp.h
include/asm-ia64/sn/tiocp.h
+1
-1
No files found.
arch/ia64/kernel/Makefile
View file @
043d0516
...
...
@@ -17,6 +17,7 @@ obj-$(CONFIG_IA64_PALINFO) += palinfo.o
obj-$(CONFIG_IOSAPIC)
+=
iosapic.o
obj-$(CONFIG_MODULES)
+=
module.o
obj-$(CONFIG_SMP)
+=
smp.o smpboot.o domain.o
obj-$(CONFIG_NUMA)
+=
numa.o
obj-$(CONFIG_PERFMON)
+=
perfmon_default_smpl.o
obj-$(CONFIG_IA64_CYCLONE)
+=
cyclone.o
obj-$(CONFIG_IA64_MCA_RECOVERY)
+=
mca_recovery.o
...
...
arch/ia64/kernel/acpi.c
View file @
043d0516
...
...
@@ -640,8 +640,10 @@ acpi_boot_init (void)
if
(
smp_boot_data
.
cpu_phys_id
[
cpu
]
!=
hard_smp_processor_id
())
node_cpuid
[
i
++
].
phys_id
=
smp_boot_data
.
cpu_phys_id
[
cpu
];
}
build_cpu_to_node_map
();
# endif
#endif
#ifdef CONFIG_ACPI_NUMA
build_cpu_to_node_map
();
#endif
/* Make boot-up look pretty */
printk
(
KERN_INFO
"%d CPUs available, %d CPUs total
\n
"
,
available_cpus
,
total_cpus
);
...
...
arch/ia64/kernel/numa.c
0 → 100644
View file @
043d0516
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ia64 kernel NUMA specific stuff
*
* Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
* Copyright (C) 2004 Silicon Graphics, Inc.
* Jesse Barnes <jbarnes@sgi.com>
*/
#include <linux/config.h>
#include <linux/topology.h>
#include <linux/module.h>
#include <asm/processor.h>
#include <asm/smp.h>
u8
cpu_to_node_map
[
NR_CPUS
]
__cacheline_aligned
;
EXPORT_SYMBOL
(
cpu_to_node_map
);
cpumask_t
node_to_cpu_mask
[
MAX_NUMNODES
]
__cacheline_aligned
;
/**
* build_cpu_to_node_map - setup cpu to node and node to cpumask arrays
*
* Build cpu to node mapping and initialize the per node cpu masks using
* info from the node_cpuid array handed to us by ACPI.
*/
void
__init
build_cpu_to_node_map
(
void
)
{
int
cpu
,
i
,
node
;
for
(
node
=
0
;
node
<
MAX_NUMNODES
;
node
++
)
cpus_clear
(
node_to_cpu_mask
[
node
]);
for
(
cpu
=
0
;
cpu
<
NR_CPUS
;
++
cpu
)
{
node
=
-
1
;
for
(
i
=
0
;
i
<
NR_CPUS
;
++
i
)
if
(
cpu_physical_id
(
cpu
)
==
node_cpuid
[
i
].
phys_id
)
{
node
=
node_cpuid
[
i
].
nid
;
break
;
}
cpu_to_node_map
[
cpu
]
=
(
node
>=
0
)
?
node
:
0
;
if
(
node
>=
0
)
cpu_set
(
cpu
,
node_to_cpu_mask
[
node
]);
}
}
arch/ia64/kernel/signal.c
View file @
043d0516
...
...
@@ -143,6 +143,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
__copy_from_user
(
current
->
thread
.
fph
,
&
sc
->
sc_fr
[
32
],
96
*
16
);
psr
->
mfh
=
0
;
/* drop signal handler's fph contents... */
preempt_disable
();
if
(
psr
->
dfh
)
ia64_drop_fpu
(
current
);
else
{
...
...
@@ -150,6 +151,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
__ia64_load_fpu
(
current
->
thread
.
fph
);
ia64_set_local_fpu_owner
(
current
);
}
preempt_enable
();
}
return
err
;
}
...
...
arch/ia64/kernel/smpboot.c
View file @
043d0516
...
...
@@ -525,47 +525,6 @@ smp_build_cpu_map (void)
}
}
#ifdef CONFIG_NUMA
/* on which node is each logical CPU (one cacheline even for 64 CPUs) */
u8
cpu_to_node_map
[
NR_CPUS
]
__cacheline_aligned
;
EXPORT_SYMBOL
(
cpu_to_node_map
);
/* which logical CPUs are on which nodes */
cpumask_t
node_to_cpu_mask
[
MAX_NUMNODES
]
__cacheline_aligned
;
/*
* Build cpu to node mapping and initialize the per node cpu masks.
*/
void
__init
build_cpu_to_node_map
(
void
)
{
int
cpu
,
i
,
node
;
for
(
node
=
0
;
node
<
MAX_NUMNODES
;
node
++
)
cpus_clear
(
node_to_cpu_mask
[
node
]);
for
(
cpu
=
0
;
cpu
<
NR_CPUS
;
++
cpu
)
{
/*
* All Itanium NUMA platforms I know use ACPI, so maybe we
* can drop this ifdef completely. [EF]
*/
#ifdef CONFIG_ACPI_NUMA
node
=
-
1
;
for
(
i
=
0
;
i
<
NR_CPUS
;
++
i
)
if
(
cpu_physical_id
(
cpu
)
==
node_cpuid
[
i
].
phys_id
)
{
node
=
node_cpuid
[
i
].
nid
;
break
;
}
#else
# error Fixme: Dunno how to build CPU-to-node map.
#endif
cpu_to_node_map
[
cpu
]
=
(
node
>=
0
)
?
node
:
0
;
if
(
node
>=
0
)
cpu_set
(
cpu
,
node_to_cpu_mask
[
node
]);
}
}
#endif
/* CONFIG_NUMA */
/*
* Cycle through the APs sending Wakeup IPIs to boot each.
*/
...
...
arch/ia64/kernel/traps.c
View file @
043d0516
...
...
@@ -90,14 +90,16 @@ die (const char *str, struct pt_regs *regs, long err)
.
lock_owner_depth
=
0
};
static
int
die_counter
;
int
cpu
=
get_cpu
();
if
(
die
.
lock_owner
!=
smp_processor_id
()
)
{
if
(
die
.
lock_owner
!=
cpu
)
{
console_verbose
();
spin_lock_irq
(
&
die
.
lock
);
die
.
lock_owner
=
smp_processor_id
()
;
die
.
lock_owner
=
cpu
;
die
.
lock_owner_depth
=
0
;
bust_spinlocks
(
1
);
}
put_cpu
();
if
(
++
die
.
lock_owner_depth
<
3
)
{
printk
(
"%s[%d]: %s %ld [%d]
\n
"
,
...
...
arch/ia64/mm/discontig.c
View file @
043d0516
This diff is collapsed.
Click to expand it.
arch/ia64/mm/init.c
View file @
043d0516
...
...
@@ -597,6 +597,7 @@ mem_init (void)
kclist_add
(
&
kcore_kernel
,
_stext
,
_end
-
_stext
);
for_each_pgdat
(
pgdat
)
if
(
pgdat
->
bdata
->
node_bootmem_map
)
totalram_pages
+=
free_all_bootmem_node
(
pgdat
);
reserved_pages
=
0
;
...
...
arch/ia64/sn/include/xtalk/hubdev.h
View file @
043d0516
...
...
@@ -8,6 +8,8 @@
#ifndef _ASM_IA64_SN_XTALK_HUBDEV_H
#define _ASM_IA64_SN_XTALK_HUBDEV_H
#include "xtalk/xwidgetdev.h"
#define HUB_WIDGET_ID_MAX 0xf
#define DEV_PER_WIDGET (2*2*8)
#define IIO_ITTE_WIDGET_BITS 4
/* size of widget field */
...
...
arch/ia64/sn/kernel/io_init.c
View file @
043d0516
...
...
@@ -9,21 +9,28 @@
#include <linux/bootmem.h>
#include <linux/nodemask.h>
#include <asm/sn/types.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/addrs.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/pcibr_provider.h"
#include "xtalk/xwidgetdev.h"
#include <asm/sn/geo.h>
#include "xtalk/hubdev.h"
#include <asm/sn/io.h>
#include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include <asm/sn/simulator.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/tioca_provider.h>
#include "xtalk/hubdev.h"
#include "xtalk/xwidgetdev.h"
char
master_baseio_wid
;
nasid_t
master_nasid
=
INVALID_NASID
;
/* Partition Master */
static
struct
list_head
sn_sysdata_list
;
/* sysdata list struct */
struct
sysdata_el
{
struct
list_head
entry
;
void
*
sysdata
;
};
struct
slab_info
{
struct
hubdev_info
hubdev
;
};
...
...
@@ -137,23 +144,6 @@ sal_get_pcidev_info(u64 segment, u64 bus_number, u64 devfn, u64 pci_dev,
return
ret_stuff
.
v0
;
}
/*
* sn_alloc_pci_sysdata() - This routine allocates a pci controller
* which is expected as the pci_dev and pci_bus sysdata by the Linux
* PCI infrastructure.
*/
static
inline
struct
pci_controller
*
sn_alloc_pci_sysdata
(
void
)
{
struct
pci_controller
*
pci_sysdata
;
pci_sysdata
=
kmalloc
(
sizeof
(
*
pci_sysdata
),
GFP_KERNEL
);
if
(
!
pci_sysdata
)
BUG
();
memset
(
pci_sysdata
,
0
,
sizeof
(
*
pci_sysdata
));
return
pci_sysdata
;
}
/*
* sn_fixup_ionodes() - This routine initializes the HUB data strcuture for
* each node in the system.
...
...
@@ -221,22 +211,34 @@ static void sn_fixup_ionodes(void)
}
void
sn_pci_unfixup_slot
(
struct
pci_dev
*
dev
)
{
struct
pci_dev
*
host_pci_dev
=
SN_PCIDEV_INFO
(
dev
)
->
host_pci_dev
;
sn_irq_unfixup
(
dev
);
pci_dev_put
(
host_pci_dev
);
pci_dev_put
(
dev
);
}
/*
* sn_pci_fixup_slot() - This routine sets up a slot's resources
* consistent with the Linux PCI abstraction layer. Resources acquired
* from our PCI provider include PIO maps to BAR space and interrupt
* objects.
*/
static
void
sn_pci_fixup_slot
(
struct
pci_dev
*
dev
)
void
sn_pci_fixup_slot
(
struct
pci_dev
*
dev
)
{
int
idx
;
int
segment
=
0
;
uint64_t
size
;
struct
sn_irq_info
*
sn_irq_info
;
struct
pci_dev
*
host_pci_dev
;
int
status
=
0
;
struct
pcibus_bussoft
*
bs
;
struct
pci_bus
*
host_pci_bus
;
struct
pci_dev
*
host_pci_dev
;
struct
sn_irq_info
*
sn_irq_info
;
unsigned
long
size
;
unsigned
int
bus_no
,
devfn
;
pci_dev_get
(
dev
);
/* for the sysdata pointer */
dev
->
sysdata
=
kmalloc
(
sizeof
(
struct
pcidev_info
),
GFP_KERNEL
);
if
(
SN_PCIDEV_INFO
(
dev
)
<=
0
)
BUG
();
/* Cannot afford to run out of memory */
...
...
@@ -253,7 +255,7 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
(
u64
)
__pa
(
SN_PCIDEV_INFO
(
dev
)),
(
u64
)
__pa
(
sn_irq_info
));
if
(
status
)
BUG
();
/* Cannot get platform pci device information
information */
BUG
();
/* Cannot get platform pci device
information */
/* Copy over PIO Mapped Addresses */
for
(
idx
=
0
;
idx
<=
PCI_ROM_RESOURCE
;
idx
++
)
{
...
...
@@ -275,15 +277,21 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
dev
->
resource
[
idx
].
parent
=
&
iomem_resource
;
}
/* set up host bus linkages */
bs
=
SN_PCIBUS_BUSSOFT
(
dev
->
bus
);
host_pci_dev
=
pci_find_slot
(
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
>>
32
,
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
&
0xffffffff
);
/*
* Using the PROMs values for the PCI host bus, get the Linux
* PCI host_pci_dev struct and set up host bus linkages
*/
bus_no
=
SN_PCIDEV_INFO
(
dev
)
->
pdi_slot_host_handle
>>
32
;
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_dev
=
pci_get_slot
(
host_pci_bus
,
devfn
);
SN_PCIDEV_INFO
(
dev
)
->
host_pci_dev
=
host_pci_dev
;
SN_PCIDEV_INFO
(
dev
)
->
pdi_host_pcidev_info
=
SN_PCIDEV_INFO
(
host_pci_dev
);
SN_PCIDEV_INFO
(
dev
)
->
pdi_linux_pcidev
=
dev
;
bs
=
SN_PCIBUS_BUSSOFT
(
dev
->
bus
);
SN_PCIDEV_INFO
(
dev
)
->
pdi_pcibus_info
=
bs
;
if
(
bs
&&
bs
->
bs_asic_type
<
PCIIO_ASIC_MAX_TYPES
)
{
...
...
@@ -297,6 +305,9 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
SN_PCIDEV_INFO
(
dev
)
->
pdi_sn_irq_info
=
sn_irq_info
;
dev
->
irq
=
SN_PCIDEV_INFO
(
dev
)
->
pdi_sn_irq_info
->
irq_irq
;
sn_irq_fixup
(
dev
,
sn_irq_info
);
}
else
{
SN_PCIDEV_INFO
(
dev
)
->
pdi_sn_irq_info
=
NULL
;
kfree
(
sn_irq_info
);
}
}
...
...
@@ -304,55 +315,57 @@ static void sn_pci_fixup_slot(struct pci_dev *dev)
* sn_pci_controller_fixup() - This routine sets up a bus's resources
* consistent with the Linux PCI abstraction layer.
*/
static
void
sn_pci_controller_fixup
(
int
segment
,
int
busnum
)
void
sn_pci_controller_fixup
(
int
segment
,
int
busnum
,
struct
pci_bus
*
bus
)
{
int
status
=
0
;
int
nasid
,
cnode
;
struct
pci_bus
*
bus
;
struct
pci_controller
*
controller
;
struct
pcibus_bussoft
*
prom_bussoft_ptr
;
struct
hubdev_info
*
hubdev_info
;
void
*
provider_soft
;
struct
sn_pcibus_provider
*
provider
;
status
=
sal_get_pcibus_info
((
u64
)
segment
,
(
u64
)
busnum
,
status
=
sal_get_pcibus_info
((
u64
)
segment
,
(
u64
)
busnum
,
(
u64
)
ia64_tpa
(
&
prom_bussoft_ptr
));
if
(
status
>
0
)
{
return
;
/* bus # does not exist */
}
if
(
status
>
0
)
return
;
/*bus # does not exist */
prom_bussoft_ptr
=
__va
(
prom_bussoft_ptr
);
controller
=
sn_alloc_pci_sysdata
();
/* controller non-zero is BUG'd in sn_alloc_pci_sysdata */
bus
=
pci_scan_bus
(
busnum
,
&
pci_root_ops
,
controller
);
controller
=
kcalloc
(
1
,
sizeof
(
struct
pci_controller
),
GFP_KERNEL
);
if
(
!
controller
)
BUG
();
if
(
bus
==
NULL
)
{
bus
=
pci_scan_bus
(
busnum
,
&
pci_root_ops
,
controller
);
if
(
bus
==
NULL
)
return
;
/* error, or bus already scanned */
bus
->
sysdata
=
NULL
;
}
if
(
bus
->
sysdata
)
goto
error_return
;
/* sysdata already alloc'd */
/*
* Per-provider fixup. Copies the contents from prom to local
* area and links SN_PCIBUS_BUSSOFT().
*/
if
(
prom_bussoft_ptr
->
bs_asic_type
>=
PCIIO_ASIC_MAX_TYPES
)
{
if
(
prom_bussoft_ptr
->
bs_asic_type
>=
PCIIO_ASIC_MAX_TYPES
)
return
;
/* unsupported asic type */
}
if
(
prom_bussoft_ptr
->
bs_asic_type
==
PCIIO_ASIC_TYPE_PPB
)
goto
error_return
;
/* no further fixup necessary */
provider
=
sn_pci_provider
[
prom_bussoft_ptr
->
bs_asic_type
];
if
(
provider
==
NULL
)
{
if
(
provider
==
NULL
)
return
;
/* no provider registerd for this asic */
}
provider_soft
=
NULL
;
if
(
provider
->
bus_fixup
)
{
if
(
provider
->
bus_fixup
)
provider_soft
=
(
*
provider
->
bus_fixup
)
(
prom_bussoft_ptr
);
}
if
(
provider_soft
==
NULL
)
{
if
(
provider_soft
==
NULL
)
return
;
/* fixup failed or not applicable */
}
/*
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr
...
...
@@ -361,12 +374,47 @@ static void sn_pci_controller_fixup(int segment, int busnum)
bus
->
sysdata
=
controller
;
PCI_CONTROLLER
(
bus
)
->
platform_data
=
provider_soft
;
nasid
=
NASID_GET
(
SN_PCIBUS_BUSSOFT
(
bus
)
->
bs_base
);
cnode
=
nasid_to_cnodeid
(
nasid
);
hubdev_info
=
(
struct
hubdev_info
*
)(
NODEPDA
(
cnode
)
->
pdinfo
);
SN_PCIBUS_BUSSOFT
(
bus
)
->
bs_xwidget_info
=
&
(
hubdev_info
->
hdi_xwidget_info
[
SN_PCIBUS_BUSSOFT
(
bus
)
->
bs_xid
]);
return
;
error_return:
kfree
(
controller
);
return
;
}
void
sn_bus_store_sysdata
(
struct
pci_dev
*
dev
)
{
struct
sysdata_el
*
element
;
element
=
kcalloc
(
1
,
sizeof
(
struct
sysdata_el
),
GFP_KERNEL
);
if
(
!
element
)
{
dev_dbg
(
dev
,
"%s: out of memory!
\n
"
,
__FUNCTION__
);
return
;
}
element
->
sysdata
=
dev
->
sysdata
;
list_add
(
&
element
->
entry
,
&
sn_sysdata_list
);
}
void
sn_bus_free_sysdata
(
void
)
{
struct
sysdata_el
*
element
;
struct
list_head
*
list
;
sn_sysdata_free_start:
list_for_each
(
list
,
&
sn_sysdata_list
)
{
element
=
list_entry
(
list
,
struct
sysdata_el
,
entry
);
list_del
(
&
element
->
entry
);
kfree
(
element
->
sysdata
);
kfree
(
element
);
goto
sn_sysdata_free_start
;
}
return
;
}
/*
...
...
@@ -403,20 +451,17 @@ static int __init sn_pci_init(void)
*/
ia64_max_iommu_merge_mask
=
~
PAGE_MASK
;
sn_fixup_ionodes
();
sn_irq
=
kmalloc
(
sizeof
(
struct
sn_irq_info
*
)
*
NR_IRQS
,
GFP_KERNEL
);
if
(
sn_irq
<=
0
)
BUG
();
/* Canno afford to run out of memory. */
memset
(
sn_irq
,
0
,
sizeof
(
struct
sn_irq_info
*
)
*
NR_IRQS
);
sn_irq_lh_init
();
INIT_LIST_HEAD
(
&
sn_sysdata_list
);
sn_init_cpei_timer
();
#ifdef CONFIG_PROC_FS
register_sn_procfs
();
#endif
for
(
i
=
0
;
i
<
PCI_BUSES_TO_SCAN
;
i
++
)
{
sn_pci_controller_fixup
(
0
,
i
);
}
/* busses are not known yet ... */
for
(
i
=
0
;
i
<
PCI_BUSES_TO_SCAN
;
i
++
)
sn_pci_controller_fixup
(
0
,
i
,
NULL
);
/*
* Generic Linux PCI Layer has created the pci_bus and pci_dev
...
...
@@ -425,9 +470,8 @@ static int __init sn_pci_init(void)
*/
while
((
pci_dev
=
pci_
find_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
pci_dev
))
!=
NULL
)
{
pci_
get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
pci_dev
))
!=
NULL
)
sn_pci_fixup_slot
(
pci_dev
);
}
sn_ioif_inited
=
1
;
/* sn I/O infrastructure now initialized */
...
...
@@ -469,3 +513,8 @@ cnodeid_get_geoid(cnodeid_t cnode)
}
subsys_initcall
(
sn_pci_init
);
EXPORT_SYMBOL
(
sn_pci_fixup_slot
);
EXPORT_SYMBOL
(
sn_pci_unfixup_slot
);
EXPORT_SYMBOL
(
sn_pci_controller_fixup
);
EXPORT_SYMBOL
(
sn_bus_store_sysdata
);
EXPORT_SYMBOL
(
sn_bus_free_sysdata
);
arch/ia64/sn/kernel/irq.c
View file @
043d0516
...
...
@@ -9,13 +9,13 @@
*/
#include <linux/irq.h>
#include <
asm/sn/intr
.h>
#include <
linux/spinlock
.h>
#include <asm/sn/addrs.h>
#include <asm/sn/arch.h>
#include "xtalk/xwidgetdev.h"
#include <asm/sn/intr.h>
#include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/pcibr_provider.h"
#include <asm/sn/shub_mmr.h>
#include <asm/sn/sn_sal.h>
...
...
@@ -25,7 +25,8 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info);
extern
int
sn_force_interrupt_flag
;
extern
int
sn_ioif_inited
;
struct
sn_irq_info
**
sn_irq
;
static
struct
list_head
**
sn_irq_lh
;
static
spinlock_t
sn_irq_info_lock
=
SPIN_LOCK_UNLOCKED
;
/* non-IRQ lock */
static
inline
uint64_t
sn_intr_alloc
(
nasid_t
local_nasid
,
int
local_widget
,
u64
sn_irq_info
,
...
...
@@ -115,82 +116,84 @@ static void sn_end_irq(unsigned int irq)
force_interrupt
(
irq
);
}
static
void
sn_irq_info_free
(
struct
rcu_head
*
head
);
static
void
sn_set_affinity_irq
(
unsigned
int
irq
,
cpumask_t
mask
)
{
struct
sn_irq_info
*
sn_irq_info
=
sn_irq
[
irq
];
struct
sn_irq_info
*
tmp_sn_irq_info
;
struct
sn_irq_info
*
sn_irq_info
,
*
sn_irq_info_safe
;
int
cpuid
,
cpuphys
;
nasid_t
t_nasid
;
/* nasid to target */
int
t_slice
;
/* slice to target */
/* allocate a temp sn_irq_info struct to get new target info */
tmp_sn_irq_info
=
kmalloc
(
sizeof
(
*
tmp_sn_irq_info
),
GFP_KERNEL
);
if
(
!
tmp_sn_irq_info
)
return
;
cpuid
=
first_cpu
(
mask
);
cpuphys
=
cpu_physical_id
(
cpuid
);
t_nasid
=
cpuid_to_nasid
(
cpuid
);
t_slice
=
cpuid_to_slice
(
cpuid
);
while
(
sn_irq_info
)
{
int
status
;
int
local_widget
;
uint64_t
bridge
=
(
uint64_t
)
sn_irq_info
->
irq_bridge
;
nasid_t
local_nasid
=
NASID_GET
(
bridge
);
list_for_each_entry_safe
(
sn_irq_info
,
sn_irq_info_safe
,
sn_irq_lh
[
irq
],
list
)
{
uint64_t
bridge
;
int
local_widget
,
status
;
nasid_t
local_nasid
;
struct
sn_irq_info
*
new_irq_info
;
new_irq_info
=
kmalloc
(
sizeof
(
struct
sn_irq_info
),
GFP_ATOMIC
);
if
(
new_irq_info
==
NULL
)
break
;
memcpy
(
new_irq_info
,
sn_irq_info
,
sizeof
(
struct
sn_irq_info
));
if
(
!
bridge
)
bridge
=
(
uint64_t
)
new_irq_info
->
irq_bridge
;
if
(
!
bridge
)
{
kfree
(
new_irq_info
);
break
;
/* irq is not a device interrupt */
}
local_nasid
=
NASID_GET
(
bridge
);
if
(
local_nasid
&
1
)
local_widget
=
TIO_SWIN_WIDGETNUM
(
bridge
);
else
local_widget
=
SWIN_WIDGETNUM
(
bridge
);
/* Free the old PROM sn_irq_info structure */
sn_intr_free
(
local_nasid
,
local_widget
,
sn_irq_info
);
/* Free the old PROM new_irq_info structure */
sn_intr_free
(
local_nasid
,
local_widget
,
new_irq_info
);
/* Update kernels new_irq_info with new target info */
unregister_intr_pda
(
new_irq_info
);
/* allocate a new PROM
sn
_irq_info struct */
/* allocate a new PROM
new
_irq_info struct */
status
=
sn_intr_alloc
(
local_nasid
,
local_widget
,
__pa
(
tmp_sn_irq_info
),
irq
,
t_nasid
,
t_slice
);
__pa
(
new_irq_info
),
irq
,
cpuid_to_nasid
(
cpuid
),
cpuid_to_slice
(
cpuid
));
if
(
status
==
0
)
{
/* Update kernels sn_irq_info with new target info */
unregister_intr_pda
(
sn_irq_info
);
sn_irq_info
->
irq_cpuid
=
cpuid
;
sn_irq_info
->
irq_nasid
=
t_nasid
;
sn_irq_info
->
irq_slice
=
t_slice
;
sn_irq_info
->
irq_xtalkaddr
=
tmp_sn_irq_info
->
irq_xtalkaddr
;
sn_irq_info
->
irq_cookie
=
tmp_sn_irq_info
->
irq_cookie
;
register_intr_pda
(
sn_irq_info
);
if
(
IS_PCI_BRIDGE_ASIC
(
sn_irq_info
->
irq_bridge_type
))
{
pcibr_change_devices_irq
(
sn_irq_info
);
/* SAL call failed */
if
(
status
)
{
kfree
(
new_irq_info
);
break
;
}
sn_irq_info
=
sn_irq_info
->
irq_next
;
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
);
spin_lock
(
&
sn_irq_info_lock
);
list_replace_rcu
(
&
sn_irq_info
->
list
,
&
new_irq_info
->
list
);
spin_unlock
(
&
sn_irq_info_lock
);
call_rcu
(
&
sn_irq_info
->
rcu
,
sn_irq_info_free
);
#ifdef CONFIG_SMP
set_irq_affinity_info
((
irq
&
0xff
),
cpuphys
,
0
);
#endif
}
else
{
break
;
/* snp_affinity failed the intr_alloc */
}
}
kfree
(
tmp_sn_irq_info
);
}
struct
hw_interrupt_type
irq_type_sn
=
{
"SN hub"
,
sn_startup_irq
,
sn_shutdown_irq
,
sn_enable_irq
,
sn_disable_irq
,
sn_ack_irq
,
sn_end_irq
,
sn_set_affinity_irq
.
typename
=
"SN hub"
,
.
startup
=
sn_startup_irq
,
.
shutdown
=
sn_shutdown_irq
,
.
enable
=
sn_enable_irq
,
.
disable
=
sn_disable_irq
,
.
ack
=
sn_ack_irq
,
.
end
=
sn_end_irq
,
.
set_affinity
=
sn_set_affinity_irq
};
unsigned
int
sn_local_vector_to_irq
(
u8
vector
)
...
...
@@ -231,19 +234,18 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)
struct
sn_irq_info
*
tmp_irq_info
;
int
i
,
foundmatch
;
rcu_read_lock
();
if
(
pdacpu
(
cpu
)
->
sn_last_irq
==
irq
)
{
foundmatch
=
0
;
for
(
i
=
pdacpu
(
cpu
)
->
sn_last_irq
-
1
;
i
;
i
--
)
{
tmp_irq_info
=
sn_irq
[
i
];
while
(
tmp_irq_info
)
{
for
(
i
=
pdacpu
(
cpu
)
->
sn_last_irq
-
1
;
i
&&
!
foundmatch
;
i
--
)
{
list_for_each_entry_rcu
(
tmp_irq_info
,
sn_irq_lh
[
i
],
list
)
{
if
(
tmp_irq_info
->
irq_cpuid
==
cpu
)
{
foundmatch
++
;
foundmatch
=
1
;
break
;
}
tmp_irq_info
=
tmp_irq_info
->
irq_next
;
}
if
(
foundmatch
)
{
break
;
}
}
pdacpu
(
cpu
)
->
sn_last_irq
=
i
;
...
...
@@ -251,60 +253,27 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)
if
(
pdacpu
(
cpu
)
->
sn_first_irq
==
irq
)
{
foundmatch
=
0
;
for
(
i
=
pdacpu
(
cpu
)
->
sn_first_irq
+
1
;
i
<
NR_IRQS
;
i
++
)
{
tmp_irq_info
=
sn_irq
[
i
];
while
(
tmp_irq_info
)
{
for
(
i
=
pdacpu
(
cpu
)
->
sn_first_irq
+
1
;
i
<
NR_IRQS
&&
!
foundmatch
;
i
++
)
{
list_for_each_entry_rcu
(
tmp_irq_info
,
sn_irq_lh
[
i
],
list
)
{
if
(
tmp_irq_info
->
irq_cpuid
==
cpu
)
{
foundmatch
++
;
foundmatch
=
1
;
break
;
}
tmp_irq_info
=
tmp_irq_info
->
irq_next
;
}
if
(
foundmatch
)
{
break
;
}
}
pdacpu
(
cpu
)
->
sn_first_irq
=
((
i
==
NR_IRQS
)
?
0
:
i
);
}
rcu_read_unlock
();
}
struct
sn_irq_info
*
sn_irq_alloc
(
nasid_t
local_nasid
,
int
local_widget
,
int
irq
,
nasid_t
nasid
,
int
slice
)
static
void
sn_irq_info_free
(
struct
rcu_head
*
head
)
{
struct
sn_irq_info
*
sn_irq_info
;
int
status
;
sn_irq_info
=
kmalloc
(
sizeof
(
*
sn_irq_info
),
GFP_KERNEL
);
if
(
sn_irq_info
==
NULL
)
return
NULL
;
memset
(
sn_irq_info
,
0x0
,
sizeof
(
*
sn_irq_info
));
status
=
sn_intr_alloc
(
local_nasid
,
local_widget
,
__pa
(
sn_irq_info
),
irq
,
nasid
,
slice
);
if
(
status
)
{
kfree
(
sn_irq_info
);
return
NULL
;
}
else
{
return
sn_irq_info
;
}
}
void
sn_irq_free
(
struct
sn_irq_info
*
sn_irq_info
)
{
uint64_t
bridge
=
(
uint64_t
)
sn_irq_info
->
irq_bridge
;
nasid_t
local_nasid
=
NASID_GET
(
bridge
);
int
local_widget
;
if
(
local_nasid
&
1
)
/* tio check */
local_widget
=
TIO_SWIN_WIDGETNUM
(
bridge
);
else
local_widget
=
SWIN_WIDGETNUM
(
bridge
);
sn_intr_free
(
local_nasid
,
local_widget
,
sn_irq_info
);
sn_irq_info
=
container_of
(
head
,
struct
sn_irq_info
,
rcu
);
kfree
(
sn_irq_info
);
}
...
...
@@ -314,30 +283,54 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)
int
slice
=
sn_irq_info
->
irq_slice
;
int
cpu
=
nasid_slice_to_cpuid
(
nasid
,
slice
);
pci_dev_get
(
pci_dev
);
sn_irq_info
->
irq_cpuid
=
cpu
;
sn_irq_info
->
irq_pciioinfo
=
SN_PCIDEV_INFO
(
pci_dev
);
/* link it into the sn_irq[irq] list */
sn_irq_info
->
irq_next
=
sn_irq
[
sn_irq_info
->
irq_irq
];
sn_irq
[
sn_irq_info
->
irq_irq
]
=
sn_irq_info
;
spin_lock
(
&
sn_irq_info_lock
);
list_add_rcu
(
&
sn_irq_info
->
list
,
sn_irq_lh
[
sn_irq_info
->
irq_irq
]);
spin_unlock
(
&
sn_irq_info_lock
);
(
void
)
register_intr_pda
(
sn_irq_info
);
}
void
sn_irq_unfixup
(
struct
pci_dev
*
pci_dev
)
{
struct
sn_irq_info
*
sn_irq_info
;
/* Only cleanup IRQ stuff if this device has a host bus context */
if
(
!
SN_PCIDEV_BUSSOFT
(
pci_dev
))
return
;
sn_irq_info
=
SN_PCIDEV_INFO
(
pci_dev
)
->
pdi_sn_irq_info
;
if
(
!
sn_irq_info
||
!
sn_irq_info
->
irq_irq
)
{
kfree
(
sn_irq_info
);
return
;
}
unregister_intr_pda
(
sn_irq_info
);
spin_lock
(
&
sn_irq_info_lock
);
list_del_rcu
(
&
sn_irq_info
->
list
);
spin_unlock
(
&
sn_irq_info_lock
);
call_rcu
(
&
sn_irq_info
->
rcu
,
sn_irq_info_free
);
pci_dev_put
(
pci_dev
);
}
static
void
force_interrupt
(
int
irq
)
{
struct
sn_irq_info
*
sn_irq_info
;
if
(
!
sn_ioif_inited
)
return
;
sn_irq_info
=
sn_irq
[
irq
];
while
(
sn_irq_info
)
{
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
))
{
(
sn_irq_info
->
irq_bridge
!=
NULL
))
pcibr_force_interrupt
(
sn_irq_info
);
}
sn_irq_info
=
sn_irq_info
->
irq_next
;
}
rcu_read_unlock
();
}
/*
...
...
@@ -402,19 +395,41 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
void
sn_lb_int_war_check
(
void
)
{
struct
sn_irq_info
*
sn_irq_info
;
int
i
;
if
(
!
sn_ioif_inited
||
pda
->
sn_first_irq
==
0
)
return
;
rcu_read_lock
();
for
(
i
=
pda
->
sn_first_irq
;
i
<=
pda
->
sn_last_irq
;
i
++
)
{
struct
sn_irq_info
*
sn_irq_info
=
sn_irq
[
i
];
while
(
sn_irq_info
)
{
/* Only call for PCI bridges that are fully initialized. */
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_irq_info
->
irq_bridge
!=
NULL
))
sn_check_intr
(
i
,
sn_irq_info
);
}
sn_irq_info
=
sn_irq_info
->
irq_next
;
}
rcu_read_unlock
();
}
void
sn_irq_lh_init
(
void
)
{
int
i
;
sn_irq_lh
=
kmalloc
(
sizeof
(
struct
list_head
*
)
*
NR_IRQS
,
GFP_KERNEL
);
if
(
!
sn_irq_lh
)
panic
(
"SN PCI INIT: Failed to allocate memory for PCI init
\n
"
);
for
(
i
=
0
;
i
<
NR_IRQS
;
i
++
)
{
sn_irq_lh
[
i
]
=
kmalloc
(
sizeof
(
struct
list_head
),
GFP_KERNEL
);
if
(
!
sn_irq_lh
[
i
])
panic
(
"SN PCI INIT: Failed IRQ memory allocation
\n
"
);
INIT_LIST_HEAD
(
sn_irq_lh
[
i
]);
}
}
arch/ia64/sn/kernel/setup.c
View file @
043d0516
...
...
@@ -270,7 +270,7 @@ void __init sn_setup(char **cmdline_p)
{
long
status
,
ticks_per_sec
,
drift
;
int
pxm
;
int
major
=
sn_sal_rev_major
(),
minor
=
sn_sal_rev_minor
();
u32
version
=
sn_sal_rev
();
extern
void
sn_cpu_init
(
void
);
ia64_sn_plat_set_error_handling_features
();
...
...
@@ -308,22 +308,21 @@ void __init sn_setup(char **cmdline_p)
* support here so we don't have to listen to failed keyboard probe
* messages.
*/
if
((
major
<
2
||
(
major
==
2
&&
minor
<=
9
))
&&
acpi_kbd_controller_present
)
{
if
(
version
<=
0x0209
&&
acpi_kbd_controller_present
)
{
printk
(
KERN_INFO
"Disabling legacy keyboard support as prom "
"is too old and doesn't provide FADT
\n
"
);
acpi_kbd_controller_present
=
0
;
}
printk
(
"SGI SAL version %x.%02x
\n
"
,
major
,
minor
);
printk
(
"SGI SAL version %x.%02x
\n
"
,
version
>>
8
,
version
&
0x00FF
);
/*
* Confirm the SAL we're running on is recent enough...
*/
if
((
major
<
SN_SAL_MIN_MAJOR
)
||
(
major
==
SN_SAL_MIN_MAJOR
&&
minor
<
SN_SAL_MIN_MINOR
))
{
if
(
version
<
SN_SAL_MIN_VERSION
)
{
printk
(
KERN_ERR
"This kernel needs SGI SAL version >= "
"%x.%02x
\n
"
,
SN_SAL_MIN_MAJOR
,
SN_SAL_MIN_MINOR
);
"%x.%02x
\n
"
,
SN_SAL_MIN_VERSION
>>
8
,
SN_SAL_MIN_VERSION
&
0x00FF
);
panic
(
"PROM version too old
\n
"
);
}
...
...
arch/ia64/sn/kernel/tiocx.c
View file @
043d0516
...
...
@@ -14,6 +14,7 @@
#include <linux/proc_fs.h>
#include <linux/device.h>
#include <linux/delay.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/addrs.h>
...
...
@@ -481,6 +482,9 @@ static int __init tiocx_init(void)
cnodeid_t
cnodeid
;
int
found_tiocx_device
=
0
;
if
(
!
ia64_platform_is
(
"sn2"
))
return
-
ENODEV
;
bus_register
(
&
tiocx_bus_type
);
for
(
cnodeid
=
0
;
cnodeid
<
MAX_COMPACT_NODES
;
cnodeid
++
)
{
...
...
arch/ia64/sn/pci/pci_dma.c
View file @
043d0516
...
...
@@ -11,9 +11,10 @@
#include <linux/module.h>
#include <asm/dma.h>
#include <asm/sn/
sn_sal
.h>
#include <asm/sn/
pcibr_provider
.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include <asm/sn/sn_sal.h>
#define SG_ENT_VIRT_ADDRESS(sg) (page_address((sg)->page) + (sg)->offset)
#define SG_ENT_PHYS_ADDRESS(SG) virt_to_phys(SG_ENT_VIRT_ADDRESS(SG))
...
...
arch/ia64/sn/pci/pcibr/pcibr_ate.c
View file @
043d0516
...
...
@@ -8,9 +8,9 @@
#include <linux/types.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/pcibr_provider.h"
int
pcibr_invalidate_ate
=
0
;
/* by default don't invalidate ATE on free */
...
...
arch/ia64/sn/pci/pcibr/pcibr_dma.c
View file @
043d0516
...
...
@@ -8,18 +8,17 @@
#include <linux/types.h>
#include <linux/pci.h>
#include <asm/sn/
sn_sal
.h>
#include <asm/sn/
addrs
.h>
#include <asm/sn/geo.h>
#include "xtalk/xwidgetdev.h"
#include "xtalk/hubdev.h"
#include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/tiocp.h"
#include "pci/pic.h"
#include "pci/pcibr_provider.h"
#include "pci/tiocp.h"
#include <asm/sn/pic.h>
#include <asm/sn/sn_sal.h>
#include <asm/sn/tiocp.h>
#include "tio.h"
#include <asm/sn/addrs.h>
#include "xtalk/xwidgetdev.h"
#include "xtalk/hubdev.h"
extern
int
sn_ioif_inited
;
...
...
arch/ia64/sn/pci/pcibr/pcibr_provider.c
View file @
043d0516
...
...
@@ -6,18 +6,51 @@
* Copyright (C) 2001-2004 Silicon Graphics, Inc. All rights reserved.
*/
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <asm/sn/sn_sal.h>
#include "xtalk/xwidgetdev.h"
#include <asm/sn/addrs.h>
#include <asm/sn/geo.h>
#include
"xtalk/hubdev.h"
#include
<asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/pcibr_provider.h"
#include <asm/sn/addrs.h>
#include <asm/sn/sn_sal.h>
#include "xtalk/xwidgetdev.h"
#include "xtalk/hubdev.h"
int
sal_pcibr_slot_enable
(
struct
pcibus_info
*
soft
,
int
device
,
void
*
resp
)
{
struct
ia64_sal_retval
ret_stuff
;
uint64_t
busnum
;
ret_stuff
.
status
=
0
;
ret_stuff
.
v0
=
0
;
busnum
=
soft
->
pbi_buscommon
.
bs_persist_busnum
;
SAL_CALL_NOLOCK
(
ret_stuff
,
(
u64
)
SN_SAL_IOIF_SLOT_ENABLE
,
(
u64
)
busnum
,
(
u64
)
device
,
(
u64
)
resp
,
0
,
0
,
0
,
0
);
return
(
int
)
ret_stuff
.
v0
;
}
int
sal_pcibr_slot_disable
(
struct
pcibus_info
*
soft
,
int
device
,
int
action
,
void
*
resp
)
{
struct
ia64_sal_retval
ret_stuff
;
uint64_t
busnum
;
ret_stuff
.
status
=
0
;
ret_stuff
.
v0
=
0
;
busnum
=
soft
->
pbi_buscommon
.
bs_persist_busnum
;
SAL_CALL_NOLOCK
(
ret_stuff
,
(
u64
)
SN_SAL_IOIF_SLOT_DISABLE
,
(
u64
)
busnum
,
(
u64
)
device
,
(
u64
)
action
,
(
u64
)
resp
,
0
,
0
,
0
);
return
(
int
)
ret_stuff
.
v0
;
}
static
int
sal_pcibr_error_interrupt
(
struct
pcibus_info
*
soft
)
{
...
...
@@ -188,3 +221,6 @@ pcibr_init_provider(void)
return
0
;
}
EXPORT_SYMBOL_GPL
(
sal_pcibr_slot_enable
);
EXPORT_SYMBOL_GPL
(
sal_pcibr_slot_disable
);
arch/ia64/sn/pci/pcibr/pcibr_reg.c
View file @
043d0516
...
...
@@ -6,13 +6,13 @@
* Copyright (C) 2004 Silicon Graphics, Inc. All rights reserved.
*/
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/types.h>
#include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h>
#include "pci/tiocp.h"
#include "pci/pic.h"
#include "pci/pcibr_provider.h"
#include <asm/sn/pic.h>
#include <asm/sn/tiocp.h>
union
br_ptr
{
struct
tiocp
tio
;
...
...
arch/ia64/sn/pci/tioca_provider.c
View file @
043d0516
...
...
@@ -589,8 +589,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft)
/* sanity check prom rev */
if
(
sn_sal_rev_major
()
<
4
||
(
sn_sal_rev_major
()
==
4
&&
sn_sal_rev_minor
()
<
6
))
{
if
(
sn_sal_rev
()
<
0x0406
)
{
printk
(
KERN_ERR
"%s: SGI prom rev 4.06 or greater required "
"for tioca support
\n
"
,
__FUNCTION__
);
...
...
drivers/pci/hotplug/Kconfig
View file @
043d0516
...
...
@@ -187,9 +187,10 @@ config HOTPLUG_PCI_RPA_DLPAR
config HOTPLUG_PCI_SGI
tristate "SGI PCI Hotplug Support"
depends on HOTPLUG_PCI &&
IA64_SGI_SN2
depends on HOTPLUG_PCI &&
(IA64_SGI_SN2 || IA64_GENERIC)
help
Say Y here if you have an SGI IA64 Altix system.
Say Y here if you want to use the SGI Altix Hotplug
Driver for PCI devices.
When in doubt, say N.
...
...
drivers/pci/hotplug/Makefile
View file @
043d0516
...
...
@@ -14,6 +14,7 @@ obj-$(CONFIG_HOTPLUG_PCI_PCIE) += pciehp.o
obj-$(CONFIG_HOTPLUG_PCI_SHPC)
+=
shpchp.o
obj-$(CONFIG_HOTPLUG_PCI_RPA)
+=
rpaphp.o
obj-$(CONFIG_HOTPLUG_PCI_RPA_DLPAR)
+=
rpadlpar_io.o
obj-$(CONFIG_HOTPLUG_PCI_SGI)
+=
sgi_hotplug.o
pci_hotplug-objs
:=
pci_hotplug_core.o
...
...
drivers/pci/hotplug/sgi_hotplug.c
0 → 100644
View file @
043d0516
This diff is collapsed.
Click to expand it.
drivers/pci/search.c
View file @
043d0516
...
...
@@ -379,6 +379,7 @@ int pci_dev_present(const struct pci_device_id *ids)
EXPORT_SYMBOL
(
pci_dev_present
);
EXPORT_SYMBOL
(
pci_find_bus
);
EXPORT_SYMBOL
(
pci_find_next_bus
);
EXPORT_SYMBOL
(
pci_find_device
);
EXPORT_SYMBOL
(
pci_find_device_reverse
);
EXPORT_SYMBOL
(
pci_find_slot
);
...
...
include/asm-ia64/sn/arch.h
View file @
043d0516
...
...
@@ -11,6 +11,7 @@
#ifndef _ASM_IA64_SN_ARCH_H
#define _ASM_IA64_SN_ARCH_H
#include <linux/numa.h>
#include <asm/types.h>
#include <asm/percpu.h>
#include <asm/sn/types.h>
...
...
include/asm-ia64/sn/intr.h
View file @
043d0516
...
...
@@ -9,6 +9,8 @@
#ifndef _ASM_IA64_SN_INTR_H
#define _ASM_IA64_SN_INTR_H
#include <linux/rcupdate.h>
#define SGI_UART_VECTOR (0xe9)
#define SGI_PCIBR_ERROR (0x33)
...
...
@@ -33,7 +35,7 @@
// The SN PROM irq struct
struct
sn_irq_info
{
struct
sn_irq_info
*
irq_next
;
/*
sharing irq list
*/
struct
sn_irq_info
*
irq_next
;
/*
deprecated DO NOT USE
*/
short
irq_nasid
;
/* Nasid IRQ is assigned to */
int
irq_slice
;
/* slice IRQ is assigned to */
int
irq_cpuid
;
/* kernel logical cpuid */
...
...
@@ -47,6 +49,8 @@ struct sn_irq_info {
int
irq_cookie
;
/* unique cookie */
int
irq_flags
;
/* flags */
int
irq_share_cnt
;
/* num devices sharing IRQ */
struct
list_head
list
;
/* list of sn_irq_info structs */
struct
rcu_head
rcu
;
/* rcu callback list */
};
extern
void
sn_send_IPI_phys
(
int
,
long
,
int
,
int
);
...
...
arch/ia64/sn/include/pci
/pcibr_provider.h
→
include/asm-ia64/sn
/pcibr_provider.h
View file @
043d0516
...
...
@@ -8,6 +8,9 @@
#ifndef _ASM_IA64_SN_PCI_PCIBR_PROVIDER_H
#define _ASM_IA64_SN_PCI_PCIBR_PROVIDER_H
#include <asm/sn/intr.h>
#include <asm/sn/pcibus_provider_defs.h>
/* Workarounds */
#define PV907516 (1 << 1)
/* TIOCP: Don't write the write buffer flush reg */
...
...
@@ -105,10 +108,11 @@ struct pcibus_info {
char
pbi_hub_xid
;
uint64_t
pbi_devreg
[
8
];
spinlock_t
pbi_lock
;
uint32_t
pbi_valid_devices
;
uint32_t
pbi_enabled_devices
;
spinlock_t
pbi_lock
;
};
/*
...
...
@@ -148,4 +152,8 @@ extern void pcibr_change_devices_irq(struct sn_irq_info *sn_irq_info);
extern
int
pcibr_ate_alloc
(
struct
pcibus_info
*
,
int
);
extern
void
pcibr_ate_free
(
struct
pcibus_info
*
,
int
);
extern
void
ate_write
(
struct
pcibus_info
*
,
int
,
int
,
uint64_t
);
extern
int
sal_pcibr_slot_enable
(
struct
pcibus_info
*
soft
,
int
device
,
void
*
resp
);
extern
int
sal_pcibr_slot_disable
(
struct
pcibus_info
*
soft
,
int
device
,
int
action
,
void
*
resp
);
#endif
include/asm-ia64/sn/pcidev.h
View file @
043d0516
...
...
@@ -10,11 +10,11 @@
#include <linux/pci.h>
extern
struct
sn_irq_info
**
sn_irq
;
#define SN_PCIDEV_INFO(pci_dev) \
((struct pcidev_info *)(pci_dev)->sysdata)
#define SN_PCIBUS_BUSSOFT_INFO(pci_bus) \
(struct pcibus_info *)((struct pcibus_bussoft *)(PCI_CONTROLLER((pci_bus))->platform_data))
/*
* Given a pci_bus, return the sn pcibus_bussoft struct. Note that
* this only works for root busses, not for busses represented by PPB's.
...
...
@@ -23,6 +23,8 @@ extern struct sn_irq_info **sn_irq;
#define SN_PCIBUS_BUSSOFT(pci_bus) \
((struct pcibus_bussoft *)(PCI_CONTROLLER((pci_bus))->platform_data))
#define SN_PCIBUS_BUSSOFT_INFO(pci_bus) \
(struct pcibus_info *)((struct pcibus_bussoft *)(PCI_CONTROLLER((pci_bus))->platform_data))
/*
* Given a struct pci_dev, return the sn pcibus_bussoft struct. Note
* that this is not equivalent to SN_PCIBUS_BUSSOFT(pci_dev->bus) due
...
...
@@ -50,9 +52,17 @@ struct pcidev_info {
struct
sn_irq_info
*
pdi_sn_irq_info
;
struct
sn_pcibus_provider
*
pdi_provider
;
/* sn pci ops */
struct
pci_dev
*
host_pci_dev
;
/* host bus link */
};
extern
void
sn_irq_fixup
(
struct
pci_dev
*
pci_dev
,
struct
sn_irq_info
*
sn_irq_info
);
extern
void
sn_irq_unfixup
(
struct
pci_dev
*
pci_dev
);
extern
void
sn_pci_controller_fixup
(
int
segment
,
int
busnum
,
struct
pci_bus
*
bus
);
extern
void
sn_bus_store_sysdata
(
struct
pci_dev
*
dev
);
extern
void
sn_bus_free_sysdata
(
void
);
extern
void
sn_pci_fixup_slot
(
struct
pci_dev
*
dev
);
extern
void
sn_pci_unfixup_slot
(
struct
pci_dev
*
dev
);
extern
void
sn_irq_lh_init
(
void
);
#endif
/* _ASM_IA64_SN_PCI_PCIDEV_H */
arch/ia64/sn/include/pci
/pic.h
→
include/asm-ia64/sn
/pic.h
View file @
043d0516
include/asm-ia64/sn/sn_cpuid.h
View file @
043d0516
...
...
@@ -81,11 +81,6 @@
*
*/
#ifndef CONFIG_SMP
#define cpu_physical_id(cpuid) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff)
#endif
#define get_node_number(addr) NASID_GET(addr)
/*
...
...
include/asm-ia64/sn/sn_sal.h
View file @
043d0516
...
...
@@ -134,43 +134,28 @@
#define SN_SAL_FAKE_PROM 0x02009999
/**
* sn_sal_rev_major - get the major
SGI SAL revision number
* sn_sal_revision - get the
SGI SAL revision number
*
* The SGI PROM stores its version in sal_[ab]_rev_(major|minor).
* This routine simply extracts the major value from the
* @ia64_sal_systab structure constructed by ia64_sal_init().
*/
static
inline
int
sn_sal_rev_major
(
void
)
{
struct
ia64_sal_systab
*
systab
=
efi
.
sal_systab
;
return
(
int
)
systab
->
sal_b_rev_major
;
}
/**
* sn_sal_rev_minor - get the minor SGI SAL revision number
* The SGI PROM stores its version in the sal_[ab]_rev_(major|minor).
* This routine simply extracts the major and minor values and
* presents them in a u32 format.
*
* The SGI PROM stores its version in sal_[ab]_rev_(major|minor).
* This routine simply extracts the minor value from the
* @ia64_sal_systab structure constructed by ia64_sal_init().
* For example, version 4.05 would be represented at 0x0405.
*/
static
inline
int
sn_sal_rev
_minor
(
void
)
static
inline
u32
sn_sal_rev
(
void
)
{
struct
ia64_sal_systab
*
systab
=
efi
.
sal_systab
;
return
(
int
)
systab
->
sal_b_rev_minor
;
return
(
u32
)(
systab
->
sal_b_rev_major
<<
8
|
systab
->
sal_b_rev_minor
)
;
}
/*
* Specify the minimum PROM revsion required for this kernel.
* Note that they're stored in hex format...
*/
#define SN_SAL_MIN_MAJOR 0x4
/* SN2 kernels need at least PROM 4.0 */
#define SN_SAL_MIN_MINOR 0x0
#define SN_SAL_MIN_VERSION 0x0404
/*
* Returns the master console nasid, if the call fails, return an illegal
...
...
arch/ia64/sn/include/pci
/tiocp.h
→
include/asm-ia64/sn
/tiocp.h
View file @
043d0516
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