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
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