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
9caf366e
Commit
9caf366e
authored
Aug 30, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/to-linus-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
7c0700ff
7d3b6870
Changes
50
Show whitespace changes
Inline
Side-by-side
Showing
50 changed files
with
647 additions
and
757 deletions
+647
-757
arch/ia64/Makefile
arch/ia64/Makefile
+2
-1
arch/ia64/hp/common/sba_iommu.c
arch/ia64/hp/common/sba_iommu.c
+1
-1
arch/ia64/hp/sim/simeth.c
arch/ia64/hp/sim/simeth.c
+1
-1
arch/ia64/hp/sim/simserial.c
arch/ia64/hp/sim/simserial.c
+1
-1
arch/ia64/hp/zx1/hpzx1_misc.c
arch/ia64/hp/zx1/hpzx1_misc.c
+1
-1
arch/ia64/ia32/sys_ia32.c
arch/ia64/ia32/sys_ia32.c
+1
-0
arch/ia64/kernel/acpi.c
arch/ia64/kernel/acpi.c
+79
-46
arch/ia64/kernel/efi.c
arch/ia64/kernel/efi.c
+1
-1
arch/ia64/kernel/efivars.c
arch/ia64/kernel/efivars.c
+1
-1
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+5
-5
arch/ia64/kernel/fw-emu.c
arch/ia64/kernel/fw-emu.c
+1
-1
arch/ia64/kernel/ia64_ksyms.c
arch/ia64/kernel/ia64_ksyms.c
+1
-1
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+370
-298
arch/ia64/kernel/irq.c
arch/ia64/kernel/irq.c
+13
-10
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/irq_ia64.c
+5
-10
arch/ia64/kernel/palinfo.c
arch/ia64/kernel/palinfo.c
+1
-1
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+1
-1
arch/ia64/kernel/setup.c
arch/ia64/kernel/setup.c
+6
-7
arch/ia64/kernel/smp.c
arch/ia64/kernel/smp.c
+2
-2
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+1
-1
arch/ia64/kernel/time.c
arch/ia64/kernel/time.c
+1
-1
arch/ia64/kernel/traps.c
arch/ia64/kernel/traps.c
+2
-3
arch/ia64/lib/memcpy.S
arch/ia64/lib/memcpy.S
+0
-2
arch/ia64/mm/init.c
arch/ia64/mm/init.c
+1
-1
arch/ia64/mm/tlb.c
arch/ia64/mm/tlb.c
+1
-1
arch/ia64/sn/fakeprom/fpmem.c
arch/ia64/sn/fakeprom/fpmem.c
+1
-1
arch/ia64/sn/fakeprom/fw-emu.c
arch/ia64/sn/fakeprom/fw-emu.c
+1
-1
arch/ia64/sn/io/efi-rtc.c
arch/ia64/sn/io/efi-rtc.c
+1
-1
arch/ia64/sn/kernel/llsc4.c
arch/ia64/sn/kernel/llsc4.c
+1
-1
arch/ia64/vmlinux.lds.S
arch/ia64/vmlinux.lds.S
+1
-1
include/asm-ia64/acpi.h
include/asm-ia64/acpi.h
+2
-1
include/asm-ia64/agp.h
include/asm-ia64/agp.h
+3
-0
include/asm-ia64/atomic.h
include/asm-ia64/atomic.h
+2
-2
include/asm-ia64/efi.h
include/asm-ia64/efi.h
+0
-284
include/asm-ia64/fpu.h
include/asm-ia64/fpu.h
+2
-2
include/asm-ia64/hardirq.h
include/asm-ia64/hardirq.h
+6
-6
include/asm-ia64/hw_irq.h
include/asm-ia64/hw_irq.h
+5
-3
include/asm-ia64/ide.h
include/asm-ia64/ide.h
+15
-1
include/asm-ia64/io.h
include/asm-ia64/io.h
+17
-17
include/asm-ia64/iosapic.h
include/asm-ia64/iosapic.h
+18
-11
include/asm-ia64/irq.h
include/asm-ia64/irq.h
+1
-1
include/asm-ia64/kmap_types.h
include/asm-ia64/kmap_types.h
+29
-0
include/asm-ia64/mc146818rtc.h
include/asm-ia64/mc146818rtc.h
+10
-0
include/asm-ia64/mmu_context.h
include/asm-ia64/mmu_context.h
+3
-3
include/asm-ia64/percpu.h
include/asm-ia64/percpu.h
+9
-2
include/asm-ia64/processor.h
include/asm-ia64/processor.h
+3
-4
include/asm-ia64/sal.h
include/asm-ia64/sal.h
+1
-1
include/asm-ia64/system.h
include/asm-ia64/system.h
+3
-3
include/asm-ia64/types.h
include/asm-ia64/types.h
+5
-9
include/asm-ia64/unistd.h
include/asm-ia64/unistd.h
+9
-4
No files found.
arch/ia64/Makefile
View file @
9caf366e
...
...
@@ -96,7 +96,8 @@ MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
vmlinux
:
arch/$(ARCH)/vmlinux.lds.s
CPPFLAGS_arch/ia64/vmlinux.lds.s
:
= -traditional
arch/$(ARCH)/vmlinux.lds.s
:
arch/$(ARCH)/vmlinux.lds.S
$(CPP)
$(CPPFLAGS)
$
(
CPPFLAGS_
$@
)
-D__ASSEMBLY__
-P
-C
-U
$(ARCH)
$<
-o
$@
compressed
:
vmlinux
$(OBJCOPY)
$(OBJCOPYFLAGS)
vmlinux vmlinux-tmp
...
...
arch/ia64/hp/common/sba_iommu.c
View file @
9caf366e
...
...
@@ -30,11 +30,11 @@
#include <linux/string.h>
#include <linux/pci.h>
#include <linux/proc_fs.h>
#include <linux/efi.h>
#include <asm/delay.h>
/* ia64_get_itc() */
#include <asm/io.h>
#include <asm/page.h>
/* PAGE_OFFSET */
#include <asm/efi.h>
#define DRIVER_NAME "SBA"
...
...
arch/ia64/hp/sim/simeth.c
View file @
9caf366e
...
...
@@ -213,7 +213,7 @@ simeth_probe1(void)
memcpy
(
dev
->
dev_addr
,
mac_addr
,
sizeof
(
mac_addr
));
dev
->
irq
=
ia64_alloc_
irq
();
dev
->
irq
=
ia64_alloc_
vector
();
/*
* attach the interrupt in the simulator, this does enable interrupts
...
...
arch/ia64/hp/sim/simserial.c
View file @
9caf366e
...
...
@@ -1076,7 +1076,7 @@ simrs_init (void)
if
(
state
->
type
==
PORT_UNKNOWN
)
continue
;
if
(
!
state
->
irq
)
{
state
->
irq
=
ia64_alloc_
irq
();
state
->
irq
=
ia64_alloc_
vector
();
ia64_ssc_connect_irq
(
KEYBOARD_INTR
,
state
->
irq
);
}
...
...
arch/ia64/hp/zx1/hpzx1_misc.c
View file @
9caf366e
...
...
@@ -12,9 +12,9 @@
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/acpi.h>
#include <linux/efi.h>
#include <asm/dma.h>
#include <asm/efi.h>
#include <asm/iosapic.h>
extern
acpi_status
acpi_evaluate_integer
(
acpi_handle
,
acpi_string
,
acpi_object_list
*
,
...
...
arch/ia64/ia32/sys_ia32.c
View file @
9caf366e
...
...
@@ -46,6 +46,7 @@
#include <linux/nfsd/syscall.h>
#include <linux/poll.h>
#include <linux/personality.h>
#include <linux/ptrace.h>
#include <linux/stat.h>
#include <linux/ipc.h>
...
...
arch/ia64/kernel/acpi.c
View file @
9caf366e
...
...
@@ -37,7 +37,7 @@
#include <linux/types.h>
#include <linux/irq.h>
#include <linux/acpi.h>
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include <asm/io.h>
#include <asm/iosapic.h>
#include <asm/machvec.h>
...
...
@@ -47,9 +47,9 @@
#define PREFIX "ACPI: "
asm
(
".weak iosapic_register_i
rq
"
);
asm
(
".weak iosapic_
register_legacy
_irq"
);
asm
(
".weak iosapic_register_platform_i
rq
"
);
asm
(
".weak iosapic_register_i
ntr
"
);
asm
(
".weak iosapic_
override_isa
_irq"
);
asm
(
".weak iosapic_register_platform_i
ntr
"
);
asm
(
".weak iosapic_init"
);
asm
(
".weak iosapic_version"
);
...
...
@@ -173,10 +173,10 @@ acpi_dispose_crs (acpi_buffer *buf)
#ifdef CONFIG_ACPI_BOOT
#define ACPI_MAX_PLATFORM_I
RQ
S 256
#define ACPI_MAX_PLATFORM_I
NTERRUPT
S 256
/* Array to record platform interrupt vectors for generic interrupt routing. */
int
platform_i
rq_list
[
ACPI_MAX_PLATFORM_IRQS
]
=
{
[
0
...
ACPI_MAX_PLATFORM_IRQ
S
-
1
]
=
-
1
};
int
platform_i
ntr_list
[
ACPI_MAX_PLATFORM_INTERRUPTS
]
=
{
[
0
...
ACPI_MAX_PLATFORM_INTERRUPT
S
-
1
]
=
-
1
};
enum
acpi_irq_model_id
acpi_irq_model
=
ACPI_IRQ_MODEL_IOSAPIC
;
...
...
@@ -189,9 +189,9 @@ acpi_request_vector (u32 int_type)
{
int
vector
=
-
1
;
if
(
int_type
<
ACPI_MAX_PLATFORM_I
RQ
S
)
{
if
(
int_type
<
ACPI_MAX_PLATFORM_I
NTERRUPT
S
)
{
/* correctable platform error interrupt */
vector
=
platform_i
rq
_list
[
int_type
];
vector
=
platform_i
ntr
_list
[
int_type
];
}
else
printk
(
"acpi_request_vector(): invalid interrupt type
\n
"
);
return
vector
;
...
...
@@ -210,6 +210,7 @@ __acpi_map_table (unsigned long phys_addr, unsigned long size)
static
int
total_cpus
__initdata
;
static
int
available_cpus
__initdata
;
struct
acpi_table_madt
*
acpi_madt
__initdata
;
static
u8
has_8259
;
static
int
__init
...
...
@@ -284,7 +285,7 @@ acpi_parse_lapic_nmi (acpi_table_entry_header *header)
static
int
__init
acpi_find_iosapic
(
int
global_vector
,
u32
*
irq
_base
,
char
**
iosapic_address
)
acpi_find_iosapic
(
unsigned
int
gsi
,
u32
*
gsi
_base
,
char
**
iosapic_address
)
{
struct
acpi_table_iosapic
*
iosapic
;
int
ver
;
...
...
@@ -292,7 +293,7 @@ acpi_find_iosapic (int global_vector, u32 *irq_base, char **iosapic_address)
char
*
p
;
char
*
end
;
if
(
!
irq
_base
||
!
iosapic_address
)
if
(
!
gsi
_base
||
!
iosapic_address
)
return
-
ENODEV
;
p
=
(
char
*
)
(
acpi_madt
+
1
);
...
...
@@ -302,13 +303,13 @@ acpi_find_iosapic (int global_vector, u32 *irq_base, char **iosapic_address)
if
(
*
p
==
ACPI_MADT_IOSAPIC
)
{
iosapic
=
(
struct
acpi_table_iosapic
*
)
p
;
*
irq
_base
=
iosapic
->
global_irq_base
;
*
gsi
_base
=
iosapic
->
global_irq_base
;
*
iosapic_address
=
ioremap
(
iosapic
->
address
,
0
);
ver
=
iosapic_version
(
*
iosapic_address
);
max_pin
=
(
ver
>>
16
)
&
0xff
;
if
((
g
lobal_vector
-
*
irq
_base
)
<=
max_pin
)
if
((
g
si
-
*
gsi
_base
)
<=
max_pin
)
return
0
;
/* Found it! */
}
p
+=
p
[
1
];
...
...
@@ -347,7 +348,7 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header)
{
struct
acpi_table_plat_int_src
*
plintsrc
;
int
vector
;
u32
irq
_base
;
u32
gsi
_base
;
char
*
iosapic_address
;
plintsrc
=
(
struct
acpi_table_plat_int_src
*
)
header
;
...
...
@@ -356,31 +357,31 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header)
acpi_table_print_madt_entry
(
header
);
if
(
!
iosapic_register_platform_i
rq
)
{
printk
(
KERN_WARNING
PREFIX
"No ACPI platform
IRQ
support
\n
"
);
if
(
!
iosapic_register_platform_i
ntr
)
{
printk
(
KERN_WARNING
PREFIX
"No ACPI platform
interrupt
support
\n
"
);
return
-
ENODEV
;
}
if
(
acpi_find_iosapic
(
plintsrc
->
global_irq
,
&
irq
_base
,
&
iosapic_address
))
{
if
(
acpi_find_iosapic
(
plintsrc
->
global_irq
,
&
gsi
_base
,
&
iosapic_address
))
{
printk
(
KERN_WARNING
PREFIX
"IOSAPIC not found
\n
"
);
return
-
ENODEV
;
}
/*
* Get vector assignment for this
IRQ, set attributes, and program the
* IOSAPIC routing table.
* Get vector assignment for this
interrupt, set attributes,
*
and program the
IOSAPIC routing table.
*/
vector
=
iosapic_register_platform_i
rq
(
plintsrc
->
type
,
vector
=
iosapic_register_platform_i
ntr
(
plintsrc
->
type
,
plintsrc
->
global_irq
,
plintsrc
->
iosapic_vector
,
plintsrc
->
eid
,
plintsrc
->
id
,
(
plintsrc
->
flags
.
polarity
==
1
)
?
1
:
0
,
(
plintsrc
->
flags
.
trigger
==
1
)
?
1
:
0
,
irq
_base
,
gsi
_base
,
iosapic_address
);
platform_i
rq
_list
[
plintsrc
->
type
]
=
vector
;
platform_i
ntr
_list
[
plintsrc
->
type
]
=
vector
;
return
0
;
}
...
...
@@ -397,10 +398,10 @@ acpi_parse_int_src_ovr (acpi_table_entry_header *header)
acpi_table_print_madt_entry
(
header
);
/* Ignore if the platform doesn't support overrides */
if
(
!
iosapic_
register_legacy
_irq
)
if
(
!
iosapic_
override_isa
_irq
)
return
0
;
iosapic_
register_legacy
_irq
(
p
->
bus_irq
,
p
->
global_irq
,
iosapic_
override_isa
_irq
(
p
->
bus_irq
,
p
->
global_irq
,
(
p
->
flags
.
polarity
==
1
)
?
1
:
0
,
(
p
->
flags
.
trigger
==
1
)
?
1
:
0
);
return
0
;
...
...
@@ -431,6 +432,9 @@ acpi_parse_madt (unsigned long phys_addr, unsigned long size)
acpi_madt
=
(
struct
acpi_table_madt
*
)
__va
(
phys_addr
);
/* remember the value for reference after free_initmem() */
has_8259
=
acpi_madt
->
flags
.
pcat_compat
;
/* Get base address of IPI Message Block */
if
(
acpi_madt
->
lapic_address
)
...
...
@@ -440,11 +444,14 @@ acpi_parse_madt (unsigned long phys_addr, unsigned long size)
return
0
;
}
static
int
__init
acpi_parse_fadt
(
unsigned
long
phys_addr
,
unsigned
long
size
)
{
struct
acpi_table_header
*
fadt_header
;
fadt_descriptor_rev2
*
fadt
;
u32
sci_irq
,
gsi_base
;
char
*
iosapic_address
;
if
(
!
phys_addr
||
!
size
)
return
-
EINVAL
;
...
...
@@ -458,9 +465,20 @@ acpi_parse_fadt (unsigned long phys_addr, unsigned long size)
if
(
!
(
fadt
->
iapc_boot_arch
&
BAF_8042_KEYBOARD_CONTROLLER
))
acpi_kbd_controller_present
=
0
;
if
(
!
iosapic_register_intr
)
return
0
;
/* just ignore the rest */
sci_irq
=
fadt
->
sci_int
;
if
(
has_8259
&&
sci_irq
<
16
)
return
0
;
/* legacy, no setup required */
if
(
!
acpi_find_iosapic
(
sci_irq
,
&
gsi_base
,
&
iosapic_address
))
iosapic_register_intr
(
sci_irq
,
0
,
0
,
gsi_base
,
iosapic_address
);
return
0
;
}
unsigned
long
__init
acpi_find_rsdp
(
void
)
{
...
...
@@ -482,12 +500,12 @@ static int __init
acpi_parse_spcr
(
unsigned
long
phys_addr
,
unsigned
long
size
)
{
acpi_ser_t
*
spcr
;
unsigned
long
global_int
;
unsigned
int
gsi
;
if
(
!
phys_addr
||
!
size
)
return
-
EINVAL
;
if
(
!
iosapic_register_i
rq
)
if
(
!
iosapic_register_i
ntr
)
return
-
ENODEV
;
/*
...
...
@@ -500,6 +518,7 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size)
*/
spcr
=
(
acpi_ser_t
*
)
__va
(
phys_addr
);
setup_serial_acpi
(
spcr
);
if
(
spcr
->
length
<
sizeof
(
acpi_ser_t
))
...
...
@@ -509,22 +528,22 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size)
if
((
spcr
->
base_addr
.
space_id
!=
ACPI_SERIAL_PCICONF_SPACE
)
&&
(
spcr
->
int_type
==
ACPI_SERIAL_INT_SAPIC
))
{
u32
irq
_base
;
u32
gsi
_base
;
char
*
iosapic_address
;
int
vector
;
/* We have a UART in memory space with an SAPIC interrupt */
g
lobal_int
=
(
(
spcr
->
global_int
[
3
]
<<
24
)
|
g
si
=
(
(
spcr
->
global_int
[
3
]
<<
24
)
|
(
spcr
->
global_int
[
2
]
<<
16
)
|
(
spcr
->
global_int
[
1
]
<<
8
)
|
(
spcr
->
global_int
[
0
])
);
/* Which iosapic does this
IRQ
belong to? */
/* Which iosapic does this
interrupt
belong to? */
if
(
!
acpi_find_iosapic
(
g
lobal_int
,
&
irq
_base
,
&
iosapic_address
))
vector
=
iosapic_register_i
rq
(
global_int
,
1
,
1
,
irq
_base
,
iosapic_address
);
if
(
!
acpi_find_iosapic
(
g
si
,
&
gsi
_base
,
&
iosapic_address
))
vector
=
iosapic_register_i
ntr
(
gsi
,
1
,
1
,
gsi
_base
,
iosapic_address
);
}
return
0
;
}
...
...
@@ -583,7 +602,12 @@ acpi_boot_init (char *cmdline)
printk
(
KERN_ERR
PREFIX
"Error parsing NMI SRC entry
\n
"
);
skip_madt:
/* FADT says whether a legacy keyboard controller is present. */
/*
* FADT says whether a legacy keyboard controller is present.
* The FADT also contains an SCI_INT line, by which the system
* gets interrupts such as power and sleep buttons. If it's not
* on a Legacy interrupt, it needs to be setup.
*/
if
(
acpi_table_parse
(
ACPI_FACP
,
acpi_parse_fadt
)
<
1
)
printk
(
KERN_ERR
PREFIX
"Can't find FADT
\n
"
);
...
...
@@ -631,7 +655,7 @@ acpi_get_prt (struct pci_vector_struct **vectors, int *count)
*
count
=
0
;
if
(
acpi_prt
.
count
<
0
)
{
printk
(
KERN_ERR
PREFIX
"No PCI
IRQ
routing entries
\n
"
);
printk
(
KERN_ERR
PREFIX
"No PCI
interrupt
routing entries
\n
"
);
return
-
ENODEV
;
}
...
...
@@ -669,4 +693,13 @@ acpi_get_interrupt_model (int *type)
return
0
;
}
int
acpi_irq_to_vector
(
u32
irq
)
{
if
(
has_8259
&&
irq
<
16
)
return
isa_irq_to_vector
(
irq
);
return
gsi_to_vector
(
irq
);
}
#endif
/* CONFIG_ACPI_BOOT */
arch/ia64/kernel/efi.c
View file @
9caf366e
...
...
@@ -24,8 +24,8 @@
#include <linux/types.h>
#include <linux/time.h>
#include <linux/proc_fs.h>
#include <linux/efi.h>
#include <asm/efi.h>
#include <asm/io.h>
#include <asm/kregs.h>
#include <asm/pgtable.h>
...
...
arch/ia64/kernel/efivars.c
View file @
9caf366e
...
...
@@ -65,8 +65,8 @@
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/smp.h>
#include <linux/efi.h>
#include <asm/efi.h>
#include <asm/uaccess.h>
MODULE_AUTHOR
(
"Matt Domsch <Matt_Domsch@Dell.com>"
);
...
...
arch/ia64/kernel/entry.S
View file @
9caf366e
...
...
@@ -1229,11 +1229,11 @@ sys_call_table:
data8
ia64_ni_syscall
//
1235
data8
ia64_ni_syscall
data8
ia64_ni_syscall
data8
ia64_ni_syscall
data8
ia64_ni_syscall
data8
ia64_ni_syscall
//
1240
data8
ia64_ni_syscall
data8
ia64_ni_syscal
l
data8
sys_io_setup
data8
sys_io_destroy
data8
sys_io_getevents
//
1240
data8
sys_io_submit
data8
sys_io_cance
l
data8
ia64_ni_syscall
data8
ia64_ni_syscall
data8
ia64_ni_syscall
//
1245
...
...
arch/ia64/kernel/fw-emu.c
View file @
9caf366e
...
...
@@ -13,7 +13,7 @@
# include <linux/pci.h>
#endif
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include <asm/io.h>
#include <asm/pal.h>
#include <asm/sal.h>
...
...
arch/ia64/kernel/ia64_ksyms.c
View file @
9caf366e
...
...
@@ -58,7 +58,7 @@ EXPORT_SYMBOL(clear_page);
#include <asm/processor.h>
# ifndef CONFIG_NUMA
EXPORT_SYMBOL
(
cpu_info
);
EXPORT_SYMBOL
(
cpu_info
__per_cpu
);
# endif
EXPORT_SYMBOL
(
kernel_thread
);
...
...
arch/ia64/kernel/iosapic.c
View file @
9caf366e
...
...
@@ -26,9 +26,12 @@
* 02/04/18 J.I. Lee bug fix in iosapic_init_pci_irq
* 02/04/30 J.I. Lee bug fix in find_iosapic to fix ACPI PCI IRQ to IOSAPIC mapping
* error
* 02/07/29 T. Kochi Allocate interrupt vectors dynamically
* 02/08/04 T. Kochi Cleaned up terminology (irq, global system interrupt, vector,
* etc.)
*/
/*
* Here is what the interrupt logic between a PCI device and the
CPU
looks like:
* Here is what the interrupt logic between a PCI device and the
kernel
looks like:
*
* (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC, INTD). The
* device is uniquely identified by its bus--, and slot-number (the function
...
...
@@ -37,19 +40,28 @@
*
* (2) The motherboard routes the interrupt line to a pin on a IOSAPIC controller.
* Multiple interrupt lines may have to share the same IOSAPIC pin (if they're level
* triggered and use the same polarity). Each interrupt line has a unique
IOSAPIC
*
irq number which can be calculated as the sum of the controller's base irq number
* and the IOSAPIC pin number to which the line connects.
* triggered and use the same polarity). Each interrupt line has a unique
Global
*
System Interrupt (GSI) number which can be calculated as the sum of the controller's
*
base GSI number
and the IOSAPIC pin number to which the line connects.
*
* (3) The IOSAPIC uses an internal
table to map the IOSAPIC pin into the IA-64 interrupt
* vector. This interrupt vector is then sent to the CPU.
* (3) The IOSAPIC uses an internal
routing table entries (RTEs) to map the IOSAPIC pin
*
into the IA-64 interrupt
vector. This interrupt vector is then sent to the CPU.
*
* In other words, there are two levels of indirections involved:
* (4) The kernel recognizes an interrupt as an IRQ. The IRQ interface is used as
* architecture-independent interrupt handling mechanism in Linux. As an
* IRQ is a number, we have to have IA-64 interrupt vector number <-> IRQ number
* mapping. On smaller systems, we use one-to-one mapping between IA-64 vector and
* IRQ. A platform can implemnent platform_irq_to_vector(irq) and
* platform_local_vector_to_irq(vector) APIs to differentiate the mapping.
* Please see also include/asm-ia64/hw_irq.h for those APIs.
*
*
pci pin -> iosapic irq -> IA-64 vector
*
To sum up, there are three levels of mappings involved:
*
* Note: outside this module, IA-64 vectors are called "irqs". This is because that's
* the traditional name Linux uses for interrupt vectors.
* PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ
*
* Note: The term "IRQ" is loosely used everywhere in Linux kernel to describe interrupts.
* Now we use "IRQ" only for Linux IRQ's. ISA IRQ (isa_irq) is the only exception in this
* source code.
*/
#include <linux/config.h>
...
...
@@ -72,49 +84,55 @@
#include <asm/system.h>
#undef DEBUG_I
RQ
_ROUTING
#undef DEBUG_I
NTERRUPT
_ROUTING
#undef OVERRIDE_DEBUG
#ifdef DEBUG_INTERRUPT_ROUTING
#define DBG(fmt...) printk(fmt)
#else
#define DBG(fmt...)
#endif
static
spinlock_t
iosapic_lock
=
SPIN_LOCK_UNLOCKED
;
/* PCI pin to
IOSAPIC irq
routing information. This info typically comes from ACPI. */
/* PCI pin to
GSI
routing information. This info typically comes from ACPI. */
static
struct
{
int
num_routes
;
struct
pci_vector_struct
*
route
;
}
pci_irq
;
/* Th
is tables maps
IA-64 vectors to the IOSAPIC pin that generates this vector. */
/* Th
ese tables map
IA-64 vectors to the IOSAPIC pin that generates this vector. */
static
struct
iosapic_i
rq
{
static
struct
iosapic_i
ntr_info
{
char
*
addr
;
/* base address of IOSAPIC */
unsigned
int
base_irq
;
/* first irq
assigned to this IOSAPIC */
char
pin
;
/* IOSAPIC pin (-1 => not an IOSAPIC irq
) */
unsigned
int
gsi_base
;
/* first GSI
assigned to this IOSAPIC */
char
rte_index
;
/* IOSAPIC RTE index (-1 => not an IOSAPIC interrupt
) */
unsigned
char
dmode
:
3
;
/* delivery mode (see iosapic.h) */
unsigned
char
polarity
:
1
;
/* interrupt polarity (see iosapic.h) */
unsigned
char
polarity
:
1
;
/* interrupt polarity (see iosapic.h) */
unsigned
char
trigger
:
1
;
/* trigger mode (see iosapic.h) */
}
iosapic_i
rq
[
IA64_NUM_VECTORS
];
}
iosapic_i
ntr_info
[
IA64_NUM_VECTORS
];
static
struct
iosapic
{
char
*
addr
;
/* base address of IOSAPIC */
unsigned
int
base_irq
;
/* first irq
assigned to this IOSAPIC */
unsigned
short
max_pin
;
/* max input pin supported
in this IOSAPIC */
unsigned
int
gsi_base
;
/* first GSI
assigned to this IOSAPIC */
unsigned
short
num_rte
;
/* number of RTE
in this IOSAPIC */
unsigned
char
pcat_compat
;
/* 8259 compatibility flag */
}
iosapic_lists
[
256
]
__initdata
;
}
iosapic_lists
[
256
]
__
dev
initdata
;
static
int
num_iosapic
=
0
;
/*
* Find an IOSAPIC associated with a
n IRQ
* Find an IOSAPIC associated with a
GSI
*/
static
inline
int
__init
find_iosapic
(
unsigned
int
irq
)
static
inline
int
__
dev
init
find_iosapic
(
unsigned
int
gsi
)
{
int
i
;
for
(
i
=
0
;
i
<
num_iosapic
;
i
++
)
{
if
((
unsigned
)
(
irq
-
iosapic_lists
[
i
].
base_irq
)
<=
iosapic_lists
[
i
].
max_pin
)
if
((
unsigned
)
(
gsi
-
iosapic_lists
[
i
].
gsi_base
)
<
iosapic_lists
[
i
].
num_rte
)
return
i
;
}
...
...
@@ -122,60 +140,51 @@ find_iosapic (unsigned int irq)
}
/*
* Translate
IOSAPIC irq
number to the corresponding IA-64 interrupt vector. If no
* Translate
GSI
number to the corresponding IA-64 interrupt vector. If no
* entry exists, return -1.
*/
static
int
iosapic_irq_to_vector
(
int
irq
)
int
gsi_to_vector
(
unsigned
int
gsi
)
{
int
vector
;
for
(
vector
=
0
;
vector
<
IA64_NUM_VECTORS
;
++
vector
)
if
(
iosapic_i
rq
[
vector
].
base_irq
+
iosapic_irq
[
vector
].
pin
==
irq
)
if
(
iosapic_i
ntr_info
[
vector
].
gsi_base
+
iosapic_intr_info
[
vector
].
rte_index
==
gsi
)
return
vector
;
return
-
1
;
}
/*
* Map PCI pin to the corresponding IA-64 interrupt vector. If no such mapping exists,
* return -1.
*/
int
pci_pin_to_vector
(
int
bus
,
int
slot
,
int
pci_pin
)
{
struct
pci_vector_struct
*
r
;
for
(
r
=
pci_irq
.
route
;
r
<
pci_irq
.
route
+
pci_irq
.
num_routes
;
++
r
)
if
(
r
->
bus
==
bus
&&
(
r
->
pci_id
>>
16
)
==
slot
&&
r
->
pin
==
pci_pin
)
return
iosapic_irq_to_vector
(
r
->
irq
);
return
-
1
;
}
static
void
set_rte
(
unsigned
int
vector
,
unsigned
long
dest
)
set_rte
(
unsigned
int
vector
,
unsigned
int
dest
)
{
unsigned
long
pol
,
trigger
,
dmode
;
u32
low32
,
high32
;
char
*
addr
;
int
pin
;
int
rte_index
;
char
redir
;
#ifdef DEBUG_IRQ_ROUTING
printk
(
KERN_DEBUG
"set_rte: routing vector 0x%02x to 0x%lx
\n
"
,
vector
,
dest
);
#endif
DBG
(
KERN_DEBUG
"%s: routing vector %d to %x
\n
"
,
__FUNCTION__
,
vector
,
dest
);
pin
=
iosapic_irq
[
vector
].
pin
;
if
(
pin
<
0
)
rte_index
=
iosapic_intr_info
[
vector
].
rte_index
;
if
(
rte_index
<
0
)
return
;
/* not an IOSAPIC interrupt */
addr
=
iosapic_i
rq
[
vector
].
addr
;
pol
=
iosapic_i
rq
[
vector
].
polarity
;
trigger
=
iosapic_i
rq
[
vector
].
trigger
;
dmode
=
iosapic_i
rq
[
vector
].
dmode
;
addr
=
iosapic_i
ntr_info
[
vector
].
addr
;
pol
=
iosapic_i
ntr_info
[
vector
].
polarity
;
trigger
=
iosapic_i
ntr_info
[
vector
].
trigger
;
dmode
=
iosapic_i
ntr_info
[
vector
].
dmode
;
redir
=
(
dmode
==
IOSAPIC_LOWEST_PRIORITY
)
?
1
:
0
;
#ifdef CONFIG_SMP
set_irq_affinity_info
(
vector
,
(
int
)(
dest
&
0xffff
),
redir
);
{
unsigned
int
irq
;
for
(
irq
=
0
;
irq
<
NR_IRQS
;
++
irq
)
if
(
irq_to_vector
(
irq
)
==
vector
)
{
set_irq_affinity_info
(
irq
,
(
int
)(
dest
&
0xffff
),
redir
);
break
;
}
}
#endif
low32
=
((
pol
<<
IOSAPIC_POLARITY_SHIFT
)
|
...
...
@@ -186,9 +195,9 @@ set_rte (unsigned int vector, unsigned long dest)
/* dest contains both id and eid */
high32
=
(
dest
<<
IOSAPIC_DEST_SHIFT
);
writel
(
IOSAPIC_RTE_HIGH
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_HIGH
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
high32
,
addr
+
IOSAPIC_WINDOW
);
writel
(
IOSAPIC_RTE_LOW
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_LOW
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
low32
,
addr
+
IOSAPIC_WINDOW
);
}
...
...
@@ -204,18 +213,18 @@ mask_irq (unsigned int irq)
unsigned
long
flags
;
char
*
addr
;
u32
low32
;
int
pin
;
int
rte_index
;
ia64_vector
vec
=
irq_to_vector
(
irq
);
addr
=
iosapic_i
rq
[
vec
].
addr
;
pin
=
iosapic_irq
[
vec
].
pin
;
addr
=
iosapic_i
ntr_info
[
vec
].
addr
;
rte_index
=
iosapic_intr_info
[
vec
].
rte_index
;
if
(
pin
<
0
)
if
(
rte_index
<
0
)
return
;
/* not an IOSAPIC interrupt! */
spin_lock_irqsave
(
&
iosapic_lock
,
flags
);
{
writel
(
IOSAPIC_RTE_LOW
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_LOW
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
low32
=
readl
(
addr
+
IOSAPIC_WINDOW
);
low32
|=
(
1
<<
IOSAPIC_MASK_SHIFT
);
/* set only the mask bit */
...
...
@@ -230,17 +239,17 @@ unmask_irq (unsigned int irq)
unsigned
long
flags
;
char
*
addr
;
u32
low32
;
int
pin
;
int
rte_index
;
ia64_vector
vec
=
irq_to_vector
(
irq
);
addr
=
iosapic_i
rq
[
vec
].
addr
;
pin
=
iosapic_irq
[
vec
].
pin
;
if
(
pin
<
0
)
addr
=
iosapic_i
ntr_info
[
vec
].
addr
;
rte_index
=
iosapic_intr_info
[
vec
].
rte_index
;
if
(
rte_index
<
0
)
return
;
/* not an IOSAPIC interrupt! */
spin_lock_irqsave
(
&
iosapic_lock
,
flags
);
{
writel
(
IOSAPIC_RTE_LOW
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_LOW
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
low32
=
readl
(
addr
+
IOSAPIC_WINDOW
);
low32
&=
~
(
1
<<
IOSAPIC_MASK_SHIFT
);
/* clear only the mask bit */
...
...
@@ -256,24 +265,28 @@ iosapic_set_affinity (unsigned int irq, unsigned long mask)
#ifdef CONFIG_SMP
unsigned
long
flags
;
u32
high32
,
low32
;
int
dest
,
pin
;
int
dest
,
rte_index
;
char
*
addr
;
int
redir
=
(
irq
&
(
1
<<
31
))
?
1
:
0
;
int
redir
=
(
irq
&
IA64_IRQ_REDIRECTED
)
?
1
:
0
;
ia64_vector
vec
;
irq
&=
(
~
IA64_IRQ_REDIRECTED
);
vec
=
irq_to_vector
(
irq
);
mask
&=
cpu_online_map
;
if
(
!
mask
||
irq
>=
IA64_NUM_VECTORS
)
if
(
!
mask
||
vec
>=
IA64_NUM_VECTORS
)
return
;
dest
=
cpu_physical_id
(
ffz
(
~
mask
));
pin
=
iosapic_irq
[
irq
].
pin
;
addr
=
iosapic_i
rq
[
irq
].
addr
;
rte_index
=
iosapic_intr_info
[
vec
].
rte_index
;
addr
=
iosapic_i
ntr_info
[
vec
].
addr
;
if
(
pin
<
0
)
if
(
rte_index
<
0
)
return
;
/* not an IOSAPIC interrupt */
set_irq_affinity_info
(
irq
,
dest
,
redir
);
set_irq_affinity_info
(
irq
,
dest
,
redir
);
/* dest contains both id and eid */
high32
=
dest
<<
IOSAPIC_DEST_SHIFT
;
...
...
@@ -281,7 +294,7 @@ iosapic_set_affinity (unsigned int irq, unsigned long mask)
spin_lock_irqsave
(
&
iosapic_lock
,
flags
);
{
/* get current delivery mode by reading the low32 */
writel
(
IOSAPIC_RTE_LOW
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_LOW
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
low32
=
readl
(
addr
+
IOSAPIC_WINDOW
);
low32
&=
~
(
7
<<
IOSAPIC_DELIVERY_SHIFT
);
...
...
@@ -292,9 +305,9 @@ iosapic_set_affinity (unsigned int irq, unsigned long mask)
/* change delivery mode to fixed */
low32
|=
(
IOSAPIC_FIXED
<<
IOSAPIC_DELIVERY_SHIFT
);
writel
(
IOSAPIC_RTE_HIGH
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_HIGH
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
high32
,
addr
+
IOSAPIC_WINDOW
);
writel
(
IOSAPIC_RTE_LOW
(
pin
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
IOSAPIC_RTE_LOW
(
rte_index
),
addr
+
IOSAPIC_REG_SELECT
);
writel
(
low32
,
addr
+
IOSAPIC_WINDOW
);
}
spin_unlock_irqrestore
(
&
iosapic_lock
,
flags
);
...
...
@@ -317,7 +330,7 @@ iosapic_end_level_irq (unsigned int irq)
{
ia64_vector
vec
=
irq_to_vector
(
irq
);
writel
(
vec
,
iosapic_i
rq
[
vec
].
addr
+
IOSAPIC_EOI
);
writel
(
vec
,
iosapic_i
ntr_info
[
vec
].
addr
+
IOSAPIC_EOI
);
}
#define iosapic_shutdown_level_irq mask_irq
...
...
@@ -388,7 +401,7 @@ iosapic_version (char *addr)
* {
* unsigned int version : 8;
* unsigned int reserved1 : 8;
* unsigned int
pins
: 8;
* unsigned int
max_redir
: 8;
* unsigned int reserved2 : 8;
* }
*/
...
...
@@ -405,70 +418,72 @@ iosapic_reassign_vector (int vector)
{
int
new_vector
;
if
(
iosapic_i
rq
[
vector
].
pin
>=
0
||
iosapic_irq
[
vector
].
addr
||
iosapic_i
rq
[
vector
].
base_irq
||
iosapic_irq
[
vector
].
dmode
||
iosapic_i
rq
[
vector
].
polarity
||
iosapic_irq
[
vector
].
trigger
)
if
(
iosapic_i
ntr_info
[
vector
].
rte_index
>=
0
||
iosapic_intr_info
[
vector
].
addr
||
iosapic_i
ntr_info
[
vector
].
gsi_base
||
iosapic_intr_info
[
vector
].
dmode
||
iosapic_i
ntr_info
[
vector
].
polarity
||
iosapic_intr_info
[
vector
].
trigger
)
{
new_vector
=
ia64_alloc_
irq
();
printk
(
"Reassigning vector
0x%x to 0x%x
\n
"
,
vector
,
new_vector
);
memcpy
(
&
iosapic_irq
[
new_vector
],
&
iosapic_irq
[
vector
],
sizeof
(
struct
iosapic_irq
));
memset
(
&
iosapic_irq
[
vector
],
0
,
sizeof
(
struct
iosapic_irq
));
iosapic_i
rq
[
vector
].
pin
=
-
1
;
new_vector
=
ia64_alloc_
vector
();
printk
(
"Reassigning vector
%d to %d
\n
"
,
vector
,
new_vector
);
memcpy
(
&
iosapic_intr_info
[
new_vector
],
&
iosapic_intr_info
[
vector
],
sizeof
(
struct
iosapic_intr_info
));
memset
(
&
iosapic_intr_info
[
vector
],
0
,
sizeof
(
struct
iosapic_intr_info
));
iosapic_i
ntr_info
[
vector
].
rte_index
=
-
1
;
}
}
static
void
register_i
rq
(
u32
global_vector
,
int
vector
,
int
pin
,
unsigned
char
delivery
,
register_i
ntr
(
unsigned
int
gsi
,
int
vector
,
unsigned
char
delivery
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
base_irq
,
char
*
iosapic_address
)
unsigned
int
gsi_base
,
char
*
iosapic_address
)
{
irq_desc_t
*
idesc
;
struct
hw_interrupt_type
*
irq_type
;
int
rte_index
;
gsi_to_vector
(
global_vector
)
=
vector
;
iosapic_i
rq
[
vector
].
pin
=
pin
;
iosapic_i
rq
[
vector
].
polarity
=
polarity
?
IOSAPIC_POL_HIGH
:
IOSAPIC_POL_LOW
;
iosapic_i
rq
[
vector
].
dmode
=
delivery
;
rte_index
=
gsi
-
gsi_base
;
iosapic_i
ntr_info
[
vector
].
rte_index
=
rte_index
;
iosapic_i
ntr_info
[
vector
].
polarity
=
polarity
?
IOSAPIC_POL_HIGH
:
IOSAPIC_POL_LOW
;
iosapic_i
ntr_info
[
vector
].
dmode
=
delivery
;
/*
* In override, it
does not provide addr/base_irq. global_vector
is enough to
* locate iosapic addr,
base_irq and pin by examining base_irq and max_pin of
* registered iosapics (tbd)
* In override, it
may not provide addr/gsi_base. GSI
is enough to
* locate iosapic addr,
gsi_base and rte_index by examining
*
gsi_base and num_rte of
registered iosapics (tbd)
*/
#ifndef OVERRIDE_DEBUG
if
(
iosapic_address
)
{
iosapic_i
rq
[
vector
].
addr
=
iosapic_address
;
iosapic_i
rq
[
vector
].
base_irq
=
base_irq
;
iosapic_i
ntr_info
[
vector
].
addr
=
iosapic_address
;
iosapic_i
ntr_info
[
vector
].
gsi_base
=
gsi_base
;
}
#else
if
(
iosapic_address
)
{
if
(
iosapic_i
rq
[
vector
].
addr
&&
(
iosapic_irq
[
vector
].
addr
!=
iosapic_address
))
printk
(
"WARN: register_i
rq: diff IOSAPIC ADDRESS for gv %x, v %x
\n
"
,
g
lobal_vector
,
vector
);
iosapic_i
rq
[
vector
].
addr
=
iosapic_address
;
if
(
iosapic_i
rq
[
vector
].
base_irq
&&
(
iosapic_irq
[
vector
].
base_irq
!=
base_irq
))
{
printk
(
"WARN: register_i
rq: diff BASE IRQ %x for gv %x, v %x
\n
"
,
base_irq
,
global_vector
,
vector
);
if
(
iosapic_i
ntr_info
[
vector
].
addr
&&
(
iosapic_intr_info
[
vector
].
addr
!=
iosapic_address
))
printk
(
"WARN: register_i
ntr: diff IOSAPIC ADDRESS for GSI 0x%x, vector %d
\n
"
,
g
si
,
vector
);
iosapic_i
ntr_info
[
vector
].
addr
=
iosapic_address
;
if
(
iosapic_i
ntr_info
[
vector
].
gsi_base
&&
(
iosapic_intr_info
[
vector
].
gsi_base
!=
gsi_base
))
{
printk
(
"WARN: register_i
ntr: diff GSI base 0x%x for GSI 0x%x, vector %d
\n
"
,
gsi_base
,
gsi
,
vector
);
}
iosapic_i
rq
[
vector
].
base_irq
=
base_irq
;
}
else
if
(
!
iosapic_i
rq
[
vector
].
addr
)
printk
(
"WARN: register_i
rq: invalid override for gv %x, v %x
\n
"
,
g
lobal_vector
,
vector
);
iosapic_i
ntr_info
[
vector
].
gsi_base
=
gsi_base
;
}
else
if
(
!
iosapic_i
ntr_info
[
vector
].
addr
)
printk
(
"WARN: register_i
ntr: invalid override for GSI 0x%x, vector %d
\n
"
,
g
si
,
vector
);
#endif
if
(
edge_triggered
)
{
iosapic_i
rq
[
vector
].
trigger
=
IOSAPIC_EDGE
;
iosapic_i
ntr_info
[
vector
].
trigger
=
IOSAPIC_EDGE
;
irq_type
=
&
irq_type_iosapic_edge
;
}
else
{
iosapic_i
rq
[
vector
].
trigger
=
IOSAPIC_LEVEL
;
iosapic_i
ntr_info
[
vector
].
trigger
=
IOSAPIC_LEVEL
;
irq_type
=
&
irq_type_iosapic_level
;
}
idesc
=
irq_desc
(
vector
);
if
(
idesc
->
handler
!=
irq_type
)
{
if
(
idesc
->
handler
!=
&
no_irq_type
)
printk
(
"register_irq(): changing vector 0x%02x from "
"%s to %s
\n
"
,
vector
,
idesc
->
handler
->
typename
,
irq_type
->
typename
);
printk
(
"%s: changing vector %d from %s to %s
\n
"
,
__FUNCTION__
,
vector
,
idesc
->
handler
->
typename
,
irq_type
->
typename
);
idesc
->
handler
=
irq_type
;
}
}
...
...
@@ -479,24 +494,26 @@ register_irq (u32 global_vector, int vector, int pin, unsigned char delivery,
* program the IOSAPIC RTE.
*/
int
iosapic_register_irq
(
u32
global_vector
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
base_irq
,
char
*
iosapic_address
)
iosapic_register_intr
(
unsigned
int
gsi
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
unsigned
int
gsi_base
,
char
*
iosapic_address
)
{
int
vector
;
unsigned
int
dest
=
(
ia64_get_lid
()
>>
16
)
&
0xffff
;
vector
=
iosapic_irq_to_vector
(
global_vector
);
vector
=
gsi_to_vector
(
gsi
);
if
(
vector
<
0
)
vector
=
ia64_alloc_
irq
();
vector
=
ia64_alloc_
vector
();
register_irq
(
global_vector
,
vector
,
global_vector
-
base_irq
,
IOSAPIC_LOWEST_PRIORITY
,
polarity
,
edge_triggered
,
base_irq
,
iosapic_address
);
register_intr
(
gsi
,
vector
,
IOSAPIC_LOWEST_PRIORITY
,
polarity
,
edge_triggered
,
gsi_base
,
iosapic_address
);
printk
(
"IOSAPIC 0x%x(%s,%s) -> Vector 0x%x
\n
"
,
global_vector
,
(
polarity
?
"high"
:
"low"
),
(
edge_triggered
?
"edge"
:
"level"
),
vector
);
printk
(
"GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d
\n
"
,
gsi
,
(
polarity
?
"high"
:
"low"
),
(
edge_triggered
?
"edge"
:
"level"
),
dest
,
vector
);
/* program the IOSAPIC routing table */
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
);
set_rte
(
vector
,
dest
);
return
vector
;
}
...
...
@@ -505,12 +522,14 @@ iosapic_register_irq (u32 global_vector, unsigned long polarity, unsigned long
* Note that the irq_base and IOSAPIC address must be set in iosapic_init().
*/
int
iosapic_register_platform_irq
(
u32
int_type
,
u32
global_vector
,
u32
iosapic_vector
,
u16
eid
,
u16
id
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
base_irq
,
char
*
iosapic_address
)
iosapic_register_platform_intr
(
u32
int_type
,
unsigned
int
gsi
,
int
iosapic_vector
,
u16
eid
,
u16
id
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
unsigned
int
gsi_base
,
char
*
iosapic_address
)
{
unsigned
char
delivery
;
int
vector
;
unsigned
int
dest
=
((
id
<<
8
)
|
eid
)
&
0xffff
;
switch
(
int_type
)
{
case
ACPI_INTERRUPT_PMI
:
...
...
@@ -523,7 +542,7 @@ iosapic_register_platform_irq (u32 int_type, u32 global_vector,
delivery
=
IOSAPIC_PMI
;
break
;
case
ACPI_INTERRUPT_INIT
:
vector
=
ia64_alloc_
irq
();
vector
=
ia64_alloc_
vector
();
delivery
=
IOSAPIC_INIT
;
break
;
case
ACPI_INTERRUPT_CPEI
:
...
...
@@ -535,56 +554,137 @@ iosapic_register_platform_irq (u32 int_type, u32 global_vector,
return
-
1
;
}
register_i
rq
(
global_vector
,
vector
,
global_vector
-
base_irq
,
delivery
,
polarity
,
edge_triggered
,
base_irq
,
iosapic_address
);
register_i
ntr
(
gsi
,
vector
,
delivery
,
polarity
,
edge_triggered
,
gsi_base
,
iosapic_address
);
printk
(
"PLATFORM int 0x%x:
IOSAPIC 0x%x(%s,%s) -> Vector 0x%x CPU %.02u:%.02u
\n
"
,
int_type
,
g
lobal_vector
,
(
polarity
?
"high"
:
"low"
),
(
edge_triggered
?
"edge"
:
"level"
),
vector
,
eid
,
id
);
printk
(
"PLATFORM int 0x%x:
GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d
\n
"
,
int_type
,
g
si
,
(
polarity
?
"high"
:
"low"
),
(
edge_triggered
?
"edge"
:
"level"
),
dest
,
vector
);
/* program the IOSAPIC routing table */
set_rte
(
vector
,
((
id
<<
8
)
|
eid
)
&
0xffff
);
set_rte
(
vector
,
dest
);
return
vector
;
}
/*
* ACPI calls this when it finds an entry for a legacy ISA
interrupt
.
* Note that the
irq
_base and IOSAPIC address must be set in iosapic_init().
* ACPI calls this when it finds an entry for a legacy ISA
IRQ override
.
* Note that the
gsi
_base and IOSAPIC address must be set in iosapic_init().
*/
void
iosapic_
register_legacy_irq
(
unsigned
long
irq
,
unsigned
long
pin
,
unsigned
long
polarity
,
iosapic_
override_isa_irq
(
unsigned
int
isa_irq
,
unsigned
int
gsi
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
)
{
int
vector
=
isa_irq_to_vector
(
irq
);
int
index
,
vector
;
unsigned
int
gsi_base
;
char
*
addr
;
unsigned
int
dest
=
(
ia64_get_lid
()
>>
16
)
&
0xffff
;
index
=
find_iosapic
(
gsi
);
if
(
index
<
0
)
{
printk
(
"ISA: No corresponding IOSAPIC found : ISA IRQ %u -> GSI 0x%x
\n
"
,
isa_irq
,
gsi
);
return
;
}
register_irq
(
irq
,
vector
,
(
int
)
pin
,
IOSAPIC_LOWEST_PRIORITY
,
polarity
,
edge_triggered
,
0
,
NULL
);
/* ignored for override */
vector
=
isa_irq_to_vector
(
isa_irq
);
addr
=
iosapic_lists
[
index
].
addr
;
gsi_base
=
iosapic_lists
[
index
].
gsi_base
;
register_intr
(
gsi
,
vector
,
IOSAPIC_LOWEST_PRIORITY
,
polarity
,
edge_triggered
,
gsi_base
,
addr
);
#ifdef DEBUG_IRQ_ROUTING
printk
(
"ISA: IRQ %u -> IOSAPIC irq 0x%02x (%s, %s) -> vector %02x
\n
"
,
(
unsigned
)
irq
,
(
unsigned
)
pin
,
DBG
(
"ISA: IRQ %u -> GSI 0x%x (%s,%s) -> CPU 0x%04x vector %d
\n
"
,
isa_irq
,
gsi
,
polarity
?
"high"
:
"low"
,
edge_triggered
?
"edge"
:
"level"
,
vector
);
#endif
dest
,
vector
);
/* program the IOSAPIC routing table */
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
);
set_rte
(
vector
,
dest
);
}
/*
* Map PCI pin to the corresponding GSI.
* If no such mapping exists, return -1.
*/
static
int
pci_pin_to_gsi
(
int
bus
,
int
slot
,
int
pci_pin
,
unsigned
int
*
gsi
)
{
struct
pci_vector_struct
*
r
;
for
(
r
=
pci_irq
.
route
;
r
<
pci_irq
.
route
+
pci_irq
.
num_routes
;
++
r
)
if
(
r
->
bus
==
bus
&&
(
r
->
pci_id
>>
16
)
==
slot
&&
r
->
pin
==
pci_pin
)
{
*
gsi
=
r
->
irq
;
return
0
;
}
return
-
1
;
}
void
__init
iosapic_init
(
unsigned
long
phys_addr
,
unsigned
int
base_irq
,
int
pcat_compat
)
/*
* Map PCI pin to the corresponding IA-64 interrupt vector. If no such mapping exists,
* try to allocate a new vector. If it fails, return -1.
*/
static
int
pci_pin_to_vector
(
int
bus
,
int
slot
,
int
pci_pin
)
{
int
irq
,
max_pin
,
vector
,
pin
;
unsigned
int
ver
;
int
index
,
vector
;
int
gsi_base
,
pcat_compat
;
char
*
addr
;
unsigned
int
gsi
;
if
(
pci_pin_to_gsi
(
bus
,
slot
,
pci_pin
,
&
gsi
)
<
0
)
{
printk
(
"PCI: no interrupt route for %02x:%02x pin %c
\n
"
,
bus
,
slot
,
'A'
+
pci_pin
);
return
-
1
;
}
vector
=
gsi_to_vector
(
gsi
);
if
(
vector
<
0
)
{
/* we should allocate a vector for this interrupt line */
index
=
find_iosapic
(
gsi
);
if
(
index
<
0
)
{
printk
(
"PCI: GSI 0x%x has no IOSAPIC mapping
\n
"
,
gsi
);
return
-
1
;
}
addr
=
iosapic_lists
[
index
].
addr
;
gsi_base
=
iosapic_lists
[
index
].
gsi_base
;
pcat_compat
=
iosapic_lists
[
index
].
pcat_compat
;
if
(
pcat_compat
&&
(
gsi
<
16
))
vector
=
isa_irq_to_vector
(
gsi
);
else
{
/* new GSI; allocate a vector for it */
vector
=
ia64_alloc_vector
();
}
register_intr
(
gsi
,
vector
,
IOSAPIC_LOWEST_PRIORITY
,
0
,
0
,
gsi_base
,
addr
);
DBG
(
"PCI: (%02x:%02x INT%c) -> GSI 0x%x -> vector %d
\n
"
,
bus
,
slot
,
'A'
+
pci_pin
,
gsi
,
vector
);
}
return
vector
;
}
void
__devinit
iosapic_init
(
unsigned
long
phys_addr
,
unsigned
int
gsi_base
,
int
pcat_compat
)
{
int
num_rte
,
vector
;
unsigned
int
isa_irq
,
ver
;
char
*
addr
;
static
int
first_time
=
1
;
if
(
first_time
)
{
first_time
=
0
;
for
(
vector
=
0
;
vector
<
IA64_NUM_VECTORS
;
++
vector
)
iosapic_i
rq
[
vector
].
pin
=
-
1
;
/* mark as unused */
iosapic_i
ntr_info
[
vector
].
rte_index
=
-
1
;
/* mark as unused */
}
if
(
pcat_compat
)
{
...
...
@@ -599,120 +699,67 @@ iosapic_init (unsigned long phys_addr, unsigned int base_irq, int pcat_compat)
addr
=
ioremap
(
phys_addr
,
0
);
ver
=
iosapic_version
(
addr
);
max_pin
=
(
ver
>>
16
)
&
0xff
;
/*
* The MAX_REDIR register holds the highest input pin
* number (starting from 0).
* We add 1 so that we can use it for number of pins (= RTEs)
*/
num_rte
=
((
ver
>>
16
)
&
0xff
)
+
1
;
iosapic_lists
[
num_iosapic
].
addr
=
addr
;
iosapic_lists
[
num_iosapic
].
pcat_compat
=
pcat_compat
;
iosapic_lists
[
num_iosapic
].
base_irq
=
base_irq
;
iosapic_lists
[
num_iosapic
].
max_pin
=
max_pin
;
iosapic_lists
[
num_iosapic
].
gsi_base
=
gsi_base
;
iosapic_lists
[
num_iosapic
].
num_rte
=
num_rte
;
num_iosapic
++
;
printk
(
"IOSAPIC: version %x.%x, address 0x%lx, IRQs 0x%02x-0x%02x
\n
"
,
(
ver
&
0xf0
)
>>
4
,
(
ver
&
0x0f
),
phys_addr
,
base_irq
,
base_irq
+
max_pin
);
printk
(
"IOSAPIC: version %x.%x, address 0x%lx, GSIs 0x%x-0x%x
\n
"
,
(
ver
&
0xf0
)
>>
4
,
(
ver
&
0x0f
),
phys_addr
,
gsi_base
,
gsi_base
+
num_rte
-
1
);
if
((
gsi_base
==
0
)
&&
pcat_compat
)
{
unsigned
int
dest
=
(
ia64_get_lid
()
>>
16
)
&
0xffff
;
if
((
base_irq
==
0
)
&&
pcat_compat
)
{
/*
* Map the legacy ISA devices into the IOSAPIC data. Some of these may
* get reprogrammed later on with data from the ACPI Interrupt Source
* Override table.
*/
for
(
irq
=
0
;
irq
<
16
;
++
irq
)
{
vector
=
isa_irq_to_vector
(
irq
);
if
((
pin
=
iosapic_irq
[
vector
].
pin
)
==
-
1
)
pin
=
irq
;
for
(
isa_irq
=
0
;
isa_irq
<
16
;
++
isa_irq
)
{
vector
=
isa_irq_to_vector
(
isa_irq
);
register_i
rq
(
irq
,
vector
,
pin
,
register_i
ntr
(
isa_irq
,
vector
,
IOSAPIC_LOWEST_PRIORITY
,
/* IOSAPIC_POL_HIGH, IOSAPIC_EDGE */
IOSAPIC_LOWEST_PRIORITY
,
1
,
1
,
base_irq
,
addr
);
1
,
1
,
gsi_base
,
addr
);
#ifdef DEBUG_IRQ_ROUTING
printk
(
"ISA: IRQ %u -> IOSAPIC irq 0x%02x (high, edge) -> vector 0x%02x
\n
"
,
irq
,
iosapic_irq
[
vector
].
base_irq
+
iosapic_irq
[
vector
].
pin
,
vector
);
#endif
DBG
(
"ISA: IRQ %u -> GSI 0x%x (high,edge) -> CPU 0x%04x vector %d
\n
"
,
isa_irq
,
isa_irq
,
dest
,
vector
);
/* program the IOSAPIC routing table: */
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
);
set_rte
(
vector
,
dest
);
}
}
}
static
void
__init
iosapic_init_pci_irq
(
void
)
{
int
i
,
index
,
vector
,
pin
;
int
base_irq
,
max_pin
,
pcat_compat
;
unsigned
int
irq
;
char
*
addr
;
if
(
acpi_get_prt
(
&
pci_irq
.
route
,
&
pci_irq
.
num_routes
))
return
;
for
(
i
=
0
;
i
<
pci_irq
.
num_routes
;
i
++
)
{
irq
=
pci_irq
.
route
[
i
].
irq
;
index
=
find_iosapic
(
irq
);
if
(
index
<
0
)
{
printk
(
"PCI: IRQ %u has no IOSAPIC mapping
\n
"
,
irq
);
continue
;
}
addr
=
iosapic_lists
[
index
].
addr
;
base_irq
=
iosapic_lists
[
index
].
base_irq
;
max_pin
=
iosapic_lists
[
index
].
max_pin
;
pcat_compat
=
iosapic_lists
[
index
].
pcat_compat
;
pin
=
irq
-
base_irq
;
if
((
unsigned
)
pin
>
max_pin
)
/* the interrupt route is for another controller... */
continue
;
if
(
pcat_compat
&&
(
irq
<
16
))
vector
=
isa_irq_to_vector
(
irq
);
else
{
vector
=
iosapic_irq_to_vector
(
irq
);
if
(
vector
<
0
)
/* new iosapic irq: allocate a vector for it */
vector
=
ia64_alloc_irq
();
}
register_irq
(
irq
,
vector
,
pin
,
IOSAPIC_LOWEST_PRIORITY
,
0
,
0
,
base_irq
,
addr
);
#ifdef DEBUG_IRQ_ROUTING
printk
(
"PCI: (B%d,I%d,P%d) -> IOSAPIC irq 0x%02x -> vector 0x%02x
\n
"
,
pci_irq
.
route
[
i
].
bus
,
pci_irq
.
route
[
i
].
pci_id
>>
16
,
pci_irq
.
route
[
i
].
pin
,
iosapic_irq
[
vector
].
base_irq
+
iosapic_irq
[
vector
].
pin
,
vector
);
#endif
/*
* NOTE: The IOSAPIC RTE will be programmed in iosapic_pci_fixup(). It
* needs to be done there to ensure PCI hotplug works right.
/*
* Set allocated interrupt vector to dev->irq and
* program IOSAPIC to deliver interrupts
*/
}
}
void
iosapic_
pci_fixup
(
int
phase
)
iosapic_
fixup_pci_interrupt
(
struct
pci_dev
*
dev
)
{
struct
pci_dev
*
dev
;
unsigned
char
pin
;
unsigned
char
pci_pin
;
int
vector
;
unsigned
int
dest
;
struct
hw_interrupt_type
*
irq_type
;
irq_desc_t
*
idesc
;
if
(
phase
==
0
)
{
iosapic_init_pci_irq
();
return
;
}
pci_read_config_byte
(
dev
,
PCI_INTERRUPT_PIN
,
&
pci_pin
);
if
(
pci_pin
)
{
pci_pin
--
;
/* interrupt pins are numberd starting from 1 */
if
(
phase
!=
1
)
return
;
vector
=
pci_pin_to_vector
(
dev
->
bus
->
number
,
PCI_SLOT
(
dev
->
devfn
),
pci_pin
);
pci_for_each_dev
(
dev
)
{
pci_read_config_byte
(
dev
,
PCI_INTERRUPT_PIN
,
&
pin
);
if
(
pin
)
{
pin
--
;
/* interrupt pins are numbered starting from 1 */
vector
=
pci_pin_to_vector
(
dev
->
bus
->
number
,
PCI_SLOT
(
dev
->
devfn
),
pin
);
if
(
vector
<
0
&&
dev
->
bus
->
parent
)
{
/* go back to the bridge */
struct
pci_dev
*
bridge
=
dev
->
bus
->
self
;
...
...
@@ -721,33 +768,32 @@ iosapic_pci_fixup (int phase)
/* allow for multiple bridges on an adapter */
do
{
/* do the bridge swizzle... */
pin
=
(
pin
+
PCI_SLOT
(
dev
->
devfn
))
%
4
;
pci_pin
=
(
pci_
pin
+
PCI_SLOT
(
dev
->
devfn
))
%
4
;
vector
=
pci_pin_to_vector
(
bridge
->
bus
->
number
,
PCI_SLOT
(
bridge
->
devfn
),
pin
);
pci_
pin
);
}
while
(
vector
<
0
&&
(
bridge
=
bridge
->
bus
->
self
));
}
if
(
vector
>=
0
)
printk
(
KERN_WARNING
"PCI: using PPB(B%d,I%d,P%d) to get vector %02x
\n
"
,
dev
->
bus
->
number
,
PCI_SLOT
(
dev
->
devfn
)
,
pin
,
vector
);
"PCI: using PPB (%s INT%c) to get vector %d
\n
"
,
dev
->
slot_name
,
'A'
+
pci_pin
,
vector
);
else
printk
(
KERN_WARNING
"PCI: Couldn't map irq for (B%d,I%d,P%d
)
\n
"
,
dev
->
bus
->
number
,
PCI_SLOT
(
dev
->
devfn
),
pin
);
"PCI: Couldn't map irq for (%s INT%c
)
\n
"
,
dev
->
slot_name
,
'A'
+
pci_
pin
);
}
if
(
vector
>=
0
)
{
printk
(
"PCI->APIC IRQ transform: (B%d,I%d,P%d) -> 0x%02x
\n
"
,
dev
->
bus
->
number
,
PCI_SLOT
(
dev
->
devfn
),
pin
,
vector
);
dev
->
irq
=
vector
;
irq_type
=
&
irq_type_iosapic_level
;
idesc
=
irq_desc
(
vector
);
if
(
idesc
->
handler
!=
irq_type
)
{
if
(
idesc
->
handler
!=
&
no_irq_type
)
printk
(
"iosapic_pci_fixup: changing vector 0x%02x "
"from %s to %s
\n
"
,
vector
,
printk
(
"%s: changing vector %d from %s to %s
\n
"
,
__FUNCTION__
,
vector
,
idesc
->
handler
->
typename
,
irq_type
->
typename
);
idesc
->
handler
=
irq_type
;
...
...
@@ -765,20 +811,46 @@ iosapic_pci_fixup (int phase)
if
(
++
cpu_index
>=
NR_CPUS
)
cpu_index
=
0
;
set_rte
(
vector
,
cpu_physical_id
(
cpu_index
)
&
0xffff
)
;
dest
=
cpu_physical_id
(
cpu_index
)
&
0xffff
;
}
else
{
/*
* Direct the interrupt vector to the current cpu,
* platform redirection will distribute them.
*/
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
)
;
dest
=
(
ia64_get_lid
()
>>
16
)
&
0xffff
;
}
#else
/* direct the interrupt vector to the running cpu id */
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
)
;
dest
=
(
ia64_get_lid
()
>>
16
)
&
0xffff
;
#endif
printk
(
"PCI->APIC IRQ transform: (%s INT%c) -> CPU 0x%04x vector %d
\n
"
,
dev
->
slot_name
,
'A'
+
pci_pin
,
dest
,
vector
);
set_rte
(
vector
,
dest
);
}
}
}
void
iosapic_pci_fixup
(
int
phase
)
{
struct
pci_dev
*
dev
;
if
(
phase
==
0
)
{
if
(
acpi_get_prt
(
&
pci_irq
.
route
,
&
pci_irq
.
num_routes
))
{
printk
(
"%s: acpi_get_prt failed
\n
"
,
__FILE__
);
}
return
;
}
if
(
phase
!=
1
)
return
;
pci_for_each_dev
(
dev
)
{
/* fixup dev->irq and program IOSAPIC */
iosapic_fixup_pci_interrupt
(
dev
);
/*
* Nothing to fixup
* Fix out-of-range IRQ numbers
...
...
arch/ia64/kernel/irq.c
View file @
9caf366e
...
...
@@ -802,8 +802,7 @@ static struct proc_dir_entry * irq_dir [NR_IRQS];
#define HEX_DIGITS 8
static
unsigned
int
parse_hex_value
(
const
char
*
buffer
,
unsigned
long
count
,
unsigned
long
*
ret
)
static
int
parse_hex_value
(
const
char
*
buffer
,
unsigned
long
count
,
unsigned
long
*
ret
)
{
unsigned
char
hexnum
[
HEX_DIGITS
];
unsigned
long
value
;
...
...
@@ -846,11 +845,11 @@ static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
static
unsigned
long
irq_affinity
[
NR_IRQS
]
=
{
[
0
...
NR_IRQS
-
1
]
=
~
0UL
};
static
char
irq_redir
[
NR_IRQS
];
// = { [0 ... NR_IRQS-1] = 1 };
void
set_irq_affinity_info
(
int
irq
,
int
hwid
,
int
redir
)
void
set_irq_affinity_info
(
unsigned
int
irq
,
int
hwid
,
int
redir
)
{
unsigned
long
mask
=
1UL
<<
cpu_logical_id
(
hwid
);
if
(
irq
>=
0
&&
irq
<
NR_IRQS
)
{
if
(
irq
<
NR_IRQS
)
{
irq_affinity
[
irq
]
=
mask
;
irq_redir
[
irq
]
=
(
char
)
(
redir
&
0xff
);
}
...
...
@@ -861,14 +860,15 @@ static int irq_affinity_read_proc (char *page, char **start, off_t off,
{
if
(
count
<
HEX_DIGITS
+
3
)
return
-
EINVAL
;
return
sprintf
(
page
,
"%s%08lx
\n
"
,
irq_redir
[(
long
)
data
]
?
"r "
:
""
,
irq_affinity
[(
long
)
data
]);
return
sprintf
(
page
,
"%s%08lx
\n
"
,
irq_redir
[(
unsigned
long
)
data
]
?
"r "
:
""
,
irq_affinity
[(
unsigned
long
)
data
]);
}
static
int
irq_affinity_write_proc
(
struct
file
*
file
,
const
char
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
int
irq
=
(
long
)
data
,
full_count
=
count
,
err
;
unsigned
int
irq
=
(
unsigned
long
)
data
;
int
full_count
=
count
,
err
;
unsigned
long
new_value
;
const
char
*
buf
=
buffer
;
int
redir
;
...
...
@@ -884,6 +884,8 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
redir
=
0
;
err
=
parse_hex_value
(
buf
,
count
,
&
new_value
);
if
(
err
)
return
err
;
/*
* Do not allow disabling IRQs completely - it's a too easy
...
...
@@ -893,7 +895,7 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
if
(
!
(
new_value
&
cpu_online_map
))
return
-
EINVAL
;
irq_desc
(
irq
)
->
handler
->
set_affinity
(
irq
|
(
redir
?
(
1
<<
31
)
:
0
),
new_value
);
irq_desc
(
irq
)
->
handler
->
set_affinity
(
irq
|
(
redir
?
IA64_IRQ_REDIRECTED
:
0
),
new_value
);
return
full_count
;
}
...
...
@@ -912,7 +914,8 @@ static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
static
int
prof_cpu_mask_write_proc
(
struct
file
*
file
,
const
char
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
unsigned
long
*
mask
=
(
unsigned
long
*
)
data
,
full_count
=
count
,
err
;
unsigned
long
*
mask
=
(
unsigned
long
*
)
data
;
int
full_count
=
count
,
err
;
unsigned
long
new_value
;
err
=
parse_hex_value
(
buffer
,
count
,
&
new_value
);
...
...
@@ -946,7 +949,7 @@ static void register_irq_proc (unsigned int irq)
if
(
entry
)
{
entry
->
nlink
=
1
;
entry
->
data
=
(
void
*
)(
long
)
irq
;
entry
->
data
=
(
void
*
)(
unsigned
long
)
irq
;
entry
->
read_proc
=
irq_affinity_read_proc
;
entry
->
write_proc
=
irq_affinity_write_proc
;
}
...
...
arch/ia64/kernel/irq_ia64.c
View file @
9caf366e
...
...
@@ -54,20 +54,15 @@ __u8 isa_irq_to_vector_map[16] = {
0x28
,
0x27
,
0x26
,
0x25
,
0x24
,
0x23
,
0x22
,
0x21
};
/*
* GSI to IA-64 vector translation table.
*/
__u8
gsi_to_vector_map
[
255
];
int
ia64_alloc_
irq
(
void
)
ia64_alloc_
vector
(
void
)
{
static
int
next_
irq
=
IA64_FIRST_DEVICE_VECTOR
;
static
int
next_
vector
=
IA64_FIRST_DEVICE_VECTOR
;
if
(
next_
irq
>
IA64_LAST_DEVICE_VECTOR
)
if
(
next_
vector
>
IA64_LAST_DEVICE_VECTOR
)
/* XXX could look for sharable vectors instead of panic'ing... */
panic
(
"ia64_alloc_
irq
: out of interrupt vectors!"
);
return
next_
irq
++
;
panic
(
"ia64_alloc_
vector
: out of interrupt vectors!"
);
return
next_
vector
++
;
}
extern
unsigned
int
do_IRQ
(
unsigned
long
irq
,
struct
pt_regs
*
regs
);
...
...
arch/ia64/kernel/palinfo.c
View file @
9caf366e
...
...
@@ -21,10 +21,10 @@
#include <linux/proc_fs.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/efi.h>
#include <asm/pal.h>
#include <asm/sal.h>
#include <asm/efi.h>
#include <asm/page.h>
#include <asm/processor.h>
#ifdef CONFIG_SMP
...
...
arch/ia64/kernel/process.c
View file @
9caf366e
...
...
@@ -19,9 +19,9 @@
#include <linux/stddef.h>
#include <linux/thread_info.h>
#include <linux/unistd.h>
#include <linux/efi.h>
#include <asm/delay.h>
#include <asm/efi.h>
#include <asm/elf.h>
#include <asm/perfmon.h>
#include <asm/pgalloc.h>
...
...
arch/ia64/kernel/setup.c
View file @
9caf366e
...
...
@@ -30,6 +30,7 @@
#include <linux/string.h>
#include <linux/threads.h>
#include <linux/tty.h>
#include <linux/efi.h>
#include <asm/ia32.h>
#include <asm/page.h>
...
...
@@ -37,7 +38,6 @@
#include <asm/processor.h>
#include <asm/sal.h>
#include <asm/system.h>
#include <asm/efi.h>
#include <asm/mca.h>
#include <asm/smp.h>
...
...
@@ -58,9 +58,8 @@ extern char _end;
unsigned
long
__per_cpu_offset
[
NR_CPUS
];
#endif
DECLARE_PER_CPU
(
struct
cpuinfo_ia64
,
cpu_info
);
unsigned
long
ia64_phys_stacked_size_p8
;
DEFINE_PER_CPU
(
struct
cpuinfo_ia64
,
cpu_info
);
DEFINE_PER_CPU
(
unsigned
long
,
ia64_phys_stacked_size_p8
);
unsigned
long
ia64_cycles_per_usec
;
struct
ia64_boot_param
*
ia64_boot_param
;
struct
screen_info
screen_info
;
...
...
@@ -564,11 +563,11 @@ cpu_init (void)
my_cpu_data
=
(
void
*
)
get_free_page
(
GFP_KERNEL
);
memcpy
(
my_cpu_data
,
__phys_per_cpu_start
,
__per_cpu_end
-
__per_cpu_start
);
__per_cpu_offset
[
cpu
]
=
(
char
*
)
my_cpu_data
-
__per_cpu_start
;
my_cpu_info
=
my_cpu_data
+
((
char
*
)
&
cpu_info
-
__per_cpu_start
);
my_cpu_info
=
my_cpu_data
+
((
char
*
)
&
__get_cpu_var
(
cpu_info
)
-
__per_cpu_start
);
#else
my_cpu_data
=
__phys_per_cpu_start
;
#endif
my_cpu_info
=
my_cpu_data
+
((
char
*
)
&
cpu_info
-
__per_cpu_start
);
my_cpu_info
=
my_cpu_data
+
((
char
*
)
&
__get_cpu_var
(
cpu_info
)
-
__per_cpu_start
);
/*
* We can't pass "local_cpu_data" to identify_cpu() because we haven't called
...
...
@@ -652,6 +651,6 @@ cpu_init (void)
num_phys_stacked
=
96
;
}
/* size of physical stacked register partition plus 8 bytes: */
ia64_phys_stacked_size_p8
=
num_phys_stacked
*
8
+
8
;
__get_cpu_var
(
ia64_phys_stacked_size_p8
)
=
num_phys_stacked
*
8
+
8
;
platform_cpu_init
();
}
arch/ia64/kernel/smp.c
View file @
9caf366e
...
...
@@ -32,12 +32,12 @@
#include <linux/cache.h>
#include <linux/delay.h>
#include <linux/cache.h>
#include <linux/efi.h>
#include <asm/atomic.h>
#include <asm/bitops.h>
#include <asm/current.h>
#include <asm/delay.h>
#include <asm/efi.h>
#include <asm/machvec.h>
#include <asm/io.h>
#include <asm/irq.h>
...
...
@@ -72,7 +72,7 @@ static volatile struct call_data_struct *call_data;
#define IPI_CPU_STOP 1
/* This needs to be cacheline aligned because it is written to by *other* CPUs. */
static
DE
CLAR
E_PER_CPU
(
__u64
,
ipi_operation
)
____cacheline_aligned
;
static
DE
FIN
E_PER_CPU
(
__u64
,
ipi_operation
)
____cacheline_aligned
;
static
void
stop_this_cpu
(
void
)
...
...
arch/ia64/kernel/smpboot.c
View file @
9caf366e
...
...
@@ -27,13 +27,13 @@
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/spinlock.h>
#include <linux/efi.h>
#include <asm/atomic.h>
#include <asm/bitops.h>
#include <asm/cache.h>
#include <asm/current.h>
#include <asm/delay.h>
#include <asm/efi.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/machvec.h>
...
...
arch/ia64/kernel/time.c
View file @
9caf366e
...
...
@@ -15,9 +15,9 @@
#include <linux/sched.h>
#include <linux/time.h>
#include <linux/interrupt.h>
#include <linux/efi.h>
#include <asm/delay.h>
#include <asm/efi.h>
#include <asm/hw_irq.h>
#include <asm/ptrace.h>
#include <asm/sal.h>
...
...
arch/ia64/kernel/traps.c
View file @
9caf366e
...
...
@@ -135,8 +135,6 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
siginfo_t
siginfo
;
int
sig
,
code
;
die_if_kernel
(
"bad break"
,
regs
,
break_num
);
/* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
siginfo
.
si_addr
=
(
void
*
)
(
regs
->
cr_iip
+
ia64_psr
(
regs
)
->
ri
);
siginfo
.
si_imm
=
break_num
;
...
...
@@ -144,7 +142,8 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
siginfo
.
si_isr
=
0
;
switch
(
break_num
)
{
case
0
:
/* unknown error */
case
0
:
/* unknown error (used by GCC for __builtin_abort()) */
die_if_kernel
(
"bad break"
,
regs
,
break_num
);
sig
=
SIGILL
;
code
=
ILL_ILLOPC
;
break
;
...
...
arch/ia64/lib/memcpy.S
View file @
9caf366e
...
...
@@ -13,8 +13,6 @@
*
Stephane
Eranian
<
eranian
@
hpl
.
hp
.
com
>
*
David
Mosberger
-
Tang
<
davidm
@
hpl
.
hp
.
com
>
*/
#include <linux/config.h>
#include <asm/asmmacro.h>
GLOBAL_ENTRY
(
bcopy
)
...
...
arch/ia64/mm/init.c
View file @
9caf366e
...
...
@@ -14,11 +14,11 @@
#include <linux/reboot.h>
#include <linux/slab.h>
#include <linux/swap.h>
#include <linux/efi.h>
#include <asm/a.out.h>
#include <asm/bitops.h>
#include <asm/dma.h>
#include <asm/efi.h>
#include <asm/ia32.h>
#include <asm/io.h>
#include <asm/machvec.h>
...
...
arch/ia64/mm/tlb.c
View file @
9caf366e
...
...
@@ -41,7 +41,7 @@ struct ia64_ctx ia64_ctx = {
.
max_ctx
=
~
0U
};
u8
ia64_need_tlb_flush
__per_cpu_data
;
DEFINE_PER_CPU
(
u8
,
ia64_need_tlb_flush
)
;
/*
* Acquire the ia64_ctx.lock before calling this function!
...
...
arch/ia64/sn/fakeprom/fpmem.c
View file @
9caf366e
...
...
@@ -18,7 +18,7 @@
*/
#include <linux/config.h>
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include "fpmem.h"
/*
...
...
arch/ia64/sn/fakeprom/fw-emu.c
View file @
9caf366e
...
...
@@ -36,7 +36,7 @@
* http://oss.sgi.com/projects/GenInfo/NoticeExplan
*/
#include <linux/config.h>
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include <asm/pal.h>
#include <asm/sal.h>
#include <asm/sn/sn_sal.h>
...
...
arch/ia64/sn/io/efi-rtc.c
View file @
9caf366e
...
...
@@ -12,7 +12,7 @@
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/errno.h>
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include <asm/sn/klclock.h>
/*
...
...
arch/ia64/sn/kernel/llsc4.c
View file @
9caf366e
...
...
@@ -17,7 +17,7 @@
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <
asm
/efi.h>
#include <
linux
/efi.h>
#include <asm/page.h>
#include <linux/threads.h>
#include <asm/sn/simulator.h>
...
...
arch/ia64/vmlinux.lds.S
View file @
9caf366e
include/asm-ia64/acpi.h
View file @
9caf366e
...
...
@@ -100,7 +100,8 @@ const char *acpi_get_sysname (void);
int
acpi_boot_init
(
char
*
cdline
);
int
acpi_request_vector
(
u32
int_type
);
int
acpi_get_prt
(
struct
pci_vector_struct
**
vectors
,
int
*
count
);
int
acpi_get_interrupt_model
(
int
*
type
);
int
acpi_get_interrupt_model
(
int
*
type
);
int
acpi_irq_to_vector
(
u32
irq
);
#ifdef CONFIG_DISCONTIGMEM
#define NODE_ARRAY_INDEX(x) ((x) / 8)
/* 8 bits/char */
...
...
include/asm-ia64/agp.h
View file @
9caf366e
...
...
@@ -18,4 +18,7 @@
#define flush_agp_mappings()
/* nothing */
#define flush_agp_cache() mb()
/* Page-protection value to be used for AGP memory mapped into kernel space. */
#define PAGE_AGP PAGE_KERNEL
#endif
/* _ASM_IA64_AGP_H */
include/asm-ia64/atomic.h
View file @
9caf366e
...
...
@@ -9,8 +9,8 @@
* "int" types were carefully placed so as to ensure proper operation
* of the macros.
*
* Copyright (C) 1998, 1999 Hewlett-Packard Co
*
Copyright (C) 1998, 1999
David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 1998, 1999
, 2002
Hewlett-Packard Co
*
David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <linux/types.h>
...
...
include/asm-ia64/efi.h
deleted
100644 → 0
View file @
7c0700ff
#ifndef _ASM_IA64_EFI_H
#define _ASM_IA64_EFI_H
/*
* Extensible Firmware Interface
* Based on 'Extensible Firmware Interface Specification' version 0.9, April 30, 1999
*
* Copyright (C) 1999 VA Linux Systems
* Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
* Copyright (C) 1999, 2002 Hewlett-Packard Co.
* David Mosberger-Tang <davidm@hpl.hp.com>
* Stephane Eranian <eranian@hpl.hp.com>
*/
#include <linux/init.h>
#include <linux/string.h>
#include <linux/time.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <asm/page.h>
#include <asm/system.h>
#define EFI_SUCCESS 0
#define EFI_LOAD_ERROR (1L | (1L << 63))
#define EFI_INVALID_PARAMETER (2L | (1L << 63))
#define EFI_UNSUPPORTED (3L | (1L << 63))
#define EFI_BAD_BUFFER_SIZE (4L | (1L << 63))
#define EFI_BUFFER_TOO_SMALL (5L | (1L << 63))
#define EFI_NOT_FOUND (14L | (1L << 63))
typedef
unsigned
long
efi_status_t
;
typedef
u8
efi_bool_t
;
typedef
u16
efi_char16_t
;
/* UNICODE character */
typedef
struct
{
u8
b
[
16
];
}
efi_guid_t
;
#define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
((efi_guid_t) \
{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
(b) & 0xff, ((b) >> 8) & 0xff, \
(c) & 0xff, ((c) >> 8) & 0xff, \
(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
/*
* Generic EFI table header
*/
typedef
struct
{
u64
signature
;
u32
revision
;
u32
headersize
;
u32
crc32
;
u32
reserved
;
}
efi_table_hdr_t
;
/*
* Memory map descriptor:
*/
/* Memory types: */
#define EFI_RESERVED_TYPE 0
#define EFI_LOADER_CODE 1
#define EFI_LOADER_DATA 2
#define EFI_BOOT_SERVICES_CODE 3
#define EFI_BOOT_SERVICES_DATA 4
#define EFI_RUNTIME_SERVICES_CODE 5
#define EFI_RUNTIME_SERVICES_DATA 6
#define EFI_CONVENTIONAL_MEMORY 7
#define EFI_UNUSABLE_MEMORY 8
#define EFI_ACPI_RECLAIM_MEMORY 9
#define EFI_ACPI_MEMORY_NVS 10
#define EFI_MEMORY_MAPPED_IO 11
#define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12
#define EFI_PAL_CODE 13
#define EFI_MAX_MEMORY_TYPE 14
/* Attribute values: */
#define EFI_MEMORY_UC 0x0000000000000001
/* uncached */
#define EFI_MEMORY_WC 0x0000000000000002
/* write-coalescing */
#define EFI_MEMORY_WT 0x0000000000000004
/* write-through */
#define EFI_MEMORY_WB 0x0000000000000008
/* write-back */
#define EFI_MEMORY_WP 0x0000000000001000
/* write-protect */
#define EFI_MEMORY_RP 0x0000000000002000
/* read-protect */
#define EFI_MEMORY_XP 0x0000000000004000
/* execute-protect */
#define EFI_MEMORY_RUNTIME 0x8000000000000000
/* range requires runtime mapping */
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
#define EFI_PAGE_SHIFT 12
typedef
struct
{
u32
type
;
u32
pad
;
u64
phys_addr
;
u64
virt_addr
;
u64
num_pages
;
u64
attribute
;
}
efi_memory_desc_t
;
typedef
int
efi_freemem_callback_t
(
u64
start
,
u64
end
,
void
*
arg
);
/*
* Types and defines for Time Services
*/
#define EFI_TIME_ADJUST_DAYLIGHT 0x1
#define EFI_TIME_IN_DAYLIGHT 0x2
#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
typedef
struct
{
u16
year
;
u8
month
;
u8
day
;
u8
hour
;
u8
minute
;
u8
second
;
u8
pad1
;
u32
nanosecond
;
s16
timezone
;
u8
daylight
;
u8
pad2
;
}
efi_time_t
;
typedef
struct
{
u32
resolution
;
u32
accuracy
;
u8
sets_to_zero
;
}
efi_time_cap_t
;
/*
* Types and defines for EFI ResetSystem
*/
#define EFI_RESET_COLD 0
#define EFI_RESET_WARM 1
/*
* EFI Runtime Services table
*/
#define EFI_RUNTIME_SERVICES_SIGNATURE 0x5652453544e5552
#define EFI_RUNTIME_SERVICES_REVISION 0x00010000
typedef
struct
{
efi_table_hdr_t
hdr
;
u64
get_time
;
u64
set_time
;
u64
get_wakeup_time
;
u64
set_wakeup_time
;
u64
set_virtual_address_map
;
u64
convert_pointer
;
u64
get_variable
;
u64
get_next_variable
;
u64
set_variable
;
u64
get_next_high_mono_count
;
u64
reset_system
;
}
efi_runtime_services_t
;
typedef
efi_status_t
efi_get_time_t
(
efi_time_t
*
tm
,
efi_time_cap_t
*
tc
);
typedef
efi_status_t
efi_set_time_t
(
efi_time_t
*
tm
);
typedef
efi_status_t
efi_get_wakeup_time_t
(
efi_bool_t
*
enabled
,
efi_bool_t
*
pending
,
efi_time_t
*
tm
);
typedef
efi_status_t
efi_set_wakeup_time_t
(
efi_bool_t
enabled
,
efi_time_t
*
tm
);
typedef
efi_status_t
efi_get_variable_t
(
efi_char16_t
*
name
,
efi_guid_t
*
vendor
,
u32
*
attr
,
unsigned
long
*
data_size
,
void
*
data
);
typedef
efi_status_t
efi_get_next_variable_t
(
unsigned
long
*
name_size
,
efi_char16_t
*
name
,
efi_guid_t
*
vendor
);
typedef
efi_status_t
efi_set_variable_t
(
efi_char16_t
*
name
,
efi_guid_t
*
vendor
,
u32
attr
,
unsigned
long
data_size
,
void
*
data
);
typedef
efi_status_t
efi_get_next_high_mono_count_t
(
u64
*
count
);
typedef
void
efi_reset_system_t
(
int
reset_type
,
efi_status_t
status
,
unsigned
long
data_size
,
efi_char16_t
*
data
);
/*
* EFI Configuration Table and GUID definitions
*/
#define NULL_GUID \
EFI_GUID( 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 )
#define MPS_TABLE_GUID \
EFI_GUID( 0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
#define ACPI_TABLE_GUID \
EFI_GUID( 0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
#define ACPI_20_TABLE_GUID \
EFI_GUID( 0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 )
#define SMBIOS_TABLE_GUID \
EFI_GUID( 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
#define SAL_SYSTEM_TABLE_GUID \
EFI_GUID( 0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
#define HCDP_TABLE_GUID \
EFI_GUID( 0xf951938d, 0x620b, 0x42ef, 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 )
typedef
struct
{
efi_guid_t
guid
;
u64
table
;
}
efi_config_table_t
;
#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
#define EFI_SYSTEM_TABLE_REVISION ((1 << 16) | 00)
typedef
struct
{
efi_table_hdr_t
hdr
;
u64
fw_vendor
;
/* physical addr of CHAR16 vendor string */
u32
fw_revision
;
u64
con_in_handle
;
u64
con_in
;
u64
con_out_handle
;
u64
con_out
;
u64
stderr_handle
;
u64
stderr
;
u64
runtime
;
u64
boottime
;
u64
nr_tables
;
u64
tables
;
}
efi_system_table_t
;
/*
* All runtime access to EFI goes through this structure:
*/
extern
struct
efi
{
efi_system_table_t
*
systab
;
/* EFI system table */
void
*
mps
;
/* MPS table */
void
*
acpi
;
/* ACPI table (IA64 ext 0.71) */
void
*
acpi20
;
/* ACPI table (ACPI 2.0) */
void
*
smbios
;
/* SM BIOS table */
void
*
sal_systab
;
/* SAL system table */
void
*
boot_info
;
/* boot info table */
void
*
hcdp
;
/* HCDP table */
efi_get_time_t
*
get_time
;
efi_set_time_t
*
set_time
;
efi_get_wakeup_time_t
*
get_wakeup_time
;
efi_set_wakeup_time_t
*
set_wakeup_time
;
efi_get_variable_t
*
get_variable
;
efi_get_next_variable_t
*
get_next_variable
;
efi_set_variable_t
*
set_variable
;
efi_get_next_high_mono_count_t
*
get_next_high_mono_count
;
efi_reset_system_t
*
reset_system
;
}
efi
;
static
inline
int
efi_guidcmp
(
efi_guid_t
left
,
efi_guid_t
right
)
{
return
memcmp
(
&
left
,
&
right
,
sizeof
(
efi_guid_t
));
}
static
inline
char
*
efi_guid_unparse
(
efi_guid_t
*
guid
,
char
*
out
)
{
sprintf
(
out
,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
,
guid
->
b
[
3
],
guid
->
b
[
2
],
guid
->
b
[
1
],
guid
->
b
[
0
],
guid
->
b
[
5
],
guid
->
b
[
4
],
guid
->
b
[
7
],
guid
->
b
[
6
],
guid
->
b
[
8
],
guid
->
b
[
9
],
guid
->
b
[
10
],
guid
->
b
[
11
],
guid
->
b
[
12
],
guid
->
b
[
13
],
guid
->
b
[
14
],
guid
->
b
[
15
]);
return
out
;
}
extern
void
efi_init
(
void
);
extern
void
efi_map_pal_code
(
void
);
extern
void
efi_memmap_walk
(
efi_freemem_callback_t
callback
,
void
*
arg
);
extern
void
efi_gettimeofday
(
struct
timeval
*
tv
);
extern
void
efi_enter_virtual_mode
(
void
);
/* switch EFI to virtual mode, if possible */
extern
u64
efi_get_iobase
(
void
);
extern
u32
efi_mem_type
(
unsigned
long
phys_addr
);
extern
u64
efi_mem_attributes
(
unsigned
long
phys_addr
);
/*
* Variable Attributes
*/
#define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
/*
* efi_dir is allocated in arch/ia64/kernel/efi.c.
*/
#ifdef CONFIG_PROC_FS
extern
struct
proc_dir_entry
*
efi_dir
;
#endif
#endif
/* _ASM_IA64_EFI_H */
include/asm-ia64/fpu.h
View file @
9caf366e
...
...
@@ -2,8 +2,8 @@
#define _ASM_IA64_FPU_H
/*
* Copyright (C) 1998, 1999 Hewlett-Packard Co
*
Copyright (C) 1998, 1999
David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 1998, 1999
, 2002
Hewlett-Packard Co
*
David Mosberger-Tang <davidm@hpl.hp.com>
*/
#include <asm/types.h>
...
...
include/asm-ia64/hardirq.h
View file @
9caf366e
...
...
@@ -95,7 +95,7 @@
#define irq_exit() \
do { \
preempt_count() -= IRQ_EXIT_OFFSET; \
if (!in_interrupt() &&
softirq_pending(smp_processor_id()
)) \
if (!in_interrupt() &&
local_softirq_pending(
)) \
do_softirq(); \
preempt_enable_no_resched(); \
} while (0)
...
...
include/asm-ia64/hw_irq.h
View file @
9caf366e
...
...
@@ -53,6 +53,10 @@ typedef u8 ia64_vector;
#define IA64_IPI_RESCHEDULE 0xfd
/* SMP reschedule */
#define IA64_IPI_VECTOR 0xfe
/* inter-processor interrupt vector */
/* Used for encoding redirected irqs */
#define IA64_IRQ_REDIRECTED (1 << 31)
/* IA64 inter-cpu interrupt related definitions */
#define IA64_IPI_DEFAULT_BASE_ADDR 0xfee00000
...
...
@@ -68,14 +72,12 @@ enum {
extern
__u8
isa_irq_to_vector_map
[
16
];
#define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)]
extern
__u8
gsi_to_vector_map
[
255
];
#define gsi_to_vector(x) gsi_to_vector_map[(x)]
extern
unsigned
long
ipi_base_addr
;
extern
struct
hw_interrupt_type
irq_type_ia64_lsapic
;
/* CPU-internal interrupt controller */
extern
int
ia64_alloc_
irq
(
void
);
/* allocate a free irq
*/
extern
int
ia64_alloc_
vector
(
void
);
/* allocate a free vector
*/
extern
void
ia64_send_ipi
(
int
cpu
,
int
vector
,
int
delivery_mode
,
int
redirect
);
extern
void
register_percpu_irq
(
ia64_vector
vec
,
struct
irqaction
*
action
);
...
...
include/asm-ia64/ide.h
View file @
9caf366e
...
...
@@ -85,11 +85,25 @@ ide_init_default_hwifs (void)
for
(
index
=
0
;
index
<
MAX_HWIFS
;
index
++
)
{
ide_init_hwif_ports
(
&
hw
,
ide_default_io_base
(
index
),
0
,
NULL
);
hw
.
irq
=
ide_default_irq
(
ide_default_io_base
(
index
));
ide_register_hw
(
&
hw
);
ide_register_hw
(
&
hw
,
NULL
);
}
#endif
}
#define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id))
#define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id))
#define ide_check_region(from,extent) check_region((from), (extent))
#define ide_request_region(from,extent,name) request_region((from), (extent), (name))
#define ide_release_region(from,extent) release_region((from), (extent))
/*
* The following are not needed for the non-m68k ports
*/
#define ide_ack_intr(hwif) (1)
#define ide_fix_driveid(id) do {} while (0)
#define ide_release_lock(lock) do {} while (0)
#define ide_get_lock(lock, hdlr, data) do {} while (0)
#endif
/* __KERNEL__ */
#endif
/* __ASM_IA64_IDE_H */
include/asm-ia64/io.h
View file @
9caf366e
...
...
@@ -13,7 +13,7 @@
* over and over again with slight variations and possibly making a
* mistake somewhere.
*
* Copyright (C) 1998-200
1
Hewlett-Packard Co
* Copyright (C) 1998-200
2
Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
* Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
...
...
@@ -277,9 +277,9 @@ __outsl (unsigned long port, void *src, unsigned long count)
}
/*
* Unfortunately, some platforms are broken and do not follow the
*
IA-64 architecture specification regarding legacy I/O support.
*
Thus, we have to make these operations
platform dependent...
* Unfortunately, some platforms are broken and do not follow the
IA-64 architecture
*
specification regarding legacy I/O support. Thus, we have to make these operations
* platform dependent...
*/
#define __inb platform_inb
#define __inw platform_inw
...
...
@@ -289,19 +289,19 @@ __outsl (unsigned long port, void *src, unsigned long count)
#define __outl platform_outl
#define __mmiob platform_mmiob
#define inb
__inb
#define inw
__inw
#define inl
__inl
#define insb
__insb
#define insw
__insw
#define insl
__insl
#define outb
__outb
#define outw
__outw
#define outl
__outl
#define outsb
__outsb
#define outsw
__outsw
#define outsl
__outsl
#define mmiob
__mmiob
#define inb
(p) __inb(p)
#define inw
(p) __inw(p)
#define inl
(p) __inl(p)
#define insb
(p,d,c) __insb(p,d,c)
#define insw
(p,d,c) __insw(p,d,c)
#define insl
(p,d,c) __insl(p,d,c)
#define outb
(v,p) __outb(v,p)
#define outw
(v,p) __outw(v,p)
#define outl
(v,p) __outl(v,p)
#define outsb
(p,s,c) __outsb(p,s,c)
#define outsw
(p,s,c) __outsw(p,s,c)
#define outsl
(p,s,c) __outsl(p,s,c)
#define mmiob
() __mmiob()
/*
* The address passed to these functions are ioremap()ped already.
...
...
include/asm-ia64/iosapic.h
View file @
9caf366e
...
...
@@ -51,16 +51,23 @@
#ifndef __ASSEMBLY__
extern
void
__init
iosapic_init
(
unsigned
long
address
,
unsigned
int
base_irq
,
extern
void
__devinit
iosapic_init
(
unsigned
long
address
,
unsigned
int
gsi_base
,
int
pcat_compat
);
extern
int
iosapic_register_irq
(
u32
global_vector
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
base_irq
,
char
*
iosapic_address
);
extern
void
iosapic_register_legacy_irq
(
unsigned
long
irq
,
unsigned
long
pin
,
unsigned
long
polarity
,
unsigned
long
trigger
);
extern
int
iosapic_register_platform_irq
(
u32
int_type
,
u32
global_vector
,
u32
iosapic_vector
,
u16
eid
,
u16
id
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
base_irq
,
extern
int
gsi_to_vector
(
unsigned
int
gsi
);
extern
int
iosapic_register_intr
(
unsigned
int
gsi
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
u32
gsi_base
,
char
*
iosapic_address
);
extern
void
iosapic_override_isa_irq
(
unsigned
int
isa_irq
,
unsigned
int
gsi
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
);
extern
int
iosapic_register_platform_intr
(
u32
int_type
,
unsigned
int
gsi
,
int
pmi_vector
,
u16
eid
,
u16
id
,
unsigned
long
polarity
,
unsigned
long
edge_triggered
,
unsigned
int
gsi_base
,
char
*
iosapic_address
);
extern
unsigned
int
iosapic_version
(
char
*
addr
);
...
...
include/asm-ia64/irq.h
View file @
9caf366e
...
...
@@ -27,6 +27,6 @@ irq_cannonicalize (int irq)
extern
void
disable_irq
(
unsigned
int
);
extern
void
disable_irq_nosync
(
unsigned
int
);
extern
void
enable_irq
(
unsigned
int
);
extern
void
set_irq_affinity_info
(
int
irq
,
int
dest
,
int
redir
);
extern
void
set_irq_affinity_info
(
unsigned
int
irq
,
int
dest
,
int
redir
);
#endif
/* _ASM_IA64_IRQ_H */
include/asm-ia64/kmap_types.h
0 → 100644
View file @
9caf366e
#ifndef _ASM_IA64_KMAP_TYPES_H
#define _ASM_IA64_KMAP_TYPES_H
#include <linux/config.h>
#if CONFIG_DEBUG_HIGHMEM
# define D(n) __KM_FENCE_##n ,
#else
# define D(n)
#endif
enum
km_type
{
D
(
0
)
KM_BOUNCE_READ
,
D
(
1
)
KM_SKB_SUNRPC_DATA
,
D
(
2
)
KM_SKB_DATA_SOFTIRQ
,
D
(
3
)
KM_USER0
,
D
(
4
)
KM_USER1
,
D
(
5
)
KM_BIO_SRC_IRQ
,
D
(
6
)
KM_BIO_DST_IRQ
,
D
(
7
)
KM_PTE0
,
D
(
8
)
KM_PTE1
,
D
(
9
)
KM_IRQ0
,
D
(
10
)
KM_IRQ1
,
D
(
11
)
KM_TYPE_NR
};
#undef D
#endif
/* _ASM_IA64_KMAP_TYPES_H */
include/asm-ia64/mc146818rtc.h
0 → 100644
View file @
9caf366e
#ifndef _ASM_IA64_MC146818RTC_H
#define _ASM_IA64_MC146818RTC_H
/*
* Machine dependent access functions for RTC registers.
*/
/* empty include file to satisfy the include in genrtc.c */
#endif
/* _ASM_IA64_MC146818RTC_H */
include/asm-ia64/mmu_context.h
View file @
9caf366e
...
...
@@ -36,7 +36,7 @@ struct ia64_ctx {
};
extern
struct
ia64_ctx
ia64_ctx
;
extern
u8
ia64_need_tlb_flush
__per_cpu_data
;
DECLARE_PER_CPU
(
u8
,
ia64_need_tlb_flush
)
;
extern
void
wrap_mmu_context
(
struct
mm_struct
*
mm
);
...
...
@@ -56,9 +56,9 @@ delayed_tlb_flush (void)
{
extern
void
__flush_tlb_all
(
void
);
if
(
unlikely
(
ia64_need_tlb_flush
))
{
if
(
unlikely
(
__get_cpu_var
(
ia64_need_tlb_flush
)
))
{
__flush_tlb_all
();
ia64_need_tlb_flush
=
0
;
__get_cpu_var
(
ia64_need_tlb_flush
)
=
0
;
}
}
...
...
include/asm-ia64/percpu.h
View file @
9caf366e
#ifndef _ASM_IA64_PERCPU_H
#define _ASM_IA64_PERCPU_H
#include <linux/config.h>
#include <linux/compiler.h>
/*
* Copyright (C) 2002 Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
...
...
@@ -22,8 +25,12 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
#endif
#define DECLARE_PER_CPU(type, name) extern __typeof__(type) name##__per_cpu
#define per_cpu(var, cpu) (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
#define __get_cpu_var(var) (var##__per_cpu)
#ifdef CONFIG_SMP
# define per_cpu(var, cpu) (*RELOC_HIDE(&var##__per_cpu, __per_cpu_offset[cpu]))
#else
# define per_cpu(var, cpu) __get_cpu_var(var)
#endif
#endif
/* !__ASSEMBLY__ */
...
...
include/asm-ia64/processor.h
View file @
9caf366e
...
...
@@ -15,9 +15,6 @@
#include <linux/config.h>
#include <linux/percpu.h>
#include <linux/compiler.h>
#include <asm/ptrace.h>
#include <asm/kregs.h>
#include <asm/system.h>
...
...
@@ -81,8 +78,10 @@
#ifndef __ASSEMBLY__
#include <linux/threads.h>
#include <linux/cache.h>
#include <linux/compiler.h>
#include <linux/percpu.h>
#include <linux/threads.h>
#include <asm/fpu.h>
#include <asm/offsets.h>
...
...
include/asm-ia64/sal.h
View file @
9caf366e
...
...
@@ -24,9 +24,9 @@
*/
#include <linux/spinlock.h>
#include <linux/efi.h>
#include <asm/pal.h>
#include <asm/efi.h>
#include <asm/system.h>
#include <asm/fpu.h>
...
...
include/asm-ia64/system.h
View file @
9caf366e
...
...
@@ -13,7 +13,6 @@
* Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
*/
#include <linux/config.h>
#include <linux/percpu.h>
#include <asm/kregs.h>
#include <asm/page.h>
...
...
@@ -26,6 +25,7 @@
#ifndef __ASSEMBLY__
#include <linux/percpu.h>
#include <linux/kernel.h>
#include <linux/types.h>
...
...
@@ -368,8 +368,8 @@ extern void ia64_save_extra (struct task_struct *task);
extern
void
ia64_load_extra
(
struct
task_struct
*
task
);
#if defined(CONFIG_SMP) && defined(CONFIG_PERFMON)
extern
int
__per_cpu_data
pfm_syst_wide
;
# define PERFMON_IS_SYSWIDE() (
this_cpu
(pfm_syst_wide) != 0)
DECLARE_PER_CPU
(
int
,
pfm_syst_wide
)
;
# define PERFMON_IS_SYSWIDE() (
get_cpu_var
(pfm_syst_wide) != 0)
#else
# define PERFMON_IS_SYSWIDE() (0)
#endif
...
...
include/asm-ia64/types.h
View file @
9caf366e
...
...
@@ -2,14 +2,13 @@
#define _ASM_IA64_TYPES_H
/*
* This file is never included by application software unless
* explicitly requested (e.g., via linux/types.h) in which case the
* application is Linux specific so (user-) name space pollution is
* not a major issue. However, for interoperability, libraries still
* This file is never included by application software unless explicitly requested (e.g.,
* via linux/types.h) in which case the application is Linux specific so (user-) name
* space pollution is not a major issue. However, for interoperability, libraries still
* need to be careful to avoid a name clashes.
*
* Copyright (C) 1998-2000 Hewlett-Packard Co
*
Copyright (C) 1998-2000
David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 1998-2000
, 2002
Hewlett-Packard Co
*
David Mosberger-Tang <davidm@hpl.hp.com>
*/
#ifdef __ASSEMBLY__
...
...
@@ -18,9 +17,6 @@
#else
# define __IA64_UL(x) ((unsigned long)(x))
# define __IA64_UL_CONST(x) x##UL
#endif
#ifndef __ASSEMBLY__
typedef
unsigned
int
umode_t
;
...
...
include/asm-ia64/unistd.h
View file @
9caf366e
...
...
@@ -223,10 +223,15 @@
#define __NR_sched_setaffinity 1231
#define __NR_sched_getaffinity 1232
#define __NR_security 1233
#define __NR_get_large_pages 1234
#define __NR_free_large_pages 1235
#define __NR_share_large_pages 1236
#define __NR_unshare_large_pages 1237
#define __NR_alloc_hugepages 1234
#define __NR_free_hugepages 1235
/* 1236 currently unused */
/* 1237 currently unused */
#define __NR_io_setup 1238
#define __NR_io_destroy 1239
#define __NR_io_getevents 1240
#define __NR_io_submit 1241
#define __NR_io_cancel 1242
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
...
...
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