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
514fd7fd
Commit
514fd7fd
authored
Jul 13, 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
1e279dd8
99ad25a3
Changes
16
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
138 additions
and
45 deletions
+138
-45
arch/ia64/Kconfig
arch/ia64/Kconfig
+0
-7
arch/ia64/configs/sn2_defconfig
arch/ia64/configs/sn2_defconfig
+0
-1
arch/ia64/kernel/setup.c
arch/ia64/kernel/setup.c
+35
-2
arch/ia64/lib/flush.S
arch/ia64/lib/flush.S
+34
-12
arch/ia64/pci/pci.c
arch/ia64/pci/pci.c
+10
-2
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/io_init.c
+18
-2
arch/ia64/sn/kernel/xpc_channel.c
arch/ia64/sn/kernel/xpc_channel.c
+4
-4
arch/ia64/sn/pci/pci_dma.c
arch/ia64/sn/pci/pci_dma.c
+13
-3
arch/ia64/sn/pci/pcibr/pcibr_provider.c
arch/ia64/sn/pci/pcibr/pcibr_provider.c
+9
-1
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioca_provider.c
+3
-1
drivers/firmware/pcdp.h
drivers/firmware/pcdp.h
+2
-0
include/asm-ia64/pci.h
include/asm-ia64/pci.h
+1
-0
include/asm-ia64/sn/pcibr_provider.h
include/asm-ia64/sn/pcibr_provider.h
+1
-1
include/asm-ia64/sn/pcibus_provider_defs.h
include/asm-ia64/sn/pcibus_provider_defs.h
+2
-1
include/asm-ia64/sn/simulator.h
include/asm-ia64/sn/simulator.h
+1
-8
include/asm-ia64/topology.h
include/asm-ia64/topology.h
+5
-0
No files found.
arch/ia64/Kconfig
View file @
514fd7fd
...
...
@@ -220,13 +220,6 @@ config IOSAPIC
depends on !IA64_HP_SIM
default y
config IA64_SGI_SN_SIM
bool "SGI Medusa Simulator Support"
depends on IA64_SGI_SN2 || IA64_GENERIC
help
If you are compiling a kernel that will run under SGI's IA-64
simulator (Medusa) then say Y, otherwise say N.
config IA64_SGI_SN_XP
tristate "Support communication between SGI SSIs"
select IA64_UNCACHED_ALLOCATOR
...
...
arch/ia64/configs/sn2_defconfig
View file @
514fd7fd
...
...
@@ -81,7 +81,6 @@ CONFIG_HOLES_IN_ZONE=y
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
# CONFIG_IA64_CYCLONE is not set
CONFIG_IOSAPIC=y
CONFIG_IA64_SGI_SN_SIM=y
CONFIG_FORCE_MAX_ZONEORDER=18
CONFIG_SMP=y
CONFIG_NR_CPUS=512
...
...
arch/ia64/kernel/setup.c
View file @
514fd7fd
...
...
@@ -20,6 +20,7 @@
* 02/01/00 R.Seth fixed get_cpuinfo for SMP
* 01/07/99 S.Eranian added the support for command line argument
* 06/24/99 W.Drummond added boot_cpu_data.
* 05/28/05 Z. Menyhart Dynamic stride size for "flush_icache_range()"
*/
#include <linux/config.h>
#include <linux/module.h>
...
...
@@ -84,6 +85,13 @@ struct io_space io_space[MAX_IO_SPACES];
EXPORT_SYMBOL
(
io_space
);
unsigned
int
num_io_spaces
;
/*
* "flush_icache_range()" needs to know what processor dependent stride size to use
* when it makes i-cache(s) coherent with d-caches.
*/
#define I_CACHE_STRIDE_SHIFT 5
/* Safest way to go: 32 bytes by 32 bytes */
unsigned
long
ia64_i_cache_stride_shift
=
~
0
;
/*
* The merge_mask variable needs to be set to (max(iommu_page_size(iommu)) - 1). This
* mask specifies a mask of address bits that must be 0 in order for two buffers to be
...
...
@@ -628,6 +636,12 @@ setup_per_cpu_areas (void)
/* start_kernel() requires this... */
}
/*
* Calculate the max. cache line size.
*
* In addition, the minimum of the i-cache stride sizes is calculated for
* "flush_icache_range()".
*/
static
void
get_max_cacheline_size
(
void
)
{
...
...
@@ -641,6 +655,8 @@ get_max_cacheline_size (void)
printk
(
KERN_ERR
"%s: ia64_pal_cache_summary() failed (status=%ld)
\n
"
,
__FUNCTION__
,
status
);
max
=
SMP_CACHE_BYTES
;
/* Safest setup for "flush_icache_range()" */
ia64_i_cache_stride_shift
=
I_CACHE_STRIDE_SHIFT
;
goto
out
;
}
...
...
@@ -649,13 +665,30 @@ get_max_cacheline_size (void)
&
cci
);
if
(
status
!=
0
)
{
printk
(
KERN_ERR
"%s: ia64_pal_cache_config_info(l=%lu) failed (status=%ld)
\n
"
,
"%s: ia64_pal_cache_config_info(l=%lu
, 2
) failed (status=%ld)
\n
"
,
__FUNCTION__
,
l
,
status
);
max
=
SMP_CACHE_BYTES
;
/* The safest setup for "flush_icache_range()" */
cci
.
pcci_stride
=
I_CACHE_STRIDE_SHIFT
;
cci
.
pcci_unified
=
1
;
}
line_size
=
1
<<
cci
.
pcci_line_size
;
if
(
line_size
>
max
)
max
=
line_size
;
if
(
!
cci
.
pcci_unified
)
{
status
=
ia64_pal_cache_config_info
(
l
,
/* cache_type (instruction)= */
1
,
&
cci
);
if
(
status
!=
0
)
{
printk
(
KERN_ERR
"%s: ia64_pal_cache_config_info(l=%lu, 1) failed (status=%ld)
\n
"
,
__FUNCTION__
,
l
,
status
);
/* The safest setup for "flush_icache_range()" */
cci
.
pcci_stride
=
I_CACHE_STRIDE_SHIFT
;
}
}
if
(
cci
.
pcci_stride
<
ia64_i_cache_stride_shift
)
ia64_i_cache_stride_shift
=
cci
.
pcci_stride
;
}
out:
if
(
max
>
ia64_max_cacheline_size
)
...
...
arch/ia64/lib/flush.S
View file @
514fd7fd
...
...
@@ -3,31 +3,53 @@
*
*
Copyright
(
C
)
1999
-
2001
,
2005
Hewlett
-
Packard
Co
*
David
Mosberger
-
Tang
<
davidm
@
hpl
.
hp
.
com
>
*
*
05
/
28
/
05
Zoltan
Menyhart
Dynamic
stride
size
*/
#include <asm/asmmacro.h>
#include <asm/page.h>
/
*
*
flush_icache_range
(
start
,
end
)
*
Must
flush
range
from
start
to
end
-
1
but
nothing
else
(
need
to
*
*
Make
i
-
cache
(
s
)
coherent
with
d
-
caches
.
*
*
Must
deal
with
range
from
start
to
end
-
1
but
nothing
else
(
need
to
*
be
careful
not
to
touch
addresses
that
may
be
unmapped
)
.
*
*
Note
:
"in0"
and
"in1"
are
preserved
for
debugging
purposes
.
*/
GLOBAL_ENTRY
(
flush_icache_range
)
.
prologue
alloc
r2
=
ar
.
pfs
,
2
,
0
,
0
,
0
sub
r8
=
in1
,
in0
,
1
movl
r3
=
ia64_i_cache_stride_shift
mov
r21
=
1
;;
ld8
r20
=[
r3
]
//
r20
:
stride
shift
sub
r22
=
in1
,
r0
,
1
//
last
byte
address
;;
shr.u
r23
=
in0
,
r20
//
start
/
(
stride
size
)
shr.u
r22
=
r22
,
r20
//
(
last
byte
address
)
/
(
stride
size
)
shl
r21
=
r21
,
r20
//
r21
:
stride
size
of
the
i
-
cache
(
s
)
;;
shr.u
r8
=
r8
,
5
//
we
flush
32
bytes
per
iteration
.
save
ar
.
lc
,
r3
sub
r8
=
r22
,
r23
//
number
of
strides
-
1
shl
r24
=
r23
,
r20
//
r24
:
addresses
for
"fc.i"
=
//
"start"
rounded
down
to
stride
boundary
.
save
ar
.
lc
,
r3
mov
r3
=
ar
.
lc
//
save
ar
.
lc
;;
.
body
mov
ar
.
lc
=
r8
;;
.
Loop
:
fc.i
in0
//
issuable
on
M2
only
add
in0
=
32
,
in0
/
*
*
32
byte
aligned
loop
,
even
number
of
(
actually
2
)
bundles
*/
.
Loop
:
fc.i
r24
//
issuable
on
M0
only
add
r24
=
r21
,
r24
//
we
flush
"stride size"
bytes
per
iteration
nop.i
0
br.cloop.sptk.few
.
Loop
;;
sync.i
...
...
arch/ia64/pci/pci.c
View file @
514fd7fd
...
...
@@ -157,6 +157,7 @@ alloc_pci_controller (int seg)
memset
(
controller
,
0
,
sizeof
(
*
controller
));
controller
->
segment
=
seg
;
controller
->
node
=
-
1
;
return
controller
;
}
...
...
@@ -288,6 +289,7 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
unsigned
int
windows
=
0
;
struct
pci_bus
*
pbus
;
char
*
name
;
int
pxm
;
controller
=
alloc_pci_controller
(
domain
);
if
(
!
controller
)
...
...
@@ -295,10 +297,16 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
controller
->
acpi_handle
=
device
->
handle
;
pxm
=
acpi_get_pxm
(
controller
->
acpi_handle
);
#ifdef CONFIG_NUMA
if
(
pxm
>=
0
)
controller
->
node
=
pxm_to_nid_map
[
pxm
];
#endif
acpi_walk_resources
(
device
->
handle
,
METHOD_NAME__CRS
,
count_window
,
&
windows
);
controller
->
window
=
kmalloc
(
sizeof
(
*
controller
->
window
)
*
windows
,
GFP_KERNEL
);
controller
->
window
=
kmalloc
_node
(
sizeof
(
*
controller
->
window
)
*
windows
,
GFP_KERNEL
,
controller
->
node
);
if
(
!
controller
->
window
)
goto
out2
;
...
...
arch/ia64/sn/kernel/io_init.c
View file @
514fd7fd
...
...
@@ -61,7 +61,7 @@ sn_default_pci_unmap(struct pci_dev *pdev, dma_addr_t addr, int direction)
}
static
void
*
sn_default_pci_bus_fixup
(
struct
pcibus_bussoft
*
soft
)
sn_default_pci_bus_fixup
(
struct
pcibus_bussoft
*
soft
,
struct
pci_controller
*
controller
)
{
return
NULL
;
}
...
...
@@ -362,7 +362,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
provider_soft
=
NULL
;
if
(
provider
->
bus_fixup
)
provider_soft
=
(
*
provider
->
bus_fixup
)
(
prom_bussoft_ptr
);
provider_soft
=
(
*
provider
->
bus_fixup
)
(
prom_bussoft_ptr
,
controller
);
if
(
provider_soft
==
NULL
)
return
;
/* fixup failed or not applicable */
...
...
@@ -380,6 +380,22 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
SN_PCIBUS_BUSSOFT
(
bus
)
->
bs_xwidget_info
=
&
(
hubdev_info
->
hdi_xwidget_info
[
SN_PCIBUS_BUSSOFT
(
bus
)
->
bs_xid
]);
/*
* If the node information we obtained during the fixup phase is invalid
* then set controller->node to -1 (undetermined)
*/
if
(
controller
->
node
>=
num_online_nodes
())
{
struct
pcibus_bussoft
*
b
=
SN_PCIBUS_BUSSOFT
(
bus
);
printk
(
KERN_WARNING
"Device ASIC=%u XID=%u PBUSNUM=%lu"
"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
);
printk
(
KERN_WARNING
"on node %d but only %d nodes online."
"Association set to undetermined.
\n
"
,
controller
->
node
,
num_online_nodes
());
controller
->
node
=
-
1
;
}
return
;
error_return:
...
...
arch/ia64/sn/kernel/xpc_channel.c
View file @
514fd7fd
...
...
@@ -72,7 +72,7 @@ xpc_initialize_channels(struct xpc_partition *part, partid_t partid)
enum
xpc_retval
xpc_setup_infrastructure
(
struct
xpc_partition
*
part
)
{
int
ret
;
int
ret
,
cpuid
;
struct
timer_list
*
timer
;
partid_t
partid
=
XPC_PARTID
(
part
);
...
...
@@ -223,9 +223,9 @@ xpc_setup_infrastructure(struct xpc_partition *part)
xpc_vars_part
[
partid
].
openclose_args_pa
=
__pa
(
part
->
local_openclose_args
);
xpc_vars_part
[
partid
].
IPI_amo_pa
=
__pa
(
part
->
local_IPI_amo_va
);
xpc_vars_part
[
partid
].
IPI_nasid
=
cpuid_to_nasid
(
smp_processor_id
());
xpc_vars_part
[
partid
].
IPI_
phys_cpuid
=
cpu_physical_id
(
smp_processor_id
()
);
cpuid
=
raw_smp_processor_id
();
/* any CPU in this partition will do */
xpc_vars_part
[
partid
].
IPI_
nasid
=
cpuid_to_nasid
(
cpuid
);
xpc_vars_part
[
partid
].
IPI_phys_cpuid
=
cpu_physical_id
(
cpuid
);
xpc_vars_part
[
partid
].
nchannels
=
part
->
nchannels
;
xpc_vars_part
[
partid
].
magic
=
XPC_VP_MAGIC1
;
...
...
arch/ia64/sn/pci/pci_dma.c
View file @
514fd7fd
...
...
@@ -79,6 +79,7 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size,
{
void
*
cpuaddr
;
unsigned
long
phys_addr
;
int
node
;
struct
pci_dev
*
pdev
=
to_pci_dev
(
dev
);
struct
sn_pcibus_provider
*
provider
=
SN_PCIDEV_BUSPROVIDER
(
pdev
);
...
...
@@ -86,10 +87,19 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size,
/*
* Allocate the memory.
* FIXME: We should be doing alloc_pages_node for the node closest
* to the PCI device.
*/
if
(
!
(
cpuaddr
=
(
void
*
)
__get_free_pages
(
GFP_ATOMIC
,
get_order
(
size
))))
node
=
pcibus_to_node
(
pdev
->
bus
);
if
(
likely
(
node
>=
0
))
{
struct
page
*
p
=
alloc_pages_node
(
node
,
GFP_ATOMIC
,
get_order
(
size
));
if
(
likely
(
p
))
cpuaddr
=
page_address
(
p
);
else
return
NULL
;
}
else
cpuaddr
=
(
void
*
)
__get_free_pages
(
GFP_ATOMIC
,
get_order
(
size
));
if
(
unlikely
(
!
cpuaddr
))
return
NULL
;
memset
(
cpuaddr
,
0x0
,
size
);
...
...
arch/ia64/sn/pci/pcibr/pcibr_provider.c
View file @
514fd7fd
...
...
@@ -85,7 +85,7 @@ pcibr_error_intr_handler(int irq, void *arg, struct pt_regs *regs)
}
void
*
pcibr_bus_fixup
(
struct
pcibus_bussoft
*
prom_bussoft
)
pcibr_bus_fixup
(
struct
pcibus_bussoft
*
prom_bussoft
,
struct
pci_controller
*
controller
)
{
int
nasid
,
cnode
,
j
;
struct
hubdev_info
*
hubdev_info
;
...
...
@@ -158,6 +158,14 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft)
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
;
else
controller
->
node
=
cnode
;
return
soft
;
}
...
...
arch/ia64/sn/pci/tioca_provider.c
View file @
514fd7fd
...
...
@@ -581,7 +581,7 @@ tioca_error_intr_handler(int irq, void *arg, struct pt_regs *pt)
* the caller.
*/
static
void
*
tioca_bus_fixup
(
struct
pcibus_bussoft
*
prom_bussoft
)
tioca_bus_fixup
(
struct
pcibus_bussoft
*
prom_bussoft
,
struct
pci_controller
*
controller
)
{
struct
tioca_common
*
tioca_common
;
struct
tioca_kernel
*
tioca_kern
;
...
...
@@ -646,6 +646,8 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft)
__FUNCTION__
,
SGI_TIOCA_ERROR
,
(
int
)
tioca_common
->
ca_common
.
bs_persist_busnum
);
/* Setup locality information */
controller
->
node
=
tioca_kern
->
ca_closest_node
;
return
tioca_common
;
}
...
...
drivers/firmware/pcdp.h
View file @
514fd7fd
...
...
@@ -52,6 +52,8 @@ struct pcdp_uart {
u32
clock_rate
;
u8
pci_prog_intfc
;
u8
flags
;
u16
conout_index
;
u32
reserved
;
}
__attribute__
((
packed
));
#define PCDP_IF_PCI 1
...
...
include/asm-ia64/pci.h
View file @
514fd7fd
...
...
@@ -128,6 +128,7 @@ struct pci_controller {
void
*
acpi_handle
;
void
*
iommu
;
int
segment
;
int
node
;
/* nearest node with memory or -1 for global allocation */
unsigned
int
windows
;
struct
pci_window
*
window
;
...
...
include/asm-ia64/sn/pcibr_provider.h
View file @
514fd7fd
...
...
@@ -128,7 +128,7 @@ pcibr_lock(struct pcibus_info *pcibus_info)
#define pcibr_unlock(pcibus_info, flag) spin_unlock_irqrestore(&pcibus_info->pbi_lock, flag)
extern
int
pcibr_init_provider
(
void
);
extern
void
*
pcibr_bus_fixup
(
struct
pcibus_bussoft
*
);
extern
void
*
pcibr_bus_fixup
(
struct
pcibus_bussoft
*
,
struct
pci_controller
*
);
extern
dma_addr_t
pcibr_dma_map
(
struct
pci_dev
*
,
unsigned
long
,
size_t
);
extern
dma_addr_t
pcibr_dma_map_consistent
(
struct
pci_dev
*
,
unsigned
long
,
size_t
);
extern
void
pcibr_dma_unmap
(
struct
pci_dev
*
,
dma_addr_t
,
int
);
...
...
include/asm-ia64/sn/pcibus_provider_defs.h
View file @
514fd7fd
...
...
@@ -37,6 +37,7 @@ struct pcibus_bussoft {
struct
xwidget_info
*
bs_xwidget_info
;
};
struct
pci_controller
;
/*
* SN pci bus indirection
*/
...
...
@@ -45,7 +46,7 @@ struct sn_pcibus_provider {
dma_addr_t
(
*
dma_map
)(
struct
pci_dev
*
,
unsigned
long
,
size_t
);
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
*
);
void
*
(
*
bus_fixup
)(
struct
pcibus_bussoft
*
,
struct
pci_controller
*
);
};
extern
struct
sn_pcibus_provider
*
sn_pci_provider
[];
...
...
include/asm-ia64/sn/simulator.h
View file @
514fd7fd
...
...
@@ -13,16 +13,9 @@
#define SNMAGIC 0xaeeeeeee8badbeefL
#define IS_MEDUSA() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) : "r"(2)); sn == SNMAGIC;})
#ifdef CONFIG_IA64_SGI_SN_SIM
#define SIMULATOR_SLEEP() asm("nop.i 0x8beef")
#define IS_RUNNING_ON_SIMULATOR() (sn_prom_type)
#define IS_RUNNING_ON_FAKE_PROM() (sn_prom_type == 2)
extern
int
sn_prom_type
;
/* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */
#else
#define IS_RUNNING_ON_SIMULATOR() (0)
#define IS_RUNNING_ON_FAKE_PROM() (0)
#define SIMULATOR_SLEEP()
#endif
#endif
/* _ASM_IA64_SN_SIMULATOR_H */
include/asm-ia64/topology.h
View file @
514fd7fd
...
...
@@ -40,6 +40,11 @@
*/
#define node_to_first_cpu(node) (__ffs(node_to_cpumask(node)))
/*
* Determines the node for a given pci bus
*/
#define pcibus_to_node(bus) PCI_CONTROLLER(bus)->node
void
build_cpu_to_node_map
(
void
);
#define SD_CPU_INIT (struct sched_domain) { \
...
...
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